363 строки
13 KiB
JavaScript
363 строки
13 KiB
JavaScript
/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* ***** BEGIN LICENSE BLOCK *****
|
|
* 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 Communicator client code, released
|
|
* March 31, 1998.
|
|
*
|
|
* The Initial Developer of the Original Code is
|
|
* Netscape Communications Corporation.
|
|
* Portions created by the Initial Developer are Copyright (C) 1998-1999
|
|
* the Initial Developer. All Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
* Ben Goodger (03/01/00)
|
|
* Seth Spitzer (28/10/99)
|
|
* Dan Veditz <dveditz@netscape.com>
|
|
* Brant Gurganus <brantgurganus2001@cherokeescouting.org>
|
|
* Neil Rashbrook <neil@parkwaycc.co.uk>
|
|
*
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
* either of 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 gMozAppsBundle;
|
|
var gProfileBundle;
|
|
var gBrandBundle;
|
|
var gProfileService;
|
|
var gPromptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
|
|
.getService(Components.interfaces.nsIPromptService);
|
|
var gProfileManagerMode = "selection";
|
|
var gDialogParams = window.arguments[0]
|
|
.QueryInterface(Components.interfaces.nsIDialogParamBlock);
|
|
|
|
function StartUp()
|
|
{
|
|
gMozAppsBundle = document.getElementById("bundle_mozapps");
|
|
gProfileBundle = document.getElementById("bundle_profile");
|
|
gBrandBundle = document.getElementById("bundle_brand");
|
|
if (gDialogParams.objects) {
|
|
document.documentElement.getButton("accept").setAttribute("label",
|
|
document.documentElement.getAttribute("buttonlabelstart"));
|
|
document.documentElement.getButton("cancel").setAttribute("label",
|
|
document.documentElement.getAttribute("buttonlabelexit"));
|
|
document.getElementById('intro').textContent =
|
|
document.getElementById('intro').getAttribute("start");
|
|
document.getElementById('offlineState').hidden = false;
|
|
gDialogParams.SetInt(0, 0);
|
|
}
|
|
|
|
gProfileService = Components.classes["@mozilla.org/toolkit/profile-service;1"]
|
|
.getService(Components.interfaces.nsIToolkitProfileService);
|
|
var enum = gProfileService.profiles;
|
|
var selectedProfile = null;
|
|
try {
|
|
selectedProfile = gProfileService.selectedProfile;
|
|
}
|
|
catch (ex) {
|
|
}
|
|
while (enum.hasMoreElements()) {
|
|
AddItem(enum.getNext().QueryInterface(Components.interfaces.nsIToolkitProfile),
|
|
selectedProfile);
|
|
}
|
|
|
|
var autoSelect = document.getElementById("autoSelect");
|
|
var prefs = Components.classes["@mozilla.org/preferences-service;1"]
|
|
.getService(Components.interfaces.nsIPrefBranch);
|
|
if (prefs.getBoolPref("profile.manage_only_at_launch"))
|
|
autoSelect.hidden = true;
|
|
else
|
|
autoSelect.checked = gProfileService.startWithLastProfile;
|
|
|
|
DoEnabling();
|
|
}
|
|
|
|
// function : <profileSelection.js>::AddItem();
|
|
// purpose : utility function for adding items to a tree.
|
|
function AddItem(aProfile, aProfileToSelect)
|
|
{
|
|
var tree = document.getElementById("profiles");
|
|
var treeitem = document.createElement("treeitem");
|
|
var treerow = document.createElement("treerow");
|
|
var treecell = document.createElement("treecell");
|
|
treecell.setAttribute("label", aProfile.name);
|
|
treerow.appendChild(treecell);
|
|
treeitem.appendChild(treerow);
|
|
tree.lastChild.appendChild(treeitem);
|
|
treeitem.profile = aProfile;
|
|
if (aProfile == aProfileToSelect) {
|
|
var profileIndex = tree.view.getIndexOfItem(treeitem);
|
|
tree.view.selection.select(profileIndex);
|
|
tree.treeBoxObject.ensureRowIsVisible(profileIndex);
|
|
}
|
|
}
|
|
|
|
// function : <profileSelection.js>::AcceptDialog();
|
|
// purpose : sets the current profile to the selected profile (user choice: "Start Mozilla")
|
|
function AcceptDialog()
|
|
{
|
|
var autoSelect = document.getElementById("autoSelect");
|
|
if (!autoSelect.hidden) {
|
|
gProfileService.startWithLastProfile = autoSelect.checked;
|
|
gProfileService.flush();
|
|
}
|
|
|
|
var profileTree = document.getElementById("profiles");
|
|
var selected = profileTree.view.getItemAtIndex(profileTree.currentIndex);
|
|
|
|
if (!gDialogParams.objects) {
|
|
var dirServ = Components.classes['@mozilla.org/file/directory_service;1']
|
|
.getService(Components.interfaces.nsIProperties);
|
|
var profD = dirServ.get("ProfD", Components.interfaces.nsIFile);
|
|
var profLD = dirServ.get("ProfLD", Components.interfaces.nsIFile);
|
|
|
|
if (selected.profile.rootDir.equals(profD) &&
|
|
selected.profile.localDir.equals(profLD))
|
|
return true;
|
|
}
|
|
|
|
try {
|
|
var profileLock = selected.profile.lock({});
|
|
gProfileService.selectedProfile = selected.profile;
|
|
gProfileService.flush();
|
|
if (gDialogParams.objects) {
|
|
gDialogParams.objects.insertElementAt(profileLock, 0, false);
|
|
gProfileService.startOffline = document.getElementById("offlineState").checked;
|
|
gDialogParams.SetInt(0, 1);
|
|
gDialogParams.SetString(0, selected.profile.name);
|
|
return true;
|
|
}
|
|
profileLock.unlock();
|
|
} catch (e) {
|
|
var brandName = gBrandBundle.getString("brandShortName");
|
|
var message = gProfileBundle.getFormattedString("dirLocked",
|
|
[brandName, selected.profile.name]);
|
|
gPromptService.alert(window, null, message);
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
var env = Components.classes["@mozilla.org/process/environment;1"]
|
|
.getService(Components.interfaces.nsIEnvironment);
|
|
env.set("XRE_PROFILE_NAME", selected.profile.name);
|
|
env.set("XRE_PROFILE_PATH", selected.profile.rootDir.path);
|
|
env.set("XRE_PROFILE_LOCAL_PATH", selected.profile.localDir.path);
|
|
var app = Components.classes["@mozilla.org/toolkit/app-startup;1"]
|
|
.getService(Components.interfaces.nsIAppStartup);
|
|
app.quit(app.eAttemptQuit | app.eRestart);
|
|
return true;
|
|
}
|
|
catch (e) {
|
|
env.set("XRE_PROFILE_NAME", "");
|
|
env.set("XRE_PROFILE_PATH", "");
|
|
env.set("XRE_PROFILE_LOCAL_PATH", "");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// invoke the createProfile Wizard
|
|
function CreateProfileWizard()
|
|
{
|
|
window.openDialog('chrome://mozapps/content/profile/createProfileWizard.xul',
|
|
'', 'centerscreen,chrome,modal,titlebar');
|
|
}
|
|
|
|
// update the display to show the additional profile
|
|
function CreateProfile(aProfile)
|
|
{
|
|
gProfileService.flush();
|
|
AddItem(aProfile, aProfile);
|
|
}
|
|
|
|
// rename the selected profile
|
|
function RenameProfile()
|
|
{
|
|
var profileTree = document.getElementById("profiles");
|
|
var selected = profileTree.view.getItemAtIndex(profileTree.currentIndex);
|
|
var profileName = selected.profile.name;
|
|
var newName = {value: profileName};
|
|
var dialogTitle = gMozAppsBundle.getString("renameProfileTitle");
|
|
var msg = gMozAppsBundle.getFormattedString("renameProfilePrompt", [profileName]);
|
|
if (gPromptService.prompt(window, dialogTitle, msg, newName, null, {value: 0}) &&
|
|
newName.value != profileName) {
|
|
if (!/\S/.test(newName.value)) {
|
|
gPromptService.alert(window,
|
|
gMozAppsBundle.getString("profileNameInvalidTitle"),
|
|
gMozAppsBundle.getString("profileNameEmpty"));
|
|
return false;
|
|
}
|
|
|
|
if (/([\\*:?<>|\/\"])/.test(newName.value)) {
|
|
gPromptService.alert(window,
|
|
gMozAppsBundle.getString("profileNameInvalidTitle"),
|
|
gMozAppsBundle.getFormattedString("invalidChar", [RegExp.$1]));
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
gProfileService.getProfileByName(newName.value);
|
|
gPromptService.alert(window,
|
|
gMozAppsBundle.getString("profileExistsTitle"),
|
|
gMozAppsBundle.getString("profileExists"));
|
|
return false;
|
|
}
|
|
catch (e) {
|
|
}
|
|
|
|
selected.profile.name = newName.value;
|
|
gProfileService.flush();
|
|
selected.firstChild.firstChild.setAttribute("label", newName.value);
|
|
}
|
|
}
|
|
|
|
function ConfirmDelete()
|
|
{
|
|
var profileTree = document.getElementById("profiles");
|
|
var selected = profileTree.view.getItemAtIndex(profileTree.currentIndex);
|
|
if (!selected.profile.rootDir.exists()) {
|
|
DeleteProfile(false);
|
|
return;
|
|
}
|
|
|
|
try {
|
|
var profileLock = selected.profile.lock({});
|
|
var dialogTitle = gMozAppsBundle.getString("deleteTitle");
|
|
var dialogText;
|
|
|
|
var path = selected.profile.rootDir.path;
|
|
dialogText = gProfileBundle.getFormattedString("deleteProfile", [path]);
|
|
var buttonPressed = gPromptService.confirmEx(window, dialogTitle, dialogText,
|
|
(gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_0) +
|
|
(gPromptService.BUTTON_TITLE_CANCEL * gPromptService.BUTTON_POS_1) +
|
|
(gPromptService.BUTTON_TITLE_IS_STRING * gPromptService.BUTTON_POS_2),
|
|
gMozAppsBundle.getString("dontDeleteFiles"), null,
|
|
gMozAppsBundle.getString("deleteFiles"), null, {value: 0});
|
|
profileLock.unlock();
|
|
if (buttonPressed != 1)
|
|
DeleteProfile(buttonPressed == 2);
|
|
} catch (e) {
|
|
var dialogTitle = gProfileBundle.getString("deleteTitle");
|
|
var brandName = gBrandBundle.getString("brandShortName");
|
|
var dialogText = gProfileBundle.getFormattedString("deleteLocked",
|
|
[brandName, selected.profile.name]);
|
|
gPromptService.alert(window, dialogTitle, dialogText);
|
|
}
|
|
}
|
|
|
|
// Delete the profile, with the delete flag set as per instruction above.
|
|
function DeleteProfile(aDeleteFiles)
|
|
{
|
|
var profileTree = document.getElementById("profiles");
|
|
var selected = profileTree.view.getItemAtIndex(profileTree.currentIndex);
|
|
var previous = profileTree.currentIndex && profileTree.currentIndex - 1;
|
|
|
|
try {
|
|
selected.profile.remove(aDeleteFiles);
|
|
gProfileService.flush();
|
|
profileTree.lastChild.removeChild(selected);
|
|
|
|
if (profileTree.view.rowCount != 0) {
|
|
profileTree.view.selection.select(previous);
|
|
profileTree.treeBoxObject.ensureRowIsVisible(previous);
|
|
}
|
|
|
|
// set the button state
|
|
DoEnabling();
|
|
}
|
|
catch (ex) {
|
|
dump("Exception during profile deletion.\n");
|
|
}
|
|
}
|
|
|
|
function SwitchProfileManagerMode()
|
|
{
|
|
var captionLine;
|
|
var prattleIndex;
|
|
|
|
if (gProfileManagerMode == "selection") {
|
|
prattleIndex = 1;
|
|
captionLine = gProfileBundle.getString("manageTitle");
|
|
|
|
document.getElementById("profiles").focus();
|
|
|
|
// hide the manage profiles button...
|
|
document.documentElement.getButton("extra2").hidden = true;
|
|
gProfileManagerMode = "manager";
|
|
}
|
|
else {
|
|
prattleIndex = 0;
|
|
captionLine = gProfileBundle.getString("selectTitle");
|
|
gProfileManagerMode = "selection";
|
|
}
|
|
|
|
// swap deck
|
|
document.getElementById("prattle").selectedIndex = prattleIndex;
|
|
|
|
// change the title of the profile manager/selection window.
|
|
document.getElementById("header").setAttribute("description", captionLine);
|
|
document.title = captionLine;
|
|
}
|
|
|
|
// do button enabling based on tree selection
|
|
function DoEnabling()
|
|
{
|
|
var acceptButton = document.documentElement.getButton("accept");
|
|
var deleteButton = document.getElementById("deleteButton");
|
|
var renameButton = document.getElementById("renameButton");
|
|
|
|
var disabled = document.getElementById("profiles").view.selection.count == 0;
|
|
acceptButton.disabled = disabled;
|
|
deleteButton.disabled = disabled;
|
|
renameButton.disabled = disabled;
|
|
}
|
|
|
|
// handle key event on tree
|
|
function HandleKeyEvent(aEvent)
|
|
{
|
|
if (gProfileManagerMode != "manager")
|
|
return;
|
|
|
|
switch (aEvent.keyCode)
|
|
{
|
|
case KeyEvent.DOM_VK_BACK_SPACE:
|
|
case KeyEvent.DOM_VK_DELETE:
|
|
if (!document.getElementById("deleteButton").disabled)
|
|
ConfirmDelete();
|
|
break;
|
|
case KeyEvent.DOM_VK_F2:
|
|
if (!document.getElementById("renameButton").disabled)
|
|
RenameProfile();
|
|
}
|
|
}
|
|
|
|
function HandleClickEvent(aEvent)
|
|
{
|
|
if (aEvent.button == 0 && aEvent.target.parentNode.view.selection.count != 0 && AcceptDialog()) {
|
|
window.close();
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|