mirror of
https://github.com/rn10950/RetroZilla.git
synced 2024-11-14 03:30:17 +01:00
516 lines
18 KiB
JavaScript
516 lines
18 KiB
JavaScript
/* -*- 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 of 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;
|
|
}
|
|
|