Source code

Revision control

Copy as Markdown

Other Tools

// -*- 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 gPrintService = null;
var gPrintSettings = null;
var gStringBundle = null;
var gDoingMetric = false;
var gPrintSettingsInterface = Ci.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;
document.addEventListener("dialogaccept", onAccept);
}
// ---------------------------------------------------
function isListOfPrinterFeaturesAvailable() {
return Services.prefs.getBoolPref(
"print.tmp.printerfeatures." +
gPrintSettings.printerName +
".has_special_printerfeatures",
false
);
}
// ---------------------------------------------------
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);
}
// ---------------------------------------------------
async function customize(node) {
// If selection is now "Custom..." then prompt user for custom setting.
if (node.value == 6) {
let [title, promptText] = await document.l10n.formatValues([
{ id: "custom-prompt-title" },
{ id: "custom-prompt-prompt" },
]);
var result = { value: node.custom };
var ok = Services.prompt.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 = [];
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;
}
async function lastUsedPrinterNameOrDefault() {
let printerList = Cc["@mozilla.org/gfx/printerlist;1"].getService(
Ci.nsIPrinterList
);
let lastUsedName = gPrintService.lastUsedPrinterName;
let printers = await printerList.printers;
for (let printer of printers) {
printer.QueryInterface(Ci.nsIPrinter);
if (printer.name == lastUsedName) {
return lastUsedName;
}
}
return printerList.systemDefaultPrinterName;
}
async function setPrinterDefaultsForSelectedPrinter() {
if (gPrintSettings.printerName == "") {
gPrintSettings.printerName = await lastUsedPrinterNameOrDefault();
}
// 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"
);
}
}
// ---------------------------------------------------
async 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 {
gPrintService = Cc["@mozilla.org/gfx/printsettings-service;1"];
if (gPrintService) {
gPrintService = gPrintService.getService();
if (gPrintService) {
gPrintService = gPrintService.QueryInterface(
Ci.nsIPrintSettingsService
);
}
}
} catch (ex) {
dump("loadDialog: ex=" + ex + "\n");
}
await setPrinterDefaultsForSelectedPrinter();
gDialog.printBG.checked =
gPrintSettings.printBGColors || gPrintSettings.printBGImages;
gDialog.shrinkToFit.checked = gPrintSettings.shrinkToFit;
gDialog.scalingLabel.disabled = gDialog.scalingInput.disabled =
gDialog.shrinkToFit.checked;
if (
gPrintSettings.paperSizeUnit == gPrintSettingsInterface.kPaperSizeInches
) {
document.l10n.setAttributes(
gDialog.marginGroup,
"margin-group-label-inches"
);
gDoingMetric = false;
} else {
document.l10n.setAttributes(
gDialog.marginGroup,
"margin-group-label-metric"
);
// Also, set global page dimensions for A4 paper, in millimeters (assumes portrait at this point).
gPageWidth = 2100;
gPageHeight = 2970;
gDoingMetric = true;
}
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 (
Services.prefs.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(Ci.nsIPrintSettings);
paramBlock = window.arguments[1].QueryInterface(Ci.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.kInitSaveShrinkToFit |
gPrintSettingsInterface.kInitSaveScaling;
// Note that this file is Windows only code, so this doesn't handle saving
// for other platforms.
// XXX Should we do this in nsPrintDialogServiceWin::ShowPageSetup (the code
// that invokes us), since ShowPageSetup is where we do the saving for the
// other platforms?
gPrintService.maybeSavePrintSettingsToPrefs(gPrintSettings, flags);
}
// ---------------------------------------------------
function onCancel() {
// set return value to "cancel"
if (paramBlock) {
paramBlock.SetInt(0, 0);
} else {
dump("*** FATAL ERROR: No paramBlock\n");
}
return true;
}