home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 December / PCWorld_2000-12_cd.bin / Komunikace / mozilla / mozilla-win32-M18-mathml-svg-xslt.exe / chrome / toolkit / content / global / filepicker.js < prev    next >
Text File  |  2000-09-14  |  11KB  |  381 lines

  1. /* -*- Mode: Java; tab-width: 4; 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 Communications
  16.  * Corporation.  Portions created by Netscape are
  17.  * Copyright (C) 2000 Netscape Communications Corporation. All
  18.  * Rights Reserved.
  19.  *
  20.  * Contributor(s): 
  21.  *  Stuart Parmenter <pavlov@netscape.com>
  22.  *  Brian Ryner <bryner@netscape.com>
  23.  *  Jan Varga <varga@utcru.sk>
  24.  *  Peter Annema <disttsc@bart.nl>
  25.  */
  26.  
  27. const nsILocalFile        = Components.interfaces.nsILocalFile;
  28. const nsILocalFile_CONTRACTID = "@mozilla.org/file/local;1";
  29. const nsIFilePicker       = Components.interfaces.nsIFilePicker;
  30. const nsIDirectoryServiceProvider = Components.interfaces.nsIDirectoryServiceProvider;
  31. const nsIDirectoryServiceProvider_CONTRACTID = "@mozilla.org/file/directory_service;1";
  32. const nsStdURL_CONTRACTID     = "@mozilla.org/network/standard-url;1";
  33. const nsIFileURL          = Components.interfaces.nsIFileURL;
  34. const NC_NAMESPACE_URI = "http://home.netscape.com/NC-rdf#";
  35.  
  36. var sfile = Components.classes[nsILocalFile_CONTRACTID].createInstance(nsILocalFile);
  37. var retvals;
  38. var filePickerMode;
  39. var currentFilter;
  40. var lastClicked;
  41. var dirHistory;
  42. var homeDir;
  43.  
  44. var directoryTree;
  45. var textInput;
  46.  
  47. var bundle = srGetStrBundle("chrome://global/locale/filepicker.properties");   
  48.  
  49. function onLoad() {
  50.   dirHistory = new Array();
  51.  
  52.   directoryTree = document.getElementById("directoryTree");
  53.   textInput = document.getElementById("textInput");
  54.  
  55.   if (window.arguments) {
  56.     var o = window.arguments[0];
  57.     retvals = o.retvals; /* set this to a global var so we can set return values */
  58.     const title = o.title;
  59.     filePickerMode = o.mode;
  60.     if (o.displayDirectory)
  61.       const directory = o.displayDirectory.path;
  62.     const initialText = o.defaultString;
  63.     const filterTitles = o.filters.titles;
  64.     const filterTypes = o.filters.types;
  65.     const numFilters = filterTitles.length;
  66.  
  67.     window.title = title;
  68.  
  69.     if (initialText) {
  70.       textInput.value = initialText;
  71.     }
  72.     /* build filter popup */
  73.     var filterPopup = document.createElement("menupopup");
  74.  
  75.     currentFilter = filterTypes[0];
  76.     applyFilter();
  77.     for (var i = 0; i < numFilters; i++) {
  78.       var menuItem = document.createElement("menuitem");
  79.       menuItem.setAttribute("value", filterTitles[i] + " (" + filterTypes[i] + ")");
  80.       menuItem.setAttribute("filters", filterTypes[i]);
  81.       filterPopup.appendChild(menuItem);
  82.     }
  83.  
  84.     var filterMenuList = document.getElementById("filterMenuList");
  85.     filterMenuList.appendChild(filterPopup);
  86.   }
  87.   
  88.   try {
  89.     var buttonLabel;
  90.     switch (filePickerMode) {
  91.       case nsIFilePicker.modeOpen:
  92.         buttonLabel = bundle.GetStringFromName("openButtonLabel");
  93.         break;
  94.       case nsIFilePicker.modeSave:
  95.         buttonLabel = bundle.GetStringFromName("saveButtonLabel");
  96.         break;
  97.       case nsIFilePicker.modeGetFolder:
  98.         buttonLabel = bundle.GetStringFromName("selectFolderButtonLabel");
  99.         break;
  100.     }
  101.  
  102.     if (buttonLabel) {
  103.       var okButton = document.getElementById("ok");
  104.       okButton.setAttribute("value", buttonLabel);
  105.     }
  106.   } catch (exception) {
  107.     // keep it set to "OK"
  108.   }
  109.  
  110.   // setup the dialogOverlay.xul button handlers
  111.   doSetOKCancel(onOK, onCancel);
  112.  
  113.   // get the home dir
  114.   var dirServiceProvider = Components.classes[nsIDirectoryServiceProvider_CONTRACTID].getService().QueryInterface(nsIDirectoryServiceProvider);
  115.   var persistent = new Object();
  116.   homeDir = dirServiceProvider.getFile("Home", persistent);
  117.  
  118.   if (directory)
  119.     sfile.initWithPath(directory);
  120.   if (!directory || !(sfile.exists() && sfile.isDirectory())) {
  121.     // Start in the user's home directory
  122.     sfile.initWithPath(homeDir.path);
  123.   }
  124.  
  125.   retvals.buttonStatus = nsIFilePicker.returnCancel;
  126.  
  127.   gotoDirectory(sfile);
  128.   textInput.focus();
  129. }
  130.  
  131. function onFilterChanged(target)
  132. {
  133.   var filterTypes = target.getAttribute("filters");
  134.   currentFilter = filterTypes;
  135.   applyFilter();
  136. }
  137.  
  138. function applyFilter()
  139. {
  140.   /* This is where we manipulate the DOM to create new <rule>s */
  141.   var splitFilters = currentFilter.split("; ");
  142.   var matchAllFiles = false;
  143.  
  144.   /* get just the extensions for each of the filters */
  145.   var extensions = new Array(splitFilters.length);
  146.   for (var j = 0; j < splitFilters.length; j++) {
  147.     var tmpStr = splitFilters[j];
  148.     if (tmpStr == "*") {
  149.       matchAllFiles = true;
  150.       break;
  151.     } else
  152.       extensions[j] = tmpStr.substring(1); /* chop off the '*' */
  153.   }
  154.  
  155.   /* delete all rules except the first one */
  156.   for (var j = 1;; j++) {
  157.     var ruleNode = document.getElementById("matchRule."+j);
  158.     if (ruleNode) {
  159.       ruleNode.parentNode.removeChild(ruleNode);
  160.     } else {
  161.       break;
  162.     }
  163.   }
  164.  
  165.   /* if we are matching all files, just clear the extension attribute
  166.      on the first match rule and we're done */
  167.   var rule0 = document.getElementById("matchRule.0");
  168.   if (matchAllFiles) {
  169.     rule0.removeAttributeNS(NC_NAMESPACE_URI, "extension");
  170.     directoryTree.builder.rebuild();
  171.     return;
  172.   }
  173.  
  174.   /* rule 0 is special */
  175.   rule0.setAttributeNS(NC_NAMESPACE_URI, "extension" , extensions[0]);
  176.  
  177.   /* iterate through the remaining extensions, creating new rules */
  178.   var ruleNode = document.getElementById("fileFilter");
  179.  
  180.   for (var k=1; k < extensions.length; k++) {
  181.     var newRule = rule0.cloneNode(true);
  182.     newRule.setAttribute("id", "matchRule."+k);
  183.     newRule.setAttributeNS(NC_NAMESPACE_URI, "extension", extensions[k]);
  184.     ruleNode.appendChild(newRule);
  185.   }
  186.  
  187.   directoryTree.builder.rebuild();
  188. }
  189.  
  190. function onOK()
  191. {
  192.   var ret = nsIFilePicker.returnCancel;
  193.  
  194.   var isDir = false;
  195.   var isFile = false;
  196.  
  197.   var input = textInput.value;
  198.   if (input[0] == '~') // XXX XP?
  199.     input  = homeDir.pathá+ input.substring(1);
  200.  
  201.   var file = sfile.clone().QueryInterface(nsILocalFile);
  202.   if (!file)
  203.     return false;
  204.  
  205.   /* XXX we need an XP way to test for an absolute path! */
  206.   if (input[0] == '/')   /* an absolute path was entered */
  207.     file.initWithPath(input);
  208.   else {
  209.     try {
  210.       file.appendRelativePath(input);
  211.     } catch (e) {
  212.       dump("Can't append relative path '"+input+"':\n");
  213.       return false;
  214.     }
  215.   }
  216.  
  217.   if (!file.exists() && (filePickerMode != nsIFilePicker.modeSave)) {
  218.     return false;
  219.   }
  220.  
  221.   if (file.exists()) {
  222.     var isDir = file.isDirectory();
  223.     var isFile = file.isFile();
  224.   }
  225.  
  226.   switch(filePickerMode) {
  227.   case nsIFilePicker.modeOpen:
  228.     if (isFile) {
  229.       retvals.directory = file.parent.path;
  230.       ret = nsIFilePicker.returnOK;
  231.     } else if (isDir) {
  232.       if (!sfile.equals(file)) {
  233.         gotoDirectory(file);
  234.       }
  235.       textInput.value = "";
  236.       ret = nsIFilePicker.returnCancel;
  237.     }
  238.     break;
  239.   case nsIFilePicker.modeSave:
  240.     if (isFile) {
  241.       // we need to pop up a dialog asking if you want to save
  242.       rv = window.confirm(file.path + " " + bundle.GetStringFromName("confirmFileReplacing"));
  243.       if (rv)
  244.         ret = nsIFilePicker.returnReplace;
  245.       else
  246.         ret = nsIFilePicker.returnCancel;
  247.       retvals.directory = file.parent.path;
  248.     } else if (!file.exists()) {
  249.       ret = nsIFilePicker.returnOK;
  250.       retvals.directory = file.parent.path;
  251.     }
  252.     break;
  253.   case nsIFilePicker.modeGetFolder:
  254.     if (isDir) {
  255.       retvals.directory = file.parent.path;
  256.       ret = nsIFilePicker.returnOK;
  257.     }
  258.     break;
  259.   }
  260.  
  261.   retvals.file = file;
  262.   retvals.buttonStatus = ret;
  263.  
  264.   if (ret == nsIFilePicker.returnCancel)
  265.     return false;
  266.   else
  267.     return true;
  268. }
  269.  
  270. function onCancel()
  271. {
  272.   // Close the window.
  273.   retvals.buttonStatus = nsIFilePicker.returnCancel;
  274.   retvals.file = null;
  275.   return true;
  276. }
  277.  
  278. function onClick(e) {
  279.   if ( e.detail == 2 ) {
  280.     var file = URLpathToFile(e.target.parentNode.getAttribute("path"));
  281.  
  282.     if (file.isDirectory()) {
  283.       gotoDirectory(file);
  284.     }
  285.     else if (file.isFile()) {
  286.       /* what about symlinks? what if they symlink to a directory? */
  287.       return doOKButton();
  288.     }
  289.   }
  290. }
  291.  
  292. function onKeypress(e) {
  293.   if (e.keyCode == 8) /* backspace */
  294.     goUp();
  295. }
  296.  
  297. function onSelect(e) {
  298.   if (e.target.selectedItems.length != 1)
  299.     return;
  300.   var file = URLpathToFile(e.target.selectedItems[0].firstChild.getAttribute("path"));
  301.  
  302.   if (file.isFile()) {
  303.     textInput.value = file.leafName;
  304.     lastClicked = file.leafName;
  305.   }
  306. }
  307.  
  308. function onDirectoryChanged(target)
  309. {
  310.   var path = target.getAttribute("value");
  311.  
  312.   var file = Components.classes[nsILocalFile_CONTRACTID].createInstance(nsILocalFile);
  313.   file.initWithPath(path);
  314.  
  315.   gotoDirectory(file);
  316. }
  317.  
  318. function addToHistory(directoryName) {
  319.   var found = false;
  320.   var i = 0;
  321.   while (!found && i<dirHistory.length) {
  322.     if (dirHistory[i] == directoryName)
  323.       found = true;
  324.     else
  325.       i++;
  326.   }
  327.  
  328.   if (found) {
  329.     if (i!=0) {
  330.       dirHistory.splice(i, 1);
  331.       dirHistory.splice(0, 0, directoryName);
  332.     }
  333.   } else {
  334.     dirHistory.splice(0, 0, directoryName);
  335.   }
  336.  
  337.   var menu = document.getElementById("lookInMenu");
  338.  
  339.   var children = menu.childNodes;
  340.   for (var i=0; i < children.length; i++)
  341.     menu.removeChild(children[i]);
  342.  
  343.   for (var i=0; i < dirHistory.length; i++) {
  344.     var menuItem = document.createElement("menuitem");
  345.     menuItem.setAttribute("value", dirHistory[i]);
  346.     menu.appendChild(menuItem);
  347.   }
  348.  
  349.   var menuList = document.getElementById("lookInMenuList");
  350.   menuList.selectedIndex = 0;
  351. }
  352.  
  353. function goUp() {
  354.   try {
  355.     var parent = sfile.parent;
  356.   } catch(ex) { dump("can't get parent directory\n"); }
  357.  
  358.   if (parent) {
  359.     gotoDirectory(parent);
  360.   }
  361. }
  362.  
  363. function gotoDirectory(directory) {
  364.   var newURL = fileToURL(directory);
  365.   addToHistory(directory.path);
  366.   directoryTree.setAttribute("ref", fileToURL(directory).spec);
  367.   sfile = directory;
  368. }
  369.  
  370. function fileToURL(aFile) {
  371.   var newDirectoryURL = Components.classes[nsStdURL_CONTRACTID].createInstance().QueryInterface(nsIFileURL);
  372.   newDirectoryURL.file = aFile;
  373.   return newDirectoryURL;
  374. }
  375.  
  376. function URLpathToFile(aURLstr) {
  377.   var fileURL = Components.classes[nsStdURL_CONTRACTID].createInstance().QueryInterface(nsIFileURL);
  378.   fileURL.spec = aURLstr;
  379.   return fileURL.file;
  380. }
  381.