home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 May / PCWorld_2003-05_cd.bin / Komunik / phoenix / chrome / toolkit.jar / content / global / printProgress.js < prev    next >
Text File  |  2002-10-03  |  9KB  |  295 lines

  1. /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. /*
  3.  * The contents of this file are subject to the Netscape Public License
  4.  * Version 1.0 (the "License"); you may not use this file except in
  5.  * compliance with the License.  You may obtain a copy of the License at
  6.  * http://www.mozilla.org/NPL/
  7.  *
  8.  * Software distributed under the License is distributed on an "AS IS" basis,
  9.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  10.  * for the specific language governing rights and limitations under the
  11.  * License.
  12.  *
  13.  * The Original Code is Mozilla Communicator client code, 
  14.  * released March 31, 1998. 
  15.  *
  16.  * The Initial Developer of the Original Code is Netscape Communications 
  17.  * Corporation.  Portions created by Netscape are 
  18.  * Copyright (C) 1998 Netscape Communications Corporation.  All Rights
  19.  * Reserved.
  20.  *
  21.  * Contributors:
  22.  *     William A. ("PowerGUI") Law <law@netscape.com>
  23.  *     Scott MacGregor <mscott@netscape.com>
  24.  *     jean-Francois Ducarroz <ducarroz@netscape.com>
  25.  *     Rod Spears <rods@netscape.com>
  26.  */
  27.  
  28. // dialog is just an array we'll use to store various properties from the dialog document...
  29. var dialog;
  30.  
  31. // the printProgress is a nsIPrintProgress object
  32. var printProgress = null; 
  33.  
  34. // random global variables...
  35. var targetFile;
  36.  
  37. var docTitle = "";
  38. var docURL   = "";
  39. var progressParams = null;
  40. var switchUI = true;
  41.  
  42. function elipseString(aStr, doFront)
  43. {
  44.   if (aStr.length > 3 && (aStr.substr(0, 3) == "..." || aStr.substr(aStr.length-4, 3) == "...")) {
  45.     return aStr;
  46.   }
  47.  
  48.   var fixedLen = 64;
  49.   if (aStr.length > fixedLen) {
  50.     if (doFront) {
  51.       var endStr = aStr.substr(aStr.length-fixedLen, fixedLen);
  52.       var str = "..." + endStr;
  53.       return str;
  54.     } else {
  55.       var frontStr = aStr.substr(0, fixedLen);
  56.       var str = frontStr + "...";
  57.       return str;
  58.     }
  59.   }
  60.   return aStr;
  61. }
  62.  
  63. // all progress notifications are done through the nsIWebProgressListener implementation...
  64. var progressListener = {
  65.     onStateChange: function(aWebProgress, aRequest, aStateFlags, aStatus)
  66.     {
  67.       if (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_START)
  68.       {
  69.         // Put progress meter in undetermined mode.
  70.         // dialog.progress.setAttribute( "value", 0 );
  71.         dialog.progress.setAttribute( "mode", "undetermined" );
  72.       }
  73.       
  74.       if (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP)
  75.       {
  76.         // we are done printing 
  77.         // Indicate completion in title area.
  78.         var msg = getString( "printComplete" );
  79.         dialog.title.setAttribute("value", msg);
  80.  
  81.         // Put progress meter at 100%.
  82.         dialog.progress.setAttribute( "value", 100 );
  83.         dialog.progress.setAttribute( "mode", "normal" );
  84.         var percentPrint = getString( "progressText" );
  85.         percentPrint = replaceInsert( percentPrint, 1, 100 );
  86.         dialog.progressText.setAttribute("value", percentPrint);
  87.         window.close();
  88.       }
  89.     },
  90.     
  91.     onProgressChange: function(aWebProgress, aRequest, aCurSelfProgress, aMaxSelfProgress, aCurTotalProgress, aMaxTotalProgress)
  92.     {
  93.       if (switchUI) 
  94.       {
  95.         dialog.tempLabel.setAttribute("hidden", "true");
  96.         dialog.progress.setAttribute("hidden", "false");
  97.         dialog.cancel.setAttribute("disabled", "false");
  98.  
  99.         var progressLabel = getString("progress");
  100.         if (progressLabel == "") {
  101.           progressLabel = "Progress:"; // better than nothing
  102.         }
  103.         switchUI = false;
  104.       }
  105.  
  106.       if (progressParams)
  107.       {
  108.         var docTitleStr = elipseString(progressParams.docTitle, false);
  109.         if (docTitleStr != docTitle) {
  110.           docTitle = docTitleStr;
  111.           dialog.title.value = docTitle;
  112.         }
  113.         var docURLStr = progressParams.docURL;
  114.         if (docURLStr != docURL && dialog.title != null) {
  115.           docURL = docURLStr;
  116.           if (docTitle == "") {
  117.             dialog.title.value = elipseString(docURLStr, true);
  118.           }
  119.         }
  120.       }
  121.  
  122.       // Calculate percentage.
  123.       var percent;
  124.       if ( aMaxTotalProgress > 0 ) 
  125.       {
  126.         percent = parseInt( (aCurTotalProgress*100)/aMaxTotalProgress + .5 );
  127.         if ( percent > 100 )
  128.           percent = 100;
  129.         
  130.         dialog.progress.removeAttribute( "mode");
  131.         
  132.         // Advance progress meter.
  133.         dialog.progress.setAttribute( "value", percent );
  134.  
  135.         // Update percentage label on progress meter.
  136.         var percentPrint = getString( "progressText" );
  137.         percentPrint = replaceInsert( percentPrint, 1, percent );
  138.         dialog.progressText.setAttribute("value", percentPrint);
  139.       } 
  140.       else 
  141.       {
  142.         // Progress meter should be barber-pole in this case.
  143.         dialog.progress.setAttribute( "mode", "undetermined" );
  144.         // Update percentage label on progress meter.
  145.         dialog.progressText.setAttribute("value", "");
  146.       }
  147.     },
  148.  
  149.       onLocationChange: function(aWebProgress, aRequest, aLocation)
  150.     {
  151.       // we can ignore this notification
  152.     },
  153.  
  154.     onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage)
  155.     {
  156.       if (aMessage != "")
  157.         dialog.title.setAttribute("value", aMessage);
  158.     },
  159.  
  160.     onSecurityChange: function(aWebProgress, aRequest, state)
  161.     {
  162.       // we can ignore this notification
  163.     },
  164.  
  165.     QueryInterface : function(iid)
  166.     {
  167.      if (iid.equals(Components.interfaces.nsIWebProgressListener) || iid.equals(Components.interfaces.nsISupportsWeakReference))
  168.       return this;
  169.      
  170.      throw Components.results.NS_NOINTERFACE;
  171.     }
  172. };
  173.  
  174. function getString( stringId ) {
  175.    // Check if we've fetched this string already.
  176.    if (!(stringId in dialog.strings)) {
  177.       // Try to get it.
  178.       var elem = document.getElementById( "dialog.strings."+stringId );
  179.       try {
  180.         if ( elem
  181.            &&
  182.            elem.childNodes
  183.            &&
  184.            elem.childNodes[0]
  185.            &&
  186.            elem.childNodes[0].nodeValue ) {
  187.          dialog.strings[ stringId ] = elem.childNodes[0].nodeValue;
  188.         } else {
  189.           // If unable to fetch string, use an empty string.
  190.           dialog.strings[ stringId ] = "";
  191.         }
  192.       } catch (e) { dialog.strings[ stringId ] = ""; }
  193.    }
  194.    return dialog.strings[ stringId ];
  195. }
  196.  
  197. function loadDialog() 
  198. {
  199. }
  200.  
  201. function replaceInsert( text, index, value ) {
  202.    var result = text;
  203.    var regExp = new RegExp( "#"+index );
  204.    result = result.replace( regExp, value );
  205.    return result;
  206. }
  207.  
  208. function onLoad() {
  209.  
  210.     // Set global variables.
  211.     printProgress = window.arguments[0];
  212.     if (window.arguments[1])
  213.     {
  214.       progressParams = window.arguments[1].QueryInterface(Components.interfaces.nsIPrintProgressParams)
  215.       if (progressParams)
  216.       {
  217.         docTitle = elipseString(progressParams.docTitle, false);
  218.         docURL   = elipseString(progressParams.docURL, true);
  219.       }
  220.     }
  221.  
  222.     if ( !printProgress ) {
  223.         dump( "Invalid argument to printProgress.xul\n" );
  224.         window.close()
  225.         return;
  226.     }
  227.  
  228.     dialog = new Object;
  229.     dialog.strings = new Array;
  230.     dialog.title        = document.getElementById("dialog.title");
  231.     dialog.titleLabel   = document.getElementById("dialog.titleLabel");
  232.     dialog.progress     = document.getElementById("dialog.progress");
  233.     dialog.progressText = document.getElementById("dialog.progressText");
  234.     dialog.progressLabel = document.getElementById("dialog.progressLabel");
  235.     dialog.tempLabel    = document.getElementById("dialog.tempLabel");
  236.     dialog.cancel       = document.getElementById("cancel");
  237.  
  238.     dialog.progress.setAttribute("hidden", "true");
  239.     dialog.cancel.setAttribute("disabled", "true");
  240.  
  241.     var progressLabel = getString("preparing");
  242.     if (progressLabel == "") {
  243.       progressLabel = "Preparing..."; // better than nothing
  244.     }
  245.     dialog.tempLabel.value = progressLabel;
  246.  
  247.     dialog.title.value = docTitle;
  248.  
  249.     // Set up dialog button callbacks.
  250.     var object = this;
  251.     doSetOKCancel("", function () { return object.onCancel();});
  252.  
  253.     // Fill dialog.
  254.     loadDialog();
  255.  
  256.     // set our web progress listener on the helper app launcher
  257.     printProgress.registerListener(progressListener);
  258.     moveToAlertPosition();
  259.     //We need to delay the set title else dom will overwrite it
  260.     window.setTimeout(doneIniting, 500);
  261. }
  262.  
  263. function onUnload() 
  264. {
  265.   if (printProgress)
  266.   {
  267.    try 
  268.    {
  269.      printProgress.unregisterListener(progressListener);
  270.      printProgress = null;
  271.    }
  272.     
  273.    catch( exception ) {}
  274.   }
  275. }
  276.  
  277. // If the user presses cancel, tell the app launcher and close the dialog...
  278. function onCancel () 
  279. {
  280.   // Cancel app launcher.
  281.    try 
  282.    {
  283.      printProgress.processCanceledByUser = true;
  284.    }
  285.    catch( exception ) {return true;}
  286.     
  287.   // don't Close up dialog by returning false, the backend will close the dialog when everything will be aborted.
  288.   return false;
  289. }
  290.  
  291. function doneIniting() 
  292. {
  293.   printProgress.doneIniting();
  294. }
  295.