home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 January / 01_02.iso / linux / mozilla-installer_linux / xpi / browser.xpi / bin / components / nsFilePicker.js < prev    next >
Text File  |  2001-11-20  |  9KB  |  270 lines

  1. /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
  2.  *
  3.  * The contents of this file are subject to the Mozilla 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/MPL/
  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.org code.
  14.  * 
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation.  Portions created by Netscape are
  17.  * Copyright (C) 2000 Netscape Communications Corporation.  All
  18.  * Rights Reserved.
  19.  * 
  20.  * Contributor(s): Stuart Parmenter <pavlov@netscape.com>
  21.  */
  22.  
  23. /*
  24.  * No magic constructor behaviour, as is de rigeur for XPCOM.
  25.  * If you must perform some initialization, and it could possibly fail (even
  26.  * due to an out-of-memory condition), you should use an Init method, which
  27.  * can convey failure appropriately (thrown exception in JS,
  28.  * NS_FAILED(nsresult) return in C++).
  29.  *
  30.  * In JS, you can actually cheat, because a thrown exception will cause the
  31.  * CreateInstance call to fail in turn, but not all languages are so lucky.
  32.  * (Though ANSI C++ provides exceptions, they are verboten in Mozilla code
  33.  * for portability reasons -- and even when you're building completely
  34.  * platform-specific code, you can't throw across an XPCOM method boundary.)
  35.  */
  36.  
  37.  
  38. const DEBUG = false; /* set to true to enable debug messages */
  39.  
  40. const FILEPICKER_CONTRACTID     = "@mozilla.org/filepicker;1";
  41. const FILEPICKER_CID        = Components.ID("{54ae32f8-1dd2-11b2-a209-df7c505370f8}");
  42. const LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1";
  43. const APPSHELL_SERV_CONTRACTID  = "@mozilla.org/appshell/appShellService;1";
  44. const STRBUNDLE_SERV_CONTRACTID = "@mozilla.org/intl/stringbundle;1";
  45.  
  46. const nsIAppShellService    = Components.interfaces.nsIAppShellService;
  47. const nsILocalFile          = Components.interfaces.nsILocalFile;
  48. const nsIFileURL            = Components.interfaces.nsIFileURL;
  49. const nsISupports           = Components.interfaces.nsISupports;
  50. const nsIFactory            = Components.interfaces.nsIFactory;
  51. const nsIFilePicker         = Components.interfaces.nsIFilePicker;
  52. const nsIInterfaceRequestor = Components.interfaces.nsIInterfaceRequestor
  53. const nsIDOMWindow          = Components.interfaces.nsIDOMWindow;
  54. const nsIStringBundleService = Components.interfaces.nsIStringBundleService;
  55.  
  56. var   bundle                = null;
  57. var   lastDirectory         = null;
  58.  
  59. function nsFilePicker()
  60. {
  61.   if (!bundle)
  62.     bundle = srGetStrBundle("chrome://global/locale/filepicker.properties");
  63.  
  64.   /* attributes */
  65.   this.mDefaultString = "";
  66.   if (lastDirectory) {
  67.     this.mDisplayDirectory = Components.classes[LOCAL_FILE_CONTRACTID].createInstance(nsILocalFile);
  68.     this.mDisplayDirectory.initWithUnicodePath(lastDirectory);
  69.   } else {
  70.     this.mDisplayDirectory = null;
  71.   }
  72.   this.mFilterTitles = new Array();
  73.   this.mFilters = new Array();
  74. }
  75.  
  76. nsFilePicker.prototype = {
  77.  
  78.   /* attribute nsILocalFile displayDirectory; */
  79.   set displayDirectory(a) { this.mDisplayDirectory = a; },
  80.   get displayDirectory()  { return this.mDisplayDirectory; },
  81.  
  82.   /* readonly attribute nsILocalFile file; */
  83.   set file(a) { throw "readonly property"; },
  84.   get file()  { return this.mFile; },
  85.  
  86.   /* readonly attribute nsIFileURL fileURL; */
  87.   set fileURL(a) { throw "readonly property"; },
  88.   get fileURL()  { 
  89.     if (this.mFile) {
  90.       var ioService = Components.classes["@mozilla.org/network/io-service;1"]
  91.                     .getService(Components.interfaces.nsIIOService);
  92.       var url       = ioService.newFileURI(this.mFile);
  93.       return url;
  94.     }
  95.     return null;
  96.   },
  97.  
  98.   /* attribute wstring defaultString; */
  99.   set defaultString(a) { this.mDefaultString = a; },
  100.   get defaultString()  { return this.mDefaultString; },
  101.  
  102.   /* methods */
  103.   init: function(parent, title, mode) {
  104.     this.mParentWindow = parent;
  105.     this.mTitle = title;
  106.     this.mMode = mode;
  107.   },
  108.  
  109.   appendFilters: function(filterMask) {
  110.     if (filterMask & nsIFilePicker.filterHTML) {
  111.       this.appendFilter(bundle.GetStringFromName("htmlTitle"),
  112.                    bundle.GetStringFromName("htmlFilter"));
  113.     }
  114.     if (filterMask & nsIFilePicker.filterText) {
  115.       this.appendFilter(bundle.GetStringFromName("textTitle"),
  116.                    bundle.GetStringFromName("textFilter"));
  117.     }
  118.     if (filterMask & nsIFilePicker.filterImages) {
  119.       this.appendFilter(bundle.GetStringFromName("imageTitle"),
  120.                    bundle.GetStringFromName("imageFilter"));
  121.     }
  122.     if (filterMask & nsIFilePicker.filterXML) {
  123.       this.appendFilter(bundle.GetStringFromName("xmlTitle"),
  124.                    bundle.GetStringFromName("xmlFilter"));
  125.     }
  126.     if (filterMask & nsIFilePicker.filterXUL) {
  127.       this.appendFilter(bundle.GetStringFromName("xulTitle"),
  128.                    bundle.GetStringFromName("xulFilter"));
  129.     }
  130.     if (filterMask & nsIFilePicker.filterAll) {
  131.       this.appendFilter(bundle.GetStringFromName("allTitle"),
  132.                    bundle.GetStringFromName("allFilter"));
  133.     }
  134.   },
  135.  
  136.   appendFilter: function(title, extentions) {
  137.     this.mFilterTitles.push(title);
  138.     this.mFilters.push(extentions);
  139.   },
  140.  
  141.   QueryInterface: function(iid) {
  142.     if (!iid.equals(nsIFilePicker) &&
  143.         !iid.equals(nsISupports))
  144.         throw Components.results.NS_ERROR_NO_INTERFACE;
  145.     return this;
  146.   },
  147.  
  148.   show: function() {
  149.     var o = new Object();
  150.     o.title = this.mTitle;
  151.     o.mode = this.mMode;
  152.     o.displayDirectory = this.mDisplayDirectory;
  153.     o.defaultString = this.mDefaultString;
  154.     o.filters = new Object();
  155.     o.filters.titles = this.mFilterTitles;
  156.     o.filters.types = this.mFilters;
  157.     o.retvals = new Object();
  158.  
  159.     var parent;
  160.     try {
  161.       if (this.mParentWindow) {
  162.         parent = this.mParentWindow;
  163.       } else if (typeof(window) == "object" && window != null) {
  164.         parent = window;
  165.       } else {
  166.         try {
  167.           var appShellService = Components.classes[APPSHELL_SERV_CONTRACTID].getService(nsIAppShellService);
  168.           parent = appShellService.hiddenDOMWindow;
  169.         } catch(ex) {
  170.           debug("Can't get parent.  xpconnect hates me so we can't get one from the appShellService.\n");
  171.           debug(ex + "\n");
  172.         }
  173.       }
  174.     } catch(ex) { debug("fuck\n"); }
  175.  
  176.     try {
  177.       parent.openDialog("chrome://global/content/filepicker.xul",
  178.                         "",
  179.                         "chrome,modal,titlebar,resizable=yes,dependent=yes",
  180.                         o);
  181.       this.mFile = o.retvals.file;
  182.       lastDirectory = o.retvals.directory;
  183.       return o.retvals.buttonStatus;
  184.     } catch(ex) { dump("unable to open file picker\n" + ex + "\n"); }
  185.  
  186.     return null;
  187.   }
  188. }
  189.  
  190. if (DEBUG)
  191.     debug = function (s) { dump("-*- filepicker: " + s + "\n"); }
  192. else
  193.     debug = function (s) {}
  194.  
  195. /* module foo */
  196.  
  197. var filePickerModule = new Object();
  198.  
  199. filePickerModule.registerSelf =
  200. function (compMgr, fileSpec, location, type)
  201. {
  202.     debug("registering (all right -- a JavaScript module!)");
  203.     compMgr.registerComponentWithType(FILEPICKER_CID, "FilePicker JS Component",
  204.                                       FILEPICKER_CONTRACTID, fileSpec, location,
  205.                                       true, true, type);
  206. }
  207.  
  208. filePickerModule.getClassObject =
  209. function (compMgr, cid, iid) {
  210.     if (!cid.equals(FILEPICKER_CID))
  211.         throw Components.results.NS_ERROR_NO_INTERFACE;
  212.     
  213.     if (!iid.equals(Components.interfaces.nsIFactory))
  214.         throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  215.     
  216.     return filePickerFactory;
  217. }
  218.  
  219. filePickerModule.canUnload =
  220. function(compMgr)
  221. {
  222.     debug("Unloading component.");
  223.     return true;
  224. }
  225.     
  226. /* factory object */
  227. var filePickerFactory = new Object();
  228.  
  229. filePickerFactory.createInstance =
  230. function (outer, iid) {
  231.     debug("CI: " + iid);
  232.     debug("IID:" + nsIFilePicker);
  233.     if (outer != null)
  234.         throw Components.results.NS_ERROR_NO_AGGREGATION;
  235.  
  236.     return (new nsFilePicker()).QueryInterface(iid);
  237. }
  238.  
  239. /* entrypoint */
  240. function NSGetModule(compMgr, fileSpec) {
  241.     return filePickerModule;
  242. }
  243.  
  244.  
  245.  
  246. /* crap from strres.js that I want to use for string bundles since I can't include another .js file.... */
  247.  
  248. var strBundleService = null;
  249.  
  250. function srGetStrBundle(path)
  251. {
  252.   var strBundle = null;
  253.  
  254.   if (!strBundleService) {
  255.     try {
  256.       strBundleService = Components.classes[STRBUNDLE_SERV_CONTRACTID].getService(nsIStringBundleService);
  257.     } catch (ex) {
  258.       dump("\n--** strBundleService createInstance failed **--\n");
  259.       return null;
  260.     }
  261.   }
  262.  
  263.   strBundle = strBundleService.createBundle(path); 
  264.   if (!strBundle) {
  265.     dump("\n--** strBundle createInstance failed **--\n");
  266.   }
  267.   return strBundle;
  268. }
  269.  
  270.