michael@0: // -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- michael@0: michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: var dialog; michael@0: var printService = null; michael@0: var gOriginalNumCopies = 1; michael@0: michael@0: var paramBlock; michael@0: var gPrefs = null; michael@0: var gPrintSettings = null; michael@0: var gWebBrowserPrint = null; michael@0: var gPrintSetInterface = Components.interfaces.nsIPrintSettings; michael@0: var doDebug = false; michael@0: michael@0: //--------------------------------------------------- michael@0: function initDialog() michael@0: { michael@0: dialog = new Object; michael@0: michael@0: dialog.propertiesButton = document.getElementById("properties"); michael@0: dialog.descText = document.getElementById("descText"); michael@0: michael@0: dialog.printrangeGroup = document.getElementById("printrangeGroup"); michael@0: dialog.allpagesRadio = document.getElementById("allpagesRadio"); michael@0: dialog.rangeRadio = document.getElementById("rangeRadio"); michael@0: dialog.selectionRadio = document.getElementById("selectionRadio"); michael@0: dialog.frompageInput = document.getElementById("frompageInput"); michael@0: dialog.frompageLabel = document.getElementById("frompageLabel"); michael@0: dialog.topageInput = document.getElementById("topageInput"); michael@0: dialog.topageLabel = document.getElementById("topageLabel"); michael@0: michael@0: dialog.numCopiesInput = document.getElementById("numCopiesInput"); michael@0: michael@0: dialog.printframeGroup = document.getElementById("printframeGroup"); michael@0: dialog.aslaidoutRadio = document.getElementById("aslaidoutRadio"); michael@0: dialog.selectedframeRadio = document.getElementById("selectedframeRadio"); michael@0: dialog.eachframesepRadio = document.getElementById("eachframesepRadio"); michael@0: dialog.printframeGroupLabel = document.getElementById("printframeGroupLabel"); michael@0: michael@0: dialog.fileCheck = document.getElementById("fileCheck"); michael@0: dialog.printerLabel = document.getElementById("printerLabel"); michael@0: dialog.printerList = document.getElementById("printerList"); michael@0: michael@0: dialog.printButton = document.documentElement.getButton("accept"); michael@0: michael@0: // elements michael@0: dialog.printName = document.getElementById("printButton"); michael@0: dialog.fpDialog = document.getElementById("fpDialog"); michael@0: michael@0: dialog.enabled = false; michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: function checkInteger(element) michael@0: { michael@0: var value = element.value; michael@0: if (value && value.length > 0) { michael@0: value = value.replace(/[^0-9]/g,""); michael@0: if (!value) value = ""; michael@0: element.value = value; michael@0: } michael@0: if (!value || value < 1 || value > 999) michael@0: dialog.printButton.setAttribute("disabled","true"); michael@0: else michael@0: dialog.printButton.removeAttribute("disabled"); michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: function stripTrailingWhitespace(element) michael@0: { michael@0: var value = element.value; michael@0: value = value.replace(/\s+$/,""); michael@0: element.value = value; michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: function getPrinterDescription(printerName) michael@0: { michael@0: var s = ""; michael@0: michael@0: try { michael@0: /* This may not work with non-ASCII test (see bug 235763 comment #16) */ michael@0: s = gPrefs.getCharPref("print.printer_" + printerName + ".printer_description") michael@0: } catch(e) { michael@0: } michael@0: michael@0: return s; michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: function listElement(aListElement) michael@0: { michael@0: this.listElement = aListElement; michael@0: } michael@0: michael@0: listElement.prototype = michael@0: { michael@0: clearList: michael@0: function () michael@0: { michael@0: // remove the menupopup node child of the menulist. michael@0: var popup = this.listElement.firstChild; michael@0: if (popup) { michael@0: this.listElement.removeChild(popup); michael@0: } michael@0: }, michael@0: michael@0: appendPrinterNames: michael@0: function (aDataObject) michael@0: { michael@0: if ((null == aDataObject) || !aDataObject.hasMore()) { michael@0: // disable dialog michael@0: this.listElement.setAttribute("value", ""); michael@0: this.listElement.setAttribute("label", michael@0: document.getElementById("printingBundle") michael@0: .getString("noprinter")); michael@0: michael@0: this.listElement.setAttribute("disabled", "true"); michael@0: dialog.printerLabel.setAttribute("disabled","true"); michael@0: dialog.propertiesButton.setAttribute("disabled","true"); michael@0: dialog.fileCheck.setAttribute("disabled","true"); michael@0: dialog.printButton.setAttribute("disabled","true"); michael@0: } michael@0: else { michael@0: // build popup menu from printer names michael@0: var list = document.getElementById("printerList"); michael@0: do { michael@0: printerNameStr = aDataObject.getNext(); michael@0: list.appendItem(printerNameStr, printerNameStr, getPrinterDescription(printerNameStr)); michael@0: } while (aDataObject.hasMore()); michael@0: this.listElement.removeAttribute("disabled"); michael@0: } michael@0: } michael@0: }; michael@0: michael@0: //--------------------------------------------------- michael@0: function getPrinters() michael@0: { michael@0: var selectElement = new listElement(dialog.printerList); michael@0: selectElement.clearList(); michael@0: michael@0: var printerEnumerator; michael@0: try { michael@0: printerEnumerator = michael@0: Components.classes["@mozilla.org/gfx/printerenumerator;1"] michael@0: .getService(Components.interfaces.nsIPrinterEnumerator) michael@0: .printerNameList; michael@0: } catch(e) { printerEnumerator = null; } michael@0: michael@0: selectElement.appendPrinterNames(printerEnumerator); michael@0: selectElement.listElement.value = printService.defaultPrinterName; michael@0: michael@0: // make sure we load the prefs for the initially selected printer michael@0: setPrinterDefaultsForSelectedPrinter(); michael@0: } michael@0: michael@0: michael@0: //--------------------------------------------------- michael@0: // update gPrintSettings with the defaults for the selected printer michael@0: function setPrinterDefaultsForSelectedPrinter() michael@0: { michael@0: gPrintSettings.printerName = dialog.printerList.value; michael@0: michael@0: dialog.descText.value = getPrinterDescription(gPrintSettings.printerName); michael@0: michael@0: // First get any defaults from the printer michael@0: printService.initPrintSettingsFromPrinter(gPrintSettings.printerName, gPrintSettings); michael@0: michael@0: // now augment them with any values from last time michael@0: printService.initPrintSettingsFromPrefs(gPrintSettings, true, gPrintSetInterface.kInitSaveAll); michael@0: michael@0: if (doDebug) { michael@0: dump("setPrinterDefaultsForSelectedPrinter: printerName='"+gPrintSettings.printerName+"', paperName='"+gPrintSettings.paperName+"'\n"); michael@0: } michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: function displayPropertiesDialog() michael@0: { michael@0: gPrintSettings.numCopies = dialog.numCopiesInput.value; michael@0: try { michael@0: var printingPromptService = Components.classes["@mozilla.org/embedcomp/printingprompt-service;1"] michael@0: .getService(Components.interfaces.nsIPrintingPromptService); michael@0: if (printingPromptService) { michael@0: printingPromptService.showPrinterProperties(null, dialog.printerList.value, gPrintSettings); michael@0: dialog.numCopiesInput.value = gPrintSettings.numCopies; michael@0: } michael@0: } catch(e) { michael@0: dump("problems getting printingPromptService\n"); michael@0: } michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: function doPrintRange(inx) michael@0: { michael@0: if (inx == 1) { michael@0: dialog.frompageInput.removeAttribute("disabled"); michael@0: dialog.frompageLabel.removeAttribute("disabled"); michael@0: dialog.topageInput.removeAttribute("disabled"); michael@0: dialog.topageLabel.removeAttribute("disabled"); michael@0: } else { michael@0: dialog.frompageInput.setAttribute("disabled","true"); michael@0: dialog.frompageLabel.setAttribute("disabled","true"); michael@0: dialog.topageInput.setAttribute("disabled","true"); michael@0: dialog.topageLabel.setAttribute("disabled","true"); michael@0: } michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: function loadDialog() michael@0: { michael@0: var print_copies = 1; michael@0: var print_selection_radio_enabled = false; michael@0: var print_frametype = gPrintSetInterface.kSelectedFrame; michael@0: var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone; michael@0: var print_tofile = ""; michael@0: michael@0: try { michael@0: gPrefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); michael@0: michael@0: printService = Components.classes["@mozilla.org/gfx/printsettings-service;1"]; michael@0: if (printService) { michael@0: printService = printService.getService(); michael@0: if (printService) { michael@0: printService = printService.QueryInterface(Components.interfaces.nsIPrintSettingsService); michael@0: } michael@0: } michael@0: } catch(e) {} michael@0: michael@0: // Note: getPrinters sets up the PrintToFile control michael@0: getPrinters(); michael@0: michael@0: if (gPrintSettings) { michael@0: print_tofile = gPrintSettings.printToFile; michael@0: gOriginalNumCopies = gPrintSettings.numCopies; michael@0: michael@0: print_copies = gPrintSettings.numCopies; michael@0: print_frametype = gPrintSettings.printFrameType; michael@0: print_howToEnableUI = gPrintSettings.howToEnableFrameUI; michael@0: print_selection_radio_enabled = gPrintSettings.GetPrintOptions(gPrintSetInterface.kEnableSelectionRB); michael@0: } michael@0: michael@0: if (doDebug) { michael@0: dump("loadDialog*********************************************\n"); michael@0: dump("print_tofile "+print_tofile+"\n"); michael@0: dump("print_frame "+print_frametype+"\n"); michael@0: dump("print_howToEnableUI "+print_howToEnableUI+"\n"); michael@0: dump("selection_radio_enabled "+print_selection_radio_enabled+"\n"); michael@0: } michael@0: michael@0: dialog.printrangeGroup.selectedItem = dialog.allpagesRadio; michael@0: if (print_selection_radio_enabled) { michael@0: dialog.selectionRadio.removeAttribute("disabled"); michael@0: } else { michael@0: dialog.selectionRadio.setAttribute("disabled","true"); michael@0: } michael@0: doPrintRange(dialog.rangeRadio.selected); michael@0: dialog.frompageInput.value = 1; michael@0: dialog.topageInput.value = 1; michael@0: dialog.numCopiesInput.value = print_copies; michael@0: michael@0: if (doDebug) { michael@0: dump("print_howToEnableUI: "+print_howToEnableUI+"\n"); michael@0: } michael@0: michael@0: // print frame michael@0: if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAll) { michael@0: dialog.aslaidoutRadio.removeAttribute("disabled"); michael@0: michael@0: dialog.selectedframeRadio.removeAttribute("disabled"); michael@0: dialog.eachframesepRadio.removeAttribute("disabled"); michael@0: dialog.printframeGroupLabel.removeAttribute("disabled"); michael@0: michael@0: // initialize radio group michael@0: dialog.printframeGroup.selectedItem = dialog.selectedframeRadio; michael@0: michael@0: } else if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAsIsAndEach) { michael@0: dialog.aslaidoutRadio.removeAttribute("disabled"); //enable michael@0: michael@0: dialog.selectedframeRadio.setAttribute("disabled","true"); // disable michael@0: dialog.eachframesepRadio.removeAttribute("disabled"); // enable michael@0: dialog.printframeGroupLabel.removeAttribute("disabled"); // enable michael@0: michael@0: // initialize michael@0: dialog.printframeGroup.selectedItem = dialog.eachframesepRadio; michael@0: michael@0: } else { michael@0: dialog.aslaidoutRadio.setAttribute("disabled","true"); michael@0: dialog.selectedframeRadio.setAttribute("disabled","true"); michael@0: dialog.eachframesepRadio.setAttribute("disabled","true"); michael@0: dialog.printframeGroupLabel.setAttribute("disabled","true"); michael@0: } michael@0: michael@0: dialog.printButton.label = dialog.printName.getAttribute("label"); michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: function onLoad() michael@0: { michael@0: // Init dialog. michael@0: initDialog(); michael@0: michael@0: // param[0]: nsIPrintSettings object michael@0: // param[1]: container for return value (1 = print, 0 = cancel) michael@0: michael@0: gPrintSettings = window.arguments[0].QueryInterface(gPrintSetInterface); michael@0: gWebBrowserPrint = window.arguments[1].QueryInterface(Components.interfaces.nsIWebBrowserPrint); michael@0: paramBlock = window.arguments[2].QueryInterface(Components.interfaces.nsIDialogParamBlock); michael@0: michael@0: // default return value is "cancel" michael@0: paramBlock.SetInt(0, 0); michael@0: michael@0: loadDialog(); michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: function onAccept() michael@0: { michael@0: if (gPrintSettings != null) { michael@0: var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone; michael@0: michael@0: // save these out so they can be picked up by the device spec michael@0: gPrintSettings.printerName = dialog.printerList.value; michael@0: print_howToEnableUI = gPrintSettings.howToEnableFrameUI; michael@0: gPrintSettings.printToFile = dialog.fileCheck.checked; michael@0: michael@0: if (gPrintSettings.printToFile && !chooseFile()) michael@0: return false; michael@0: michael@0: if (dialog.allpagesRadio.selected) { michael@0: gPrintSettings.printRange = gPrintSetInterface.kRangeAllPages; michael@0: } else if (dialog.rangeRadio.selected) { michael@0: gPrintSettings.printRange = gPrintSetInterface.kRangeSpecifiedPageRange; michael@0: } else if (dialog.selectionRadio.selected) { michael@0: gPrintSettings.printRange = gPrintSetInterface.kRangeSelection; michael@0: } michael@0: gPrintSettings.startPageRange = dialog.frompageInput.value; michael@0: gPrintSettings.endPageRange = dialog.topageInput.value; michael@0: gPrintSettings.numCopies = dialog.numCopiesInput.value; michael@0: michael@0: var frametype = gPrintSetInterface.kNoFrames; michael@0: if (print_howToEnableUI != gPrintSetInterface.kFrameEnableNone) { michael@0: if (dialog.aslaidoutRadio.selected) { michael@0: frametype = gPrintSetInterface.kFramesAsIs; michael@0: } else if (dialog.selectedframeRadio.selected) { michael@0: frametype = gPrintSetInterface.kSelectedFrame; michael@0: } else if (dialog.eachframesepRadio.selected) { michael@0: frametype = gPrintSetInterface.kEachFrameSep; michael@0: } else { michael@0: frametype = gPrintSetInterface.kSelectedFrame; michael@0: } michael@0: } michael@0: gPrintSettings.printFrameType = frametype; michael@0: if (doDebug) { michael@0: dump("onAccept*********************************************\n"); michael@0: dump("frametype "+frametype+"\n"); michael@0: dump("numCopies "+gPrintSettings.numCopies+"\n"); michael@0: dump("printRange "+gPrintSettings.printRange+"\n"); michael@0: dump("printerName "+gPrintSettings.printerName+"\n"); michael@0: dump("startPageRange "+gPrintSettings.startPageRange+"\n"); michael@0: dump("endPageRange "+gPrintSettings.endPageRange+"\n"); michael@0: dump("printToFile "+gPrintSettings.printToFile+"\n"); michael@0: } michael@0: } michael@0: michael@0: var saveToPrefs = false; michael@0: michael@0: saveToPrefs = gPrefs.getBoolPref("print.save_print_settings"); michael@0: michael@0: if (saveToPrefs && printService != null) { michael@0: var flags = gPrintSetInterface.kInitSavePaperSize | michael@0: gPrintSetInterface.kInitSaveColorSpace | michael@0: gPrintSetInterface.kInitSaveEdges | michael@0: gPrintSetInterface.kInitSaveInColor | michael@0: gPrintSetInterface.kInitSaveResolutionName | michael@0: gPrintSetInterface.kInitSaveDownloadFonts | michael@0: gPrintSetInterface.kInitSavePrintCommand | michael@0: gPrintSetInterface.kInitSaveShrinkToFit | michael@0: gPrintSetInterface.kInitSaveScaling; michael@0: printService.savePrintSettingsToPrefs(gPrintSettings, true, flags); michael@0: } michael@0: michael@0: // set return value to "print" michael@0: if (paramBlock) { michael@0: paramBlock.SetInt(0, 1); michael@0: } else { michael@0: dump("*** FATAL ERROR: No paramBlock\n"); michael@0: } michael@0: michael@0: return true; michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: function onCancel() michael@0: { michael@0: // set return value to "cancel" michael@0: if (paramBlock) { michael@0: paramBlock.SetInt(0, 0); michael@0: } else { michael@0: dump("*** FATAL ERROR: No paramBlock\n"); michael@0: } michael@0: michael@0: return true; michael@0: } michael@0: michael@0: //--------------------------------------------------- michael@0: const nsIFilePicker = Components.interfaces.nsIFilePicker; michael@0: function chooseFile() michael@0: { michael@0: try { michael@0: var fp = Components.classes["@mozilla.org/filepicker;1"] michael@0: .createInstance(nsIFilePicker); michael@0: fp.init(window, dialog.fpDialog.getAttribute("label"), nsIFilePicker.modeSave); michael@0: fp.appendFilters(nsIFilePicker.filterAll); michael@0: if (fp.show() != Components.interfaces.nsIFilePicker.returnCancel && michael@0: fp.file && fp.file.path) { michael@0: gPrintSettings.toFileName = fp.file.path; michael@0: return true; michael@0: } michael@0: } catch(ex) { michael@0: dump(ex); michael@0: } michael@0: michael@0: return false; michael@0: } michael@0: