gecko/toolkit/components/printing/content/printPageSetup.js

516 lines
18 KiB
JavaScript
Raw Normal View History

# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is Mozilla Communicator client code.
#
# The Initial Developer of the Original Code is
# Netscape Communications Corporation.
# Portions created by the Initial Developer are Copyright (C) 1998
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Masaki Katakai <katakai@japan.sun.com>
# Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
# Asko Tontti <atontti@cc.hut.fi>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
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;
}