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 + -
显示快捷键?