addressbook.js
来自「现在很火的邮件客户端软件thunderbird的源码」· JavaScript 代码 · 共 904 行 · 第 1/2 页
JS
904 行
# ***** 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 Addressbook.## The Initial Developer of the Original Code is# Netscape Communications Corp.# Portions created by the Initial Developer are Copyright (C) 1999-2001# the Initial Developer. All Rights Reserved.## Original Author:# Paul Hangas <hangas@netscape.com>## Contributor(s):# Seth Spitzer <sspitzer@netscape.com># Mark Banner <mark@standard8.demon.co.uk>## Alternatively, the contents of this file may be used under the terms of# either 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 cvPrefs = 0;var addressbook = 0;var gAddressBookBundle;var gSearchTimer = null;var gStatusText = null;var gQueryURIFormat = null;var gSearchInput;var gPrintSettings = null;var gDirTree;var gCardViewBox;var gCardViewBoxEmail1;var gPreviousDirTreeIndex = -1;// Constants that correspond to choices// in Address Book->View -->Show Name asconst kDisplayName = 0;const kLastNameFirst = 1;const kFirstNameFirst = 2;const kLDAPDirectory = 0; // defined in nsDirPrefs.hconst kPABDirectory = 2; // defined in nsDirPrefs.h// Note: We need to keep this listener as it does not just handle dir// pane deletes but also deletes of address books and lists from places like// the sidebar and LDAP preference pane.var gAddressBookAbListener = { onItemAdded: function(parentDir, item) { // will not be called }, onItemRemoved: function(parentDir, item) { // will only be called when an addressbook is deleted try { // If we don't have a record of the previous selection, the only // option is to select the first. if (gPreviousDirTreeIndex == -1) { SelectFirstAddressBook(); } else { // Don't reselect if we already have a valid selection, this may be // the case if items are being removed via other methods, e.g. sidebar, // LDAP preference pane etc. if (dirTree.currentIndex == -1) { var directory = item.QueryInterface(Components.interfaces.nsIAbDirectory); // If we are a mail list, move the selection up the list before // trying to find the parent. This way we'll end up selecting the // parent address book when we remove a mailing list. // // For simple address books we don't need to move up the list, as // we want to select the next one upon removal. if (directory.isMailList && gPreviousDirTreeIndex > 0) --gPreviousDirTreeIndex; // Now get the parent of the row. var newRow = dirTree.view.getParentIndex(gPreviousDirTreeIndex); // if we have no parent (i.e. we are an address book), use the // previous index. if (newRow == -1) newRow = gPreviousDirTreeIndex; // Fall back to the first adddress book if we're not in a valid range if (newRow >= dirTree.view.rowCount) newRow = 0; // Now select the new item. dirTree.view.selection.select(newRow); } } } catch (ex) { } }, onItemPropertyChanged: function(item, property, oldValue, newValue) { // will not be called }};function OnUnloadAddressBook(){ var addrbookSession = Components.classes["@mozilla.org/addressbook/services/session;1"].getService().QueryInterface(Components.interfaces.nsIAddrBookSession); addrbookSession.removeAddressBookListener(gAddressBookAbListener); RemovePrefObservers(); CloseAbView();}var gAddressBookAbViewListener = { onSelectionChanged: function() { ResultsPaneSelectionChanged(); }, onCountChanged: function(total) { SetStatusText(total); }};function GetAbViewListener(){ return gAddressBookAbViewListener;}const kPrefMailAddrBookLastNameFirst = "mail.addr_book.lastnamefirst";var gMailAddrBookLastNameFirstObserver = { observe: function(subject, topic, value) { if (topic == "nsPref:changed" && value == kPrefMailAddrBookLastNameFirst) { UpdateCardView(); } }}function AddPrefObservers(){ var prefService = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefService); var prefBranch = prefService.getBranch(null).QueryInterface(Components.interfaces.nsIPrefBranch2); prefBranch.addObserver(kPrefMailAddrBookLastNameFirst, gMailAddrBookLastNameFirstObserver, false);}function RemovePrefObservers(){ var prefService = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefService); var prefBranch = prefService.getBranch(null).QueryInterface(Components.interfaces.nsIPrefBranch2); prefBranch.removeObserver(kPrefMailAddrBookLastNameFirst, gMailAddrBookLastNameFirstObserver);}// we won't show the window until the onload() handler is finished// so we do this trick (suggested by hyatt / blaker)function OnLoadAddressBook(){ setTimeout(delayedOnLoadAddressBook, 0); // when debugging, set this to 5000, so you can see what happens after the window comes up.}function delayedOnLoadAddressBook(){ gAddressBookBundle = document.getElementById("bundle_addressBook"); gSearchInput = document.getElementById("searchInput"); verifyAccounts(null); // this will do migration, if we need to. top.addressbook = Components.classes["@mozilla.org/addressbook;1"].createInstance(Components.interfaces.nsIAddressBook); InitCommonJS(); //This migrates the LDAPServer Preferences from 4.x to mozilla format. try { gLDAPPrefsService = Components.classes["@mozilla.org/ldapprefs-service;1"].getService(); gLDAPPrefsService = gLDAPPrefsService.QueryInterface( Components.interfaces.nsILDAPPrefsService); } catch (ex) {dump ("ERROR: Cannot get the LDAP service\n" + ex + "\n");} GetCurrentPrefs(); AddPrefObservers(); // FIX ME - later we will be able to use onload from the overlay OnLoadCardView(); SetupAbCommandUpdateHandlers(); //workaround - add setTimeout to make sure dynamic overlays get loaded first setTimeout('OnLoadDirTree()', 0); // if the pref is locked disable the menuitem New->LDAP directory if (gPrefs.prefIsLocked("ldap_2.disable_button_add")) document.getElementById("addLDAP").setAttribute("disabled", "true"); // add a listener, so we can switch directories if // the current directory is deleted var addrbookSession = Components.classes["@mozilla.org/addressbook/services/session;1"].getService().QueryInterface(Components.interfaces.nsIAddrBookSession); // this listener cares when a directory (= address book), or a directory item // is/are removed. In the case of directory items, we are only really // interested in mailing list changes and not cards but we have to have both. addrbookSession.addAddressBookListener( gAddressBookAbListener, Components.interfaces.nsIAddrBookSession.directoryRemoved | Components.interfaces.nsIAddrBookSession.directoryItemRemoved); var dirTree = GetDirTree(); dirTree.addEventListener("click",DirPaneClick,true); // initialize the customizeDone method on the customizeable toolbar var toolbox = document.getElementById("ab-toolbox"); toolbox.customizeDone = MailToolboxCustomizeDone; var toolbarset = document.getElementById('customToolbars'); toolbox.toolbarset = toolbarset;}function OnLoadDirTree() { var treeBuilder = dirTree.builder.QueryInterface(Components.interfaces.nsIXULTreeBuilder); treeBuilder.addObserver(abDirTreeObserver); SelectFirstAddressBook();}function GetCurrentPrefs(){ // prefs if ( cvPrefs == 0 ) cvPrefs = new Object; cvPrefs.prefs = gPrefs; // check "Show Name As" menu item based on pref var menuitemID; switch (gPrefs.getIntPref("mail.addr_book.lastnamefirst")) { case kFirstNameFirst: menuitemID = 'firstLastCmd'; break; case kLastNameFirst: menuitemID = 'lastFirstCmd'; break; case kDisplayName: default: menuitemID = 'displayNameCmd'; break; } var menuitem = top.document.getElementById(menuitemID); if ( menuitem ) menuitem.setAttribute('checked', 'true'); // initialize phonetic var showPhoneticFields = gPrefs.getComplexValue("mail.addr_book.show_phonetic_fields", Components.interfaces.nsIPrefLocalizedString).data; // show phonetic fields if indicated by the pref if (showPhoneticFields == "true") document.getElementById("cmd_SortBy_PhoneticName") .setAttribute("hidden", "false");}function SetNameColumn(cmd){ var prefValue; switch ( cmd ) { case 'firstLastCmd': prefValue = kFirstNameFirst; break; case 'lastFirstCmd': prefValue = kLastNameFirst; break; case 'displayNameCmd': prefValue = kDisplayName; break; } cvPrefs.prefs.setIntPref("mail.addr_book.lastnamefirst", prefValue);}function onFileMenuInit(){ goUpdateCommand('cmd_printcard'); goUpdateCommand('cmd_printcardpreview');}function CommandUpdate_AddressBook(){ goUpdateCommand('cmd_delete'); goUpdateCommand('button_delete');}function ResultsPaneSelectionChanged(){ UpdateCardView();}function UpdateCardView(){ var cards = GetSelectedAbCards(); // display the selected card, if exactly one card is selected. // either no cards, or more than one card is selected, clear the pane. if (cards.length == 1) OnClickedCard(cards[0]) else ClearCardViewPane();}function OnClickedCard(card){ if (card) DisplayCardViewPane(card); else ClearCardViewPane();}function AbClose(){ top.close();}function AbNewLDAPDirectory(){ window.openDialog("chrome://messenger/content/addressbook/pref-directory-add.xul", "", "chrome,modal=yes,resizable=no,centerscreen", null);}function AbNewAddressBook(){ var strBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"]. getService(Components.interfaces.nsIStringBundleService); var bundle = strBundleService.createBundle("chrome://messenger/locale/addressbook/addressBook.properties"); var dialogTitle = bundle.GetStringFromName('newAddressBookTitle'); var dialog = window.openDialog( "chrome://messenger/content/addressbook/abAddressBookNameDialog.xul", "", "chrome,modal=yes,resizable=no,centerscreen", {title: dialogTitle, okCallback:AbOnCreateNewAddressBook});}function AbRenameAddressBook(){ var selectedABURI = GetSelectedDirectory(); // the rdf service var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService); // the RDF resource URI for LDAPDirectory will be like: "moz-abmdbdirectory://abook-3.mab" var selectedABDirectory = RDF.GetResource(selectedABURI).QueryInterface(Components.interfaces.nsIAbDirectory); var strBundleService = Components.classes["@mozilla.org/intl/stringbundle;1"]. getService(Components.interfaces.nsIStringBundleService); var bundle = strBundleService.createBundle("chrome://messenger/locale/addressbook/addressBook.properties"); var dialogTitle = bundle.GetStringFromName('renameAddressBookTitle'); // you can't rename the PAB or the CAB var canRename = (selectedABURI != kCollectedAddressbookURI && selectedABURI != kPersonalAddressbookURI); var dialog = window.openDialog( "chrome://messenger/content/addressbook/abAddressBookNameDialog.xul", "", "chrome,modal=yes,resizable=no,centerscreen", {title: dialogTitle, canRename: canRename, name: selectedABDirectory.directoryProperties.description, okCallback:AbOnRenameAddressBook});}function AbOnCreateNewAddressBook(aName){ var properties = Components.classes["@mozilla.org/addressbook/properties;1"].createInstance(Components.interfaces.nsIAbDirectoryProperties); properties.description = aName; properties.dirType = kPABDirectory; top.addressbook.newAddressBook(properties);}function AbOnRenameAddressBook(aName){ // When the UI code for renaming addrbooks (bug #17230) is ready, just // change 'properties.description' setting below and it should just work. // get select ab var selectedABURI = GetSelectedDirectory(); //dump("In AbRenameAddressBook() selectedABURI=" + selectedABURI + "\n"); // the rdf service var RDF = Components.classes["@mozilla.org/rdf/rdf-service;1"].getService(Components.interfaces.nsIRDFService); // get the datasource for the addressdirectory var addressbookDS = RDF.GetDataSource("rdf:addressdirectory"); // moz-abdirectory:// is the RDF root to get all types of addressbooks. var parentDir = RDF.GetResource("moz-abdirectory://").QueryInterface(Components.interfaces.nsIAbDirectory); // the RDF resource URI for LDAPDirectory will be like: "moz-abmdbdirectory://abook-3.mab" var selectedABDirectory = RDF.GetResource(selectedABURI).QueryInterface(Components.interfaces.nsIAbDirectory); // Copy existing dir type category id and mod time so they won't get reset. var oldProperties = selectedABDirectory.directoryProperties; // Create and fill in properties info var properties = Components.classes["@mozilla.org/addressbook/properties;1"].createInstance(Components.interfaces.nsIAbDirectoryProperties); properties.URI = selectedABURI; properties.dirType = oldProperties.dirType; properties.categoryId = oldProperties.categoryId; properties.syncTimeStamp = oldProperties.syncTimeStamp; properties.description = aName; // Now do the modification. addressbook.modifyAddressBook(addressbookDS, parentDir, selectedABDirectory, properties);}function GetPrintSettings(){ var prevPS = gPrintSettings; try { if (gPrintSettings == null) { var useGlobalPrintSettings = true; var pref = Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch); if (pref) { useGlobalPrintSettings = pref.getBoolPref("print.use_global_printsettings", false); } // I would rather be using nsIWebBrowserPrint API // but I really don't have a document at this point var printSettingsService = Components.classes["@mozilla.org/gfx/printsettings-service;1"] .getService(Components.interfaces.nsIPrintSettingsService); if (useGlobalPrintSettings) { gPrintSettings = printSettingsService.globalPrintSettings; } else { gPrintSettings = printSettingsService.CreatePrintSettings(); } } } catch (e) { dump("GetPrintSettings "+e); } return gPrintSettings;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?