Dactyloidae/mailnews/addrbook/prefs/content/pref-editdirectories.js

142 lines
4.3 KiB
JavaScript

/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* 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://gre/modules/Services.jsm");
Components.utils.import("resource:///modules/mailServices.js");
// Listener to refresh the list items if something changes. In all these
// cases we just rebuild the list as it is easier than searching/adding in the
// correct places an would be an infrequent operation.
var gAddressBookAbListener = {
onItemAdded: function(parentDir, item) {
if (item instanceof Components.interfaces.nsIAbDirectory) {
fillDirectoryList();
}
},
onItemRemoved: function(parentDir, item) {
if (item instanceof Components.interfaces.nsIAbDirectory) {
fillDirectoryList();
}
},
onItemPropertyChanged: function(item, property, oldValue, newValue) {
if (item instanceof Components.interfaces.nsIAbDirectory) {
fillDirectoryList();
}
}
};
function onInitEditDirectories()
{
// For AbDeleteDirectory in abCommon.js
gAddressBookBundle = document.getElementById("bundle_addressBook");
// If the pref is locked disable the "Add" button
if (Services.prefs.prefIsLocked("ldap_2.disable_button_add"))
document.getElementById("addButton").setAttribute('disabled', true);
// Fill out the directory list
fillDirectoryList();
const nsIAbListener = Components.interfaces.nsIAbListener;
// Add a listener so we can update correctly if the list should change
MailServices.ab.addAddressBookListener(gAddressBookAbListener,
nsIAbListener.itemAdded |
nsIAbListener.directoryRemoved |
nsIAbListener.itemChanged);
}
function onUninitEditDirectories()
{
MailServices.ab.removeAddressBookListener(gAddressBookAbListener);
}
function fillDirectoryList()
{
var abList = document.getElementById("directoriesList");
// Empty out anything in the list
while (abList.hasChildNodes())
abList.lastChild.remove();
// Init the address book list
let directories = MailServices.ab.directories;
let holdingArray = [];
while (directories && directories.hasMoreElements()) {
let ab = directories.getNext();
if (ab instanceof Components.interfaces.nsIAbDirectory && ab.isRemote)
holdingArray.push(ab);
}
holdingArray.sort(function (a, b) { return a.dirName.localeCompare(b.dirName); });
holdingArray.forEach(function (ab) {
var item = document.createElement('listitem');
item.setAttribute("label", ab.dirName);
item.setAttribute("value", ab.URI);
abList.appendChild(item);
});
}
function selectDirectory()
{
var abList = document.getElementById("directoriesList");
var editButton = document.getElementById("editButton");
var removeButton = document.getElementById("removeButton");
if (abList && abList.selectedItem) {
editButton.removeAttribute("disabled");
// If the disable delete button pref for the selected directory is set,
// disable the delete button for that directory.
let disable = false;
let ab = MailServices.ab.getDirectory(abList.value);
try {
disable = Services.prefs.getBoolPref(ab.dirPrefId + ".disable_delete");
}
catch(ex){
// If this preference is not set, it's ok.
}
if (disable)
removeButton.setAttribute("disabled", true);
else
removeButton.removeAttribute("disabled");
}
else {
editButton.setAttribute("disabled", true);
removeButton.setAttribute("disabled", true);
}
}
function dblClickDirectory(event)
{
// We only care about left click events.
if (event.button != 0)
return;
editDirectory();
}
function editDirectory()
{
var abList = document.getElementById("directoriesList");
if (abList && abList.selectedItem) {
let abURI = abList.value;
let ab = MailServices.ab.getDirectory(abURI);
window.openDialog(ab.propertiesChromeURI, "editDirectory",
"chrome,modal=yes,resizable=no",
{ selectedDirectory: ab });
}
}
function removeDirectory()
{
var abList = document.getElementById("directoriesList");
if (abList && abList.selectedItem)
AbDeleteDirectory(abList.value);
}