1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/printing/content/printdialog.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,429 @@ 1.4 +// -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- 1.5 + 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +var dialog; 1.11 +var printService = null; 1.12 +var gOriginalNumCopies = 1; 1.13 + 1.14 +var paramBlock; 1.15 +var gPrefs = null; 1.16 +var gPrintSettings = null; 1.17 +var gWebBrowserPrint = null; 1.18 +var gPrintSetInterface = Components.interfaces.nsIPrintSettings; 1.19 +var doDebug = false; 1.20 + 1.21 +//--------------------------------------------------- 1.22 +function initDialog() 1.23 +{ 1.24 + dialog = new Object; 1.25 + 1.26 + dialog.propertiesButton = document.getElementById("properties"); 1.27 + dialog.descText = document.getElementById("descText"); 1.28 + 1.29 + dialog.printrangeGroup = document.getElementById("printrangeGroup"); 1.30 + dialog.allpagesRadio = document.getElementById("allpagesRadio"); 1.31 + dialog.rangeRadio = document.getElementById("rangeRadio"); 1.32 + dialog.selectionRadio = document.getElementById("selectionRadio"); 1.33 + dialog.frompageInput = document.getElementById("frompageInput"); 1.34 + dialog.frompageLabel = document.getElementById("frompageLabel"); 1.35 + dialog.topageInput = document.getElementById("topageInput"); 1.36 + dialog.topageLabel = document.getElementById("topageLabel"); 1.37 + 1.38 + dialog.numCopiesInput = document.getElementById("numCopiesInput"); 1.39 + 1.40 + dialog.printframeGroup = document.getElementById("printframeGroup"); 1.41 + dialog.aslaidoutRadio = document.getElementById("aslaidoutRadio"); 1.42 + dialog.selectedframeRadio = document.getElementById("selectedframeRadio"); 1.43 + dialog.eachframesepRadio = document.getElementById("eachframesepRadio"); 1.44 + dialog.printframeGroupLabel = document.getElementById("printframeGroupLabel"); 1.45 + 1.46 + dialog.fileCheck = document.getElementById("fileCheck"); 1.47 + dialog.printerLabel = document.getElementById("printerLabel"); 1.48 + dialog.printerList = document.getElementById("printerList"); 1.49 + 1.50 + dialog.printButton = document.documentElement.getButton("accept"); 1.51 + 1.52 + // <data> elements 1.53 + dialog.printName = document.getElementById("printButton"); 1.54 + dialog.fpDialog = document.getElementById("fpDialog"); 1.55 + 1.56 + dialog.enabled = false; 1.57 +} 1.58 + 1.59 +//--------------------------------------------------- 1.60 +function checkInteger(element) 1.61 +{ 1.62 + var value = element.value; 1.63 + if (value && value.length > 0) { 1.64 + value = value.replace(/[^0-9]/g,""); 1.65 + if (!value) value = ""; 1.66 + element.value = value; 1.67 + } 1.68 + if (!value || value < 1 || value > 999) 1.69 + dialog.printButton.setAttribute("disabled","true"); 1.70 + else 1.71 + dialog.printButton.removeAttribute("disabled"); 1.72 +} 1.73 + 1.74 +//--------------------------------------------------- 1.75 +function stripTrailingWhitespace(element) 1.76 +{ 1.77 + var value = element.value; 1.78 + value = value.replace(/\s+$/,""); 1.79 + element.value = value; 1.80 +} 1.81 + 1.82 +//--------------------------------------------------- 1.83 +function getPrinterDescription(printerName) 1.84 +{ 1.85 + var s = ""; 1.86 + 1.87 + try { 1.88 + /* This may not work with non-ASCII test (see bug 235763 comment #16) */ 1.89 + s = gPrefs.getCharPref("print.printer_" + printerName + ".printer_description") 1.90 + } catch(e) { 1.91 + } 1.92 + 1.93 + return s; 1.94 +} 1.95 + 1.96 +//--------------------------------------------------- 1.97 +function listElement(aListElement) 1.98 + { 1.99 + this.listElement = aListElement; 1.100 + } 1.101 + 1.102 +listElement.prototype = 1.103 + { 1.104 + clearList: 1.105 + function () 1.106 + { 1.107 + // remove the menupopup node child of the menulist. 1.108 + var popup = this.listElement.firstChild; 1.109 + if (popup) { 1.110 + this.listElement.removeChild(popup); 1.111 + } 1.112 + }, 1.113 + 1.114 + appendPrinterNames: 1.115 + function (aDataObject) 1.116 + { 1.117 + if ((null == aDataObject) || !aDataObject.hasMore()) { 1.118 + // disable dialog 1.119 + this.listElement.setAttribute("value", ""); 1.120 + this.listElement.setAttribute("label", 1.121 + document.getElementById("printingBundle") 1.122 + .getString("noprinter")); 1.123 + 1.124 + this.listElement.setAttribute("disabled", "true"); 1.125 + dialog.printerLabel.setAttribute("disabled","true"); 1.126 + dialog.propertiesButton.setAttribute("disabled","true"); 1.127 + dialog.fileCheck.setAttribute("disabled","true"); 1.128 + dialog.printButton.setAttribute("disabled","true"); 1.129 + } 1.130 + else { 1.131 + // build popup menu from printer names 1.132 + var list = document.getElementById("printerList"); 1.133 + do { 1.134 + printerNameStr = aDataObject.getNext(); 1.135 + list.appendItem(printerNameStr, printerNameStr, getPrinterDescription(printerNameStr)); 1.136 + } while (aDataObject.hasMore()); 1.137 + this.listElement.removeAttribute("disabled"); 1.138 + } 1.139 + } 1.140 + }; 1.141 + 1.142 +//--------------------------------------------------- 1.143 +function getPrinters() 1.144 +{ 1.145 + var selectElement = new listElement(dialog.printerList); 1.146 + selectElement.clearList(); 1.147 + 1.148 + var printerEnumerator; 1.149 + try { 1.150 + printerEnumerator = 1.151 + Components.classes["@mozilla.org/gfx/printerenumerator;1"] 1.152 + .getService(Components.interfaces.nsIPrinterEnumerator) 1.153 + .printerNameList; 1.154 + } catch(e) { printerEnumerator = null; } 1.155 + 1.156 + selectElement.appendPrinterNames(printerEnumerator); 1.157 + selectElement.listElement.value = printService.defaultPrinterName; 1.158 + 1.159 + // make sure we load the prefs for the initially selected printer 1.160 + setPrinterDefaultsForSelectedPrinter(); 1.161 +} 1.162 + 1.163 + 1.164 +//--------------------------------------------------- 1.165 +// update gPrintSettings with the defaults for the selected printer 1.166 +function setPrinterDefaultsForSelectedPrinter() 1.167 +{ 1.168 + gPrintSettings.printerName = dialog.printerList.value; 1.169 + 1.170 + dialog.descText.value = getPrinterDescription(gPrintSettings.printerName); 1.171 + 1.172 + // First get any defaults from the printer 1.173 + printService.initPrintSettingsFromPrinter(gPrintSettings.printerName, gPrintSettings); 1.174 + 1.175 + // now augment them with any values from last time 1.176 + printService.initPrintSettingsFromPrefs(gPrintSettings, true, gPrintSetInterface.kInitSaveAll); 1.177 + 1.178 + if (doDebug) { 1.179 + dump("setPrinterDefaultsForSelectedPrinter: printerName='"+gPrintSettings.printerName+"', paperName='"+gPrintSettings.paperName+"'\n"); 1.180 + } 1.181 +} 1.182 + 1.183 +//--------------------------------------------------- 1.184 +function displayPropertiesDialog() 1.185 +{ 1.186 + gPrintSettings.numCopies = dialog.numCopiesInput.value; 1.187 + try { 1.188 + var printingPromptService = Components.classes["@mozilla.org/embedcomp/printingprompt-service;1"] 1.189 + .getService(Components.interfaces.nsIPrintingPromptService); 1.190 + if (printingPromptService) { 1.191 + printingPromptService.showPrinterProperties(null, dialog.printerList.value, gPrintSettings); 1.192 + dialog.numCopiesInput.value = gPrintSettings.numCopies; 1.193 + } 1.194 + } catch(e) { 1.195 + dump("problems getting printingPromptService\n"); 1.196 + } 1.197 +} 1.198 + 1.199 +//--------------------------------------------------- 1.200 +function doPrintRange(inx) 1.201 +{ 1.202 + if (inx == 1) { 1.203 + dialog.frompageInput.removeAttribute("disabled"); 1.204 + dialog.frompageLabel.removeAttribute("disabled"); 1.205 + dialog.topageInput.removeAttribute("disabled"); 1.206 + dialog.topageLabel.removeAttribute("disabled"); 1.207 + } else { 1.208 + dialog.frompageInput.setAttribute("disabled","true"); 1.209 + dialog.frompageLabel.setAttribute("disabled","true"); 1.210 + dialog.topageInput.setAttribute("disabled","true"); 1.211 + dialog.topageLabel.setAttribute("disabled","true"); 1.212 + } 1.213 +} 1.214 + 1.215 +//--------------------------------------------------- 1.216 +function loadDialog() 1.217 +{ 1.218 + var print_copies = 1; 1.219 + var print_selection_radio_enabled = false; 1.220 + var print_frametype = gPrintSetInterface.kSelectedFrame; 1.221 + var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone; 1.222 + var print_tofile = ""; 1.223 + 1.224 + try { 1.225 + gPrefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); 1.226 + 1.227 + printService = Components.classes["@mozilla.org/gfx/printsettings-service;1"]; 1.228 + if (printService) { 1.229 + printService = printService.getService(); 1.230 + if (printService) { 1.231 + printService = printService.QueryInterface(Components.interfaces.nsIPrintSettingsService); 1.232 + } 1.233 + } 1.234 + } catch(e) {} 1.235 + 1.236 + // Note: getPrinters sets up the PrintToFile control 1.237 + getPrinters(); 1.238 + 1.239 + if (gPrintSettings) { 1.240 + print_tofile = gPrintSettings.printToFile; 1.241 + gOriginalNumCopies = gPrintSettings.numCopies; 1.242 + 1.243 + print_copies = gPrintSettings.numCopies; 1.244 + print_frametype = gPrintSettings.printFrameType; 1.245 + print_howToEnableUI = gPrintSettings.howToEnableFrameUI; 1.246 + print_selection_radio_enabled = gPrintSettings.GetPrintOptions(gPrintSetInterface.kEnableSelectionRB); 1.247 + } 1.248 + 1.249 + if (doDebug) { 1.250 + dump("loadDialog*********************************************\n"); 1.251 + dump("print_tofile "+print_tofile+"\n"); 1.252 + dump("print_frame "+print_frametype+"\n"); 1.253 + dump("print_howToEnableUI "+print_howToEnableUI+"\n"); 1.254 + dump("selection_radio_enabled "+print_selection_radio_enabled+"\n"); 1.255 + } 1.256 + 1.257 + dialog.printrangeGroup.selectedItem = dialog.allpagesRadio; 1.258 + if (print_selection_radio_enabled) { 1.259 + dialog.selectionRadio.removeAttribute("disabled"); 1.260 + } else { 1.261 + dialog.selectionRadio.setAttribute("disabled","true"); 1.262 + } 1.263 + doPrintRange(dialog.rangeRadio.selected); 1.264 + dialog.frompageInput.value = 1; 1.265 + dialog.topageInput.value = 1; 1.266 + dialog.numCopiesInput.value = print_copies; 1.267 + 1.268 + if (doDebug) { 1.269 + dump("print_howToEnableUI: "+print_howToEnableUI+"\n"); 1.270 + } 1.271 + 1.272 + // print frame 1.273 + if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAll) { 1.274 + dialog.aslaidoutRadio.removeAttribute("disabled"); 1.275 + 1.276 + dialog.selectedframeRadio.removeAttribute("disabled"); 1.277 + dialog.eachframesepRadio.removeAttribute("disabled"); 1.278 + dialog.printframeGroupLabel.removeAttribute("disabled"); 1.279 + 1.280 + // initialize radio group 1.281 + dialog.printframeGroup.selectedItem = dialog.selectedframeRadio; 1.282 + 1.283 + } else if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAsIsAndEach) { 1.284 + dialog.aslaidoutRadio.removeAttribute("disabled"); //enable 1.285 + 1.286 + dialog.selectedframeRadio.setAttribute("disabled","true"); // disable 1.287 + dialog.eachframesepRadio.removeAttribute("disabled"); // enable 1.288 + dialog.printframeGroupLabel.removeAttribute("disabled"); // enable 1.289 + 1.290 + // initialize 1.291 + dialog.printframeGroup.selectedItem = dialog.eachframesepRadio; 1.292 + 1.293 + } else { 1.294 + dialog.aslaidoutRadio.setAttribute("disabled","true"); 1.295 + dialog.selectedframeRadio.setAttribute("disabled","true"); 1.296 + dialog.eachframesepRadio.setAttribute("disabled","true"); 1.297 + dialog.printframeGroupLabel.setAttribute("disabled","true"); 1.298 + } 1.299 + 1.300 + dialog.printButton.label = dialog.printName.getAttribute("label"); 1.301 +} 1.302 + 1.303 +//--------------------------------------------------- 1.304 +function onLoad() 1.305 +{ 1.306 + // Init dialog. 1.307 + initDialog(); 1.308 + 1.309 + // param[0]: nsIPrintSettings object 1.310 + // param[1]: container for return value (1 = print, 0 = cancel) 1.311 + 1.312 + gPrintSettings = window.arguments[0].QueryInterface(gPrintSetInterface); 1.313 + gWebBrowserPrint = window.arguments[1].QueryInterface(Components.interfaces.nsIWebBrowserPrint); 1.314 + paramBlock = window.arguments[2].QueryInterface(Components.interfaces.nsIDialogParamBlock); 1.315 + 1.316 + // default return value is "cancel" 1.317 + paramBlock.SetInt(0, 0); 1.318 + 1.319 + loadDialog(); 1.320 +} 1.321 + 1.322 +//--------------------------------------------------- 1.323 +function onAccept() 1.324 +{ 1.325 + if (gPrintSettings != null) { 1.326 + var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone; 1.327 + 1.328 + // save these out so they can be picked up by the device spec 1.329 + gPrintSettings.printerName = dialog.printerList.value; 1.330 + print_howToEnableUI = gPrintSettings.howToEnableFrameUI; 1.331 + gPrintSettings.printToFile = dialog.fileCheck.checked; 1.332 + 1.333 + if (gPrintSettings.printToFile && !chooseFile()) 1.334 + return false; 1.335 + 1.336 + if (dialog.allpagesRadio.selected) { 1.337 + gPrintSettings.printRange = gPrintSetInterface.kRangeAllPages; 1.338 + } else if (dialog.rangeRadio.selected) { 1.339 + gPrintSettings.printRange = gPrintSetInterface.kRangeSpecifiedPageRange; 1.340 + } else if (dialog.selectionRadio.selected) { 1.341 + gPrintSettings.printRange = gPrintSetInterface.kRangeSelection; 1.342 + } 1.343 + gPrintSettings.startPageRange = dialog.frompageInput.value; 1.344 + gPrintSettings.endPageRange = dialog.topageInput.value; 1.345 + gPrintSettings.numCopies = dialog.numCopiesInput.value; 1.346 + 1.347 + var frametype = gPrintSetInterface.kNoFrames; 1.348 + if (print_howToEnableUI != gPrintSetInterface.kFrameEnableNone) { 1.349 + if (dialog.aslaidoutRadio.selected) { 1.350 + frametype = gPrintSetInterface.kFramesAsIs; 1.351 + } else if (dialog.selectedframeRadio.selected) { 1.352 + frametype = gPrintSetInterface.kSelectedFrame; 1.353 + } else if (dialog.eachframesepRadio.selected) { 1.354 + frametype = gPrintSetInterface.kEachFrameSep; 1.355 + } else { 1.356 + frametype = gPrintSetInterface.kSelectedFrame; 1.357 + } 1.358 + } 1.359 + gPrintSettings.printFrameType = frametype; 1.360 + if (doDebug) { 1.361 + dump("onAccept*********************************************\n"); 1.362 + dump("frametype "+frametype+"\n"); 1.363 + dump("numCopies "+gPrintSettings.numCopies+"\n"); 1.364 + dump("printRange "+gPrintSettings.printRange+"\n"); 1.365 + dump("printerName "+gPrintSettings.printerName+"\n"); 1.366 + dump("startPageRange "+gPrintSettings.startPageRange+"\n"); 1.367 + dump("endPageRange "+gPrintSettings.endPageRange+"\n"); 1.368 + dump("printToFile "+gPrintSettings.printToFile+"\n"); 1.369 + } 1.370 + } 1.371 + 1.372 + var saveToPrefs = false; 1.373 + 1.374 + saveToPrefs = gPrefs.getBoolPref("print.save_print_settings"); 1.375 + 1.376 + if (saveToPrefs && printService != null) { 1.377 + var flags = gPrintSetInterface.kInitSavePaperSize | 1.378 + gPrintSetInterface.kInitSaveColorSpace | 1.379 + gPrintSetInterface.kInitSaveEdges | 1.380 + gPrintSetInterface.kInitSaveInColor | 1.381 + gPrintSetInterface.kInitSaveResolutionName | 1.382 + gPrintSetInterface.kInitSaveDownloadFonts | 1.383 + gPrintSetInterface.kInitSavePrintCommand | 1.384 + gPrintSetInterface.kInitSaveShrinkToFit | 1.385 + gPrintSetInterface.kInitSaveScaling; 1.386 + printService.savePrintSettingsToPrefs(gPrintSettings, true, flags); 1.387 + } 1.388 + 1.389 + // set return value to "print" 1.390 + if (paramBlock) { 1.391 + paramBlock.SetInt(0, 1); 1.392 + } else { 1.393 + dump("*** FATAL ERROR: No paramBlock\n"); 1.394 + } 1.395 + 1.396 + return true; 1.397 +} 1.398 + 1.399 +//--------------------------------------------------- 1.400 +function onCancel() 1.401 +{ 1.402 + // set return value to "cancel" 1.403 + if (paramBlock) { 1.404 + paramBlock.SetInt(0, 0); 1.405 + } else { 1.406 + dump("*** FATAL ERROR: No paramBlock\n"); 1.407 + } 1.408 + 1.409 + return true; 1.410 +} 1.411 + 1.412 +//--------------------------------------------------- 1.413 +const nsIFilePicker = Components.interfaces.nsIFilePicker; 1.414 +function chooseFile() 1.415 +{ 1.416 + try { 1.417 + var fp = Components.classes["@mozilla.org/filepicker;1"] 1.418 + .createInstance(nsIFilePicker); 1.419 + fp.init(window, dialog.fpDialog.getAttribute("label"), nsIFilePicker.modeSave); 1.420 + fp.appendFilters(nsIFilePicker.filterAll); 1.421 + if (fp.show() != Components.interfaces.nsIFilePicker.returnCancel && 1.422 + fp.file && fp.file.path) { 1.423 + gPrintSettings.toFileName = fp.file.path; 1.424 + return true; 1.425 + } 1.426 + } catch(ex) { 1.427 + dump(ex); 1.428 + } 1.429 + 1.430 + return false; 1.431 +} 1.432 +