home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 May / PCWorld_2003-05_cd.bin / Komunik / phoenix / chrome / toolkit.jar / content / global / printdialog.js < prev    next >
Text File  |  2002-09-10  |  19KB  |  510 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 gPrefs             = null;
  34. var gPrintSettings     = null;
  35. var gWebBrowserPrint   = null;
  36. var default_file       = "mozilla.ps";
  37. var gPrintSetInterface = Components.interfaces.nsIPrintSettings;
  38. var doDebug            = false;
  39. var gFileFromPicker    = "";
  40.  
  41. //---------------------------------------------------
  42. function initDialog()
  43. {
  44.   dialog = new Object;
  45.  
  46.   dialog.propertiesButton = document.getElementById("properties");
  47.  
  48.   dialog.destGroup       = document.getElementById("destGroup");
  49.   dialog.fileRadio       = document.getElementById("fileRadio");
  50.   dialog.printerRadio    = document.getElementById("printerRadio");
  51.  
  52.   dialog.printrangeGroup = document.getElementById("printrangeGroup");
  53.   dialog.allpagesRadio   = document.getElementById("allpagesRadio");
  54.   dialog.rangeRadio      = document.getElementById("rangeRadio");
  55.   dialog.selectionRadio  = document.getElementById("selectionRadio");
  56.   dialog.frompageInput   = document.getElementById("frompageInput");
  57.   dialog.frompageLabel   = document.getElementById("frompageLabel");
  58.   dialog.topageInput     = document.getElementById("topageInput");
  59.   dialog.topageLabel     = document.getElementById("topageLabel");
  60.  
  61.   dialog.numCopiesInput  = document.getElementById("numCopiesInput");  
  62.  
  63.   dialog.printframeGroup      = document.getElementById("printframeGroup");
  64.   dialog.aslaidoutRadio       = document.getElementById("aslaidoutRadio");
  65.   dialog.selectedframeRadio   = document.getElementById("selectedframeRadio");
  66.   dialog.eachframesepRadio    = document.getElementById("eachframesepRadio");
  67.   dialog.printframeGroupLabel = document.getElementById("printframeGroupLabel");
  68.  
  69.   dialog.fileInput       = document.getElementById("fileInput");
  70.   dialog.fileLabel       = document.getElementById("fileLabel");
  71.   dialog.printerLabel    = document.getElementById("printerLabel");
  72.   dialog.chooseButton    = document.getElementById("chooseFile");
  73.   dialog.printerList     = document.getElementById("printerList");
  74.  
  75.   dialog.printButton     = document.documentElement.getButton("accept");
  76.  
  77.   // <data> elements
  78.   dialog.printName       = document.getElementById("printButton");
  79.   dialog.fpDialog        = document.getElementById("fpDialog");
  80.  
  81.   dialog.enabled         = false;
  82. }
  83.  
  84. //---------------------------------------------------
  85. function checkInteger(element)
  86. {
  87.   var value = element.value;
  88.   if (value && value.length > 0) {
  89.     value = value.replace(/[^0-9]/g,"");
  90.     if (!value) value = "";
  91.     element.value = value;
  92.   }
  93.   if (!value || value < 1 || value > 999)
  94.     dialog.printButton.setAttribute("disabled","true");
  95.   else
  96.     dialog.printButton.removeAttribute("disabled");
  97. }
  98.  
  99. //---------------------------------------------------
  100. function stripTrailingWhitespace(element)
  101. {
  102.   var value = element.value;
  103.   value = value.replace(/\s+$/,"");
  104.   element.value = value;
  105. }
  106.  
  107. //---------------------------------------------------
  108. function doEnablePrintToFile(value)
  109. {
  110.   if (value) {
  111.     dialog.fileLabel.removeAttribute("disabled");
  112.     dialog.fileInput.removeAttribute("disabled");
  113.     dialog.chooseButton.removeAttribute("disabled");
  114.   } else {
  115.     dialog.fileLabel.setAttribute("disabled","true");
  116.     dialog.fileInput.setAttribute("disabled","true");
  117.     dialog.chooseButton.setAttribute("disabled","true");
  118.   }
  119. }
  120.  
  121. //---------------------------------------------------
  122. function listElement(aListElement)
  123.   {
  124.     this.listElement = aListElement;
  125.   }
  126.  
  127. listElement.prototype =
  128.   {
  129.     clearList:
  130.       function ()
  131.         {
  132.           // remove the menupopup node child of the menulist.
  133.           this.listElement.removeChild(this.listElement.firstChild);
  134.         },
  135.  
  136.     appendPrinterNames: 
  137.       function (aDataObject) 
  138.         { 
  139.           var popupNode = document.createElement("menupopup"); 
  140.           var strDefaultPrinterName = "";
  141.           var printerName;
  142.  
  143.           // build popup menu from printer names
  144.           while (aDataObject.hasMoreElements()) {
  145.             printerName = aDataObject.getNext();
  146.             printerName = printerName.QueryInterface(Components.interfaces.nsISupportsString);
  147.             var printerNameStr = printerName.toString();
  148.             if (strDefaultPrinterName == "")
  149.                strDefaultPrinterName = printerNameStr;
  150.             var itemNode = document.createElement("menuitem");
  151.             itemNode.setAttribute("value", printerNameStr);
  152.             itemNode.setAttribute("label", printerNameStr);
  153.             popupNode.appendChild(itemNode);
  154.           }
  155.           if (strDefaultPrinterName != "") {
  156.             this.listElement.removeAttribute("disabled");
  157.           } else {
  158.             var stringBundle = srGetStrBundle("chrome://global/locale/printing.properties");
  159.             this.listElement.setAttribute("value", strDefaultPrinterName);
  160.             this.listElement.setAttribute("label", stringBundle.GetStringFromName("noprinter"));
  161.  
  162.             // disable dialog
  163.             this.listElement.setAttribute("disabled", "true");
  164.             dialog.destGroup.setAttribute("disabled","true");
  165.             dialog.printerRadio.setAttribute("disabled","true");
  166.             dialog.printerLabel.setAttribute("disabled","true");
  167.             dialog.propertiesButton.setAttribute("disabled","true");
  168.             dialog.fileRadio.setAttribute("disabled","true");
  169.             dialog.printButton.setAttribute("disabled","true");
  170.             doEnablePrintToFile(false);
  171.           }
  172.  
  173.           this.listElement.appendChild(popupNode); 
  174.           return strDefaultPrinterName;
  175.         } 
  176.   };
  177.  
  178. //---------------------------------------------------
  179. function getPrinters()
  180. {
  181.   var printerEnumerator = printOptions.availablePrinters();
  182.  
  183.   var selectElement = new listElement(dialog.printerList);
  184.   selectElement.clearList();
  185.   var strDefaultPrinterName = selectElement.appendPrinterNames(printerEnumerator);
  186.  
  187.   selectElement.listElement.value = strDefaultPrinterName;
  188.  
  189.   // make sure we load the prefs for the initially selected printer
  190.   setPrinterDefaultsForSelectedPrinter();
  191. }
  192.  
  193.  
  194. //---------------------------------------------------
  195. // update gPrintSettings with the defaults for the selected printer
  196. function setPrinterDefaultsForSelectedPrinter()
  197. {
  198.   gPrintSettings.printerName = dialog.printerList.value;
  199.   
  200.   // First get any defaults from the printer 
  201.   printService.initPrintSettingsFromPrinter(gPrintSettings.printerName, gPrintSettings);
  202.   
  203.   // now augment them with any values from last time
  204.   printService.initPrintSettingsFromPrefs(gPrintSettings, true, gPrintSetInterface.kInitSaveAll);
  205.   
  206.   if (doDebug) {
  207.     dump("setPrinterDefaultsForSelectedPrinter: printerName='"+gPrintSettings.printerName+"', paperName='"+gPrintSettings.paperName+"'\n");
  208.   }
  209. }
  210.  
  211. //---------------------------------------------------
  212. function displayPropertiesDialog()
  213. {
  214.   gPrintSettings.numCopies = dialog.numCopiesInput.value;
  215.   try {
  216.     var printingPromptService = Components.classes["@mozilla.org/embedcomp/printingprompt-service;1"]
  217.                                                  .getService(Components.interfaces.nsIPrintingPromptService);
  218.     if (printingPromptService) {
  219.       printingPromptService.showPrinterProperties(null, dialog.printerList.value, gPrintSettings);
  220.       dialog.numCopiesInput.value = gPrintSettings.numCopies;
  221.     }
  222.   } catch(e) {
  223.     dump("problems getting printingPromptService\n");
  224.   }
  225. }
  226.  
  227. //---------------------------------------------------
  228. function doPrintRange(inx)
  229. {
  230.   if (inx == 1) {
  231.     dialog.frompageInput.removeAttribute("disabled");
  232.     dialog.frompageLabel.removeAttribute("disabled");
  233.     dialog.topageInput.removeAttribute("disabled");
  234.     dialog.topageLabel.removeAttribute("disabled");
  235.   } else {
  236.     dialog.frompageInput.setAttribute("disabled","true");
  237.     dialog.frompageLabel.setAttribute("disabled","true");
  238.     dialog.topageInput.setAttribute("disabled","true");
  239.     dialog.topageLabel.setAttribute("disabled","true");
  240.   }
  241. }
  242.  
  243. //---------------------------------------------------
  244. function loadDialog()
  245. {
  246.   var print_copies        = 1;
  247.   var print_file          = default_file;
  248.   var print_selection_radio_enabled = false;
  249.   var print_frametype     = gPrintSetInterface.kSelectedFrame;
  250.   var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone;
  251.   var print_tofile        = "";
  252.  
  253.   try {
  254.     gPrefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  255.  
  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.   // Note: getPrinters sets up the PrintToFile radio buttons and initalises gPrintSettings
  267.   getPrinters();
  268.  
  269.   if (gPrintSettings) {
  270.     print_tofile        = gPrintSettings.printToFile;
  271.     gOriginalNumCopies  = gPrintSettings.numCopies;
  272.  
  273.     print_copies        = gPrintSettings.numCopies;
  274.     print_file          = gPrintSettings.toFileName;
  275.     print_frametype     = gPrintSettings.printFrameType;
  276.     print_howToEnableUI = gPrintSettings.howToEnableFrameUI;
  277.     print_selection_radio_enabled = gPrintSettings.GetPrintOptions(gPrintSetInterface.kEnableSelectionRB);
  278.   }
  279.  
  280.   if (print_tofile) {
  281.     dialog.destGroup.selectedItem = dialog.fileRadio;
  282.     doEnablePrintToFile(true);
  283.   } else {
  284.     dialog.destGroup.selectedItem = dialog.printerRadio;
  285.     doEnablePrintToFile(false);
  286.   }
  287.  
  288.   if (doDebug) {
  289.     dump("loadDialog*********************************************\n");
  290.     dump("toFileName              ["+print_file+"]\n");
  291.     dump("print_tofile            "+print_tofile+"\n");
  292.     dump("print_frame             "+print_frametype+"\n");
  293.     dump("print_howToEnableUI     "+print_howToEnableUI+"\n");
  294.     dump("selection_radio_enabled "+print_selection_radio_enabled+"\n");
  295.   }
  296.  
  297.   if (print_file == "") {
  298.     print_file = default_file;
  299.   }
  300.  
  301.   dialog.printrangeGroup.selectedItem = dialog.allpagesRadio;
  302.   if (print_selection_radio_enabled) {
  303.     dialog.selectionRadio.removeAttribute("disabled");
  304.   } else {
  305.     dialog.selectionRadio.setAttribute("disabled","true");
  306.   }
  307.   doPrintRange(dialog.rangeRadio.selected);
  308.   dialog.frompageInput.value  = 1;
  309.   dialog.topageInput.value    = 1;
  310.   dialog.numCopiesInput.value = print_copies;
  311.  
  312.   dialog.fileInput.value   = print_file;
  313.  
  314.   if (gPrintSettings.toFileName != "") {
  315.     dialog.fileInput.value = gPrintSettings.toFileName;
  316.   }
  317.  
  318.   if (doDebug) {
  319.     dump("print_howToEnableUI: "+print_howToEnableUI+"\n");
  320.   }
  321.  
  322.   // print frame
  323.   if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAll) {
  324.     dialog.aslaidoutRadio.removeAttribute("disabled");
  325.  
  326.     dialog.selectedframeRadio.removeAttribute("disabled");
  327.     dialog.eachframesepRadio.removeAttribute("disabled");
  328.     dialog.printframeGroupLabel.removeAttribute("disabled");
  329.  
  330.     // initialize radio group
  331.     dialog.printframeGroup.selectedItem = dialog.selectedframeRadio;
  332.  
  333.   } else if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAsIsAndEach) {
  334.     dialog.aslaidoutRadio.removeAttribute("disabled");       //enable
  335.  
  336.     dialog.selectedframeRadio.setAttribute("disabled","true"); // disable
  337.     dialog.eachframesepRadio.removeAttribute("disabled");       // enable
  338.     dialog.printframeGroupLabel.removeAttribute("disabled");    // enable
  339.  
  340.     // initialize
  341.     dialog.printframeGroup.selectedItem = dialog.eachframesepRadio;
  342.  
  343.   } else {
  344.     dialog.aslaidoutRadio.setAttribute("disabled","true");
  345.     dialog.selectedframeRadio.setAttribute("disabled","true");
  346.     dialog.eachframesepRadio.setAttribute("disabled","true");
  347.     dialog.printframeGroupLabel.setAttribute("disabled","true");
  348.   }
  349.  
  350.   dialog.printButton.label = dialog.printName.getAttribute("label");
  351. }
  352.  
  353. //---------------------------------------------------
  354. function onLoad()
  355. {
  356.   // Init dialog.
  357.   initDialog();
  358.  
  359.   // param[0]: nsIPrintSettings object
  360.   // param[1]: container for return value (1 = print, 0 = cancel)
  361.  
  362.   gPrintSettings   = window.arguments[0].QueryInterface(gPrintSetInterface);
  363.   gWebBrowserPrint = window.arguments[1].QueryInterface(Components.interfaces.nsIWebBrowserPrint);
  364.   paramBlock       = window.arguments[2].QueryInterface(Components.interfaces.nsIDialogParamBlock);
  365.  
  366.   // default return value is "cancel"
  367.   paramBlock.SetInt(0, 0);
  368.  
  369.   loadDialog();
  370. }
  371.  
  372. //---------------------------------------------------
  373. function onAccept()
  374. {
  375.  
  376.   if (gPrintSettings != null) {
  377.     var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone;
  378.     var stringBundle = srGetStrBundle("chrome://global/locale/printing.properties");
  379.     var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
  380.                         .getService(Components.interfaces.nsIPromptService);
  381.  
  382.     if (dialog.fileRadio.selected && dialog.fileInput.value == "") {
  383.       var titleText = stringBundle.GetStringFromName("noPrintFilename.title");
  384.       var alertText = stringBundle.GetStringFromName("noPrintFilename.alert");
  385.       promptService.alert(this.window, titleText, alertText);
  386.       return false;
  387.     }
  388.  
  389.     // save these out so they can be picked up by the device spec
  390.     gPrintSettings.printToFile = dialog.fileRadio.selected;
  391.     print_howToEnableUI        = gPrintSettings.howToEnableFrameUI;
  392.  
  393.     // save these out so they can be picked up by the device spec
  394.     gPrintSettings.toFileName   = dialog.fileInput.value;
  395.     gPrintSettings.printerName  = dialog.printerList.value;
  396.  
  397.     if (gPrintSettings.printToFile) {
  398.       if (gPrintSettings.toFileName == "")
  399.         return false;
  400.       var sfile = Components.classes["@mozilla.org/file/local;1"]
  401.                   .createInstance(Components.interfaces.nsILocalFile);
  402.       sfile.initWithPath(gPrintSettings.toFileName);
  403.       if (sfile.exists() &&
  404.         gPrintSettings.toFileName != gFileFromPicker) {
  405.         var desc = stringBundle.formatStringFromName("fileConfirm.exists",
  406.                                                      [gPrintSettings.toFileName],
  407.                                                      1);
  408.         if (!promptService.confirm(this.window, null, desc)) {
  409.           return false;
  410.         }
  411.       }
  412.     }
  413.  
  414.     if (dialog.allpagesRadio.selected) {
  415.       gPrintSettings.printRange = gPrintSetInterface.kRangeAllPages;
  416.     } else if (dialog.rangeRadio.selected) {
  417.       gPrintSettings.printRange = gPrintSetInterface.kRangeSpecifiedPageRange;
  418.     } else if (dialog.selectionRadio.selected) {
  419.       gPrintSettings.printRange = gPrintSetInterface.kRangeSelection;
  420.     }
  421.     gPrintSettings.startPageRange = dialog.frompageInput.value;
  422.     gPrintSettings.endPageRange   = dialog.topageInput.value;
  423.     gPrintSettings.numCopies      = dialog.numCopiesInput.value;
  424.  
  425.     var frametype = gPrintSetInterface.kNoFrames;
  426.     if (print_howToEnableUI != gPrintSetInterface.kFrameEnableNone) {
  427.       if (dialog.aslaidoutRadio.selected) {
  428.         frametype = gPrintSetInterface.kFramesAsIs;
  429.       } else if (dialog.selectedframeRadio.selected) {
  430.         frametype = gPrintSetInterface.kSelectedFrame;
  431.       } else if (dialog.eachframesepRadio.selected) {
  432.         frametype = gPrintSetInterface.kEachFrameSep;
  433.       } else {
  434.         frametype = gPrintSetInterface.kSelectedFrame;
  435.       }
  436.     }
  437.     gPrintSettings.printFrameType = frametype;
  438.     if (doDebug) {
  439.       dump("onAccept*********************************************\n");
  440.       dump("frametype      "+frametype+"\n");
  441.       dump("numCopies      "+gPrintSettings.numCopies+"\n");
  442.       dump("printRange     "+gPrintSettings.printRange+"\n");
  443.       dump("printerName    "+gPrintSettings.printerName+"\n");
  444.       dump("startPageRange "+gPrintSettings.startPageRange+"\n");
  445.       dump("endPageRange   "+gPrintSettings.endPageRange+"\n");
  446.       dump("printToFile    "+gPrintSettings.printToFile+"\n");
  447.     }
  448.   }
  449.  
  450.   var saveToPrefs = false;
  451.  
  452.   saveToPrefs = gPrefs.getBoolPref("print.save_print_settings");
  453.  
  454.   if (saveToPrefs && printService != null) {
  455.     var flags = gPrintSetInterface.kInitSavePaperSizeType | 
  456.                 gPrintSetInterface.kInitSavePaperSizeUnit |
  457.                 gPrintSetInterface.kInitSavePaperWidth    | 
  458.                 gPrintSetInterface.kInitSavePaperHeight   |
  459.                 gPrintSetInterface.kInitSavePaperName     | 
  460.                 gPrintSetInterface.kInitSaveInColor       |
  461.                 gPrintSetInterface.kInitSavePrintCommand;
  462.     printService.savePrintSettingsToPrefs(gPrintSettings, true, flags);
  463.   }
  464.  
  465.   // set return value to "print"
  466.   if (paramBlock) {
  467.     paramBlock.SetInt(0, 1);
  468.   } else {
  469.     dump("*** FATAL ERROR: No paramBlock\n");
  470.   }
  471.  
  472.   return true;
  473.  
  474. }
  475.  
  476. //---------------------------------------------------
  477. function onCancel()
  478. {
  479.   // set return value to "cancel"
  480.   if (paramBlock) {
  481.     paramBlock.SetInt(0, 0);
  482.   } else {
  483.     dump("*** FATAL ERROR: No paramBlock\n");
  484.   }
  485.  
  486.   return true;
  487. }
  488.  
  489. //---------------------------------------------------
  490. const nsIFilePicker = Components.interfaces.nsIFilePicker;
  491. function onChooseFile()
  492. {
  493.   if (dialog.fileRadio.selected == false)
  494.     return;
  495.  
  496.   try {
  497.     var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  498.     fp.init(window, dialog.fpDialog.getAttribute("label"), nsIFilePicker.modeSave);
  499.     fp.appendFilters(nsIFilePicker.filterAll);
  500.     fp.show();
  501.     if (fp.file && fp.file.path.length > 0) {
  502.       dialog.fileInput.value = fp.file.path;
  503.       gFileFromPicker = dialog.fileInput.value;
  504.     }
  505.   } catch(ex) {
  506.     dump(ex);
  507.   }
  508. }
  509.  
  510.