?? mailwindowoverlay.js
字號:
var destMsgFolder = destResource.QueryInterface(Components.interfaces.nsIMsgFolder); aMenuItem.label = gMessengerBundle.getFormattedString(isMove ? "moveToFolderAgain" : "copyToFolderAgain", [destMsgFolder.prettyName], 1); aMenuItem.setAttribute('accesskey', gMessengerBundle.getString(isMove ? "moveToFolderAgainAccessKey" : "copyToFolderAgainAccessKey")); }}function InitViewHeadersMenu(){ var id = null; var headerchoice = 1; try { headerchoice = pref.getIntPref("mail.show_headers"); } catch (ex) { dump("failed to get the header pref\n"); } switch (headerchoice) { case 2: id = "viewallheaders"; break; case 1: default: id = "viewnormalheaders"; break; } var menuitem = document.getElementById(id); if (menuitem) menuitem.setAttribute("checked", "true"); }function InitViewBodyMenu(){ var html_as = 0; var prefer_plaintext = false; var disallow_classes = 0; try { prefer_plaintext = pref.getBoolPref("mailnews.display.prefer_plaintext"); html_as = pref.getIntPref("mailnews.display.html_as"); disallow_classes = pref.getIntPref("mailnews.display.disallow_mime_handlers"); if (disallow_classes > 0) gDisallow_classes_no_html = disallow_classes; // else gDisallow_classes_no_html keeps its inital value (see top) } catch (ex) { dump("failed to get the body plaintext vs. HTML prefs\n"); } var AllowHTML_checked = false; var Sanitized_checked = false; var AsPlaintext_checked = false; if (!prefer_plaintext && !html_as && !disallow_classes) AllowHTML_checked = true; else if (!prefer_plaintext && html_as == 3 && disallow_classes > 0) Sanitized_checked = true; else if (prefer_plaintext && html_as == 1 && disallow_classes > 0) AsPlaintext_checked = true; // else (the user edited prefs/user.js) check none of the radio menu items var AllowHTML_menuitem = document.getElementById("bodyAllowHTML"); var Sanitized_menuitem = document.getElementById("bodySanitized"); var AsPlaintext_menuitem = document.getElementById("bodyAsPlaintext"); if (AllowHTML_menuitem && Sanitized_menuitem && AsPlaintext_menuitem) { AllowHTML_menuitem.setAttribute("checked", AllowHTML_checked ? "true" : "false"); Sanitized_menuitem.setAttribute("checked", Sanitized_checked ? "true" : "false"); AsPlaintext_menuitem.setAttribute("checked", AsPlaintext_checked ? "true" : "false"); } else dump("Where is my View|Body menu?\n");}function IsNewsMessage(messageUri){ return (/^news-message:/.test(messageUri));}function IsImapMessage(messageUri){ return (/^imap-message:/.test(messageUri));}function SetMenuItemLabel(menuItemId, customLabel){ var menuItem = document.getElementById(menuItemId); if (menuItem) menuItem.setAttribute('label', customLabel);}function RemoveAllMessageTags(){ var selectedMsgUris = GetSelectedMessages(); if (!selectedMsgUris.length) return; var msg = Components.classes["@mozilla.org/supports-array;1"] .createInstance(Components.interfaces.nsISupportsArray); for (var i = 0; i < selectedMsgUris.length; ++i) { // remove all tags by removing all their tag keys, all at once. // (using a msgHdr's setStringProperty won't notify the threadPane!) var msgHdr = messenger.msgHdrFromURI(selectedMsgUris[i]); msgHdr.label = 0; // remove legacy label msg.Clear(); msg.AppendElement(msgHdr); var keywords = msgHdr.getStringProperty("keywords"); // this will remove all keywords at once... if (keywords.length > 0) msgHdr.folder.removeKeywordFromMessages(msg, keywords); } OnTagsChange();}function ToggleMessageTagKey(index){ if (GetNumSelectedMessages() < 1) return; // set the tag state based upon that of the first selected message, // just like we do for markAsRead etc. var msgHdr = gDBView.hdrForFirstSelectedMessage; var tagService = Components.classes["@mozilla.org/messenger/tagservice;1"] .getService(Components.interfaces.nsIMsgTagService); var tagArray = tagService.getAllTags({}); for (var i = 0; i < tagArray.length; ++i) { var key = tagArray[i].key; if (!--index) { // found the key, now toggle its state var curKeys = msgHdr.getStringProperty("keywords"); if (msgHdr.label) curKeys += " $label" + msgHdr.label; var addKey = (" " + curKeys + " ").indexOf(" " + key + " ") < 0; ToggleMessageTag(key, addKey); return; } }}function ToggleMessageTagMenu(target){ var key = target.getAttribute("value"); var addKey = target.getAttribute("checked") == "true"; ToggleMessageTag(key, addKey);}function ToggleMessageTag(key, addKey){ var messages = Components.classes["@mozilla.org/supports-array;1"] .createInstance(Components.interfaces.nsISupportsArray); var msg = Components.classes["@mozilla.org/supports-array;1"] .createInstance(Components.interfaces.nsISupportsArray); var selectedMsgUris = GetSelectedMessages(); var toggler = addKey ? "addKeywordToMessages" : "removeKeywordFromMessages"; var prevHdrFolder = null; // this crudely handles cross-folder virtual folders with selected messages // that spans folders, by coalescing consecutive msgs in the selection // that happen to be in the same folder. nsMsgSearchDBView does this // better, but nsIMsgDBView doesn't handle commands with arguments, // and (un)tag takes a key argument. for (var i = 0; i < selectedMsgUris.length; ++i) { var msgHdr = messenger.msgHdrFromURI(selectedMsgUris[i]); if (msgHdr.label) { // Since we touch all these messages anyway, migrate the label now. // If we don't, the thread tree won't always show the correct tag state, // because resetting a label doesn't update the tree anymore... msg.Clear(); msg.AppendElement(msgHdr); msgHdr.folder.addKeywordToMessages(msg, "$label" + msgHdr.label); msgHdr.label = 0; // remove legacy label } if (prevHdrFolder != msgHdr.folder) { if (prevHdrFolder) prevHdrFolder[toggler](messages, key); messages.Clear(); prevHdrFolder = msgHdr.folder; } messages.AppendElement(msgHdr); } if (prevHdrFolder) prevHdrFolder[toggler](messages, key); OnTagsChange();}function AddTag(){ var args = {result: "", okCallback: AddTagCallback}; var dialog = window.openDialog("chrome://messenger/content/newTagDialog.xul", "", "chrome,titlebar,modal", args);}function AddTagCallback(name, color){ var tagService = Components.classes["@mozilla.org/messenger/tagservice;1"] .getService(Components.interfaces.nsIMsgTagService); tagService.addTag(name, color, ''); try { ToggleMessageTag(tagService.getKeyForTag(name), true); } catch(ex) { return false; } return true;}function SetMessageTagLabel(menuitem, index, name){ // if a <key> is defined for this tag, use its key as the accesskey // (the key for the tag at index n needs to have the id key_tag<n>) var shortcutkey = document.getElementById("key_tag" + index); var accesskey = shortcutkey ? shortcutkey.getAttribute("key") : ""; if (accesskey) menuitem.setAttribute("accesskey", accesskey); var label = gMessengerBundle.getFormattedString("mailnews.tags.format", [accesskey, name]); menuitem.setAttribute("label", label);}function InitMessageTags(menuPopup){ var tagService = Components.classes["@mozilla.org/messenger/tagservice;1"] .getService(Components.interfaces.nsIMsgTagService); var tagArray = tagService.getAllTags({}); var tagCount = tagArray.length; // remove any existing non-static entries... var menuseparator = menuPopup.lastChild.previousSibling; for (var i = menuPopup.childNodes.length; i > 4; --i) menuPopup.removeChild(menuseparator.previousSibling); // hide double menuseparator menuseparator.previousSibling.hidden = !tagCount; // create label and accesskey for the static remove item var tagRemoveLabel = gMessengerBundle.getString("mailnews.tags.remove"); SetMessageTagLabel(menuPopup.firstChild, 0, tagRemoveLabel); // now rebuild the list var msgHdr = gDBView.hdrForFirstSelectedMessage; var curKeys = msgHdr.getStringProperty("keywords"); if (msgHdr.label) curKeys += " $label" + msgHdr.label; for (var i = 0; i < tagCount; ++i) { var taginfo = tagArray[i]; // TODO we want to either remove or "check" the tags that already exist var newMenuItem = document.createElement("menuitem"); SetMessageTagLabel(newMenuItem, i + 1, taginfo.tag); newMenuItem.setAttribute("value", taginfo.key); newMenuItem.setAttribute("type", "checkbox"); var removeKey = (" " + curKeys + " ").indexOf(" " + taginfo.key + " ") > -1; newMenuItem.setAttribute('checked', removeKey); newMenuItem.setAttribute('oncommand', 'ToggleMessageTagMenu(event.target);'); var color = taginfo.color; if (color) newMenuItem.setAttribute("class", "lc-" + color.substr(1)); menuPopup.insertBefore(newMenuItem, menuseparator); }}function backToolbarMenu_init(menuPopup){ populateHistoryMenu(menuPopup, true);}var gNavDebug = true;function navDebug(str){ if (gNavDebug) dump(str);}function populateHistoryMenu(menuPopup, isBackMenu){ // remove existing entries while (menuPopup.firstChild) menuPopup.removeChild(menuPopup.firstChild); var curPos = new Object; var numEntries = new Object; var historyEntries = new Object; messenger.getNavigateHistory(curPos, numEntries, historyEntries); curPos.value = curPos.value * 2; navDebug("curPos = " + curPos.value + " numEntries = " + numEntries.value + "\n"); var historyArray = historyEntries.value; var folder; var newMenuItem; if (GetLoadedMessage()) { if (!isBackMenu) curPos.value += 2; else curPos.value -= 2; } // for populating the back menu, we want the most recently visited // messages first in the menu. So we go backward from curPos to 0. // For the forward menu, we want to go forward from curPos to the end. var relPos = 0; for (var i = curPos.value; (isBackMenu) ? i >= 0 : i < historyArray.length; i += ((isBackMenu) ? -2 : 2)) { navDebug("history[" + i + "] = " + historyArray[i] + "\n"); navDebug("history[" + i + "] = " + historyArray[i + 1] + "\n"); folder = RDF.GetResource(historyArray[i + 1]).QueryInterface(Components.interfaces.nsIMsgFolder); navDebug("folder URI = " + folder.URI + "pretty name " + folder.prettyName + "\n"); var menuText = ""; var msgHdr = messenger.msgHdrFromURI(historyArray[i]); if (!IsCurrentLoadedFolder(folder)) menuText = folder.prettyName + " - "; menuText += msgHdr.mime2DecodedSubject; menuText += ":"; menuText += msgHdr.mime2DecodedAuthor; newMenuItem = document.createElement('menuitem'); newMenuItem.setAttribute('label', menuText); relPos += isBackMenu ? -1 : 1; newMenuItem.setAttribute('value', relPos); newMenuItem.setAttribute('oncommand', 'NavigateToUri(event.target); event.stopPropagation();'); menuPopup.appendChild(newMenuItem); if (! (relPos % 20)) break; } }function NavigateToUri(target){ var historyIndex = target.getAttribute('value'); var folderUri = messenger.getFolderUriAtNavigatePos(historyIndex); var msgUri = messenger.getMsgUriAtNavigatePos(historyIndex); var folder = RDF.GetResource(folderUri).QueryInterface(Components.interfaces.nsIMsgFolder); var msgHdr = messenger.msgHdrFromURI(msgUri); navDebug("navigating from " + messenger.navigatePos + " by " + historyIndex + " to " + msgUri + "\n"); // this "- 0" seems to ensure that historyIndex is treated as an int, not a string. messenger.navigatePos += historyIndex - 0; if (IsCurrentLoadedFolder(folder)) { gDBView.selectMsgByKey(msgHdr.messageKey); } else { gStartMsgKey = msgHdr.messageKey; SelectFolder(folderUri); }}function forwardToolbarMenu_init(menuPopup){ populateHistoryMenu(menuPopup, false);}function InitMessageMark(){ var areMessagesRead = SelectedMessagesAreRead(); var readItem = document.getElementById("cmd_markAsRead"); if(readItem) readItem.setAttribute("checked", areMessagesRead); var areMessagesFlagged = SelectedMessagesAreFlagged(); var flaggedItem = document.getElementById("cmd_markAsFlagged"); if(flaggedItem) flaggedItem.setAttribute("checked", areMessagesFlagged); document.commandDispatcher.updateCommands('create-menu-mark');}function UpdateJunkToolbarButton(){ var junkButtonDeck = document.getElementById("junk-deck"); if (junkButtonDeck) junkButtonDeck.selectedIndex = SelectedMessagesAreJunk() ? 1 : 0;}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -