home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2002 December / PCpro_2002_12.ISO / browser / netscape7 / browser.xpi / bin / chrome / toolkit.jar / content / global / printdialog.js < prev    next >
Encoding:
JavaScript  |  2002-06-07  |  18.1 KB  |  492 lines

  1. /* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
  2.  *
  3.  * The contents of this file are subject to the Netscape Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  *
  13.  * The Original Code is Mozilla Communicator client code.
  14.  *
  15.  * The Initial Developer of the Original Code is Netscape Communications
  16.  * Corporation.  Portions created by Netscape are
  17.  * Copyright (C) 1998 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  *
  20.  * Contributor(s): 
  21.  *   Masaki Katakai <katakai@japan.sun.com>
  22.  *   Jessica Blanco <jblanco@us.ibm.com>
  23.  *   Asko Tontti <atontti@cc.hut.fi>
  24.  *   Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
  25.  */
  26.  
  27. var dialog;
  28. var printService       = null;
  29. var printOptions       = null;
  30. var gOriginalNumCopies = 1;
  31.  
  32. var paramBlock;
  33. var gPrintSettings = null;
  34. var gPrinterName   = "";
  35. var gWebBrowserPrint   = null;
  36. var default_file       = "mozilla.ps";
  37. var gPrintSetInterface = Components.interfaces.nsIPrintSettings;
  38. var doDebug            = false;
  39.  
  40. //---------------------------------------------------
  41. function initDialog()
  42. {
  43.   dialog = new Object;
  44.  
  45.   dialog.propertiesButton = document.getElementById("properties");
  46.  
  47.   dialog.destGroup       = document.getElementById("destGroup");
  48.   dialog.fileRadio       = document.getElementById("fileRadio");
  49.   dialog.printerRadio    = document.getElementById("printerRadio");
  50.  
  51.   dialog.printrangeGroup = document.getElementById("printrangeGroup");
  52.   dialog.allpagesRadio   = document.getElementById("allpagesRadio");
  53.   dialog.rangeRadio      = document.getElementById("rangeRadio");
  54.   dialog.selectionRadio  = document.getElementById("selectionRadio");
  55.   dialog.frompageInput   = document.getElementById("frompageInput");
  56.   dialog.frompageLabel   = document.getElementById("frompageLabel");
  57.   dialog.topageInput     = document.getElementById("topageInput");
  58.   dialog.topageLabel     = document.getElementById("topageLabel");
  59.  
  60.   dialog.numCopiesInput  = document.getElementById("numCopiesInput");  
  61.  
  62.   dialog.printframeGroup      = document.getElementById("printframeGroup");
  63.   dialog.aslaidoutRadio       = document.getElementById("aslaidoutRadio");
  64.   dialog.selectedframeRadio   = document.getElementById("selectedframeRadio");
  65.   dialog.eachframesepRadio    = document.getElementById("eachframesepRadio");
  66.   dialog.printframeGroupLabel = document.getElementById("printframeGroupLabel");
  67.  
  68.   dialog.fileInput       = document.getElementById("fileInput");
  69.   dialog.fileLabel       = document.getElementById("fileLabel");
  70.   dialog.printerLabel    = document.getElementById("printerLabel");
  71.   dialog.chooseButton    = document.getElementById("chooseFile");
  72.   dialog.printerList     = document.getElementById("printerList");
  73.  
  74.   dialog.printButton     = document.documentElement.getButton("accept");
  75.  
  76.   // <data> elements
  77.   dialog.printName       = document.getElementById("printButton");
  78.   dialog.fpDialog        = document.getElementById("fpDialog");
  79.  
  80.   dialog.enabled         = false;
  81. }
  82.  
  83. //---------------------------------------------------
  84. function checkInteger(element)
  85. {
  86.   var value = element.value;
  87.   if (value && value.length > 0) {
  88.     value = value.replace(/[^0-9]/g,"");
  89.     if (!value) value = "";
  90.     element.value = value;
  91.   }
  92.   if (!value || value < 1 || value > 999)
  93.     dialog.printButton.setAttribute("disabled","true");
  94.   else
  95.     dialog.printButton.removeAttribute("disabled");
  96. }
  97.  
  98. //---------------------------------------------------
  99. function stripTrailingWhitespace(element)
  100. {
  101.   var value = element.value;
  102.   value = value.replace(/\s+$/,"");
  103.   element.value = value;
  104. }
  105.  
  106. //---------------------------------------------------
  107. function doEnablePrintToFile(value)
  108. {
  109.   if (value) {
  110.     dialog.fileLabel.removeAttribute("disabled");
  111.     dialog.fileInput.removeAttribute("disabled");
  112.     dialog.chooseButton.removeAttribute("disabled");
  113.   } else {
  114.     dialog.fileLabel.setAttribute("disabled","true");
  115.     dialog.fileInput.setAttribute("disabled","true");
  116.     dialog.chooseButton.setAttribute("disabled","true");
  117.   }
  118. }
  119.  
  120. //---------------------------------------------------
  121. function listElement(aListElement)
  122.   {
  123.     this.listElement = aListElement;
  124.   }
  125.  
  126. listElement.prototype =
  127.   {
  128.     clearList:
  129.       function ()
  130.         {
  131.           // remove the menupopup node child of the menulist.
  132.           this.listElement.removeChild(this.listElement.firstChild);
  133.         },
  134.  
  135.     appendPrinterNames: 
  136.       function (aDataObject) 
  137.         { 
  138.           var popupNode = document.createElement("menupopup"); 
  139.           var strDefaultPrinterName = "";
  140.           var printerName;
  141.  
  142.           // build popup menu from printer names
  143.           while (aDataObject.hasMoreElements()) {
  144.             printerName = aDataObject.getNext();
  145.             printerName = printerName.QueryInterface(Components.interfaces.nsISupportsWString);
  146.             var printerNameStr = printerName.toString();
  147.             if (strDefaultPrinterName == "")
  148.                strDefaultPrinterName = printerNameStr;
  149.             var itemNode = document.createElement("menuitem");
  150.             itemNode.setAttribute("value", printerNameStr);
  151.             itemNode.setAttribute("label", printerNameStr);
  152.             popupNode.appendChild(itemNode);
  153.           }
  154.           if (strDefaultPrinterName != "") {
  155.             this.listElement.removeAttribute("disabled");
  156.           } else {
  157.             var stringBundle = srGetStrBundle("chrome://global/locale/printing.properties");
  158.             this.listElement.setAttribute("value", strDefaultPrinterName);
  159.             this.listElement.setAttribute("label", stringBundle.GetStringFromName("noprinter"));
  160.  
  161.             // disable dialog
  162.             this.listElement.setAttribute("disabled", "true");
  163.             dialog.destGroup.setAttribute("disabled","true");
  164.             dialog.printerRadio.setAttribute("disabled","true");
  165.             dialog.printerLabel.setAttribute("disabled","true");
  166.             dialog.propertiesButton.setAttribute("disabled","true");
  167.             dialog.fileRadio.setAttribute("disabled","true");
  168.             dialog.printButton.setAttribute("disabled","true");
  169.             doEnablePrintToFile(false);
  170.           }
  171.  
  172.           this.listElement.appendChild(popupNode); 
  173.           return strDefaultPrinterName;
  174.         } 
  175.   };
  176.  
  177. //---------------------------------------------------
  178. function getPrinters()
  179. {
  180.   var printerEnumerator = printOptions.availablePrinters();
  181.  
  182.   var selectElement = new listElement(dialog.printerList);
  183.   selectElement.clearList();
  184.   var strDefaultPrinterName = selectElement.appendPrinterNames(printerEnumerator);
  185.  
  186.   selectElement.listElement.value = strDefaultPrinterName;
  187.  
  188.   // make sure we load the prefs for the initially selected printer
  189.   setPrinterDefaultsForSelectedPrinter();
  190. }
  191.  
  192.  
  193. //---------------------------------------------------
  194. // update gPrintSettings with the defaults for the selected printer
  195. function setPrinterDefaultsForSelectedPrinter()
  196. {
  197.   /* FixMe: We should save the old printer's values here... */
  198.  
  199.   gPrintSettings.printerName  = dialog.printerList.value;
  200.  
  201.   // First get any defaults from the printer 
  202.   printService.initPrintSettingsFromPrinter(gPrintSettings.printerName, gPrintSettings);
  203.  
  204.   var flags = gPrintSetInterface.kInitSavePaperSizeType | gPrintSetInterface.kInitSavePaperSizeUnit |
  205.               gPrintSetInterface.kInitSavePaperWidth | gPrintSetInterface.kInitSavePaperHeight |
  206.               gPrintSetInterface.kInitSavePaperName |
  207.               gPrintSetInterface.kInitSavePrintCommand;
  208.  
  209.   // now augment them with any values from last time
  210.   printService.initPrintSettingsFromPrefs(gPrintSettings, true, flags);
  211.  
  212. }
  213.  
  214. //---------------------------------------------------
  215. function displayPropertiesDialog()
  216. {
  217.   gPrintSettings.numCopies = dialog.numCopiesInput.value;
  218.   try {
  219.     var printingPromptService = Components.classes["@mozilla.org/embedcomp/printingprompt-service;1"]
  220.                                                  .getService(Components.interfaces.nsIPrintingPromptService);
  221.     if (printingPromptService) {
  222.       printingPromptService.showPrinterProperties(null, dialog.printerList.value, gPrintSettings);
  223.     }
  224.   } catch(e) {
  225.     dump("problems getting printingPromptService\n");
  226.   }
  227. }
  228.  
  229. //---------------------------------------------------
  230. function doPrintRange(inx)
  231. {
  232.   if (inx == 1) {
  233.     dialog.frompageInput.removeAttribute("disabled");
  234.     dialog.frompageLabel.removeAttribute("disabled");
  235.     dialog.topageInput.removeAttribute("disabled");
  236.     dialog.topageLabel.removeAttribute("disabled");
  237.   } else {
  238.     dialog.frompageInput.setAttribute("disabled","true");
  239.     dialog.frompageLabel.setAttribute("disabled","true");
  240.     dialog.topageInput.setAttribute("disabled","true");
  241.     dialog.topageLabel.setAttribute("disabled","true");
  242.   }
  243. }
  244.  
  245. //---------------------------------------------------
  246. function loadDialog()
  247. {
  248.   var print_copies        = 1;
  249.   var print_file          = default_file;
  250.   var print_selection_radio_enabled = false;
  251.   var print_frametype     = gPrintSetInterface.kSelectedFrame;
  252.   var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone;
  253.   var print_tofile        = "";
  254.  
  255.   try {
  256.     printService = Components.classes["@mozilla.org/gfx/printsettings-service;1"];
  257.     if (printService) {
  258.       printService = printService.getService();
  259.       if (printService) {
  260.         printService = printService.QueryInterface(Components.interfaces.nsIPrintSettingsService);
  261.         printOptions = printService.QueryInterface(Components.interfaces.nsIPrintOptions);
  262.       }
  263.     }
  264.   } catch(e) {}
  265.  
  266.   if (gPrintSettings) {
  267.     gPrinterName        = gPrintSettings.printerName;
  268.     print_tofile        = gPrintSettings.printToFile;
  269.     gOriginalNumCopies  = gPrintSettings.numCopies;
  270.  
  271.     print_copies        = gPrintSettings.numCopies;
  272.     print_file          = gPrintSettings.toFileName;
  273.     print_frametype     = gPrintSettings.printFrameType;
  274.     print_howToEnableUI = gPrintSettings.howToEnableFrameUI;
  275.     print_selection_radio_enabled = gPrintSettings.GetPrintOptions(gPrintSetInterface.kEnableSelectionRB);
  276.   }
  277.  
  278.   if (print_tofile) {
  279.     dialog.destGroup.selectedItem = dialog.fileRadio;
  280.     doEnablePrintToFile(true);
  281.   } else {
  282.     dialog.destGroup.selectedItem = dialog.printerRadio;
  283.     doEnablePrintToFile(false);
  284.   }
  285.  
  286.   if (doDebug) {
  287.     dump("loadDialog*********************************************\n");
  288.     dump("toFileName              ["+print_file+"]\n");
  289.     dump("print_tofile            "+print_tofile+"\n");
  290.     dump("print_frame             "+print_frametype+"\n");
  291.     dump("print_howToEnableUI     "+print_howToEnableUI+"\n");
  292.     dump("selection_radio_enabled "+print_selection_radio_enabled+"\n");
  293.   }
  294.  
  295.   if (print_file == "") {
  296.     print_file = default_file;
  297.   }
  298.  
  299.   dialog.printrangeGroup.selectedItem = dialog.allpagesRadio;
  300.   if (print_selection_radio_enabled) {
  301.     dialog.selectionRadio.removeAttribute("disabled");
  302.   } else {
  303.     dialog.selectionRadio.setAttribute("disabled","true");
  304.   }
  305.   doPrintRange(dialog.rangeRadio.selected);
  306.   dialog.frompageInput.value  = 1;
  307.   dialog.topageInput.value    = 1;
  308.   dialog.numCopiesInput.value = 1;
  309.  
  310.   dialog.fileInput.value   = print_file;
  311.  
  312.   // NOTE: getPRinters sets up the PrintToFile radio buttons
  313.   getPrinters();
  314.  
  315.   if (gPrintSettings.toFileName != "") {
  316.     dialog.fileInput.value = gPrintSettings.toFileName;
  317.   }
  318.  
  319.   if (doDebug) {
  320.     dump("print_howToEnableUI: "+print_howToEnableUI+"\n");
  321.   }
  322.  
  323.   // print frame
  324.   if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAll) {
  325.     dialog.aslaidoutRadio.removeAttribute("disabled");
  326.  
  327.     dialog.selectedframeRadio.removeAttribute("disabled");
  328.     dialog.eachframesepRadio.removeAttribute("disabled");
  329.     dialog.printframeGroupLabel.removeAttribute("disabled");
  330.  
  331.     // initialize radio group
  332.     dialog.printframeGroup.selectedItem = dialog.selectedframeRadio;
  333.  
  334.   } else if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAsIsAndEach) {
  335.     dialog.aslaidoutRadio.removeAttribute("disabled");       //enable
  336.  
  337.     dialog.selectedframeRadio.setAttribute("disabled","true"); // disable
  338.     dialog.eachframesepRadio.removeAttribute("disabled");       // enable
  339.     dialog.printframeGroupLabel.removeAttribute("disabled");    // enable
  340.  
  341.     // initialize
  342.     dialog.printframeGroup.selectedItem = dialog.eachframesepRadio;
  343.  
  344.   } else {
  345.     dialog.aslaidoutRadio.setAttribute("disabled","true");
  346.     dialog.selectedframeRadio.setAttribute("disabled","true");
  347.     dialog.eachframesepRadio.setAttribute("disabled","true");
  348.     dialog.printframeGroupLabel.setAttribute("disabled","true");
  349.   }
  350.  
  351.   dialog.printButton.label = dialog.printName.getAttribute("label");
  352. }
  353.  
  354. //---------------------------------------------------
  355. function onLoad()
  356. {
  357.   // Init dialog.
  358.   initDialog();
  359.  
  360.   // param[0]: nsIPrintSettings object
  361.   // param[1]: container for return value (1 = print, 0 = cancel)
  362.  
  363.   gPrintSettings   = window.arguments[0].QueryInterface(gPrintSetInterface);
  364.   gWebBrowserPrint = window.arguments[1].QueryInterface(Components.interfaces.nsIWebBrowserPrint);
  365.   paramBlock       = window.arguments[2].QueryInterface(Components.interfaces.nsIDialogParamBlock);
  366.  
  367.   // default return value is "cancel"
  368.   paramBlock.SetInt(0, 0);
  369.  
  370.   loadDialog();
  371. }
  372.  
  373. //---------------------------------------------------
  374. function onAccept()
  375. {
  376.  
  377.   if (gPrintSettings != null) {
  378.     var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone;
  379.  
  380.     if (dialog.fileRadio.selected && dialog.fileInput.value == "") {
  381.       var stringBundle = srGetStrBundle("chrome://global/locale/printing.properties");
  382.       var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService();
  383.       promptService = promptService.QueryInterface(Components.interfaces.nsIPromptService)
  384.       var titleText = stringBundle.GetStringFromName("noPrintFilename.title");
  385.       var alertText = stringBundle.GetStringFromName("noPrintFilename.alert");
  386.       promptService.alert(this.window, titleText, alertText);
  387.       return false;
  388.     }
  389.  
  390.     // save these out so they can be picked up by the device spec
  391.     gPrintSettings.printToFile = dialog.fileRadio.selected;
  392.     print_howToEnableUI        = gPrintSettings.howToEnableFrameUI;
  393.  
  394.     // save these out so they can be picked up by the device spec
  395.     gPrintSettings.toFileName   = dialog.fileInput.value;
  396.     gPrintSettings.printerName  = dialog.printerList.value;
  397.  
  398.     if (dialog.allpagesRadio.selected) {
  399.       gPrintSettings.printRange = gPrintSetInterface.kRangeAllPages;
  400.     } else if (dialog.rangeRadio.selected) {
  401.       gPrintSettings.printRange = gPrintSetInterface.kRangeSpecifiedPageRange;
  402.     } else if (dialog.selectionRadio.selected) {
  403.       gPrintSettings.printRange = gPrintSetInterface.kRangeSelection;
  404.     }
  405.     gPrintSettings.startPageRange = dialog.frompageInput.value;
  406.     gPrintSettings.endPageRange   = dialog.topageInput.value;
  407.     gPrintSettings.numCopies      = dialog.numCopiesInput.value;
  408.  
  409.     var frametype = gPrintSetInterface.kNoFrames;
  410.     if (print_howToEnableUI != gPrintSetInterface.kFrameEnableNone) {
  411.       if (dialog.aslaidoutRadio.selected) {
  412.         frametype = gPrintSetInterface.kFramesAsIs;
  413.       } else if (dialog.selectedframeRadio.selected) {
  414.         frametype = gPrintSetInterface.kSelectedFrame;
  415.       } else if (dialog.eachframesepRadio.selected) {
  416.         frametype = gPrintSetInterface.kEachFrameSep;
  417.       } else {
  418.         frametype = gPrintSetInterface.kSelectedFrame;
  419.       }
  420.     }
  421.     gPrintSettings.printFrameType = frametype;
  422.     if (doDebug) {
  423.       dump("onAccept*********************************************\n");
  424.       dump("frametype      "+frametype+"\n");
  425.       dump("numCopies      "+gPrintSettings.numCopies+"\n");
  426.       dump("printRange     "+gPrintSettings.printRange+"\n");
  427.       dump("printerName    "+gPrintSettings.printerName+"\n");
  428.       dump("startPageRange "+gPrintSettings.startPageRange+"\n");
  429.       dump("endPageRange   "+gPrintSettings.endPageRange+"\n");
  430.       dump("printToFile    "+gPrintSettings.printToFile+"\n");
  431.     }
  432.   }
  433.  
  434.   var saveToPrefs = false;
  435.   var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  436.   if (prefs) {
  437.     saveToPrefs = prefs.getBoolPref("print.save_print_settings");
  438.   }
  439.  
  440.   if (saveToPrefs && printService != null) {
  441.     var flags = gPrintSetInterface.kInitSavePaperSizeType | gPrintSetInterface.kInitSavePaperSizeUnit |
  442.                 gPrintSetInterface.kInitSavePaperWidth | gPrintSetInterface.kInitSavePaperHeight |
  443.                 gPrintSetInterface.kInitSavePaperName |
  444.                 gPrintSetInterface.kInitSavePrintCommand;
  445.     printService.savePrintSettingsToPrefs(gPrintSettings, true, flags);
  446.   }
  447.  
  448.   // set return value to "print"
  449.   if (paramBlock) {
  450.     paramBlock.SetInt(0, 1);
  451.   } else {
  452.     dump("*** FATAL ERROR: No paramBlock\n");
  453.   }
  454.  
  455.   return true;
  456.  
  457. }
  458.  
  459. //---------------------------------------------------
  460. function onCancel()
  461. {
  462.   // set return value to "cancel"
  463.   if (paramBlock) {
  464.     paramBlock.SetInt(0, 0);
  465.   } else {
  466.     dump("*** FATAL ERROR: No paramBlock\n");
  467.   }
  468.  
  469.   return true;
  470. }
  471.  
  472. //---------------------------------------------------
  473. const nsIFilePicker = Components.interfaces.nsIFilePicker;
  474. function onChooseFile()
  475. {
  476.   if (dialog.fileRadio.selected == false)
  477.     return;
  478.  
  479.   try {
  480.     var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  481.     fp.init(window, dialog.fpDialog.getAttribute("label"), nsIFilePicker.modeSave);
  482.     fp.appendFilters(nsIFilePicker.filterAll);
  483.     fp.show();
  484.     if (fp.file && fp.file.path.length > 0) {
  485.       dialog.fileInput.value = fp.file.path;
  486.     }
  487.   } catch(ex) {
  488.     dump(ex);
  489.   }
  490. }
  491.  
  492.