?? mailcommands.js
字號:
# -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-# ***** 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 Communicator client code, released# March 31, 1998.## The Initial Developer of the Original Code is# Netscape Communications Corporation.# Portions created by the Initial Developer are Copyright (C) 1998-1999# the Initial Developer. All Rights Reserved.## Contributor(s):## 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 *****function DoRDFCommand(dataSource, command, srcArray, argumentArray){ var commandResource = RDF.GetResource(command); if (commandResource) { try { if (!argumentArray) argumentArray = Components.classes["@mozilla.org/supports-array;1"] .createInstance(Components.interfaces.nsISupportsArray); if (argumentArray) argumentArray.AppendElement(msgWindow); dataSource.DoCommand(srcArray, commandResource, argumentArray); } catch(e) { if (command == "http://home.netscape.com/NC-rdf#NewFolder") { throw(e); // so that the dialog does not automatically close. } dump("Exception : In mail commands" + e + "\n"); } }}function GetNewMessages(selectedFolders, server, compositeDataSource){ var numFolders = selectedFolders.length; if (numFolders > 0) { var msgFolder = selectedFolders[0]; // Whenever we do get new messages, clear the old new messages. if (msgFolder) { var nsIMsgFolder = Components.interfaces.nsIMsgFolder; msgFolder.biffState = nsIMsgFolder.nsMsgBiffState_NoMail; msgFolder.clearNewMessages(); } if (compositeDataSource) { var folderResource = msgFolder.QueryInterface(Components.interfaces.nsIRDFResource); var folderArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); folderArray.AppendElement(folderResource); var serverArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); serverArray.AppendElement(server); DoRDFCommand(compositeDataSource, "http://home.netscape.com/NC-rdf#GetNewMessages", folderArray, serverArray); } } else { dump("Nothing was selected\n"); }}function getBestIdentity(identities, optionalHint){ var identity = null; var identitiesCount = identities.Count(); try { // if we have more than one identity and a hint to help us pick one if (identitiesCount > 1 && optionalHint) { // normalize case on the optional hint to improve our chances of finding a match optionalHint = optionalHint.toLowerCase(); var id; // iterate over all of the identities var tempID; for (id = 0; id < identitiesCount; ++id) { tempID = identities.GetElementAt(id).QueryInterface(Components.interfaces.nsIMsgIdentity); if (optionalHint.indexOf(tempID.email.toLowerCase()) >= 0) { identity = tempID; break; } } // if we could not find an exact email address match within the hint fields then maybe the message // was to a mailing list. In this scenario, we won't have a match based on email address. // Before we just give up, try and search for just a shared domain between the hint and // the email addresses for our identities. Hey, it is better than nothing and in the case // of multiple matches here, we'll end up picking the first one anyway which is what we would have done // if we didn't do this second search. This helps the case for corporate users where mailing lists will have the same domain // as one of your multiple identities. if (!identity) { for (id = 0; id < identitiesCount; ++id) { tempID = identities.GetElementAt(id).QueryInterface(Components.interfaces.nsIMsgIdentity); // extract out the partial domain var start = tempID.email.lastIndexOf("@"); // be sure to include the @ sign in our search to reduce the risk of false positives if (optionalHint.search(tempID.email.slice(start).toLowerCase()) >= 0) { identity = tempID; break; } } } } } catch (ex) {dump (ex + "\n");} // Still no matches ? // Give up and pick the first one (if it exists), like we used to. if (!identity && identitiesCount > 0) identity = identities.GetElementAt(0).QueryInterface(Components.interfaces.nsIMsgIdentity); return identity;}function getIdentityForServer(server, optionalHint){ var identity = null; if (server) { // Get the identities associated with this server. var identities = accountManager.GetIdentitiesForServer(server); // dump("identities = " + identities + "\n"); // Try and find the best one. identity = getBestIdentity(identities, optionalHint); } return identity;}function GetNextNMessages(folder){ if (folder) { var newsFolder = folder.QueryInterface(Components.interfaces.nsIMsgNewsFolder); if (newsFolder) { newsFolder.getNextNMessages(msgWindow); } }}// type is a nsIMsgCompType and format is a nsIMsgCompFormatfunction ComposeMessage(type, format, folder, messageArray){ var msgComposeType = Components.interfaces.nsIMsgCompType; var identity = null; var newsgroup = null; var server; // dump("ComposeMessage folder=" + folder + "\n"); try { if (folder) { // Get the incoming server associated with this uri. server = folder.server; // If they hit new or reply and they are reading a newsgroup, // turn this into a new post or a reply to group. if (!folder.isServer && server.type == "nntp" && type == msgComposeType.New) { type = msgComposeType.NewsPost; newsgroup = folder.folderURL; } identity = folder.customIdentity; if (!identity) identity = getIdentityForServer(server); // dump("identity = " + identity + "\n"); } } catch (ex) { dump("failed to get an identity to pre-select: " + ex + "\n"); } // dump("\nComposeMessage from XUL: " + identity + "\n"); var uri = null; if (!msgComposeService) { dump("### msgComposeService is invalid\n"); return; } if (type == msgComposeType.New) { // New message. // dump("OpenComposeWindow with " + identity + "\n"); // If the addressbook sidebar panel is open and has focus, get // the selected addresses from it. if (document.commandDispatcher.focusedWindow.document.documentElement.hasAttribute("selectedaddresses")) NewMessageToSelectedAddresses(type, format, identity); else msgComposeService.OpenComposeWindow(null, null, type, format, identity, msgWindow); return; } else if (type == msgComposeType.NewsPost) { // dump("OpenComposeWindow with " + identity + " and " + newsgroup + "\n"); msgComposeService.OpenComposeWindow(null, newsgroup, type, format, identity, msgWindow); return; } messenger.SetWindow(window, msgWindow); var object = null; if (messageArray && messageArray.length > 0) { uri = ""; for (var i = 0; i < messageArray.length; ++i) { var messageUri = messageArray[i]; var hdr = messenger.msgHdrFromURI(messageUri); // If we treat reply from sent specially, do we check for that folder flag here ? var hintForIdentity = (type == msgComposeType.Template) ? hdr.author : hdr.recipients + hdr.ccList; var customIdentity = null; if (folder) { server = folder.server; customIdentity = folder.customIdentity; } var accountKey = hdr.accountKey; if (accountKey.length > 0) { var account = accountManager.getAccount(accountKey); if (account) server = account.incomingServer; } identity = (server && !customIdentity) ? getIdentityForServer(server, hintForIdentity) : customIdentity; var messageID = hdr.messageId; var messageIDScheme = messageID ? messageID.split(":")[0] : ""; if (messageIDScheme && (messageIDScheme == 'http' || messageIDScheme == 'https') && "openComposeWindowForRSSArticle" in this) openComposeWindowForRSSArticle(messageID, hdr, type); else if (type == msgComposeType.Reply || type == msgComposeType.ReplyAll || type == msgComposeType.ForwardInline || type == msgComposeType.ReplyToGroup || type == msgComposeType.ReplyToSender || type == msgComposeType.ReplyToSenderAndGroup || type == msgComposeType.Template || type == msgComposeType.Draft) { msgComposeService.OpenComposeWindow(null, messageUri, type, format, identity, msgWindow); // Limit the number of new compose windows to 8. Why 8 ? I like that number :-) if (i == 7) break; } else { if (i) uri += "," uri += messageUri; } } if (type == msgComposeType.ForwardAsAttachment && uri) msgComposeService.OpenComposeWindow(null, uri, type, format, identity, msgWindow); } else dump("### nodeList is invalid\n");}function NewMessageToSelectedAddresses(type, format, identity) { var abSidebarPanel = document.commandDispatcher.focusedWindow; var abResultsTree = abSidebarPanel.document.getElementById("abResultsTree"); var abResultsBoxObject = abResultsTree.treeBoxObject; var abView = abResultsBoxObject.view; abView = abView.QueryInterface(Components.interfaces.nsIAbView); var addresses = abView.selectedAddresses; var params = Components.classes["@mozilla.org/messengercompose/composeparams;1"].createInstance(Components.interfaces.nsIMsgComposeParams); if (params) { params.type = type; params.format = format; params.identity = identity; var composeFields = Components.classes["@mozilla.org/messengercompose/composefields;1"].createInstance(Components.interfaces.nsIMsgCompFields); if (composeFields) { var addressList = ""; for (var i = 0; i < addresses.Count(); i++) { addressList = addressList + (i > 0 ? ",":"") + addresses.QueryElementAt(i,Components.interfaces.nsISupportsString).data; } composeFields.to = addressList; params.composeFields = composeFields; msgComposeService.OpenComposeWindowWithParams(null, params); } }}function CreateNewSubfolder(chromeWindowURL, preselectedMsgFolder, dualUseFolders, callBackFunctionName){ var preselectedURI; if (preselectedMsgFolder) { var preselectedFolderResource = preselectedMsgFolder.QueryInterface(Components.interfaces.nsIRDFResource); if (preselectedFolderResource) preselectedURI = preselectedFolderResource.Value; dump("preselectedURI = " + preselectedURI + "\n"); } window.openDialog(chromeWindowURL, "", "chrome,titlebar,modal", {preselectedURI:preselectedURI, dualUseFolders:dualUseFolders, okCallback:callBackFunctionName});}function NewFolder(name,uri){ // dump("uri,name = " + uri + "," + name + "\n"); if (uri && (uri != "") && name && (name != "")) { var selectedFolderResource = RDF.GetResource(uri); // dump("selectedFolder = " + uri + "\n"); var compositeDataSource = GetCompositeDataSource("NewFolder"); var folderArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); var nameArray = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); folderArray.AppendElement(selectedFolderResource); var nameLiteral = RDF.GetLiteral(name); nameArray.AppendElement(nameLiteral); DoRDFCommand(compositeDataSource, "http://home.netscape.com/NC-rdf#NewFolder", folderArray, nameArray); } else { dump("no name or nothing selected\n"); }}function UnSubscribe(folder){ // Unsubscribe the current folder from the newsserver, this assumes any confirmation has already // been made by the user SPL var server = folder.server; var subscribableServer = server.QueryInterface(Components.interfaces.nsISubscribableServer); subscribableServer.unsubscribe(folder.name); subscribableServer.commitSubscribeChanges();}function Subscribe(preselectedMsgFolder){ var preselectedURI; if (preselectedMsgFolder) { var preselectedFolderResource = preselectedMsgFolder.QueryInterface(Components.interfaces.nsIRDFResource); if (preselectedFolderResource) preselectedURI = preselectedFolderResource.Value; dump("preselectedURI = " + preselectedURI + "\n"); } window.openDialog("chrome://messenger/content/subscribe.xul", "subscribe", "chrome,modal,titlebar,resizable=yes",
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -