mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-26 02:17:34 +09:00
180 lines
5.8 KiB
JavaScript
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;
|
|
}
|