|
1 // -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- |
|
2 |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 var dialog; |
|
8 var printService = null; |
|
9 var gOriginalNumCopies = 1; |
|
10 |
|
11 var paramBlock; |
|
12 var gPrefs = null; |
|
13 var gPrintSettings = null; |
|
14 var gWebBrowserPrint = null; |
|
15 var gPrintSetInterface = Components.interfaces.nsIPrintSettings; |
|
16 var doDebug = false; |
|
17 |
|
18 //--------------------------------------------------- |
|
19 function initDialog() |
|
20 { |
|
21 dialog = new Object; |
|
22 |
|
23 dialog.propertiesButton = document.getElementById("properties"); |
|
24 dialog.descText = document.getElementById("descText"); |
|
25 |
|
26 dialog.printrangeGroup = document.getElementById("printrangeGroup"); |
|
27 dialog.allpagesRadio = document.getElementById("allpagesRadio"); |
|
28 dialog.rangeRadio = document.getElementById("rangeRadio"); |
|
29 dialog.selectionRadio = document.getElementById("selectionRadio"); |
|
30 dialog.frompageInput = document.getElementById("frompageInput"); |
|
31 dialog.frompageLabel = document.getElementById("frompageLabel"); |
|
32 dialog.topageInput = document.getElementById("topageInput"); |
|
33 dialog.topageLabel = document.getElementById("topageLabel"); |
|
34 |
|
35 dialog.numCopiesInput = document.getElementById("numCopiesInput"); |
|
36 |
|
37 dialog.printframeGroup = document.getElementById("printframeGroup"); |
|
38 dialog.aslaidoutRadio = document.getElementById("aslaidoutRadio"); |
|
39 dialog.selectedframeRadio = document.getElementById("selectedframeRadio"); |
|
40 dialog.eachframesepRadio = document.getElementById("eachframesepRadio"); |
|
41 dialog.printframeGroupLabel = document.getElementById("printframeGroupLabel"); |
|
42 |
|
43 dialog.fileCheck = document.getElementById("fileCheck"); |
|
44 dialog.printerLabel = document.getElementById("printerLabel"); |
|
45 dialog.printerList = document.getElementById("printerList"); |
|
46 |
|
47 dialog.printButton = document.documentElement.getButton("accept"); |
|
48 |
|
49 // <data> elements |
|
50 dialog.printName = document.getElementById("printButton"); |
|
51 dialog.fpDialog = document.getElementById("fpDialog"); |
|
52 |
|
53 dialog.enabled = false; |
|
54 } |
|
55 |
|
56 //--------------------------------------------------- |
|
57 function checkInteger(element) |
|
58 { |
|
59 var value = element.value; |
|
60 if (value && value.length > 0) { |
|
61 value = value.replace(/[^0-9]/g,""); |
|
62 if (!value) value = ""; |
|
63 element.value = value; |
|
64 } |
|
65 if (!value || value < 1 || value > 999) |
|
66 dialog.printButton.setAttribute("disabled","true"); |
|
67 else |
|
68 dialog.printButton.removeAttribute("disabled"); |
|
69 } |
|
70 |
|
71 //--------------------------------------------------- |
|
72 function stripTrailingWhitespace(element) |
|
73 { |
|
74 var value = element.value; |
|
75 value = value.replace(/\s+$/,""); |
|
76 element.value = value; |
|
77 } |
|
78 |
|
79 //--------------------------------------------------- |
|
80 function getPrinterDescription(printerName) |
|
81 { |
|
82 var s = ""; |
|
83 |
|
84 try { |
|
85 /* This may not work with non-ASCII test (see bug 235763 comment #16) */ |
|
86 s = gPrefs.getCharPref("print.printer_" + printerName + ".printer_description") |
|
87 } catch(e) { |
|
88 } |
|
89 |
|
90 return s; |
|
91 } |
|
92 |
|
93 //--------------------------------------------------- |
|
94 function listElement(aListElement) |
|
95 { |
|
96 this.listElement = aListElement; |
|
97 } |
|
98 |
|
99 listElement.prototype = |
|
100 { |
|
101 clearList: |
|
102 function () |
|
103 { |
|
104 // remove the menupopup node child of the menulist. |
|
105 var popup = this.listElement.firstChild; |
|
106 if (popup) { |
|
107 this.listElement.removeChild(popup); |
|
108 } |
|
109 }, |
|
110 |
|
111 appendPrinterNames: |
|
112 function (aDataObject) |
|
113 { |
|
114 if ((null == aDataObject) || !aDataObject.hasMore()) { |
|
115 // disable dialog |
|
116 this.listElement.setAttribute("value", ""); |
|
117 this.listElement.setAttribute("label", |
|
118 document.getElementById("printingBundle") |
|
119 .getString("noprinter")); |
|
120 |
|
121 this.listElement.setAttribute("disabled", "true"); |
|
122 dialog.printerLabel.setAttribute("disabled","true"); |
|
123 dialog.propertiesButton.setAttribute("disabled","true"); |
|
124 dialog.fileCheck.setAttribute("disabled","true"); |
|
125 dialog.printButton.setAttribute("disabled","true"); |
|
126 } |
|
127 else { |
|
128 // build popup menu from printer names |
|
129 var list = document.getElementById("printerList"); |
|
130 do { |
|
131 printerNameStr = aDataObject.getNext(); |
|
132 list.appendItem(printerNameStr, printerNameStr, getPrinterDescription(printerNameStr)); |
|
133 } while (aDataObject.hasMore()); |
|
134 this.listElement.removeAttribute("disabled"); |
|
135 } |
|
136 } |
|
137 }; |
|
138 |
|
139 //--------------------------------------------------- |
|
140 function getPrinters() |
|
141 { |
|
142 var selectElement = new listElement(dialog.printerList); |
|
143 selectElement.clearList(); |
|
144 |
|
145 var printerEnumerator; |
|
146 try { |
|
147 printerEnumerator = |
|
148 Components.classes["@mozilla.org/gfx/printerenumerator;1"] |
|
149 .getService(Components.interfaces.nsIPrinterEnumerator) |
|
150 .printerNameList; |
|
151 } catch(e) { printerEnumerator = null; } |
|
152 |
|
153 selectElement.appendPrinterNames(printerEnumerator); |
|
154 selectElement.listElement.value = printService.defaultPrinterName; |
|
155 |
|
156 // make sure we load the prefs for the initially selected printer |
|
157 setPrinterDefaultsForSelectedPrinter(); |
|
158 } |
|
159 |
|
160 |
|
161 //--------------------------------------------------- |
|
162 // update gPrintSettings with the defaults for the selected printer |
|
163 function setPrinterDefaultsForSelectedPrinter() |
|
164 { |
|
165 gPrintSettings.printerName = dialog.printerList.value; |
|
166 |
|
167 dialog.descText.value = getPrinterDescription(gPrintSettings.printerName); |
|
168 |
|
169 // First get any defaults from the printer |
|
170 printService.initPrintSettingsFromPrinter(gPrintSettings.printerName, gPrintSettings); |
|
171 |
|
172 // now augment them with any values from last time |
|
173 printService.initPrintSettingsFromPrefs(gPrintSettings, true, gPrintSetInterface.kInitSaveAll); |
|
174 |
|
175 if (doDebug) { |
|
176 dump("setPrinterDefaultsForSelectedPrinter: printerName='"+gPrintSettings.printerName+"', paperName='"+gPrintSettings.paperName+"'\n"); |
|
177 } |
|
178 } |
|
179 |
|
180 //--------------------------------------------------- |
|
181 function displayPropertiesDialog() |
|
182 { |
|
183 gPrintSettings.numCopies = dialog.numCopiesInput.value; |
|
184 try { |
|
185 var printingPromptService = Components.classes["@mozilla.org/embedcomp/printingprompt-service;1"] |
|
186 .getService(Components.interfaces.nsIPrintingPromptService); |
|
187 if (printingPromptService) { |
|
188 printingPromptService.showPrinterProperties(null, dialog.printerList.value, gPrintSettings); |
|
189 dialog.numCopiesInput.value = gPrintSettings.numCopies; |
|
190 } |
|
191 } catch(e) { |
|
192 dump("problems getting printingPromptService\n"); |
|
193 } |
|
194 } |
|
195 |
|
196 //--------------------------------------------------- |
|
197 function doPrintRange(inx) |
|
198 { |
|
199 if (inx == 1) { |
|
200 dialog.frompageInput.removeAttribute("disabled"); |
|
201 dialog.frompageLabel.removeAttribute("disabled"); |
|
202 dialog.topageInput.removeAttribute("disabled"); |
|
203 dialog.topageLabel.removeAttribute("disabled"); |
|
204 } else { |
|
205 dialog.frompageInput.setAttribute("disabled","true"); |
|
206 dialog.frompageLabel.setAttribute("disabled","true"); |
|
207 dialog.topageInput.setAttribute("disabled","true"); |
|
208 dialog.topageLabel.setAttribute("disabled","true"); |
|
209 } |
|
210 } |
|
211 |
|
212 //--------------------------------------------------- |
|
213 function loadDialog() |
|
214 { |
|
215 var print_copies = 1; |
|
216 var print_selection_radio_enabled = false; |
|
217 var print_frametype = gPrintSetInterface.kSelectedFrame; |
|
218 var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone; |
|
219 var print_tofile = ""; |
|
220 |
|
221 try { |
|
222 gPrefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); |
|
223 |
|
224 printService = Components.classes["@mozilla.org/gfx/printsettings-service;1"]; |
|
225 if (printService) { |
|
226 printService = printService.getService(); |
|
227 if (printService) { |
|
228 printService = printService.QueryInterface(Components.interfaces.nsIPrintSettingsService); |
|
229 } |
|
230 } |
|
231 } catch(e) {} |
|
232 |
|
233 // Note: getPrinters sets up the PrintToFile control |
|
234 getPrinters(); |
|
235 |
|
236 if (gPrintSettings) { |
|
237 print_tofile = gPrintSettings.printToFile; |
|
238 gOriginalNumCopies = gPrintSettings.numCopies; |
|
239 |
|
240 print_copies = gPrintSettings.numCopies; |
|
241 print_frametype = gPrintSettings.printFrameType; |
|
242 print_howToEnableUI = gPrintSettings.howToEnableFrameUI; |
|
243 print_selection_radio_enabled = gPrintSettings.GetPrintOptions(gPrintSetInterface.kEnableSelectionRB); |
|
244 } |
|
245 |
|
246 if (doDebug) { |
|
247 dump("loadDialog*********************************************\n"); |
|
248 dump("print_tofile "+print_tofile+"\n"); |
|
249 dump("print_frame "+print_frametype+"\n"); |
|
250 dump("print_howToEnableUI "+print_howToEnableUI+"\n"); |
|
251 dump("selection_radio_enabled "+print_selection_radio_enabled+"\n"); |
|
252 } |
|
253 |
|
254 dialog.printrangeGroup.selectedItem = dialog.allpagesRadio; |
|
255 if (print_selection_radio_enabled) { |
|
256 dialog.selectionRadio.removeAttribute("disabled"); |
|
257 } else { |
|
258 dialog.selectionRadio.setAttribute("disabled","true"); |
|
259 } |
|
260 doPrintRange(dialog.rangeRadio.selected); |
|
261 dialog.frompageInput.value = 1; |
|
262 dialog.topageInput.value = 1; |
|
263 dialog.numCopiesInput.value = print_copies; |
|
264 |
|
265 if (doDebug) { |
|
266 dump("print_howToEnableUI: "+print_howToEnableUI+"\n"); |
|
267 } |
|
268 |
|
269 // print frame |
|
270 if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAll) { |
|
271 dialog.aslaidoutRadio.removeAttribute("disabled"); |
|
272 |
|
273 dialog.selectedframeRadio.removeAttribute("disabled"); |
|
274 dialog.eachframesepRadio.removeAttribute("disabled"); |
|
275 dialog.printframeGroupLabel.removeAttribute("disabled"); |
|
276 |
|
277 // initialize radio group |
|
278 dialog.printframeGroup.selectedItem = dialog.selectedframeRadio; |
|
279 |
|
280 } else if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAsIsAndEach) { |
|
281 dialog.aslaidoutRadio.removeAttribute("disabled"); //enable |
|
282 |
|
283 dialog.selectedframeRadio.setAttribute("disabled","true"); // disable |
|
284 dialog.eachframesepRadio.removeAttribute("disabled"); // enable |
|
285 dialog.printframeGroupLabel.removeAttribute("disabled"); // enable |
|
286 |
|
287 // initialize |
|
288 dialog.printframeGroup.selectedItem = dialog.eachframesepRadio; |
|
289 |
|
290 } else { |
|
291 dialog.aslaidoutRadio.setAttribute("disabled","true"); |
|
292 dialog.selectedframeRadio.setAttribute("disabled","true"); |
|
293 dialog.eachframesepRadio.setAttribute("disabled","true"); |
|
294 dialog.printframeGroupLabel.setAttribute("disabled","true"); |
|
295 } |
|
296 |
|
297 dialog.printButton.label = dialog.printName.getAttribute("label"); |
|
298 } |
|
299 |
|
300 //--------------------------------------------------- |
|
301 function onLoad() |
|
302 { |
|
303 // Init dialog. |
|
304 initDialog(); |
|
305 |
|
306 // param[0]: nsIPrintSettings object |
|
307 // param[1]: container for return value (1 = print, 0 = cancel) |
|
308 |
|
309 gPrintSettings = window.arguments[0].QueryInterface(gPrintSetInterface); |
|
310 gWebBrowserPrint = window.arguments[1].QueryInterface(Components.interfaces.nsIWebBrowserPrint); |
|
311 paramBlock = window.arguments[2].QueryInterface(Components.interfaces.nsIDialogParamBlock); |
|
312 |
|
313 // default return value is "cancel" |
|
314 paramBlock.SetInt(0, 0); |
|
315 |
|
316 loadDialog(); |
|
317 } |
|
318 |
|
319 //--------------------------------------------------- |
|
320 function onAccept() |
|
321 { |
|
322 if (gPrintSettings != null) { |
|
323 var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone; |
|
324 |
|
325 // save these out so they can be picked up by the device spec |
|
326 gPrintSettings.printerName = dialog.printerList.value; |
|
327 print_howToEnableUI = gPrintSettings.howToEnableFrameUI; |
|
328 gPrintSettings.printToFile = dialog.fileCheck.checked; |
|
329 |
|
330 if (gPrintSettings.printToFile && !chooseFile()) |
|
331 return false; |
|
332 |
|
333 if (dialog.allpagesRadio.selected) { |
|
334 gPrintSettings.printRange = gPrintSetInterface.kRangeAllPages; |
|
335 } else if (dialog.rangeRadio.selected) { |
|
336 gPrintSettings.printRange = gPrintSetInterface.kRangeSpecifiedPageRange; |
|
337 } else if (dialog.selectionRadio.selected) { |
|
338 gPrintSettings.printRange = gPrintSetInterface.kRangeSelection; |
|
339 } |
|
340 gPrintSettings.startPageRange = dialog.frompageInput.value; |
|
341 gPrintSettings.endPageRange = dialog.topageInput.value; |
|
342 gPrintSettings.numCopies = dialog.numCopiesInput.value; |
|
343 |
|
344 var frametype = gPrintSetInterface.kNoFrames; |
|
345 if (print_howToEnableUI != gPrintSetInterface.kFrameEnableNone) { |
|
346 if (dialog.aslaidoutRadio.selected) { |
|
347 frametype = gPrintSetInterface.kFramesAsIs; |
|
348 } else if (dialog.selectedframeRadio.selected) { |
|
349 frametype = gPrintSetInterface.kSelectedFrame; |
|
350 } else if (dialog.eachframesepRadio.selected) { |
|
351 frametype = gPrintSetInterface.kEachFrameSep; |
|
352 } else { |
|
353 frametype = gPrintSetInterface.kSelectedFrame; |
|
354 } |
|
355 } |
|
356 gPrintSettings.printFrameType = frametype; |
|
357 if (doDebug) { |
|
358 dump("onAccept*********************************************\n"); |
|
359 dump("frametype "+frametype+"\n"); |
|
360 dump("numCopies "+gPrintSettings.numCopies+"\n"); |
|
361 dump("printRange "+gPrintSettings.printRange+"\n"); |
|
362 dump("printerName "+gPrintSettings.printerName+"\n"); |
|
363 dump("startPageRange "+gPrintSettings.startPageRange+"\n"); |
|
364 dump("endPageRange "+gPrintSettings.endPageRange+"\n"); |
|
365 dump("printToFile "+gPrintSettings.printToFile+"\n"); |
|
366 } |
|
367 } |
|
368 |
|
369 var saveToPrefs = false; |
|
370 |
|
371 saveToPrefs = gPrefs.getBoolPref("print.save_print_settings"); |
|
372 |
|
373 if (saveToPrefs && printService != null) { |
|
374 var flags = gPrintSetInterface.kInitSavePaperSize | |
|
375 gPrintSetInterface.kInitSaveColorSpace | |
|
376 gPrintSetInterface.kInitSaveEdges | |
|
377 gPrintSetInterface.kInitSaveInColor | |
|
378 gPrintSetInterface.kInitSaveResolutionName | |
|
379 gPrintSetInterface.kInitSaveDownloadFonts | |
|
380 gPrintSetInterface.kInitSavePrintCommand | |
|
381 gPrintSetInterface.kInitSaveShrinkToFit | |
|
382 gPrintSetInterface.kInitSaveScaling; |
|
383 printService.savePrintSettingsToPrefs(gPrintSettings, true, flags); |
|
384 } |
|
385 |
|
386 // set return value to "print" |
|
387 if (paramBlock) { |
|
388 paramBlock.SetInt(0, 1); |
|
389 } else { |
|
390 dump("*** FATAL ERROR: No paramBlock\n"); |
|
391 } |
|
392 |
|
393 return true; |
|
394 } |
|
395 |
|
396 //--------------------------------------------------- |
|
397 function onCancel() |
|
398 { |
|
399 // set return value to "cancel" |
|
400 if (paramBlock) { |
|
401 paramBlock.SetInt(0, 0); |
|
402 } else { |
|
403 dump("*** FATAL ERROR: No paramBlock\n"); |
|
404 } |
|
405 |
|
406 return true; |
|
407 } |
|
408 |
|
409 //--------------------------------------------------- |
|
410 const nsIFilePicker = Components.interfaces.nsIFilePicker; |
|
411 function chooseFile() |
|
412 { |
|
413 try { |
|
414 var fp = Components.classes["@mozilla.org/filepicker;1"] |
|
415 .createInstance(nsIFilePicker); |
|
416 fp.init(window, dialog.fpDialog.getAttribute("label"), nsIFilePicker.modeSave); |
|
417 fp.appendFilters(nsIFilePicker.filterAll); |
|
418 if (fp.show() != Components.interfaces.nsIFilePicker.returnCancel && |
|
419 fp.file && fp.file.path) { |
|
420 gPrintSettings.toFileName = fp.file.path; |
|
421 return true; |
|
422 } |
|
423 } catch(ex) { |
|
424 dump(ex); |
|
425 } |
|
426 |
|
427 return false; |
|
428 } |
|
429 |