diff options
Diffstat (limited to 'mailnews/base/prefs/content/am-identities-list.js')
-rw-r--r-- | mailnews/base/prefs/content/am-identities-list.js | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/mailnews/base/prefs/content/am-identities-list.js b/mailnews/base/prefs/content/am-identities-list.js new file mode 100644 index 000000000..2cabb400d --- /dev/null +++ b/mailnews/base/prefs/content/am-identities-list.js @@ -0,0 +1,180 @@ +/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +Components.utils.import("resource:///modules/iteratorUtils.jsm"); +Components.utils.import("resource://gre/modules/Services.jsm"); + +var gIdentityListBox; // the root <listbox> node +var gAddButton; +var gEditButton; +var gSetDefaultButton; +var gDeleteButton; + +var gAccount = null; // the account we are showing the identities for + +function onLoad() +{ + gIdentityListBox = document.getElementById("identitiesList"); + gAddButton = document.getElementById("cmd_add"); + gEditButton = document.getElementById("cmd_edit"); + gSetDefaultButton = document.getElementById("cmd_default"); + gDeleteButton = document.getElementById("cmd_delete"); + + // extract the account + gAccount = window.arguments[0].account; + + var accountName = window.arguments[0].accountName; + document.title = document.getElementById("bundle_prefs") + .getFormattedString("identity-list-title", [accountName]); + + refreshIdentityList(0); +} + +/** + * Rebuilds the listbox holding the list of identities. + * + * @param aSelectIndex Attempt to select the identity with this index. + */ +function refreshIdentityList(aSelectIndex) +{ + // Remove all children. + while (gIdentityListBox.hasChildNodes()) + gIdentityListBox.lastChild.remove(); + + // Build the list from the identities array. + let identities = gAccount.identities; + for (let identity in fixIterator(identities, + Components.interfaces.nsIMsgIdentity)) + { + if (identity.valid) + { + let listitem = document.createElement("listitem"); + listitem.setAttribute("label", identity.identityName); + listitem.setAttribute("key", identity.key); + gIdentityListBox.appendChild(listitem); + } + } + + // Ensure one identity is always selected. + if (!aSelectIndex || aSelectIndex < 0) + aSelectIndex = 0; + else if (aSelectIndex >= gIdentityListBox.itemCount) + aSelectIndex = gIdentityListBox.itemCount - 1; + + // This also fires the onselect event, which in turn calls updateButtons(). + gIdentityListBox.selectedIndex = aSelectIndex; +} + +/** + * Opens the identity editor dialog. + * + * @param identity the identity (if any) to load in the dialog + */ +function openIdentityEditor(identity) +{ + let args = { identity: identity, account: gAccount, result: false }; + + let indexToSelect = identity ? gIdentityListBox.selectedIndex : + gIdentityListBox.itemCount; + + window.openDialog("am-identity-edit.xul", "", + "chrome,modal,resizable,centerscreen", args); + + if (args.result) + refreshIdentityList(indexToSelect); +} + +function getSelectedIdentity() +{ + if (gIdentityListBox.selectedItems.length != 1) + return null; + + var identityKey = gIdentityListBox.selectedItems[0].getAttribute("key"); + let identities = gAccount.identities; + for (let identity in fixIterator(identities, + Components.interfaces.nsIMsgIdentity)) + { + if (identity.valid && identity.key == identityKey) + return identity; + } + + return null; // no identity found +} + +function onEdit(event) +{ + var id = (event.target.localName == 'listbox') ? null : getSelectedIdentity(); + openIdentityEditor(id); +} + +/** + * Enable/disable buttons depending on number of identities and current selection. + */ +function updateButtons() +{ + // In this listbox there should always be one item selected. + if (gIdentityListBox.selectedItems.length != 1 || gIdentityListBox.itemCount == 0) { + // But in case this is not met (e.g. there is no identity for some reason, + // or the list is being rebuilt), disable all buttons. + gEditButton.setAttribute("disabled", "true"); + gDeleteButton.setAttribute("disabled", "true"); + gSetDefaultButton.setAttribute("disabled", "true"); + return; + } + + gEditButton.setAttribute("disabled", "false"); + gDeleteButton.setAttribute("disabled", (gIdentityListBox.itemCount <= 1) ? "true" : "false"); + gSetDefaultButton.setAttribute("disabled", (gIdentityListBox.selectedIndex == 0) ? "true" : "false"); + // The Add command is always enabled. +} + +function onSetDefault(event) +{ + let identity = getSelectedIdentity(); + if (!identity) + return; + + // If the first identity is selected, there is nothing to do. + if (gIdentityListBox.selectedIndex == 0) + return; + + gAccount.defaultIdentity = identity; + // Rebuilt the identity list and select the moved identity again. + refreshIdentityList(0); +} + +function onDelete(event) +{ + if (gIdentityListBox.itemCount <= 1) // don't support deleting the last identity + return; + + // get delete confirmation + let selectedIdentity = getSelectedIdentity(); + + let prefsBundle = document.getElementById("bundle_prefs"); + let confirmTitle = prefsBundle.getFormattedString("identity-delete-confirm-title", + [window.arguments[0].accountName]); + let confirmText = prefsBundle.getFormattedString("identity-delete-confirm", + [selectedIdentity.identityName]); + let confirmButton = prefsBundle.getString("identity-delete-confirm-button"); + + if (Services.prompt.confirmEx(window, confirmTitle, confirmText, + (Services.prompt.BUTTON_POS_0 * Services.prompt.BUTTON_TITLE_IS_STRING) + + (Services.prompt.BUTTON_POS_1 * Services.prompt.BUTTON_TITLE_CANCEL), + confirmButton, null, null, null, {})) + return; + + let selectedItemIndex = gIdentityListBox.selectedIndex; + + gAccount.removeIdentity(selectedIdentity); + + refreshIdentityList(selectedItemIndex); +} + +function onOk() +{ + window.arguments[0].result = true; + return true; +} |