Dactyloidae/mailnews/base/prefs/content/am-identities-list.js

180 lines
5.8 KiB
JavaScript

/* -*- 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;
}