// -*- indent-tabs-mode: nil; js-indent-level: 2 -*- /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ var dialog; var gPrintBundle; var gPrintSettings = null; var gPrintSettingsInterface = Components.interfaces.nsIPrintSettings; var gPaperArray; var gPrefs; var gPrintSetInterface = Components.interfaces.nsIPrintSettings; var doDebug = true; // --------------------------------------------------- function checkDouble(element, maxVal) { var value = element.value; if (value && value.length > 0) { value = value.replace(/[^\.|^0-9]/g, ""); if (!value) { element.value = ""; } else if (value > maxVal) { element.value = maxVal; } else { element.value = value; } } } // --------------------------------------------------- function isListOfPrinterFeaturesAvailable() { return gPrefs.getBoolPref("print.tmp.printerfeatures." + gPrintSettings.printerName + ".has_special_printerfeatures", false); } // --------------------------------------------------- function getDoubleStr(val, dec) { var str = val.toString(); var inx = str.indexOf("."); return str.substring(0, inx+dec+1); } // --------------------------------------------------- function initDialog() { gPrintBundle = document.getElementById("printBundle"); dialog = {}; dialog.paperList = document.getElementById("paperList"); dialog.paperGroup = document.getElementById("paperGroup"); dialog.jobTitleLabel = document.getElementById("jobTitleLabel"); dialog.jobTitleGroup = document.getElementById("jobTitleGroup"); dialog.jobTitleInput = document.getElementById("jobTitleInput"); dialog.colorGroup = document.getElementById("colorGroup"); dialog.colorRadioGroup = document.getElementById("colorRadioGroup"); dialog.colorRadio = document.getElementById("colorRadio"); dialog.grayRadio = document.getElementById("grayRadio"); dialog.topInput = document.getElementById("topInput"); dialog.bottomInput = document.getElementById("bottomInput"); dialog.leftInput = document.getElementById("leftInput"); dialog.rightInput = document.getElementById("rightInput"); } // --------------------------------------------------- function round10(val) { return Math.round(val * 10) / 10; } // --------------------------------------------------- function paperListElement(aPaperListElement) { this.paperListElement = aPaperListElement; } paperListElement.prototype = { clearPaperList: function () { // remove the menupopup node child of the menulist. this.paperListElement.removeChild(this.paperListElement.firstChild); }, appendPaperNames: function (aDataObject) { var popupNode = document.createElement("menupopup"); for (var i=0;i<aDataObject.length;i++) { var paperObj = aDataObject[i]; var itemNode = document.createElement("menuitem"); var label; try { label = gPrintBundle.getString(paperObj.name); } catch (e) { /* No name in string bundle ? Then build one manually (this * usually happens when gPaperArray was build by createPaperArrayFromPrinterFeatures() ...) */ if (paperObj.inches) { label = paperObj.name + " (" + round10(paperObj.width) + "x" + round10(paperObj.height) + " inch)"; } else { label = paperObj.name + " (" + paperObj.width + "x" + paperObj.height + " mm)"; } } itemNode.setAttribute("label", label); itemNode.setAttribute("value", i); popupNode.appendChild(itemNode); } this.paperListElement.appendChild(popupNode); } }; // --------------------------------------------------- function createPaperArrayFromDefaults() { var paperNames = ["letterSize", "legalSize", "exectiveSize", "a5Size", "a4Size", "a3Size", "a2Size", "a1Size", "a0Size"]; // var paperNames = ["&letterRadio.label;", "&legalRadio.label;", "&exectiveRadio.label;", "&a4Radio.label;", "&a3Radio.label;"]; var paperWidths = [ 8.5, 8.5, 7.25, 148.0, 210.0, 287.0, 420.0, 594.0, 841.0]; var paperHeights = [11.0, 14.0, 10.50, 210.0, 297.0, 420.0, 594.0, 841.0, 1189.0]; var paperInches = [true, true, true, false, false, false, false, false, false]; gPaperArray = new Array(); for (var i=0;i<paperNames.length;i++) { var obj = {}; obj.name = paperNames[i]; obj.width = paperWidths[i]; obj.height = paperHeights[i]; obj.inches = paperInches[i]; /* Calculate the width/height in millimeters */ if (paperInches[i]) { obj.width_mm = paperWidths[i] * 25.4; obj.height_mm = paperHeights[i] * 25.4; } else { obj.width_mm = paperWidths[i]; obj.height_mm = paperHeights[i]; } gPaperArray[i] = obj; } } // --------------------------------------------------- function createPaperArrayFromPrinterFeatures() { var printername = gPrintSettings.printerName; if (doDebug) { dump("createPaperArrayFromPrinterFeatures for " + printername + ".\n"); } gPaperArray = new Array(); var numPapers = gPrefs.getIntPref("print.tmp.printerfeatures." + printername + ".paper.count"); if (doDebug) { dump("processing " + numPapers + " entries...\n"); } for (var i=0;i<numPapers;i++) { var obj = {}; obj.name = gPrefs.getCharPref("print.tmp.printerfeatures." + printername + ".paper." + i + ".name"); obj.width_mm = gPrefs.getIntPref("print.tmp.printerfeatures." + printername + ".paper." + i + ".width_mm"); obj.height_mm = gPrefs.getIntPref("print.tmp.printerfeatures." + printername + ".paper." + i + ".height_mm"); obj.inches = gPrefs.getBoolPref("print.tmp.printerfeatures." + printername + ".paper." + i + ".is_inch"); /* Calculate the width/height in paper's native units (either inches or millimeters) */ if (obj.inches) { obj.width = obj.width_mm / 25.4; obj.height = obj.height_mm / 25.4; } else { obj.width = obj.width_mm; obj.height = obj.height_mm; } gPaperArray[i] = obj; if (doDebug) { dump("paper index=" + i + ", name=" + obj.name + ", width=" + obj.width + ", height=" + obj.height + ".\n"); } } } // --------------------------------------------------- function createPaperArray() { if (isListOfPrinterFeaturesAvailable()) { createPaperArrayFromPrinterFeatures(); } else { createPaperArrayFromDefaults(); } } // --------------------------------------------------- function createPaperSizeList(selectedInx) { var selectElement = new paperListElement(dialog.paperList); selectElement.clearPaperList(); selectElement.appendPaperNames(gPaperArray); if (selectedInx > -1) { selectElement.paperListElement.selectedIndex = selectedInx; } // dialog.paperList = selectElement; } // --------------------------------------------------- function loadDialog() { var print_paper_unit = 0; var print_paper_width = 0.0; var print_paper_height = 0.0; var print_paper_name = ""; var print_color = true; var print_jobtitle = ""; gPrefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); if (gPrintSettings) { print_paper_unit = gPrintSettings.paperSizeUnit; print_paper_width = gPrintSettings.paperWidth; print_paper_height = gPrintSettings.paperHeight; print_paper_name = gPrintSettings.paperName; print_color = gPrintSettings.printInColor; print_jobtitle = gPrintSettings.title; } if (doDebug) { dump("loadDialog******************************\n"); dump("paperSizeType "+print_paper_unit+"\n"); dump("paperWidth "+print_paper_width+"\n"); dump("paperHeight "+print_paper_height+"\n"); dump("paperName "+print_paper_name+"\n"); dump("print_color "+print_color+"\n"); dump("print_jobtitle "+print_jobtitle+"\n"); } createPaperArray(); var paperSelectedInx = 0; for (var i=0;i<gPaperArray.length;i++) { if (print_paper_name == gPaperArray[i].name) { paperSelectedInx = i; break; } } if (doDebug) { if (i == gPaperArray.length) dump("loadDialog: No paper found.\n"); else dump("loadDialog: found paper '"+gPaperArray[paperSelectedInx].name+"'.\n"); } createPaperSizeList(paperSelectedInx); /* Enable/disable and/or hide/unhide widgets based in the information * whether the selected printer and/or print module supports the matching * feature or not */ if (isListOfPrinterFeaturesAvailable()) { // job title if (gPrefs.getBoolPref("print.tmp.printerfeatures." + gPrintSettings.printerName + ".can_change_jobtitle")) dialog.jobTitleInput.removeAttribute("disabled"); else dialog.jobTitleInput.setAttribute("disabled", "true"); if (gPrefs.getBoolPref("print.tmp.printerfeatures." + gPrintSettings.printerName + ".supports_jobtitle_change")) dialog.jobTitleGroup.removeAttribute("hidden"); else dialog.jobTitleGroup.setAttribute("hidden", "true"); // paper size if (gPrefs.getBoolPref("print.tmp.printerfeatures." + gPrintSettings.printerName + ".can_change_paper_size")) dialog.paperList.removeAttribute("disabled"); else dialog.paperList.setAttribute("disabled", "true"); if (gPrefs.getBoolPref("print.tmp.printerfeatures." + gPrintSettings.printerName + ".supports_paper_size_change")) dialog.paperGroup.removeAttribute("hidden"); else dialog.paperGroup.setAttribute("hidden", "true"); // color/grayscale radio if (gPrefs.getBoolPref("print.tmp.printerfeatures." + gPrintSettings.printerName + ".can_change_printincolor")) dialog.colorRadioGroup.removeAttribute("disabled"); else dialog.colorRadioGroup.setAttribute("disabled", "true"); if (gPrefs.getBoolPref("print.tmp.printerfeatures." + gPrintSettings.printerName + ".supports_printincolor_change")) dialog.colorGroup.removeAttribute("hidden"); else dialog.colorGroup.setAttribute("hidden", "true"); } if (print_color) { dialog.colorRadioGroup.selectedItem = dialog.colorRadio; } else { dialog.colorRadioGroup.selectedItem = dialog.grayRadio; } dialog.jobTitleInput.value = print_jobtitle; dialog.topInput.value = gPrintSettings.edgeTop.toFixed(2); dialog.bottomInput.value = gPrintSettings.edgeBottom.toFixed(2); dialog.leftInput.value = gPrintSettings.edgeLeft.toFixed(2); dialog.rightInput.value = gPrintSettings.edgeRight.toFixed(2); } // --------------------------------------------------- function onLoad() { // Init dialog. initDialog(); gPrintSettings = window.arguments[0].QueryInterface(gPrintSetInterface); paramBlock = window.arguments[1].QueryInterface(Components.interfaces.nsIDialogParamBlock); if (doDebug) { if (gPrintSettings == null) alert("PrintSettings is null!"); if (paramBlock == null) alert("nsIDialogParam is null!"); } // default return value is "cancel" paramBlock.SetInt(0, 0); loadDialog(); } // --------------------------------------------------- function onAccept() { var print_paper_unit = gPrintSettingsInterface.kPaperSizeInches; var print_paper_width = 0.0; var print_paper_height = 0.0; var print_paper_name = ""; if (gPrintSettings != null) { var paperSelectedInx = dialog.paperList.selectedIndex; if (gPaperArray[paperSelectedInx].inches) { print_paper_unit = gPrintSettingsInterface.kPaperSizeInches; } else { print_paper_unit = gPrintSettingsInterface.kPaperSizeMillimeters; } print_paper_width = gPaperArray[paperSelectedInx].width; print_paper_height = gPaperArray[paperSelectedInx].height; print_paper_name = gPaperArray[paperSelectedInx].name; gPrintSettings.paperSizeUnit = print_paper_unit; gPrintSettings.paperWidth = print_paper_width; gPrintSettings.paperHeight = print_paper_height; gPrintSettings.paperName = print_paper_name; // save these out so they can be picked up by the device spec gPrintSettings.printInColor = dialog.colorRadio.selected; gPrintSettings.title = dialog.jobTitleInput.value; gPrintSettings.edgeTop = dialog.topInput.value; gPrintSettings.edgeBottom = dialog.bottomInput.value; gPrintSettings.edgeLeft = dialog.leftInput.value; gPrintSettings.edgeRight = dialog.rightInput.value; if (doDebug) { dump("onAccept******************************\n"); dump("paperSizeUnit "+print_paper_unit+"\n"); dump("paperWidth "+print_paper_width+"\n"); dump("paperHeight "+print_paper_height+"\n"); dump("paperName '"+print_paper_name+"'\n"); dump("printInColor "+gPrintSettings.printInColor+"\n"); } } else { dump("************ onAccept gPrintSettings: "+gPrintSettings+"\n"); } if (paramBlock) { // set return value to "ok" paramBlock.SetInt(0, 1); } else { dump("*** FATAL ERROR: paramBlock missing\n"); } return true; }