toolkit/components/printing/content/printdialog.js

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1 // -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
     3 /* This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 var dialog;
     8 var printService       = null;
     9 var gOriginalNumCopies = 1;
    11 var paramBlock;
    12 var gPrefs             = null;
    13 var gPrintSettings     = null;
    14 var gWebBrowserPrint   = null;
    15 var gPrintSetInterface = Components.interfaces.nsIPrintSettings;
    16 var doDebug            = false;
    18 //---------------------------------------------------
    19 function initDialog()
    20 {
    21   dialog = new Object;
    23   dialog.propertiesButton = document.getElementById("properties");
    24   dialog.descText         = document.getElementById("descText");
    26   dialog.printrangeGroup = document.getElementById("printrangeGroup");
    27   dialog.allpagesRadio   = document.getElementById("allpagesRadio");
    28   dialog.rangeRadio      = document.getElementById("rangeRadio");
    29   dialog.selectionRadio  = document.getElementById("selectionRadio");
    30   dialog.frompageInput   = document.getElementById("frompageInput");
    31   dialog.frompageLabel   = document.getElementById("frompageLabel");
    32   dialog.topageInput     = document.getElementById("topageInput");
    33   dialog.topageLabel     = document.getElementById("topageLabel");
    35   dialog.numCopiesInput  = document.getElementById("numCopiesInput");  
    37   dialog.printframeGroup      = document.getElementById("printframeGroup");
    38   dialog.aslaidoutRadio       = document.getElementById("aslaidoutRadio");
    39   dialog.selectedframeRadio   = document.getElementById("selectedframeRadio");
    40   dialog.eachframesepRadio    = document.getElementById("eachframesepRadio");
    41   dialog.printframeGroupLabel = document.getElementById("printframeGroupLabel");
    43   dialog.fileCheck       = document.getElementById("fileCheck");
    44   dialog.printerLabel    = document.getElementById("printerLabel");
    45   dialog.printerList     = document.getElementById("printerList");
    47   dialog.printButton     = document.documentElement.getButton("accept");
    49   // <data> elements
    50   dialog.printName       = document.getElementById("printButton");
    51   dialog.fpDialog        = document.getElementById("fpDialog");
    53   dialog.enabled         = false;
    54 }
    56 //---------------------------------------------------
    57 function checkInteger(element)
    58 {
    59   var value = element.value;
    60   if (value && value.length > 0) {
    61     value = value.replace(/[^0-9]/g,"");
    62     if (!value) value = "";
    63     element.value = value;
    64   }
    65   if (!value || value < 1 || value > 999)
    66     dialog.printButton.setAttribute("disabled","true");
    67   else
    68     dialog.printButton.removeAttribute("disabled");
    69 }
    71 //---------------------------------------------------
    72 function stripTrailingWhitespace(element)
    73 {
    74   var value = element.value;
    75   value = value.replace(/\s+$/,"");
    76   element.value = value;
    77 }
    79 //---------------------------------------------------
    80 function getPrinterDescription(printerName)
    81 {
    82   var s = "";
    84   try {
    85     /* This may not work with non-ASCII test (see bug 235763 comment #16) */
    86     s = gPrefs.getCharPref("print.printer_" + printerName + ".printer_description")
    87   } catch(e) {
    88   }
    90   return s;
    91 }
    93 //---------------------------------------------------
    94 function listElement(aListElement)
    95   {
    96     this.listElement = aListElement;
    97   }
    99 listElement.prototype =
   100   {
   101     clearList:
   102       function ()
   103         {
   104           // remove the menupopup node child of the menulist.
   105           var popup = this.listElement.firstChild;
   106           if (popup) {
   107             this.listElement.removeChild(popup);
   108           }
   109         },
   111     appendPrinterNames: 
   112       function (aDataObject) 
   113         { 
   114           if ((null == aDataObject) || !aDataObject.hasMore()) {
   115             // disable dialog
   116             this.listElement.setAttribute("value", "");
   117             this.listElement.setAttribute("label",
   118               document.getElementById("printingBundle")
   119                       .getString("noprinter"));
   121             this.listElement.setAttribute("disabled", "true");
   122             dialog.printerLabel.setAttribute("disabled","true");
   123             dialog.propertiesButton.setAttribute("disabled","true");
   124             dialog.fileCheck.setAttribute("disabled","true");
   125             dialog.printButton.setAttribute("disabled","true");
   126           }
   127           else {
   128             // build popup menu from printer names
   129             var list = document.getElementById("printerList"); 
   130             do {
   131               printerNameStr = aDataObject.getNext();
   132               list.appendItem(printerNameStr, printerNameStr, getPrinterDescription(printerNameStr));
   133             } while (aDataObject.hasMore());
   134             this.listElement.removeAttribute("disabled");
   135           }
   136         } 
   137   };
   139 //---------------------------------------------------
   140 function getPrinters()
   141 {
   142   var selectElement = new listElement(dialog.printerList);
   143   selectElement.clearList();
   145   var printerEnumerator;
   146   try {
   147     printerEnumerator =
   148         Components.classes["@mozilla.org/gfx/printerenumerator;1"]
   149                   .getService(Components.interfaces.nsIPrinterEnumerator)
   150                   .printerNameList;
   151   } catch(e) { printerEnumerator = null; }
   153   selectElement.appendPrinterNames(printerEnumerator);
   154   selectElement.listElement.value = printService.defaultPrinterName;
   156   // make sure we load the prefs for the initially selected printer
   157   setPrinterDefaultsForSelectedPrinter();
   158 }
   161 //---------------------------------------------------
   162 // update gPrintSettings with the defaults for the selected printer
   163 function setPrinterDefaultsForSelectedPrinter()
   164 {
   165   gPrintSettings.printerName = dialog.printerList.value;
   167   dialog.descText.value = getPrinterDescription(gPrintSettings.printerName);
   169   // First get any defaults from the printer 
   170   printService.initPrintSettingsFromPrinter(gPrintSettings.printerName, gPrintSettings);
   172   // now augment them with any values from last time
   173   printService.initPrintSettingsFromPrefs(gPrintSettings, true, gPrintSetInterface.kInitSaveAll);
   175   if (doDebug) {
   176     dump("setPrinterDefaultsForSelectedPrinter: printerName='"+gPrintSettings.printerName+"', paperName='"+gPrintSettings.paperName+"'\n");
   177   }
   178 }
   180 //---------------------------------------------------
   181 function displayPropertiesDialog()
   182 {
   183   gPrintSettings.numCopies = dialog.numCopiesInput.value;
   184   try {
   185     var printingPromptService = Components.classes["@mozilla.org/embedcomp/printingprompt-service;1"]
   186                                                  .getService(Components.interfaces.nsIPrintingPromptService);
   187     if (printingPromptService) {
   188       printingPromptService.showPrinterProperties(null, dialog.printerList.value, gPrintSettings);
   189       dialog.numCopiesInput.value = gPrintSettings.numCopies;
   190     }
   191   } catch(e) {
   192     dump("problems getting printingPromptService\n");
   193   }
   194 }
   196 //---------------------------------------------------
   197 function doPrintRange(inx)
   198 {
   199   if (inx == 1) {
   200     dialog.frompageInput.removeAttribute("disabled");
   201     dialog.frompageLabel.removeAttribute("disabled");
   202     dialog.topageInput.removeAttribute("disabled");
   203     dialog.topageLabel.removeAttribute("disabled");
   204   } else {
   205     dialog.frompageInput.setAttribute("disabled","true");
   206     dialog.frompageLabel.setAttribute("disabled","true");
   207     dialog.topageInput.setAttribute("disabled","true");
   208     dialog.topageLabel.setAttribute("disabled","true");
   209   }
   210 }
   212 //---------------------------------------------------
   213 function loadDialog()
   214 {
   215   var print_copies        = 1;
   216   var print_selection_radio_enabled = false;
   217   var print_frametype     = gPrintSetInterface.kSelectedFrame;
   218   var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone;
   219   var print_tofile        = "";
   221   try {
   222     gPrefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
   224     printService = Components.classes["@mozilla.org/gfx/printsettings-service;1"];
   225     if (printService) {
   226       printService = printService.getService();
   227       if (printService) {
   228         printService = printService.QueryInterface(Components.interfaces.nsIPrintSettingsService);
   229       }
   230     }
   231   } catch(e) {}
   233   // Note: getPrinters sets up the PrintToFile control
   234   getPrinters();
   236   if (gPrintSettings) {
   237     print_tofile        = gPrintSettings.printToFile;
   238     gOriginalNumCopies  = gPrintSettings.numCopies;
   240     print_copies        = gPrintSettings.numCopies;
   241     print_frametype     = gPrintSettings.printFrameType;
   242     print_howToEnableUI = gPrintSettings.howToEnableFrameUI;
   243     print_selection_radio_enabled = gPrintSettings.GetPrintOptions(gPrintSetInterface.kEnableSelectionRB);
   244   }
   246   if (doDebug) {
   247     dump("loadDialog*********************************************\n");
   248     dump("print_tofile            "+print_tofile+"\n");
   249     dump("print_frame             "+print_frametype+"\n");
   250     dump("print_howToEnableUI     "+print_howToEnableUI+"\n");
   251     dump("selection_radio_enabled "+print_selection_radio_enabled+"\n");
   252   }
   254   dialog.printrangeGroup.selectedItem = dialog.allpagesRadio;
   255   if (print_selection_radio_enabled) {
   256     dialog.selectionRadio.removeAttribute("disabled");
   257   } else {
   258     dialog.selectionRadio.setAttribute("disabled","true");
   259   }
   260   doPrintRange(dialog.rangeRadio.selected);
   261   dialog.frompageInput.value  = 1;
   262   dialog.topageInput.value    = 1;
   263   dialog.numCopiesInput.value = print_copies;
   265   if (doDebug) {
   266     dump("print_howToEnableUI: "+print_howToEnableUI+"\n");
   267   }
   269   // print frame
   270   if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAll) {
   271     dialog.aslaidoutRadio.removeAttribute("disabled");
   273     dialog.selectedframeRadio.removeAttribute("disabled");
   274     dialog.eachframesepRadio.removeAttribute("disabled");
   275     dialog.printframeGroupLabel.removeAttribute("disabled");
   277     // initialize radio group
   278     dialog.printframeGroup.selectedItem = dialog.selectedframeRadio;
   280   } else if (print_howToEnableUI == gPrintSetInterface.kFrameEnableAsIsAndEach) {
   281     dialog.aslaidoutRadio.removeAttribute("disabled");       //enable
   283     dialog.selectedframeRadio.setAttribute("disabled","true"); // disable
   284     dialog.eachframesepRadio.removeAttribute("disabled");       // enable
   285     dialog.printframeGroupLabel.removeAttribute("disabled");    // enable
   287     // initialize
   288     dialog.printframeGroup.selectedItem = dialog.eachframesepRadio;
   290   } else {
   291     dialog.aslaidoutRadio.setAttribute("disabled","true");
   292     dialog.selectedframeRadio.setAttribute("disabled","true");
   293     dialog.eachframesepRadio.setAttribute("disabled","true");
   294     dialog.printframeGroupLabel.setAttribute("disabled","true");
   295   }
   297   dialog.printButton.label = dialog.printName.getAttribute("label");
   298 }
   300 //---------------------------------------------------
   301 function onLoad()
   302 {
   303   // Init dialog.
   304   initDialog();
   306   // param[0]: nsIPrintSettings object
   307   // param[1]: container for return value (1 = print, 0 = cancel)
   309   gPrintSettings   = window.arguments[0].QueryInterface(gPrintSetInterface);
   310   gWebBrowserPrint = window.arguments[1].QueryInterface(Components.interfaces.nsIWebBrowserPrint);
   311   paramBlock       = window.arguments[2].QueryInterface(Components.interfaces.nsIDialogParamBlock);
   313   // default return value is "cancel"
   314   paramBlock.SetInt(0, 0);
   316   loadDialog();
   317 }
   319 //---------------------------------------------------
   320 function onAccept()
   321 {
   322   if (gPrintSettings != null) {
   323     var print_howToEnableUI = gPrintSetInterface.kFrameEnableNone;
   325     // save these out so they can be picked up by the device spec
   326     gPrintSettings.printerName = dialog.printerList.value;
   327     print_howToEnableUI        = gPrintSettings.howToEnableFrameUI;
   328     gPrintSettings.printToFile = dialog.fileCheck.checked;
   330     if (gPrintSettings.printToFile && !chooseFile())
   331       return false;
   333     if (dialog.allpagesRadio.selected) {
   334       gPrintSettings.printRange = gPrintSetInterface.kRangeAllPages;
   335     } else if (dialog.rangeRadio.selected) {
   336       gPrintSettings.printRange = gPrintSetInterface.kRangeSpecifiedPageRange;
   337     } else if (dialog.selectionRadio.selected) {
   338       gPrintSettings.printRange = gPrintSetInterface.kRangeSelection;
   339     }
   340     gPrintSettings.startPageRange = dialog.frompageInput.value;
   341     gPrintSettings.endPageRange   = dialog.topageInput.value;
   342     gPrintSettings.numCopies      = dialog.numCopiesInput.value;
   344     var frametype = gPrintSetInterface.kNoFrames;
   345     if (print_howToEnableUI != gPrintSetInterface.kFrameEnableNone) {
   346       if (dialog.aslaidoutRadio.selected) {
   347         frametype = gPrintSetInterface.kFramesAsIs;
   348       } else if (dialog.selectedframeRadio.selected) {
   349         frametype = gPrintSetInterface.kSelectedFrame;
   350       } else if (dialog.eachframesepRadio.selected) {
   351         frametype = gPrintSetInterface.kEachFrameSep;
   352       } else {
   353         frametype = gPrintSetInterface.kSelectedFrame;
   354       }
   355     }
   356     gPrintSettings.printFrameType = frametype;
   357     if (doDebug) {
   358       dump("onAccept*********************************************\n");
   359       dump("frametype      "+frametype+"\n");
   360       dump("numCopies      "+gPrintSettings.numCopies+"\n");
   361       dump("printRange     "+gPrintSettings.printRange+"\n");
   362       dump("printerName    "+gPrintSettings.printerName+"\n");
   363       dump("startPageRange "+gPrintSettings.startPageRange+"\n");
   364       dump("endPageRange   "+gPrintSettings.endPageRange+"\n");
   365       dump("printToFile    "+gPrintSettings.printToFile+"\n");
   366     }
   367   }
   369   var saveToPrefs = false;
   371   saveToPrefs = gPrefs.getBoolPref("print.save_print_settings");
   373   if (saveToPrefs && printService != null) {
   374     var flags = gPrintSetInterface.kInitSavePaperSize      | 
   375                 gPrintSetInterface.kInitSaveColorSpace     |
   376                 gPrintSetInterface.kInitSaveEdges          |
   377                 gPrintSetInterface.kInitSaveInColor        |
   378                 gPrintSetInterface.kInitSaveResolutionName |
   379                 gPrintSetInterface.kInitSaveDownloadFonts  |
   380                 gPrintSetInterface.kInitSavePrintCommand   |
   381                 gPrintSetInterface.kInitSaveShrinkToFit    |
   382                 gPrintSetInterface.kInitSaveScaling;
   383     printService.savePrintSettingsToPrefs(gPrintSettings, true, flags);
   384   }
   386   // set return value to "print"
   387   if (paramBlock) {
   388     paramBlock.SetInt(0, 1);
   389   } else {
   390     dump("*** FATAL ERROR: No paramBlock\n");
   391   }
   393   return true;
   394 }
   396 //---------------------------------------------------
   397 function onCancel()
   398 {
   399   // set return value to "cancel"
   400   if (paramBlock) {
   401     paramBlock.SetInt(0, 0);
   402   } else {
   403     dump("*** FATAL ERROR: No paramBlock\n");
   404   }
   406   return true;
   407 }
   409 //---------------------------------------------------
   410 const nsIFilePicker = Components.interfaces.nsIFilePicker;
   411 function chooseFile()
   412 {
   413   try {
   414     var fp = Components.classes["@mozilla.org/filepicker;1"]
   415                        .createInstance(nsIFilePicker);
   416     fp.init(window, dialog.fpDialog.getAttribute("label"), nsIFilePicker.modeSave);
   417     fp.appendFilters(nsIFilePicker.filterAll);
   418     if (fp.show() != Components.interfaces.nsIFilePicker.returnCancel &&
   419         fp.file && fp.file.path) {
   420       gPrintSettings.toFileName = fp.file.path;
   421       return true;
   422     }
   423   } catch(ex) {
   424     dump(ex);
   425   }
   427   return false;
   428 }

mercurial