mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-08 12:37:37 +00:00
436 lines
14 KiB
JavaScript
Executable File
436 lines
14 KiB
JavaScript
Executable File
# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
|
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
#
|
|
# The contents of this file are subject to the Mozilla 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/MPL/
|
|
#
|
|
# 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.org Code.
|
|
#
|
|
# The Initial Developer of the Original Code is
|
|
# Doron Rosenberg.
|
|
# Portions created by the Initial Developer are Copyright (C) 2001
|
|
# the Initial Developer. All Rights Reserved.
|
|
#
|
|
# Contributor(s):
|
|
# Ben Goodger <ben@bengoodger.com>
|
|
#
|
|
# Alternatively, the contents of this file may be used under the terms of
|
|
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
# in which case the provisions of the GPL or the LGPL are applicable instead
|
|
# of those above. If you wish to allow use of your version of this file only
|
|
# under the terms of either the GPL or the LGPL, and not to allow others to
|
|
# use your version of this file under the terms of the MPL, indicate your
|
|
# decision by deleting the provisions above and replace them with the notice
|
|
# and other provisions required by the GPL or the LGPL. If you do not delete
|
|
# the provisions above, a recipient may use your version of this file under
|
|
# the terms of any one of the MPL, the GPL or the LGPL.
|
|
#
|
|
# ***** END LICENSE BLOCK *****
|
|
|
|
var _elementIDs = ["askOnSave", "downloadFolderList", "downloadFolder", "showWhenStarting", "closeWhenDone"];
|
|
|
|
#if 0
|
|
, "showWhenStarting", "closeWhenDone"
|
|
#endif
|
|
|
|
var gLastSelectedIndex = 0;
|
|
var gHelperApps = null;
|
|
|
|
var gEditFileHandler, gRemoveFileHandler, gHandlersList;
|
|
|
|
var downloadDirPref = "browser.download.dir";
|
|
var 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);
|
|
|
|
var bundle = document.getElementById("strings");
|
|
var description = bundle.getString("selectDownloadDir");
|
|
fp.init(window, description, 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;
|
|
|
|
toggleDMPrefUI(document.getElementById("showWhenStarting"));
|
|
|
|
setTimeout("postStart()", 0);
|
|
}
|
|
|
|
function postStart()
|
|
{
|
|
var downloadFolderList = document.getElementById("downloadFolderList");
|
|
downloadFolderList.label = downloadFolderList.selectedItem.label;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
var defaultFolderPref = "browser.download.defaultFolder";
|
|
var downloadDirPref = "browser.download.dir";
|
|
|
|
var data = parent.hPrefWindow.wsm.dataManager.pageData["chrome://mozapps/content/downloads/pref-downloads.xul"].elementIDs;
|
|
// 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 = document.getElementById("downloadFolder").getAttribute("path");
|
|
folder = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
|
|
folder.initWithPath(path);
|
|
break;
|
|
}
|
|
|
|
folder.reveal();
|
|
}
|
|
|
|
function getSpecialFolderKey(aFolderType)
|
|
{
|
|
#ifdef XP_WIN
|
|
return aFolderType == "Desktop" ? "DeskV" : "Pers";
|
|
#endif
|
|
#ifdef XP_MACOSX
|
|
return aFolderType == "Desktop" ? "UsrDsk" : "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 = gHelperApps.getLiteralValue(item.id, "editable") == "true";
|
|
var handleInternal = gHelperApps.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://mozapps/content/downloads/editAction.xul", "", "modal=yes", itemResource);
|
|
}
|
|
|
|
# XXXben we should handle this a little better.
|
|
function showPlugins()
|
|
{
|
|
openDialog("chrome://browser/content/pref/plugins.xul", "", "modal=yes");
|
|
}
|
|
|
|
function toggleDMPrefUI(aCheckbox)
|
|
{
|
|
if (aCheckbox.checked)
|
|
document.getElementById("closeWhenDone").removeAttribute("disabled");
|
|
else
|
|
document.getElementById("closeWhenDone").setAttribute("disabled", "true");
|
|
}
|
|
|