home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2005 October / Gamestar_77_2005-10_dvd.iso / Programy / nsb-install-8-0.exe / chrome / toolkit.jar / content / mozapps / downloads / pref-downloads.js < prev    next >
Text File  |  2005-07-29  |  14KB  |  417 lines

  1.  
  2. var _elementIDs = ["askOnSave", "downloadFolderList", "downloadFolder", "showWhenStarting", "closeWhenDone"];
  3.  
  4. var gLastSelectedIndex = 0;
  5. var gHelperApps = null;
  6.  
  7. var gEditFileHandler, gRemoveFileHandler, gHandlersList;
  8.  
  9. var downloadDirPref = "browser.download.dir"; 
  10. var downloadModePref = "browser.download.folderList";
  11. const nsILocalFile = Components.interfaces.nsILocalFile;
  12.  
  13. function selectFolder()
  14.   const nsIFilePicker = Components.interfaces.nsIFilePicker;
  15.   var fp = Components.classes["@mozilla.org/filepicker;1"]
  16.                       .createInstance(nsIFilePicker);
  17.   var pref = Components.classes["@mozilla.org/preferences-service;1"]
  18.                       .getService(Components.interfaces.nsIPrefBranch);
  19.  
  20.   var bundle = document.getElementById("strings");
  21.   var description = bundle.getString("selectDownloadDir");
  22.   fp.init(window, description, nsIFilePicker.modeGetFolder);
  23.   try 
  24.   {
  25.     var initialDir = pref.getComplexValue(downloadDirPref, nsILocalFile);
  26.     if (initialDir)
  27.       fp.displayDirectory = initialDir;
  28.   }
  29.   catch (ex)
  30.   {
  31.     // ignore exception: file picker will open at default location
  32.   }
  33.   fp.appendFilters(nsIFilePicker.filterAll);
  34.   var ret = fp.show();
  35.  
  36.   if (ret == nsIFilePicker.returnOK) {
  37.     var localFile = fp.file.QueryInterface(nsILocalFile);
  38.     pref.setComplexValue(downloadDirPref, nsILocalFile, localFile)
  39.     selectCustomFolder(true);
  40.   }
  41.   else {
  42.     var folderList = document.getElementById("downloadFolderList");
  43.     folderList.selectedIndex = gLastSelectedIndex;
  44.   }
  45. }
  46.  
  47. function doEnabling(aSelectedItem)
  48. {
  49.   var textbox = document.getElementById("downloadFolderList");
  50.   var button = document.getElementById("showFolder");
  51.   var disable = aSelectedItem.id == "alwaysAsk";
  52.   textbox.disabled = disable;
  53.   button.disabled = disable;
  54. }
  55.  
  56. function Startup() 
  57. {
  58.   var folderList = document.getElementById("downloadFolderList");
  59.   
  60.   const nsILocalFile = Components.interfaces.nsILocalFile;
  61.   var pref = Components.classes["@mozilla.org/preferences-service;1"]
  62.                       .getService(Components.interfaces.nsIPrefBranch);
  63.                       
  64.   try {
  65.     var downloadDir = pref.getComplexValue(downloadDirPref, nsILocalFile);  
  66.     
  67.     var desktop = getDownloadsFolder("Desktop");
  68.     var downloads = getDownloadsFolder("Documents");
  69.     
  70.     // Check to see if the user-entered download dir is actually one of our
  71.     // enumerated values (Desktop, My Downloads) and if so select that
  72.     // item instead of the user selected one. 
  73.     // XXX - It's lame that I should have to compare the path directly. The 
  74.     // win32 implementation of nsIFile should know that Windows is not case 
  75.     // sensitive.
  76.     var downloadPath = downloadDir.path.toUpperCase();
  77.     if (downloadPath == desktop.path.toUpperCase()) {
  78.       pref.clearUserPref(downloadDirPref);
  79.       pref.setIntPref(downloadModePref, 0);
  80.       folderList.selectedIndex = 0;
  81.     }
  82.     else if (downloadPath == downloads.path.toUpperCase()) {
  83.       pref.clearUserPref(downloadDirPref);
  84.       pref.setIntPref(downloadModePref, 1);
  85.       folderList.selectedIndex = 1;
  86.     }
  87.   }
  88.   catch (e) {
  89.   }
  90.   
  91.   try {
  92.     selectCustomFolder(false);
  93.   }
  94.   catch (e) {
  95.   }
  96.   
  97.   gLastSelectedIndex = folderList.selectedIndex;
  98.   
  99.   // Initialize the File Type list
  100.   gHelperApps = new HelperApps();
  101.   
  102.   gHandlersList = document.getElementById("fileHandlersList");
  103.   gHandlersList.database.AddDataSource(gHelperApps);
  104.   gHandlersList.setAttribute("ref", "urn:mimetypes");
  105.   
  106.   (gEditFileHandler = document.getElementById("editFileHandler")).disabled = true;
  107.   (gRemoveFileHandler = document.getElementById("removeFileHandler")).disabled = true;
  108.   
  109.   parent.hPrefWindow.registerOKCallbackFunc(updateSaveToFolder);
  110.   // XXXben such a hack. Should really update the OKCallbackFunction thing a bit to 
  111.   //        let it support holding arbitrary data. 
  112.   parent.hPrefWindow.getSpecialFolderKey = getSpecialFolderKey;
  113.  
  114.   // XXXben menulist hack #43. When initializing the display to the custom
  115.   //        download path field, the field is blank. 
  116.   var downloadFolderList = document.getElementById("downloadFolderList");
  117.   downloadFolderList.parentNode.removeChild(downloadFolderList);
  118.   var showFolder = document.getElementById("showFolder");
  119.   showFolder.parentNode.insertBefore(downloadFolderList, showFolder);
  120.   downloadFolderList.hidden = false;
  121.  
  122.   toggleDMPrefUI(document.getElementById("showWhenStarting"));
  123.   
  124.   setTimeout(postStart, 0);
  125. }
  126.  
  127. function postStart()
  128. {
  129.   var downloadFolderList = document.getElementById("downloadFolderList");
  130.   downloadFolderList.label = downloadFolderList.selectedItem.label;
  131. }
  132.  
  133. function uninit()
  134. {
  135.   gHandlersList.database.RemoveDataSource(gHelperApps);
  136.   
  137.   gHelperApps.destroy();
  138. }
  139.  
  140. // WARNING WARNING WARNING
  141. // This is a Options OK Callback
  142. // When this function is called the Downloads panel's document object 
  143. // MAY NOT BE AVAILABLE. As a result referring to any item in it in this
  144. // function will probably cause the Options window not to close when OK
  145. // is pressed. 
  146. function updateSaveToFolder()
  147. {
  148.   var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
  149.   function getPref(aPrefName, aPrefGetter, aDefVal) 
  150.   {
  151.     try {
  152.       var val = prefs[aPrefGetter](aPrefName);
  153.     }
  154.     catch (e) {
  155.       val = aDefVal;
  156.     }
  157.     return val;                
  158.   }
  159.  
  160.   var defaultFolderPref = "browser.download.defaultFolder";
  161.   var downloadDirPref = "browser.download.dir";
  162.  
  163.   var data = parent.hPrefWindow.wsm.dataManager.pageData["chrome://mozapps/content/downloads/pref-downloads.xul"].elementIDs;
  164.   // Don't let the variable names here fool you. This code executes if the 
  165.   // user chooses to have all files auto-download to a specific folder.
  166.   if (data.askOnSave.value == "true") {
  167.     var fileLocator = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
  168.     
  169.     var bundle = Components.classes["@mozilla.org/intl/stringbundle;1"].getService(Components.interfaces.nsIStringBundleService);
  170.     bundle = bundle.createBundle("chrome://mozapps/locale/downloads/unknownContentType.properties");
  171.     var description = bundle.GetStringFromName("myDownloads");
  172.     var targetFolder = null;
  173.  
  174.     switch (parseInt(data.downloadFolderList.value)) {
  175.     case 1:
  176.       targetFolder = fileLocator.get(parent.hPrefWindow.getSpecialFolderKey("Documents"), 
  177.                                      Components.interfaces.nsIFile);
  178.       targetFolder.append(description);
  179.       break;
  180.     case 2:
  181.       targetFolder = prefs.getComplexValue(downloadDirPref, 
  182.                                            Components.interfaces.nsILocalFile);  
  183.       break;
  184.     case 0:
  185.     default:          
  186.       targetFolder = fileLocator.get(parent.hPrefWindow.getSpecialFolderKey("Desktop"), 
  187.                                       Components.interfaces.nsIFile);
  188.       break;
  189.     }
  190.     prefs.setComplexValue(defaultFolderPref,
  191.                           Components.interfaces.nsILocalFile,
  192.                           targetFolder);
  193.   }
  194.   else if (prefs.prefHasUserValue(defaultFolderPref))
  195.     prefs.clearUserPref(defaultFolderPref);  
  196. }
  197.  
  198. function selectCustomFolder(aShouldSelectItem)
  199. {
  200.   var pref = Components.classes["@mozilla.org/preferences-service;1"]
  201.                       .getService(Components.interfaces.nsIPrefBranch);
  202.   var downloadDir = pref.getComplexValue(downloadDirPref, nsILocalFile);
  203.   
  204.   var folder = document.getElementById("downloadFolder");
  205.   folder.label = downloadDir.path;
  206.   folder.setAttribute("path", downloadDir.path);
  207.   folder.hidden = false;
  208.   
  209.   var folderList = document.getElementById("downloadFolderList");
  210.   if (aShouldSelectItem)
  211.     folderList.selectedIndex = 2;
  212. }
  213.  
  214. function folderListCommand(aEvent)
  215. {
  216.   var folderList = document.getElementById("downloadFolderList");
  217.   if (folderList.selectedItem.getAttribute("value") == 9)
  218.     selectFolder();
  219.   
  220.   var selectedIndex = folderList.selectedIndex;
  221.  
  222.   if (selectedIndex == 1) {
  223.     var downloads = getDownloadsFolder("Documents");
  224.     if (!downloads.exists())
  225.       downloads.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0755);
  226.   }
  227.   
  228.   // folderList.inputField.readonly = (selectedIndex == 0 || selectedIndex == 1);
  229.  
  230.   gLastSelectedIndex = folderList.selectedIndex;
  231. }
  232.  
  233. function showFolder()
  234. {
  235.   var folderList = document.getElementById("downloadFolderList");
  236.  
  237.   var folder = null;
  238.   
  239.   switch (folderList.selectedIndex) {
  240.   case 0:
  241.     folder = getDownloadsFolder("Desktop");
  242.     break;
  243.   case 1:
  244.     folder = getDownloadsFolder("Downloads");
  245.     break;
  246.   case 2:
  247.     var path = document.getElementById("downloadFolder").getAttribute("path");
  248.     folder = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  249.     folder.initWithPath(path);
  250.     break;
  251.   }
  252.  
  253.   try {
  254.     folder.reveal();
  255.   } catch (ex) {
  256.     // if nsILocalFile::Reveal failed (ie it currently just returns an
  257.     // error on unix), send the directory to the system file: handler
  258.  
  259.     var uri = Components.classes["@mozilla.org/network/standard-url;1"]
  260.       .createInstance(Components.interfaces.nsIURI);
  261.     uri.spec = "file:///" + folder.path;
  262.  
  263.     var protocolSvc = Components.classes
  264.       ["@mozilla.org/uriloader/external-protocol-service;1"]
  265.       .getService(Components.interfaces.nsIExternalProtocolService);
  266.     protocolSvc.loadUrl(uri);
  267.   }
  268. }
  269.  
  270. function getSpecialFolderKey(aFolderType) 
  271. {
  272.   return aFolderType == "Desktop" ? "DeskP" : "Pers";
  273.   return "Home";
  274. }
  275.  
  276. function getDownloadsFolder(aFolder)
  277. {
  278.   var fileLocator = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
  279.  
  280.   var dir = fileLocator.get(getSpecialFolderKey(aFolder), Components.interfaces.nsILocalFile);
  281.   var bundle = document.getElementById("strings");
  282.   var description = bundle.getString("myDownloads");
  283.   if (aFolder != "Desktop")
  284.     dir.append(description);
  285.     
  286.   return dir;
  287. }
  288.  
  289. function fileHandlerListSelectionChanged(aEvent)
  290. {
  291.   var selection = gHandlersList.view.selection; 
  292.   var selected = selection.count;
  293.   gRemoveFileHandler.disabled = selected == 0;
  294.   gEditFileHandler.disabled = selected != 1;
  295.   
  296.   var canRemove = true;
  297.   
  298.   var cv = gHandlersList.contentView;
  299.   var rangeCount = selection.getRangeCount();
  300.   var min = { }, max = { };
  301.   for (var i = 0; i < rangeCount; ++i) {
  302.     selection.getRangeAt(i, min, max);
  303.     
  304.     for (var j = min.value; j <= max.value; ++j) {
  305.       var item = cv.getItemAtIndex(j);
  306.       var editable = gHelperApps.getLiteralValue(item.id, "editable") == "true";
  307.       var handleInternal = gHelperApps.getLiteralValue(item.id, "handleInternal");
  308.       
  309.       if (!editable || handleInternal) 
  310.         canRemove = false;
  311.     }
  312.   }
  313.   
  314.   if (!canRemove) {
  315.     gRemoveFileHandler.disabled = true;
  316.     gEditFileHandler.disabled = true;
  317.   }
  318. }
  319.  
  320. function removeFileHandler()
  321. {
  322.   const nsIPS = Components.interfaces.nsIPromptService;
  323.   var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(nsIPS);
  324.   
  325.   var bundle = document.getElementById("strings");
  326.   var title = bundle.getString("removeActions");
  327.   var msg = bundle.getString("removeActionsMsg");
  328.  
  329.   var buttons = (nsIPS.BUTTON_TITLE_YES * nsIPS.BUTTON_POS_0) + (nsIPS.BUTTON_TITLE_NO * nsIPS.BUTTON_POS_1);
  330.  
  331.   if (ps.confirmEx(window, title, msg, buttons, "", "", "", "", { }) == 1) 
  332.     return;
  333.   
  334.   var c = Components.classes["@mozilla.org/rdf/container;1"].createInstance(Components.interfaces.nsIRDFContainer);
  335.   c.Init(gHelperApps, gRDF.GetResource("urn:mimetypes:root"));
  336.   
  337.   var cv = gHandlersList.contentView;
  338.   var selection = gHandlersList.view.selection; 
  339.   var rangeCount = selection.getRangeCount();
  340.   var min = { }, max = { };
  341.   
  342.   var lastAdjacent = -1;
  343.   for (var i = 0; i < rangeCount; ++i) {
  344.     selection.getRangeAt(i, min, max);
  345.     
  346.     if (i == (rangeCount - 1)) { 
  347.       if (min.value >= (gHandlersList.view.rowCount - selection.count)) 
  348.         lastAdjacent = min.value - 1;
  349.       else
  350.         lastAdjacent = min.value;
  351.     }
  352.     
  353.     for (var j = max.value; j >= min.value; --j) {
  354.       var item = cv.getItemAtIndex(j);
  355.       var itemResource = gRDF.GetResource(item.id);
  356.       c.RemoveElement(itemResource, j == min.value);
  357.       
  358.       cleanResource(itemResource);
  359.     }
  360.   }
  361.  
  362.   if (lastAdjacent != -1) {
  363.     selection.select(lastAdjacent);
  364.     gHandlersList.focus();
  365.   }
  366.   
  367.   gHelperApps.flush();
  368. }
  369.  
  370. function cleanResource(aResource)
  371. {
  372.   var handlerProp = gHelperApps.GetTarget(aResource, gHelperApps._handlerPropArc, true);
  373.   if (handlerProp) {
  374.     var extApp = gHelperApps.GetTarget(handlerProp, gHelperApps._externalAppArc, true);
  375.     if (extApp)
  376.       disconnect(extApp);
  377.     disconnect(handlerProp);
  378.   }
  379.   disconnect(aResource);
  380. }
  381.  
  382. function disconnect(aResource)
  383. {
  384.   var arcs = gHelperApps.ArcLabelsOut(aResource);
  385.   while (arcs.hasMoreElements()) {
  386.     var arc = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
  387.     var val = gHelperApps.GetTarget(aResource, arc, true);
  388.     gHelperApps.Unassert(aResource, arc, val, true);
  389.   }
  390. }
  391.  
  392. function editFileHandler()
  393. {
  394.   var selection = gHandlersList.view.selection; 
  395.   
  396.   var cv = gHandlersList.contentView;
  397.   var item = cv.getItemAtIndex(selection.currentIndex);
  398.   var itemResource = gRDF.GetResource(item.id);
  399.   
  400.   openDialog("chrome://mozapps/content/downloads/editAction.xul", "", "modal=yes", itemResource);
  401. }
  402.  
  403. function showPlugins()
  404. {
  405.   openDialog("chrome://browser/content/pref/plugins.xul", "", "modal,resizable");
  406. }
  407.  
  408. function toggleDMPrefUI(aCheckbox)
  409. {
  410.   if (aCheckbox.checked) 
  411.     document.getElementById("closeWhenDone").removeAttribute("disabled");
  412.   else
  413.     document.getElementById("closeWhenDone").setAttribute("disabled", "true");
  414. }
  415.  
  416.