⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 messagewindow.js

📁 现在很火的邮件客户端软件thunderbird的源码
💻 JS
📖 第 1 页 / 共 3 页
字号:
# -*- 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 + -