diff options
Diffstat (limited to 'toolkit/components/printing/content/printPageSetup.js')
-rw-r--r-- | toolkit/components/printing/content/printPageSetup.js | 478 |
1 files changed, 478 insertions, 0 deletions
diff --git a/toolkit/components/printing/content/printPageSetup.js b/toolkit/components/printing/content/printPageSetup.js new file mode 100644 index 000000000..31eb1bdd3 --- /dev/null +++ b/toolkit/components/printing/content/printPageSetup.js @@ -0,0 +1,478 @@ +// -*- 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 gDialog; +var paramBlock; +var gPrefs = null; +var gPrintService = null; +var gPrintSettings = null; +var gStringBundle = null; +var gDoingMetric = false; + +var gPrintSettingsInterface = Components.interfaces.nsIPrintSettings; +var gDoDebug = false; + +// --------------------------------------------------- +function initDialog() +{ + gDialog = {}; + + gDialog.orientation = document.getElementById("orientation"); + gDialog.portrait = document.getElementById("portrait"); + gDialog.landscape = document.getElementById("landscape"); + + gDialog.printBG = document.getElementById("printBG"); + + gDialog.shrinkToFit = document.getElementById("shrinkToFit"); + + gDialog.marginGroup = document.getElementById("marginGroup"); + + gDialog.marginPage = document.getElementById("marginPage"); + gDialog.marginTop = document.getElementById("marginTop"); + gDialog.marginBottom = document.getElementById("marginBottom"); + gDialog.marginLeft = document.getElementById("marginLeft"); + gDialog.marginRight = document.getElementById("marginRight"); + + gDialog.topInput = document.getElementById("topInput"); + gDialog.bottomInput = document.getElementById("bottomInput"); + gDialog.leftInput = document.getElementById("leftInput"); + gDialog.rightInput = document.getElementById("rightInput"); + + gDialog.hLeftOption = document.getElementById("hLeftOption"); + gDialog.hCenterOption = document.getElementById("hCenterOption"); + gDialog.hRightOption = document.getElementById("hRightOption"); + + gDialog.fLeftOption = document.getElementById("fLeftOption"); + gDialog.fCenterOption = document.getElementById("fCenterOption"); + gDialog.fRightOption = document.getElementById("fRightOption"); + + gDialog.scalingLabel = document.getElementById("scalingInput"); + gDialog.scalingInput = document.getElementById("scalingInput"); + + gDialog.enabled = false; + + gDialog.strings = new Array; + gDialog.strings["marginUnits.inches"] = document.getElementById("marginUnits.inches").childNodes[0].nodeValue; + gDialog.strings["marginUnits.metric"] = document.getElementById("marginUnits.metric").childNodes[0].nodeValue; + gDialog.strings["customPrompt.title"] = document.getElementById("customPrompt.title").childNodes[0].nodeValue; + gDialog.strings["customPrompt.prompt"] = document.getElementById("customPrompt.prompt").childNodes[0].nodeValue; + +} + +// --------------------------------------------------- +function isListOfPrinterFeaturesAvailable() +{ + var has_printerfeatures = false; + + try { + has_printerfeatures = gPrefs.getBoolPref("print.tmp.printerfeatures." + gPrintSettings.printerName + ".has_special_printerfeatures"); + } catch (ex) { + } + + return has_printerfeatures; +} + +// --------------------------------------------------- +function checkDouble(element) +{ + element.value = element.value.replace(/[^.0-9]/g, ""); +} + +// Theoretical paper width/height. +var gPageWidth = 8.5; +var gPageHeight = 11.0; + +// --------------------------------------------------- +function setOrientation() +{ + var selection = gDialog.orientation.selectedItem; + + var style = "background-color:white;"; + if ((selection == gDialog.portrait && gPageWidth > gPageHeight) || + (selection == gDialog.landscape && gPageWidth < gPageHeight)) { + // Swap width/height. + var temp = gPageHeight; + gPageHeight = gPageWidth; + gPageWidth = temp; + } + var div = gDoingMetric ? 100 : 10; + style += "width:" + gPageWidth/div + unitString() + ";height:" + gPageHeight/div + unitString() + ";"; + gDialog.marginPage.setAttribute( "style", style ); +} + +// --------------------------------------------------- +function unitString() +{ + return (gPrintSettings.paperSizeUnit == gPrintSettingsInterface.kPaperSizeInches) ? "in" : "mm"; +} + +// --------------------------------------------------- +function checkMargin( value, max, other ) +{ + // Don't draw this margin bigger than permitted. + return Math.min(value, max - other.value); +} + +// --------------------------------------------------- +function changeMargin( node ) +{ + // Correct invalid input. + checkDouble(node); + + // Reset the margin height/width for this node. + var val = node.value; + var nodeToStyle; + var attr="width"; + if ( node == gDialog.topInput ) { + nodeToStyle = gDialog.marginTop; + val = checkMargin( val, gPageHeight, gDialog.bottomInput ); + attr = "height"; + } else if ( node == gDialog.bottomInput ) { + nodeToStyle = gDialog.marginBottom; + val = checkMargin( val, gPageHeight, gDialog.topInput ); + attr = "height"; + } else if ( node == gDialog.leftInput ) { + nodeToStyle = gDialog.marginLeft; + val = checkMargin( val, gPageWidth, gDialog.rightInput ); + } else { + nodeToStyle = gDialog.marginRight; + val = checkMargin( val, gPageWidth, gDialog.leftInput ); + } + var style = attr + ":" + (val/10) + unitString() + ";"; + nodeToStyle.setAttribute( "style", style ); +} + +// --------------------------------------------------- +function changeMargins() +{ + changeMargin( gDialog.topInput ); + changeMargin( gDialog.bottomInput ); + changeMargin( gDialog.leftInput ); + changeMargin( gDialog.rightInput ); +} + +// --------------------------------------------------- +function customize( node ) +{ + // If selection is now "Custom..." then prompt user for custom setting. + if ( node.value == 6 ) { + var prompter = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] + .getService( Components.interfaces.nsIPromptService ); + var title = gDialog.strings["customPrompt.title"]; + var promptText = gDialog.strings["customPrompt.prompt"]; + var result = { value: node.custom }; + var ok = prompter.prompt(window, title, promptText, result, null, { value: false } ); + if ( ok ) { + node.custom = result.value; + } + } +} + +// --------------------------------------------------- +function setHeaderFooter( node, value ) +{ + node.value= hfValueToId(value); + if (node.value == 6) { + // Remember current Custom... value. + node.custom = value; + } else { + // Start with empty Custom... value. + node.custom = ""; + } +} + +var gHFValues = new Array; +gHFValues["&T"] = 1; +gHFValues["&U"] = 2; +gHFValues["&D"] = 3; +gHFValues["&P"] = 4; +gHFValues["&PT"] = 5; + +function hfValueToId(val) +{ + if ( val in gHFValues ) { + return gHFValues[val]; + } + if ( val.length ) { + return 6; // Custom... + } + return 0; // --blank-- +} + +function hfIdToValue(node) +{ + var result = ""; + switch ( parseInt( node.value ) ) { + case 0: + break; + case 1: + result = "&T"; + break; + case 2: + result = "&U"; + break; + case 3: + result = "&D"; + break; + case 4: + result = "&P"; + break; + case 5: + result = "&PT"; + break; + case 6: + result = node.custom; + break; + } + return result; +} + +function setPrinterDefaultsForSelectedPrinter() +{ + if (gPrintSettings.printerName == "") { + gPrintSettings.printerName = gPrintService.defaultPrinterName; + } + + // First get any defaults from the printer + gPrintService.initPrintSettingsFromPrinter(gPrintSettings.printerName, gPrintSettings); + + // now augment them with any values from last time + gPrintService.initPrintSettingsFromPrefs(gPrintSettings, true, gPrintSettingsInterface.kInitSaveAll); + + if (gDoDebug) { + dump("pagesetup/setPrinterDefaultsForSelectedPrinter: printerName='"+gPrintSettings.printerName+"', orientation='"+gPrintSettings.orientation+"'\n"); + } +} + +// --------------------------------------------------- +function loadDialog() +{ + var print_orientation = 0; + var print_margin_top = 0.5; + var print_margin_left = 0.5; + var print_margin_bottom = 0.5; + var print_margin_right = 0.5; + + try { + gPrefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); + + gPrintService = Components.classes["@mozilla.org/gfx/printsettings-service;1"]; + if (gPrintService) { + gPrintService = gPrintService.getService(); + if (gPrintService) { + gPrintService = gPrintService.QueryInterface(Components.interfaces.nsIPrintSettingsService); + } + } + } catch (ex) { + dump("loadDialog: ex="+ex+"\n"); + } + + setPrinterDefaultsForSelectedPrinter(); + + gDialog.printBG.checked = gPrintSettings.printBGColors || gPrintSettings.printBGImages; + + gDialog.shrinkToFit.checked = gPrintSettings.shrinkToFit; + + gDialog.scalingLabel.disabled = gDialog.scalingInput.disabled = gDialog.shrinkToFit.checked; + + var marginGroupLabel = gDialog.marginGroup.label; + if (gPrintSettings.paperSizeUnit == gPrintSettingsInterface.kPaperSizeInches) { + marginGroupLabel = marginGroupLabel.replace(/#1/, gDialog.strings["marginUnits.inches"]); + gDoingMetric = false; + } else { + marginGroupLabel = marginGroupLabel.replace(/#1/, gDialog.strings["marginUnits.metric"]); + // Also, set global page dimensions for A4 paper, in millimeters (assumes portrait at this point). + gPageWidth = 2100; + gPageHeight = 2970; + gDoingMetric = true; + } + gDialog.marginGroup.label = marginGroupLabel; + + print_orientation = gPrintSettings.orientation; + print_margin_top = convertMarginInchesToUnits(gPrintSettings.marginTop, gDoingMetric); + print_margin_left = convertMarginInchesToUnits(gPrintSettings.marginLeft, gDoingMetric); + print_margin_right = convertMarginInchesToUnits(gPrintSettings.marginRight, gDoingMetric); + print_margin_bottom = convertMarginInchesToUnits(gPrintSettings.marginBottom, gDoingMetric); + + if (gDoDebug) { + dump("print_orientation "+print_orientation+"\n"); + + dump("print_margin_top "+print_margin_top+"\n"); + dump("print_margin_left "+print_margin_left+"\n"); + dump("print_margin_right "+print_margin_right+"\n"); + dump("print_margin_bottom "+print_margin_bottom+"\n"); + } + + if (print_orientation == gPrintSettingsInterface.kPortraitOrientation) { + gDialog.orientation.selectedItem = gDialog.portrait; + } else if (print_orientation == gPrintSettingsInterface.kLandscapeOrientation) { + gDialog.orientation.selectedItem = gDialog.landscape; + } + + // Set orientation the first time on a timeout so the dialog sizes to the + // maximum height specified in the .xul file. Otherwise, if the user switches + // from landscape to portrait, the content grows and the buttons are clipped. + setTimeout( setOrientation, 0 ); + + gDialog.topInput.value = print_margin_top.toFixed(1); + gDialog.bottomInput.value = print_margin_bottom.toFixed(1); + gDialog.leftInput.value = print_margin_left.toFixed(1); + gDialog.rightInput.value = print_margin_right.toFixed(1); + changeMargins(); + + setHeaderFooter( gDialog.hLeftOption, gPrintSettings.headerStrLeft ); + setHeaderFooter( gDialog.hCenterOption, gPrintSettings.headerStrCenter ); + setHeaderFooter( gDialog.hRightOption, gPrintSettings.headerStrRight ); + + setHeaderFooter( gDialog.fLeftOption, gPrintSettings.footerStrLeft ); + setHeaderFooter( gDialog.fCenterOption, gPrintSettings.footerStrCenter ); + setHeaderFooter( gDialog.fRightOption, gPrintSettings.footerStrRight ); + + gDialog.scalingInput.value = (gPrintSettings.scaling * 100).toFixed(0); + + // Enable/disable widgets based in the information whether the selected + // printer supports the matching feature or not + if (isListOfPrinterFeaturesAvailable()) { + if (gPrefs.getBoolPref("print.tmp.printerfeatures." + gPrintSettings.printerName + ".can_change_orientation")) + gDialog.orientation.removeAttribute("disabled"); + else + gDialog.orientation.setAttribute("disabled", "true"); + } + + // Give initial focus to the orientation radio group. + // Done on a timeout due to to bug 103197. + setTimeout( function() { gDialog.orientation.focus(); }, 0 ); +} + +// --------------------------------------------------- +function onLoad() +{ + // Init gDialog. + initDialog(); + + if (window.arguments[0] != null) { + gPrintSettings = window.arguments[0].QueryInterface(Components.interfaces.nsIPrintSettings); + paramBlock = window.arguments[1].QueryInterface(Components.interfaces.nsIDialogParamBlock); + } else if (gDoDebug) { + alert("window.arguments[0] == null!"); + } + + // default return value is "cancel" + paramBlock.SetInt(0, 0); + + if (gPrintSettings) { + loadDialog(); + } else if (gDoDebug) { + alert("Could initialize gDialog, PrintSettings is null!"); + } +} + +function convertUnitsMarginToInches(aVal, aIsMetric) +{ + if (aIsMetric) { + return aVal / 25.4; + } + return aVal; +} + +function convertMarginInchesToUnits(aVal, aIsMetric) +{ + if (aIsMetric) { + return aVal * 25.4; + } + return aVal; +} + +// --------------------------------------------------- +function onAccept() +{ + + if (gPrintSettings) { + if ( gDialog.orientation.selectedItem == gDialog.portrait ) { + gPrintSettings.orientation = gPrintSettingsInterface.kPortraitOrientation; + } else { + gPrintSettings.orientation = gPrintSettingsInterface.kLandscapeOrientation; + } + + // save these out so they can be picked up by the device spec + gPrintSettings.marginTop = convertUnitsMarginToInches(gDialog.topInput.value, gDoingMetric); + gPrintSettings.marginLeft = convertUnitsMarginToInches(gDialog.leftInput.value, gDoingMetric); + gPrintSettings.marginBottom = convertUnitsMarginToInches(gDialog.bottomInput.value, gDoingMetric); + gPrintSettings.marginRight = convertUnitsMarginToInches(gDialog.rightInput.value, gDoingMetric); + + gPrintSettings.headerStrLeft = hfIdToValue(gDialog.hLeftOption); + gPrintSettings.headerStrCenter = hfIdToValue(gDialog.hCenterOption); + gPrintSettings.headerStrRight = hfIdToValue(gDialog.hRightOption); + + gPrintSettings.footerStrLeft = hfIdToValue(gDialog.fLeftOption); + gPrintSettings.footerStrCenter = hfIdToValue(gDialog.fCenterOption); + gPrintSettings.footerStrRight = hfIdToValue(gDialog.fRightOption); + + gPrintSettings.printBGColors = gDialog.printBG.checked; + gPrintSettings.printBGImages = gDialog.printBG.checked; + + gPrintSettings.shrinkToFit = gDialog.shrinkToFit.checked; + + var scaling = document.getElementById("scalingInput").value; + if (scaling < 10.0) { + scaling = 10.0; + } + if (scaling > 500.0) { + scaling = 500.0; + } + scaling /= 100.0; + gPrintSettings.scaling = scaling; + + if (gDoDebug) { + dump("******* Page Setup Accepting ******\n"); + dump("print_margin_top "+gDialog.topInput.value+"\n"); + dump("print_margin_left "+gDialog.leftInput.value+"\n"); + dump("print_margin_right "+gDialog.bottomInput.value+"\n"); + dump("print_margin_bottom "+gDialog.rightInput.value+"\n"); + } + } + + // set return value to "ok" + if (paramBlock) { + paramBlock.SetInt(0, 1); + } else { + dump("*** FATAL ERROR: No paramBlock\n"); + } + + var flags = gPrintSettingsInterface.kInitSaveMargins | + gPrintSettingsInterface.kInitSaveHeaderLeft | + gPrintSettingsInterface.kInitSaveHeaderCenter | + gPrintSettingsInterface.kInitSaveHeaderRight | + gPrintSettingsInterface.kInitSaveFooterLeft | + gPrintSettingsInterface.kInitSaveFooterCenter | + gPrintSettingsInterface.kInitSaveFooterRight | + gPrintSettingsInterface.kInitSaveBGColors | + gPrintSettingsInterface.kInitSaveBGImages | + gPrintSettingsInterface.kInitSaveInColor | + gPrintSettingsInterface.kInitSaveReversed | + gPrintSettingsInterface.kInitSaveOrientation | + gPrintSettingsInterface.kInitSaveOddEvenPages | + gPrintSettingsInterface.kInitSaveShrinkToFit | + gPrintSettingsInterface.kInitSaveScaling; + + gPrintService.savePrintSettingsToPrefs(gPrintSettings, true, flags); + + return true; +} + +// --------------------------------------------------- +function onCancel() +{ + // set return value to "cancel" + if (paramBlock) { + paramBlock.SetInt(0, 0); + } else { + dump("*** FATAL ERROR: No paramBlock\n"); + } + + return true; +} + |