The -*- file variable lines -*- establish per-file settings that Emacs will pick up. This patch makes the following changes to those lines (and touches nothing else): - Never set the buffer's mode. Years ago, Emacs did not have a good JavaScript mode, so it made sense to use Java or C++ mode in .js files. However, Emacs has had js-mode for years now; it's perfectly serviceable, and is available and enabled by default in all major Emacs packagings. Selecting a mode in the -*- file variable line -*- is almost always the wrong thing to do anyway. It overrides Emacs's default choice, which is (now) reasonable; and even worse, it overrides settings the user might have made in their '.emacs' file for that file extension. It's only useful when there's something specific about that particular file that makes a particular mode appropriate. - Correctly propagate settings that establish the correct indentation level for this file: c-basic-offset and js2-basic-offset should be js-indent-level. Whatever value they're given should be preserved; different parts of our tree use different indentation styles. - We don't use tabs in Mozilla JS code. Always set indent-tabs-mode: nil. Remove tab-width: settings, at least in files that don't contain tab characters. - Remove js2-mode settings that belong in the user's .emacs file, like js2-skip-preprocessor-directives.
482 lines
16 KiB
JavaScript
482 lines
16 KiB
JavaScript
// -*- 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 = new Object;
|
|
|
|
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...
|
|
} else {
|
|
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;
|
|
} else {
|
|
return aVal;
|
|
}
|
|
}
|
|
|
|
function convertMarginInchesToUnits(aVal, aIsMetric)
|
|
{
|
|
if (aIsMetric) {
|
|
return aVal * 25.4;
|
|
} else {
|
|
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;
|
|
}
|
|
|