diff --git a/browser/components/prefwindow/content/pref-downloads.js b/browser/components/prefwindow/content/pref-downloads.js index e69de29bb2d1..28ece3769808 100644 --- a/browser/components/prefwindow/content/pref-downloads.js +++ b/browser/components/prefwindow/content/pref-downloads.js @@ -0,0 +1,397 @@ +# -*- Mode: Java; tab-width: 4; c-basic-offset: 4; -*- +# +# The contents of this file are subject to the Netscape Public License +# Version 1.0 (the "NPL"); you may not use this file except in +# compliance with the NPL. You may obtain a copy of the NPL at +# http://www.mozilla.org/NPL/ +# +# Software distributed under the NPL is distributed on an "AS IS" basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL +# for the specific language governing rights and limitations under the +# NPL. +# +# The Initial Developer of this code under the NPL is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998 Netscape Communications Corporation. All Rights +# Reserved. +# +# Contributor(s): +# Ben Goodger + +var _elementIDs = ["askOnSave", "downloadFolderList", "downloadFolder"]; + +#if 0 + , "showWhenStarting", "closeWhenDone" +#endif + +var gLastSelectedIndex = 0; +var gHelperApps = null; + +var gEditFileHandler, gRemoveFileHandler, gHandlersList; + +const downloadDirPref = "browser.download.dir"; +const downloadModePref = "browser.download.folderList"; +const nsILocalFile = Components.interfaces.nsILocalFile; + +function selectFolder() +{ + const nsIFilePicker = Components.interfaces.nsIFilePicker; + var fp = Components.classes["@mozilla.org/filepicker;1"] + .createInstance(nsIFilePicker); + var pref = Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefBranch); + // XXXBlake Localize! + fp.init(window, "Select Download Folder", nsIFilePicker.modeGetFolder); + try + { + var initialDir = pref.getComplexValue(downloadDirPref, nsILocalFile); + if (initialDir) + fp.displayDirectory = initialDir; + } + catch (ex) + { + // ignore exception: file picker will open at default location + } + fp.appendFilters(nsIFilePicker.filterAll); + var ret = fp.show(); + + if (ret == nsIFilePicker.returnOK) { + var localFile = fp.file.QueryInterface(nsILocalFile); + pref.setComplexValue(downloadDirPref, nsILocalFile, localFile) + selectCustomFolder(true); + } + else { + var folderList = document.getElementById("downloadFolderList"); + folderList.selectedIndex = gLastSelectedIndex; + } +} + +function doEnabling(aSelectedItem) +{ + var textbox = document.getElementById("downloadFolderList"); + var button = document.getElementById("showFolder"); + var disable = aSelectedItem.id == "alwaysAsk"; + textbox.disabled = disable; + button.disabled = disable; +} + +function Startup() +{ + var folderList = document.getElementById("downloadFolderList"); + + const nsILocalFile = Components.interfaces.nsILocalFile; + var pref = Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefBranch); + + try { + var downloadDir = pref.getComplexValue(downloadDirPref, nsILocalFile); + + var desktop = getDownloadsFolder("Desktop"); + var downloads = getDownloadsFolder("Documents"); + + // Check to see if the user-entered download dir is actually one of our + // enumerated values (Desktop, My Downloads) and if so select that + // item instead of the user selected one. + // XXX - It's lame that I should have to compare the path directly. The + // win32 implementation of nsIFile should know that Windows is not case + // sensitive. + var downloadPath = downloadDir.path.toUpperCase(); + if (downloadPath == desktop.path.toUpperCase()) { + pref.clearUserPref(downloadDirPref); + pref.setIntPref(downloadModePref, 0); + folderList.selectedIndex = 0; + } + else if (downloadPath == downloads.path.toUpperCase()) { + pref.clearUserPref(downloadDirPref); + pref.setIntPref(downloadModePref, 1); + folderList.selectedIndex = 1; + } + } + catch (e) { + } + + try { + selectCustomFolder(false); + } + catch (e) { + } + + gLastSelectedIndex = folderList.selectedIndex; + + // Initialize the File Type list + gHelperApps = new HelperApps(); + + gHandlersList = document.getElementById("fileHandlersList"); + gHandlersList.database.AddDataSource(gHelperApps); + gHandlersList.setAttribute("ref", "urn:mimetypes"); + + (gEditFileHandler = document.getElementById("editFileHandler")).disabled = true; + (gRemoveFileHandler = document.getElementById("removeFileHandler")).disabled = true; + + parent.hPrefWindow.registerOKCallbackFunc(updateSaveToFolder); + // XXXben such a hack. Should really update the OKCallbackFunction thing a bit to + // let it support holding arbitrary data. + parent.hPrefWindow.getSpecialFolderKey = getSpecialFolderKey; + + // XXXben menulist hack #43. When initializing the display to the custom + // download path field, the field is blank. + var downloadFolderList = document.getElementById("downloadFolderList"); + downloadFolderList.parentNode.removeChild(downloadFolderList); + var showFolder = document.getElementById("showFolder"); + showFolder.parentNode.insertBefore(downloadFolderList, showFolder); + downloadFolderList.hidden = false; +} + +function uninit() +{ + gHandlersList.database.RemoveDataSource(gHelperApps); + + gHelperApps.destroy(); +} + +function updateSaveToFolder() +{ + var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch); + function getPref(aPrefName, aPrefGetter, aDefVal) + { + try { + var val = prefs[aPrefGetter](aPrefName); + } + catch (e) { + val = aDefVal; + } + return val; + } + + const defaultFolderPref = "browser.download.defaultFolder"; + + var data = parent.hPrefWindow.wsm.dataManager.pageData["chrome://browser/content/pref/pref-downloads.xul"]; + // Don't let the variable names here fool you. This code executes if the + // user chooses to have all files auto-download to a specific folder. + if (data.askOnSave.value == "true") { + var fileLocator = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties); + + var targetFolder = null; + switch (parseInt(data.downloadFolderList.value)) { + case 1: + targetFolder = fileLocator.get(parent.hPrefWindow.getSpecialFolderKey("Documents"), + Components.interfaces.nsIFile); + targetFolder.append("My Downloads"); // XXXben localize + break; + case 2: + targetFolder = prefs.getComplexValue(downloadDirPref, + Components.interfaces.nsILocalFile); + break; + case 0: + default: + targetFolder = fileLocator.get(parent.hPrefWindow.getSpecialFolderKey("Desktop"), + Components.interfaces.nsIFile); + break; + } + prefs.setComplexValue(defaultFolderPref, + Components.interfaces.nsILocalFile, + targetFolder); + } + else if (prefs.prefHasUserValue(defaultFolderPref)) + prefs.clearUserPref(defaultFolderPref); +} + +function selectCustomFolder(aShouldSelectItem) +{ + var pref = Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefBranch); + var downloadDir = pref.getComplexValue(downloadDirPref, nsILocalFile); + + var folder = document.getElementById("downloadFolder"); + folder.label = downloadDir.path; + folder.setAttribute("path", downloadDir.path); + folder.hidden = false; + + var folderList = document.getElementById("downloadFolderList"); + if (aShouldSelectItem) + folderList.selectedIndex = 2; +} + +function folderListCommand(aEvent) +{ + var folderList = document.getElementById("downloadFolderList"); + if (folderList.selectedItem.getAttribute("value") == 9) + selectFolder(); + + var selectedIndex = folderList.selectedIndex; + + if (selectedIndex == 1) { + var downloads = getDownloadsFolder("Documents"); + if (!downloads.exists()) + downloads.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, 0755); + } + + // folderList.inputField.readonly = (selectedIndex == 0 || selectedIndex == 1); + + gLastSelectedIndex = folderList.selectedIndex; +} + +function showFolder() +{ + var folderList = document.getElementById("downloadFolderList"); + + var folder = null; + + switch (folderList.selectedIndex) { + case 0: + folder = getDownloadsFolder("Desktop"); + break; + case 1: + folder = getDownloadsFolder("Downloads"); + break; + case 2: + var path = folderList.selectedItem.getAttribute("path"); + folder = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); + folder.path = path; + break; + } + + folder.QueryInterface(Components.interfaces.nsILocalFile); + folder.reveal(); +} + +function getSpecialFolderKey(aFolderType) +{ +#ifdef XP_WIN + return aFolderType == "Desktop" ? "DeskV" : "Pers"; +#endif +#ifdef XP_MACOSX + return aFolderType == "Desktop" ? "Desk" : "UsrDocs"; +#endif + return "Home"; +} + +function getDownloadsFolder(aFolder) +{ + var fileLocator = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties); + + var dir = fileLocator.get(getSpecialFolderKey(aFolder), Components.interfaces.nsILocalFile); + if (aFolder != "Desktop") + dir.append("My Downloads"); // XXXben localize + + return dir; +} + +function fileHandlerListSelectionChanged(aEvent) +{ + var selection = gHandlersList.view.selection; + var selected = selection.count; + gRemoveFileHandler.disabled = selected == 0; + gEditFileHandler.disabled = selected != 1; + + var canRemove = true; + + var cv = gHandlersList.contentView; + var rangeCount = selection.getRangeCount(); + var min = { }, max = { }; + for (var i = 0; i < rangeCount; ++i) { + selection.getRangeAt(i, min, max); + + for (var j = min.value; j <= max.value; ++j) { + var item = cv.getItemAtIndex(j); + var editable = getLiteralValue(item.id, "editable") == "true"; + var handleInternal = getLiteralValue(item.id, "handleInternal"); + + if (!editable || handleInternal) + canRemove = false; + } + } + + if (!canRemove) { + gRemoveFileHandler.disabled = true; + gEditFileHandler.disabled = true; + } +} + +function removeFileHandler() +{ + const nsIPS = Components.interfaces.nsIPromptService; + var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(nsIPS); + + // XXXben LOCALIZE! + var title = "Remove Actions"; + var msg = "The selected Actions will no longer be performed when files of the affected types are downloaded. Are you sure you want to remove these Actions?"; + var buttons = (nsIPS.BUTTON_TITLE_YES * nsIPS.BUTTON_POS_0) + (nsIPS.BUTTON_TITLE_NO * nsIPS.BUTTON_POS_1); + + if (ps.confirmEx(window, title, msg, buttons, "", "", "", "", { }) == 1) + return; + + var c = Components.classes["@mozilla.org/rdf/container;1"].createInstance(Components.interfaces.nsIRDFContainer); + c.Init(gHelperApps, gRDF.GetResource("urn:mimetypes:root")); + + var cv = gHandlersList.contentView; + var selection = gHandlersList.view.selection; + var rangeCount = selection.getRangeCount(); + var min = { }, max = { }; + + var lastAdjacent = -1; + for (var i = 0; i < rangeCount; ++i) { + selection.getRangeAt(i, min, max); + + if (i == (rangeCount - 1)) { + if (min.value >= (gHandlersList.view.rowCount - selection.count)) + lastAdjacent = min.value - 1; + else + lastAdjacent = min.value; + } + + for (var j = max.value; j >= min.value; --j) { + var item = cv.getItemAtIndex(j); + var itemResource = gRDF.GetResource(item.id); + c.RemoveElement(itemResource, j == min.value); + + cleanResource(itemResource); + } + } + + if (lastAdjacent != -1) { + selection.select(lastAdjacent); + gHandlersList.focus(); + } + + gHelperApps.flush(); +} + +function cleanResource(aResource) +{ + var handlerProp = gHelperApps.GetTarget(aResource, gHelperApps._handlerPropArc, true); + if (handlerProp) { + var extApp = gHelperApps.GetTarget(handlerProp, gHelperApps._externalAppArc, true); + if (extApp) + disconnect(extApp); + disconnect(handlerProp); + } + disconnect(aResource); +} + +function disconnect(aResource) +{ + var arcs = gHelperApps.ArcLabelsOut(aResource); + while (arcs.hasMoreElements()) { + var arc = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource); + var val = gHelperApps.GetTarget(aResource, arc, true); + gHelperApps.Unassert(aResource, arc, val, true); + } +} + +function editFileHandler() +{ + var selection = gHandlersList.view.selection; + + var cv = gHandlersList.contentView; + var item = cv.getItemAtIndex(selection.currentIndex); + var itemResource = gRDF.GetResource(item.id); + + openDialog("chrome://browser/content/pref/editAction.xul", "", "modal=yes", itemResource); +} + +function showPlugins() +{ + openDialog("chrome://browser/content/pref/plugins.xul", "", "modal=yes"); +} + diff --git a/browser/components/prefwindow/content/pref-downloads.xul b/browser/components/prefwindow/content/pref-downloads.xul index e69de29bb2d1..48470d33e1b0 100644 --- a/browser/components/prefwindow/content/pref-downloads.xul +++ b/browser/components/prefwindow/content/pref-downloads.xul @@ -0,0 +1,158 @@ + +# The contents of this file are subject to the Netscape Public +# License Version 1.1 (the "License"); you may not use this file +# except in compliance with the License. You may obtain a copy of +# the License at http://www.mozilla.org/NPL/ +# +# Software distributed under the License is distributed on an "AS +# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +# implied. See the License for the specific language governing +# rights and limitations under the License. +# +# The Original Code is Mozilla Communicator client code, released +# March 31, 1998. +# +# The Initial Developer of the Original Code is Netscape +# Communications Corporation. Portions created by Netscape are +# Copyright (C) 1998-2000 Netscape Communications Corporation. All +# Rights Reserved. +# +# Contributor(s): +# Ben Goodger + + + + + + + + +