commandglue.js

来自「现在很火的邮件客户端软件thunderbird的源码」· JavaScript 代码 · 共 1,237 行 · 第 1/3 页

JS
1,237
字号
    // the collapsed state is the state after we released the mouse     // so we take it as it is    gDBView.suppressMsgDisplay = now_hidden;  }  var event = document.createEvent('Events');  if (now_hidden) {    event.initEvent('messagepane-hide', false, true);  }  else {    event.initEvent('messagepane-unhide', false, true);  }  document.getElementById("messengerWindow").dispatchEvent(event);}function OnMouseUpThreadAndMessagePaneSplitter(){  // the collapsed state is the state after we released the mouse   // so we take it as it is  ChangeMessagePaneVisibility(IsMessagePaneCollapsed());}function FolderPaneSelectionChange(){    var folderTree = GetFolderTree();    var folderSelection = folderTree.view.selection;    // This prevents a folder from being loaded in the case that the user    // has right-clicked on a folder different from the one that was    // originally highlighted.  On a right-click, the highlight (selection)    // of a row will be different from the value of currentIndex, thus if    // the currentIndex is not selected, it means the user right-clicked    // and we don't want to load the contents of the folder.    if (!folderSelection.isSelected(folderSelection.currentIndex))      return;    if(gTimelineEnabled) {      gTimelineService.startTimer("FolderLoading");      gTimelineService.enter("FolderLoading has Started");    }    gVirtualFolderTerms = null;    gXFVirtualFolderTerms = null;    if (folderSelection.count == 1)    {        var startIndex = {};        var endIndex = {};        folderSelection.getRangeAt(0, startIndex, endIndex);        var folderResource = GetFolderResource(folderTree, startIndex.value);        var uriToLoad = folderResource.Value;        var msgFolder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder);        if (msgFolder == gMsgFolderSelected)           return;	      gPrevSelectedFolder = gMsgFolderSelected;        gMsgFolderSelected = msgFolder;        UpdateFolderLocationPicker(gMsgFolderSelected);        var folderFlags = msgFolder.flags;        // if this is same folder, and we're not showing a virtual folder        // then do nothing.        if (msgFolder == msgWindow.openFolder &&           !(folderFlags & MSG_FOLDER_FLAG_VIRTUAL) && ! (gPrevFolderFlags & MSG_FOLDER_FLAG_VIRTUAL))        {            dump("msgFolder already open" + folderResource.URI + "\n");            return;        }        else        {            OnLeavingFolder(gPrevSelectedFolder);  // mark all read in last folder            var sortType = 0;            var sortOrder = 0;            var viewFlags = 0;            var viewType = 0;            gVirtualFolderTerms = null;            gXFVirtualFolderTerms = null;            gPrevFolderFlags = folderFlags;            gCurrentVirtualFolderUri = null;            // don't get the db if this folder is a server            // we're going to be display account central            if (!(msgFolder.isServer))             {              try               {                var msgDatabase = msgFolder.getMsgDatabase(msgWindow);                if (msgDatabase)                {                  var dbFolderInfo = msgDatabase.dBFolderInfo;                  sortType = dbFolderInfo.sortType;                  sortOrder = dbFolderInfo.sortOrder;                  viewFlags = dbFolderInfo.viewFlags;                  if (folderFlags & MSG_FOLDER_FLAG_VIRTUAL)                  {                    viewType = nsMsgViewType.eShowQuickSearchResults;                    var searchTermString = dbFolderInfo.getCharPtrProperty("searchStr");                    var searchOnline = dbFolderInfo.getBooleanProperty("searchOnline", false);                    // trick the view code into updating the real folder...                    gCurrentVirtualFolderUri = uriToLoad;                    viewDebug("uriToLoad = " + uriToLoad + "\n");                    var srchFolderUri = dbFolderInfo.getCharPtrProperty("searchFolderUri");                    var srchFolderUriArray = srchFolderUri.split('|');                    // cross folder search                    var filterService = Components.classes["@mozilla.org/messenger/services/filters;1"].getService(Components.interfaces.nsIMsgFilterService);                    var filterList = filterService.getTempFilterList(msgFolder);                    var tempFilter = filterList.createFilter("temp");                    filterList.parseCondition(tempFilter, searchTermString);                    if (srchFolderUriArray.length > 1)                    {                      viewType = nsMsgViewType.eShowVirtualFolderResults;                      gXFVirtualFolderTerms = CreateGroupedSearchTerms(tempFilter.searchTerms);                      setupXFVirtualFolderSearch(srchFolderUriArray, gXFVirtualFolderTerms, searchOnline);                      // need to set things up so that reroot folder issues the search                    }                    else                    {                      gSearchSession = null;                      uriToLoad = srchFolderUri;                      // we need to load the db for the actual folder so that many hdrs to download                      // will return false...                      var realFolderRes = GetResourceFromUri(uriToLoad);                      var realFolder = realFolderRes.QueryInterface(Components.interfaces.nsIMsgFolder);                      msgDatabase = realFolder.getMsgDatabase(msgWindow);                      gVirtualFolderTerms = CreateGroupedSearchTerms(tempFilter.searchTerms);                    }                  }                  else                  {                    gSearchSession = null;                    viewFlags = dbFolderInfo.viewFlags;                    viewType = dbFolderInfo.viewType;                  }                  msgDatabase = null;                  dbFolderInfo = null;                }              }              catch (ex)              {                dump("failed to get view & sort values.  ex = " + ex +"\n");              }            }            if (gDBView && gDBView.viewType == nsMsgViewType.eShowQuickSearchResults)            {              if (gPreQuickSearchView) //close cached view before quick search              {                gPreQuickSearchView.close();                gPreQuickSearchView = null;                }              ClearQSIfNecessary();            }            ClearMessagePane();            if (gXFVirtualFolderTerms)              viewType = nsMsgViewType.eShowVirtualFolderResults;            else if (gSearchEmailAddress || gDefaultSearchViewTerms || gVirtualFolderTerms)               viewType = nsMsgViewType.eShowQuickSearchResults;            else if (viewType == nsMsgViewType.eShowQuickSearchResults)              viewType = nsMsgViewType.eShowAllThreads;  //override viewType - we don't want to start w/ quick search            ChangeFolderByURI(uriToLoad, viewType, viewFlags, sortType, sortOrder);            if (gVirtualFolderTerms)              gDBView.viewFolder = msgFolder;        }    }    else    {        msgWindow.openFolder = null;        ClearThreadPane();    }    if (gAccountCentralLoaded)      UpdateMailToolbar("gAccountCentralLoaded");    else if (gFakeAccountPageLoaded)      UpdateMailToolbar("gFakeAccountPageLoaded");    if (gDisplayStartupPage)    {        loadStartPage();        gDisplayStartupPage = false;        UpdateMailToolbar("gDisplayStartupPage");    }    }function ClearThreadPane(){  if (gDBView) {    gDBView.close();    gDBView = null;   }}function IsSpecialFolder(msgFolder, flags, checkAncestors){    if (!msgFolder)         return false;    else if ((msgFolder.flags & flags) == 0)    {      var parentMsgFolder = msgFolder.parentMsgFolder;      return (parentMsgFolder && checkAncestors) ? IsSpecialFolder(parentMsgFolder, flags, true) : false;    }    else {        // the user can set their INBOX to be their SENT folder.        // in that case, we want this folder to act like an INBOX,         // and not a SENT folder        return !((flags & MSG_FOLDER_FLAG_SENTMAIL) && (msgFolder.flags & MSG_FOLDER_FLAG_INBOX));    }}function SelectNextMessage(nextMessage){    dump("XXX implement SelectNextMessage()\n");}function GetSelectTrashUri(folder){    if (!folder) return null;    var uri = folder.getAttribute('id');    var resource = RDF.GetResource(uri);    var msgFolder =        resource.QueryInterface(Components.interfaces.nsIMsgFolder);    if (msgFolder)    {        var rootFolder = msgFolder.rootFolder;        var numFolder;        var out = new Object();        var trashFolder = rootFolder.getFoldersWithFlag(MSG_FOLDER_FLAG_TRASH, 1, out);        numFolder = out.value;        if (trashFolder) {            return trashFolder.URI;        }    }    return null;}function Undo(){    messenger.Undo(msgWindow);}function Redo(){    messenger.Redo(msgWindow);}function getSearchTermString(searchTerms){  var searchIndex;  var condition = "";  var count = searchTerms.Count();  for (searchIndex = 0; searchIndex < count; )  {    var term = searchTerms.QueryElementAt(searchIndex++, Components.interfaces.nsIMsgSearchTerm);        if (condition.length > 1)      condition += ' ';        if (term.matchAll)    {        condition = "ALL";        break;    }    condition += (term.booleanAnd) ? "AND (" : "OR (";    condition += term.termAsString + ')';  }  return condition;}function  CreateVirtualFolder(newName, parentFolder, searchFolderURIs, searchTerms, searchOnline){  // ### need to make sure view/folder doesn't exist.  if (searchFolderURIs && (searchFolderURIs != "") && newName && (newName != ""))   {    try    {      var newFolder = parentFolder.addSubfolder(newName);      newFolder.prettyName = newName;      newFolder.setFlag(MSG_FOLDER_FLAG_VIRTUAL);      var vfdb = newFolder.getMsgDatabase(msgWindow);      var searchTermString = getSearchTermString(searchTerms);      var dbFolderInfo = vfdb.dBFolderInfo;      // set the view string as a property of the db folder info      // set the original folder name as well.      dbFolderInfo.setCharPtrProperty("searchStr", searchTermString);      dbFolderInfo.setCharPtrProperty("searchFolderUri", searchFolderURIs);      dbFolderInfo.setBooleanProperty("searchOnline", searchOnline);      vfdb.summaryValid = true;      vfdb.Close(true);      parentFolder.NotifyItemAdded(newFolder);      var accountManager = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);      accountManager.saveVirtualFolders();    }    catch(e)    {      throw(e); // so that the dialog does not automatically close      dump ("Exception : creating virtual folder \n");    }  }  else   {    dump("no name or nothing selected\n");  }   }var searchSessionContractID = "@mozilla.org/messenger/searchSession;1";var gSearchView;var gSearchSession;var nsIMsgFolder = Components.interfaces.nsIMsgFolder;var nsIMsgWindow = Components.interfaces.nsIMsgWindow;var nsIMsgRDFDataSource = Components.interfaces.nsIMsgRDFDataSource;var nsMsgSearchScope = Components.interfaces.nsMsgSearchScope;var gFolderDatasource;var gFolderPicker;var gStatusBar = null;var gTimelineEnabled = false;var gMessengerBundle = null;// Datasource search listener -- made global as it has to be registered// and unregistered in different functions.var gDataSourceSearchListener;var gViewSearchListener;var gMailSession;function GetScopeForFolder(folder) {  return folder.server.searchScope;}function setupXFVirtualFolderSearch(folderUrisToSearch, searchTerms, searchOnline){    var count = new Object;    gSearchSession = Components.classes[searchSessionContractID].createInstance(Components.interfaces.nsIMsgSearchSession);    gMailSession = Components.classes[mailSessionContractID].getService(Components.interfaces.nsIMsgMailSession);    for (var i in folderUrisToSearch)     {      var realFolderRes = GetResourceFromUri(folderUrisToSearch[i]);      var realFolder = realFolderRes.QueryInterface(Components.interfaces.nsIMsgFolder);      if (!realFolder.isServer)        gSearchSession.addScopeTerm(!searchOnline ? nsMsgSearchScope.offlineMail : GetScopeForFolder(realFolder), realFolder);    }    var termsArray = searchTerms.QueryInterface(Components.interfaces.nsISupportsArray);    for (var i = 0; i < termsArray.Count(); i++)      gSearchSession.appendTerm(termsArray.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgSearchTerm));}function CreateGroupedSearchTerms(searchTermsArray){  var searchSession = gSearchSession ||     Components.classes[searchSessionContractID].createInstance(Components.interfaces.nsIMsgSearchSession);  // create a temporary isupports array to store our search terms  // since we will be modifying the terms so they work with quick search  var searchTermsArrayForQS = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray);    var numEntries = searchTermsArray.Count();  for (var i = 0; i < numEntries; i++) {    var searchTerm = searchTermsArray.GetElementAt(i).QueryInterface(Components.interfaces.nsIMsgSearchTerm);     // clone the term, since we might be modifying it    var searchTermForQS = searchSession.createTerm();    searchTermForQS.value = searchTerm.value;    searchTermForQS.attrib = searchTerm.attrib;    searchTermForQS.arbitraryHeader = searchTerm.arbitraryHeader    searchTermForQS.op = searchTerm.op;    // mark the first node as a group    if (i == 0)      searchTermForQS.beginsGrouping = true;    else if (i == numEntries - 1)      searchTermForQS.endsGrouping = true;    // turn the first term to true to work with quick search...    searchTermForQS.booleanAnd = i ? searchTerm.booleanAnd : true;         searchTermsArrayForQS.AppendElement(searchTermForQS);  }  return searchTermsArrayForQS;}function OnLeavingFolder(aFolder){  try  {    // Mark all messages of aFolder as read:    // We can't use the command controller, because it is already tuned in to the    // new folder, so we just mimic its behaviour wrt goDoCommand('cmd_markAllRead').    if (gDBView && gPrefBranch.getBoolPref("mailnews.mark_message_read." + aFolder.server.type))    {      gDBView.doCommand(nsMsgViewCommandType.markAllRead);    }  }  catch(e){/* ignore */}}var gViewDebug = false;function viewDebug(str){  if (gViewDebug)    dump(str);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?