📄 messagewindow.js
字号:
# -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-# ***** 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 *****/* This is where functions related to the standalone message window are kept */// from MailNewsTypes.hconst nsMsgKey_None = 0xFFFFFFFF;const nsMsgViewIndex_None = 0xFFFFFFFF;/* globals for a particular window */var compositeDataSourceContractID = datasourceContractIDPrefix + "composite-datasource";var gCompositeDataSource;var gCurrentMessageUri;var gCurrentFolderUri;var gThreadPaneCommandUpdater = null;var gCurrentMessageIsDeleted = false;var gNextMessageViewIndexAfterDelete = -2;var gCurrentFolderToRerootForStandAlone;var gRerootOnFolderLoadForStandAlone = false;var gNextMessageAfterLoad = null;// the folderListener objectvar folderListener = { OnItemAdded: function(parentItem, item) {}, OnItemRemoved: function(parentItem, item) { if (parentItem.Value != gCurrentFolderUri) return; if (item instanceof Components.interfaces.nsIMsgDBHdr && extractMsgKeyFromURI() == item.messageKey) gCurrentMessageIsDeleted = true; }, OnItemPropertyChanged: function(item, property, oldValue, newValue) {}, OnItemIntPropertyChanged: function(item, property, oldValue, newValue) { if (item.Value == gCurrentFolderUri) { if (property.toString() == "TotalMessages" || property.toString() == "TotalUnreadMessages") { UpdateStandAloneMessageCounts(); } } }, OnItemBoolPropertyChanged: function(item, property, oldValue, newValue) {}, OnItemUnicharPropertyChanged: function(item, property, oldValue, newValue){}, OnItemPropertyFlagChanged: function(item, property, oldFlag, newFlag) {}, OnItemEvent: function(folder, event) { var eventType = event.toString(); if (eventType == "DeleteOrMoveMsgCompleted") HandleDeleteOrMoveMsgCompleted(folder); else if (eventType == "DeleteOrMoveMsgFailed") HandleDeleteOrMoveMsgFailed(folder); else if (eventType == "FolderLoaded") { if (folder) { var uri = folder.URI; if (uri == gCurrentFolderToRerootForStandAlone) { gCurrentFolderToRerootForStandAlone = null; var msgFolder = folder.QueryInterface(Components.interfaces.nsIMsgFolder); if (msgFolder) { msgFolder.endFolderLoading(); if (gRerootOnFolderLoadForStandAlone) { RerootFolderForStandAlone(uri); } } } } } else if (eventType == "JunkStatusChanged") { HandleJunkStatusChanged(folder); } } }var messagepaneObserver = { canHandleMultipleItems: false, onDrop: function (aEvent, aData, aDragSession) { var sourceUri = aData.data; if (sourceUri != gCurrentMessageUri) { SelectFolder(GetMsgHdrFromUri(sourceUri).folder.URI); SelectMessage(sourceUri); } }, onDragOver: function (aEvent, aFlavour, aDragSession) { var messagepanebox = document.getElementById("messagepanebox"); messagepanebox.setAttribute("dragover", "true"); }, onDragExit: function (aEvent, aDragSession) { var messagepanebox = document.getElementById("messagepanebox"); messagepanebox.removeAttribute("dragover"); }, canDrop: function(aEvent, aDragSession) //allow drop from mail:3pane window only - 4xp { var doc = aDragSession.sourceNode.ownerDocument; var elem = doc.getElementById("messengerWindow"); return (elem && (elem.getAttribute("windowtype") == "mail:3pane")); }, getSupportedFlavours: function () { var flavourSet = new FlavourSet(); flavourSet.appendFlavour("text/x-moz-message"); return flavourSet; }};function nsMsgDBViewCommandUpdater(){}function UpdateStandAloneMessageCounts(){ // hook for extra toolbar items var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); observerService.notifyObservers(window, "mail:updateStandAloneMessageCounts", "");}nsMsgDBViewCommandUpdater.prototype = { updateCommandStatus : function() { // the back end is smart and is only telling us to update command status // when the # of items in the selection has actually changed. UpdateMailToolbar("dbview, std alone window"); }, displayMessageChanged : function(aFolder, aSubject, aKeywords) { setTitleFromFolder(aFolder, aSubject); ClearPendingReadTimer(); // we are loading / selecting a new message so kill the mark as read timer for the currently viewed message gCurrentMessageUri = gDBView.URIForFirstSelectedMessage; UpdateStandAloneMessageCounts(); goUpdateCommand("button_junk"); goUpdateCommand("button_goBack"); goUpdateCommand("button_goForward"); }, updateNextMessageAfterDelete : function() { SetNextMessageAfterDelete(); }, QueryInterface : function(iid) { if (iid.equals(Components.interfaces.nsIMsgDBViewCommandUpdater) || iid.equals(Components.interfaces.nsISupports)) return this; throw Components.results.NS_NOINTERFACE; }}function HandleDeleteOrMoveMsgCompleted(folder){ var folderResource = folder.QueryInterface(Components.interfaces.nsIRDFResource); if (!folderResource) return; if ((folderResource.Value == gCurrentFolderUri) && gCurrentMessageIsDeleted) { gDBView.onDeleteCompleted(true); gCurrentMessageIsDeleted = false; if (gNextMessageViewIndexAfterDelete != nsMsgViewIndex_None) { var nextMstKey = gDBView.getKeyAt(gNextMessageViewIndexAfterDelete); if (nextMstKey != nsMsgKey_None) { LoadMessageByViewIndex(gNextMessageViewIndexAfterDelete); } else { window.close(); } } else { // close the stand alone window because there are no more messages in the folder window.close(); } }}function HandleDeleteOrMoveMsgFailed(folder){ var folderResource = folder.QueryInterface(Components.interfaces.nsIRDFResource); if (!folderResource) return; gDBView.onDeleteCompleted(false); if ((folderResource.Value == gCurrentFolderUri) && gCurrentMessageIsDeleted) gCurrentMessageIsDeleted = false;}function IsCurrentLoadedFolder(folder){ var folderResource = folder.QueryInterface(Components.interfaces.nsIRDFResource); if (!folderResource) return false; return (folderResource.Value == gCurrentFolderUri);}// we won't show the window until the onload() handler is finished// so we do this trick (suggested by hyatt / blaker)function OnLoadMessageWindow(){ setTimeout(delayedOnLoadMessageWindow, 0); // when debugging, set this to 5000, so you can see what happens after the window comes up.}function delayedOnLoadMessageWindow(){ HideMenus(); HideToolbarButtons(); ShowMenus(); MailOfflineMgr.init(); CreateMailWindowGlobals(); CreateMessageWindowGlobals(); verifyAccounts(null); InitMsgWindow(); messenger.SetWindow(window, msgWindow); InitializeDataSources(); // FIX ME - later we will be able to use onload from the overlay OnLoadMsgHeaderPane(); try { var nsIFolderListener = Components.interfaces.nsIFolderListener; var notifyFlags = nsIFolderListener.removed | nsIFolderListener.event | nsIFolderListener.intPropertyChanged; mailSession.AddFolderListener(folderListener, notifyFlags); } catch (ex) { dump("Error adding to session: " +ex + "\n"); } var originalView = null; var folder = null; var messageUri; var loadCustomMessage = false; //set to true when either loading a message/rfc822 attachment or a .eml file if (window.arguments) { if (window.arguments[0]) { try { messageUri = window.arguments[0]; if (messageUri instanceof Components.interfaces.nsIURI) { loadCustomMessage = /type=application\/x-message-display/.test(messageUri.spec); gCurrentMessageUri = messageUri.spec; if (messageUri instanceof Components.interfaces.nsIMsgMailNewsUrl) folder = messageUri.folder; } } catch(ex) { folder = null; dump("## ex=" + ex + "\n"); } if (!gCurrentMessageUri) gCurrentMessageUri = window.arguments[0]; } else gCurrentMessageUri = null; if (window.arguments[1]) gCurrentFolderUri = window.arguments[1]; else gCurrentFolderUri = folder ? folder.URI : null; if (window.arguments[2]) originalView = window.arguments[2]; } CreateView(originalView); gFindBar.initFindBar(); gPhishingDetector.init(); // initialize the customizeDone method on the customizeable toolbar var toolbox = document.getElementById("mail-toolbox"); toolbox.customizeDone = MailToolboxCustomizeDone; var toolbarset = document.getElementById('customToolbars'); toolbox.toolbarset = toolbarset; setTimeout(OnLoadMessageWindowDelayed, 0, loadCustomMessage); SetupCommandUpdateHandlers();}function OnLoadMessageWindowDelayed(loadCustomMessage){ if (loadCustomMessage) { gDBView.suppressMsgDisplay = false; gDBView.loadMessageByUrl(gCurrentMessageUri); } else { var msgKey = extractMsgKeyFromURI(gCurrentMessageUri); LoadMessageByViewIndex(gDBView.findIndexFromKey(msgKey, true)); } gNextMessageViewIndexAfterDelete = gDBView.msgToSelectAfterDelete; UpdateStandAloneMessageCounts(); // set focus to the message pane window.content.focus(); // since we just changed the pane with focus we need to update the toolbar to reflect this // XXX TODO // can we optimize // and just update cmd_delete and button_delete? UpdateMailToolbar("focus");}function CreateView(originalView){ var msgFolder = GetLoadedMsgFolder(); // extract the sort type, the sort order, var sortType; var sortOrder; var viewFlags; var viewType; if (originalView) { viewType = originalView.viewType; viewFlags = originalView.viewFlags; sortType = originalView.sortType; sortOrder = originalView.sortOrder; } else if (msgFolder) { var msgDatabase = msgFolder.getMsgDatabase(msgWindow); if (msgDatabase) { var dbFolderInfo = msgDatabase.dBFolderInfo; sortType = dbFolderInfo.sortType; sortOrder = dbFolderInfo.sortOrder; viewFlags = dbFolderInfo.viewFlags; viewType = dbFolderInfo.viewType; msgDatabase = null; dbFolderInfo = null; } } else { // this is a hack to make opening a stand-alone msg window on a // .eml file work. We use a search view since its much more tolerant // of not having a folder.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -