commandglue.js

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

JS
1,237
字号
{  var tree = GetThreadTree();  var lastFolderSent = tree.getAttribute("lastfoldersent") == "true";  if (isSentFolder != lastFolderSent)  {    var senderColumn = document.getElementById("senderCol");    var recipientColumn = document.getElementById("recipientCol");        var saveHidden = senderColumn.getAttribute("hidden");    senderColumn.setAttribute("hidden", senderColumn.getAttribute("swappedhidden"));    senderColumn.setAttribute("swappedhidden", saveHidden);    saveHidden = recipientColumn.getAttribute("hidden");    recipientColumn.setAttribute("hidden", recipientColumn.getAttribute("swappedhidden"));    recipientColumn.setAttribute("swappedhidden", saveHidden);  }  if(isSentFolder)    tree.setAttribute("lastfoldersent", "true");  else    tree.setAttribute("lastfoldersent", "false");}function ShowLocationColumn(show){  var col = document.getElementById("locationCol");  if (col) {    if (show) {      col.removeAttribute("hidden");      col.removeAttribute("ignoreincolumnpicker");    }    else {      col.setAttribute("hidden","true");      col.setAttribute("ignoreincolumnpicker","true");    }  }}function SetNewsFolderColumns(){  var sizeColumn = document.getElementById("sizeCol");  if (gDBView.usingLines) {     sizeColumn.setAttribute("label",gMessengerBundle.getString("linesColumnHeader"));  }  else {     sizeColumn.setAttribute("label", gMessengerBundle.getString("sizeColumnHeader"));  }}function UpdateStatusMessageCounts(folder){  var unreadElement = GetUnreadCountElement();  var totalElement = GetTotalCountElement();  if(folder && unreadElement && totalElement)  {    var numUnread =            gMessengerBundle.getFormattedString("unreadMsgStatus",                                                [ folder.getNumUnread(false)]);    var numTotal =            gMessengerBundle.getFormattedString("totalMsgStatus",                                                [folder.getTotalMessages(false)]);    unreadElement.setAttribute("label", numUnread);    totalElement.setAttribute("label", numTotal);    unreadElement.hidden = false;    totalElement.hidden = false;  }}var gQuotaUICache;function UpdateStatusQuota(folder){  if (!(folder && // no folder selected        folder instanceof Components.interfaces.nsIMsgImapMailFolder)) // POP etc.  {    if (typeof(gQuotaUICache) == "object") // ever shown quota      gQuotaUICache.panel.hidden = true;    return;  }  folder = folder.QueryInterface(Components.interfaces.nsIMsgImapMailFolder);  // get element references and prefs  if (typeof(gQuotaUICache) != "object")  {    gQuotaUICache = new Object();    gQuotaUICache.meter = document.getElementById("quotaMeter");    gQuotaUICache.panel = document.getElementById("quotaPanel");    gQuotaUICache.label = document.getElementById("quotaLabel");    const kBranch = "mail.quota.mainwindow_threshold.";    gQuotaUICache.showTreshold = gPrefBranch.getIntPref(kBranch + "show");    gQuotaUICache.warningTreshold = gPrefBranch.getIntPref(kBranch + "warning");    gQuotaUICache.criticalTreshold = gPrefBranch.getIntPref(kBranch + "critical");  }  var valid = {value: null};  var used = {value: null};  var max = {value: null};  try {    // get data from backend    folder.getQuota(valid, used, max);  } catch (e) { dump(e + "\n"); }  if (valid.value)  {    var percent = Math.round(used.value / max.value * 100);    // show in UI    if (percent < gQuotaUICache.showTreshold)      gQuotaUICache.panel.hidden = true;    else    {      gQuotaUICache.panel.hidden = false;      gQuotaUICache.meter.setAttribute("value", percent);           // do not use value property, because that is imprecise (3%)           // for optimization that we don't need here      var label = percent + "%";      gQuotaUICache.label.value = label;      if (percent < gQuotaUICache.warningTreshold)        gQuotaUICache.panel.removeAttribute("alert");      else if (percent < gQuotaUICache.criticalTreshold)        gQuotaUICache.panel.setAttribute("alert", "warning");      else        gQuotaUICache.panel.setAttribute("alert", "critical");    }  }  else    gQuotaUICache.panel.hidden = true;}function ConvertColumnIDToSortType(columnID){  var sortKey;  switch (columnID) {    case "dateCol":      sortKey = nsMsgViewSortType.byDate;      break;    case "senderCol":    	sortKey = nsMsgViewSortType.byAuthor;      break;    case "recipientCol":    	sortKey = nsMsgViewSortType.byRecipient;      break;    case "subjectCol":      sortKey = nsMsgViewSortType.bySubject;      break;    case "locationCol":      sortKey = nsMsgViewSortType.byLocation;      break;    case "accountCol":      sortKey = nsMsgViewSortType.byAccount;      break;    case "unreadButtonColHeader":      sortKey = nsMsgViewSortType.byUnread;      break;    case "statusCol":      sortKey = nsMsgViewSortType.byStatus;      break;    case "sizeCol":      sortKey = nsMsgViewSortType.bySize;      break;    case "priorityCol":      sortKey = nsMsgViewSortType.byPriority;      break;    case "flaggedCol":      sortKey = nsMsgViewSortType.byFlagged;      break;    case "threadCol":      sortKey = nsMsgViewSortType.byThread;      break;    case "tagsCol":      sortKey = nsMsgViewSortType.byTags;      break;    case "junkStatusCol":      sortKey = nsMsgViewSortType.byJunkStatus;      break;    case "idCol":      sortKey = nsMsgViewSortType.byId;      break;    case "attachmentCol":	    sortKey = nsMsgViewSortType.byAttachments;	    break;    default:            //no predefined column handler - lets check if there is a custom column handler      try {        //try to grab the columnHandler (an error is thrown if it does not exist)        columnHandler = gDBView.getColumnHandler(columnID);        //it exists - save this column ID in the customSortCol property of dbFolderInfo        //for later use (see nsIMsgDBView.cpp)        gDBView.db.dBFolderInfo.setProperty('customSortCol', columnID);                sortKey = nsMsgViewSortType.byCustom;      }      catch(err)      {        dump("unsupported sort column: " + columnID + " - no custom handler installed. (Error was: " + err + ")\n");        sortKey = 0;      }      break;  }  return sortKey;}function ConvertSortTypeToColumnID(sortKey){  var columnID;  // hack to turn this into an integer, if it was a string  // it would be a string if it came from localStore.rdf  sortKey = sortKey - 0;  switch (sortKey) {    case nsMsgViewSortType.byDate:      columnID = "dateCol";      break;    case nsMsgViewSortType.byAuthor:      columnID = "senderCol";      break;    case nsMsgViewSortType.byRecipient:      columnID = "recipientCol";      break;    case nsMsgViewSortType.bySubject:      columnID = "subjectCol";      break;    case nsMsgViewSortType.byLocation:      columnID = "locationCol";      break;    case nsMsgViewSortType.byAccount:      columnID = "accountCol";      break;    case nsMsgViewSortType.byUnread:      columnID = "unreadButtonColHeader";      break;    case nsMsgViewSortType.byStatus:      columnID = "statusCol";      break;    case nsMsgViewSortType.byTags:      columnID = "tagsCol";      break;    case nsMsgViewSortType.bySize:      columnID = "sizeCol";      break;    case nsMsgViewSortType.byPriority:      columnID = "priorityCol";      break;    case nsMsgViewSortType.byFlagged:      columnID = "flaggedCol";      break;    case nsMsgViewSortType.byThread:      columnID = "threadCol";      break;    case nsMsgViewSortType.byId:      columnID = "idCol";      break;    case nsMsgViewSortType.byJunkStatus:      columnID = "junkStatusCol";      break;	  case nsMsgViewSortType.byAttachments:	    columnID = "attachmentCol";	    break;    case nsMsgViewSortType.byCustom:      //TODO: either change try() catch to if (property exists) or restore the getColumnHandler() check      try //getColumnHandler throws an errror when the ID is not handled      {        columnID = gDBView.db.dBFolderInfo.getProperty('customSortCol');      }      catch (err) { //error - means no handler        dump("ConvertSortTypeToColumnID: custom sort key but no handler for column '" + columnID + "'\n");        columnID = "dateCol";      }      break;    default:      dump("unsupported sort key: " + sortKey + "\n");      columnID = "dateCol";      break;  }  return columnID;}var nsMsgViewSortType = Components.interfaces.nsMsgViewSortType;var nsMsgViewSortOrder = Components.interfaces.nsMsgViewSortOrder;var nsMsgViewFlagsType = Components.interfaces.nsMsgViewFlagsType;var nsMsgViewCommandType = Components.interfaces.nsMsgViewCommandType;var nsMsgViewType = Components.interfaces.nsMsgViewType;var nsMsgNavigationType = Components.interfaces.nsMsgNavigationType;var gDBView = null;var gCurViewFlags;var gCurSortType;// CreateDBView is called when we have a thread pane. CreateBareDBView is called when there is no// tree associated with the view. CreateDBView will call into CreateBareDBView...function CreateBareDBView(originalView, msgFolder, viewType, viewFlags, sortType, sortOrder){  var dbviewContractId = "@mozilla.org/messenger/msgdbview;1?type=";  // hack to turn this into an integer, if it was a string  // it would be a string if it came from localStore.rdf  viewType = viewType - 0;  switch (viewType) {      case nsMsgViewType.eShowQuickSearchResults:          dbviewContractId += "quicksearch";          break;      case nsMsgViewType.eShowThreadsWithUnread:          dbviewContractId += "threadswithunread";          break;      case nsMsgViewType.eShowWatchedThreadsWithUnread:          dbviewContractId += "watchedthreadswithunread";          break;      case nsMsgViewType.eShowVirtualFolderResults:          dbviewContractId += "xfvf";          break;      case nsMsgViewType.eShowSearch:          dbviewContractId += "search";          break;      case nsMsgViewType.eShowAllThreads:      default:          if (sortType == nsMsgViewSortType.byThread || sortType == nsMsgViewSortType.byId            || sortType == nsMsgViewSortType.byNone)            viewFlags &= ~nsMsgViewFlagsType.kGroupBySort;          if (viewFlags & nsMsgViewFlagsType.kGroupBySort)            dbviewContractId += "group";          else            dbviewContractId += "threaded";          break;  }  //  dump ("contract id = " + dbviewContractId + "original view = " + originalView + "\n");  if (!originalView)    gDBView = Components.classes[dbviewContractId].createInstance(Components.interfaces.nsIMsgDBView);  gCurViewFlags = viewFlags;  var count = new Object;  if (!gThreadPaneCommandUpdater)    gThreadPaneCommandUpdater = new nsMsgDBViewCommandUpdater();  gCurSortType = sortType;  if (!originalView) {    gDBView.init(messenger, msgWindow, gThreadPaneCommandUpdater);    gDBView.open(msgFolder, gCurSortType, sortOrder, viewFlags, count);    if (viewType == nsMsgViewType.eShowVirtualFolderResults)    {      // the view is a listener on the search results      gViewSearchListener = gDBView.QueryInterface(Components.interfaces.nsIMsgSearchNotify);      gSearchSession.registerListener(gViewSearchListener);    }  }   else {    gDBView = originalView.cloneDBView(messenger, msgWindow, gThreadPaneCommandUpdater);  }}function CreateDBView(msgFolder, viewType, viewFlags, sortType, sortOrder){  // call the inner create method  CreateBareDBView(null, msgFolder, viewType, viewFlags, sortType, sortOrder);  // now do tree specific work  // based on the collapsed state of the thread pane/message pane splitter,  // suppress message display if appropriate.  gDBView.suppressMsgDisplay = IsMessagePaneCollapsed();  UpdateSortIndicators(gCurSortType, sortOrder);  var ObserverService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);  ObserverService.notifyObservers(msgFolder, "MsgCreateDBView", viewType + ":" + viewFlags);}//------------------------------------------------------------// Sets the column header sort icon based on the requested// column and direction.//// Notes:// (1) This function relies on the first part of the//     <treecell id> matching the <treecol id>.  The treecell//     id must have a "Header" suffix.// (2) By changing the "sortDirection" attribute, a different//     CSS style will be used, thus changing the icon based on//     the "sortDirection" parameter.//------------------------------------------------------------function UpdateSortIndicator(column,sortDirection){  // this is obsolete}function GetSelectedFolderResource(){    var folderTree = GetFolderTree();    var startIndex = {};    var endIndex = {};    folderTree.view.selection.getRangeAt(0, startIndex, endIndex);    return GetFolderResource(folderTree, startIndex.value);}function ChangeMessagePaneVisibility(now_hidden){  // we also have to hide the File/Attachments menuitem  node = document.getElementById("fileAttachmentMenu");  if (node)    node.hidden = now_hidden;  if (gDBView) {

⌨️ 快捷键说明

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