/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * The contents of this file are subject to the Netscape 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/NPL/ * * 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 Netscape are * Copyright (C) 1998-1999 Netscape Communications Corporation. All * Rights Reserved. * * Contributors: timeless * slucy@objectivesw.co.uk * Håkan Waara * Jan Varga * Seth Spitzer * David Bienvenu */ var gMessengerBundle; var gPromptService; var gOfflinePromptsBundle; var nsPrefBranch = null; var gOfflineManager; var gWindowManagerInterface; var gPrefs = null; var gPrintSettings = null; var gTimelineEnabled = false; /* var gTimelineService = null; var gTimelineEnabled = ("@mozilla.org;timeline-service;1" in Components.classes); if (gTimelineEnabled) { try { gTimelineEnabled = gPrefs.getBoolPref("mailnews.timeline_is_enabled"); if (gTimelineEnabled) { gTimelineService = Components.classes["@mozilla.org;timeline-service;1"].getService(Components.interfaces.nsITimelineService); } } catch (ex) { gTimelineEnabled = false; } } */ var disallow_classes_no_html = 1; /* the user preference, if HTML is not allowed. I assume, that the user could have set this to a value > 1 in his prefs.js or user.js, but that the value will not change during runtime other than through the MsgBody*() functions below.*/ // Disable the new account menu item if the account preference is locked. // Two other affected areas are the account central and the account manager // dialog. function menu_new_init() { if (!gMessengerBundle) gMessengerBundle = document.getElementById("bundle_messenger"); if (!nsPrefBranch) { var prefService = Components.classes["@mozilla.org/preferences-service;1"]; prefService = prefService.getService(); prefService = prefService.QueryInterface(Components.interfaces.nsIPrefService); nsPrefBranch = prefService.getBranch(null); } var newAccountItem = document.getElementById('newAccountMenuItem'); if (nsPrefBranch.prefIsLocked("mail.disable_new_account_addition")) newAccountItem.setAttribute("disabled","true"); // Change "New Folder..." menu according to the context var startIndex = {}; var endIndex = {}; var folderTree = GetFolderTree(); folderTree.treeBoxObject.selection.getRangeAt(0, startIndex, endIndex); if (startIndex.value < 0) return false; var numSelected = endIndex.value - startIndex.value + 1; var folderResource = GetFolderResource(folderTree, startIndex.value); var specialFolder = GetFolderAttribute(folderTree, folderResource, "SpecialFolder"); var isServer = GetFolderAttribute(folderTree, folderResource, "IsServer") == 'true'; var serverType = GetFolderAttribute(folderTree, folderResource, "ServerType"); var canCreateNew = GetFolderAttribute(folderTree, folderResource, "CanCreateSubfolders") == "true"; var isInbox = specialFolder == "Inbox"; var isIMAPFolder = GetFolderAttribute(folderTree, folderResource, "ServerType") == "imap"; var ioService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService); var showNew = ((numSelected <=1) && (serverType != 'nntp') && canCreateNew) || isInbox; ShowMenuItem("menu_newFolder", showNew); EnableMenuItem("menu_newFolder", !isIMAPFolder || !ioService.offline); if (showNew) { if (isServer || isInbox) SetMenuItemLabel("menu_NewFolder", gMessengerBundle.getString("newFolder")); else SetMenuItemLabel("menu_NewFolder", gMessengerBundle.getString("newSubfolder")); } } function goUpdateMailMenuItems(commandset) { // dump("Updating commands for " + commandset.id + "\n"); for (var i = 0; i < commandset.childNodes.length; i++) { var commandID = commandset.childNodes[i].getAttribute("id"); if (commandID) { goUpdateCommand(commandID); } } } function file_init() { if (!gMessengerBundle) gMessengerBundle = document.getElementById("bundle_messenger"); file_attachments(); /* file_attachments() can return false to indicate a load failure, but if you return false to oncreate then the popup menu will not display which is not a good thing. */ document.commandDispatcher.updateCommands('create-menu-file'); } function file_attachments() { var numAttachments = GetNumberOfAttachmentsForDisplayedMessage(); var amParent=document.getElementById('fileAttachmentMenu'); if (!amParent) return false; // hide the attachment menu item if the message does not have any messages.. if (numAttachments > 0) { amParent.removeAttribute('hidden'); } else amParent.setAttribute('hidden',true); return true; } function InitEditMessagesMenu() { document.commandDispatcher.updateCommands('create-menu-edit'); } function InitGoMessagesMenu() { document.commandDispatcher.updateCommands('create-menu-go'); } function view_init() { if (!gMessengerBundle) gMessengerBundle = document.getElementById("bundle_messenger"); var message_menuitem=document.getElementById('menu_showMessage'); if (message_menuitem) { var message_menuitem_hidden = message_menuitem.getAttribute("hidden"); if(message_menuitem_hidden != "true"){ message_menuitem.setAttribute('checked',!IsThreadAndMessagePaneSplitterCollapsed()); } } var threadColumn = document.getElementById('ThreadColumnHeader'); var thread_menuitem=document.getElementById('menu_showThreads'); if (threadColumn && thread_menuitem){ thread_menuitem.setAttribute('checked',threadColumn.getAttribute('currentView')=='threaded'); } document.commandDispatcher.updateCommands('create-menu-view'); } function setSortByMenuItemCheckState(id, value) { var menuitem = document.getElementById(id); if (menuitem) { menuitem.setAttribute("checked", value); } } function InitViewSortByMenu() { var sortType = gDBView.sortType; setSortByMenuItemCheckState("sortByDateMenuitem", (sortType == nsMsgViewSortType.byDate)); setSortByMenuItemCheckState("sortByFlagMenuitem", (sortType == nsMsgViewSortType.byFlagged)); setSortByMenuItemCheckState("sortByOrderReceivedMenuitem", (sortType == nsMsgViewSortType.byId)); setSortByMenuItemCheckState("sortByPriorityMenuitem", (sortType == nsMsgViewSortType.byPriority)); setSortByMenuItemCheckState("sortBySizeMenuitem", (sortType == nsMsgViewSortType.bySize)); setSortByMenuItemCheckState("sortByStatusMenuitem", (sortType == nsMsgViewSortType.byStatus)); setSortByMenuItemCheckState("sortBySubjectMenuitem", (sortType == nsMsgViewSortType.bySubject)); setSortByMenuItemCheckState("sortByThreadMenuitem", (sortType == nsMsgViewSortType.byThread)); setSortByMenuItemCheckState("sortByUnreadMenuitem", (sortType == nsMsgViewSortType.byUnread)); setSortByMenuItemCheckState("sortByLabelMenuitem", (sortType == nsMsgViewSortType.byLabel)); // the Sender / Recipient menu is dynamic setSortByMenuItemCheckState("sortBySenderOrRecipientMenuitem", (sortType == nsMsgViewSortType.byAuthor) || (sortType == nsMsgViewSortType.byRecipient)); var senderOrRecipientMenuitem = document.getElementById("sortBySenderOrRecipientMenuitem"); if (senderOrRecipientMenuitem) { var currentFolder = gDBView.msgFolder; if (IsSpecialFolder(currentFolder, MSG_FOLDER_FLAG_SENTMAIL | MSG_FOLDER_FLAG_DRAFTS | MSG_FOLDER_FLAG_QUEUE)) { senderOrRecipientMenuitem.setAttribute('label',gMessengerBundle.getString('recipientColumnHeader')); senderOrRecipientMenuitem.setAttribute('accesskey',gMessengerBundle.getString('recipientAccessKey')); } else { senderOrRecipientMenuitem.setAttribute('label',gMessengerBundle.getString('senderColumnHeader')); senderOrRecipientMenuitem.setAttribute('accesskey',gMessengerBundle.getString('senderAccessKey')); } } var sortOrder = gDBView.sortOrder; setSortByMenuItemCheckState("sortAscending", (sortOrder == nsMsgViewSortOrder.ascending)); setSortByMenuItemCheckState("sortDescending", (sortOrder == nsMsgViewSortOrder.descending)); } function InitViewMessagesMenu() { var allMenuItem = document.getElementById("viewAllMessagesMenuItem"); var viewFlags = gDBView.viewFlags; var viewType = gDBView.viewType; if(allMenuItem) allMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kUnreadOnly) == 0 && (viewType == nsMsgViewType.eShowAllThreads)); var unreadMenuItem = document.getElementById("viewUnreadMessagesMenuItem"); if(unreadMenuItem) unreadMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kUnreadOnly) != 0); var theadedMenuItem = document.getElementById("menu_showThreads"); if (theadedMenuItem) theadedMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kThreadedDisplay) != 0); document.commandDispatcher.updateCommands('create-menu-view'); var theadsWithUnreadMenuItem = document.getElementById("viewThreadsWithUnreadMenuItem"); if(theadsWithUnreadMenuItem) theadsWithUnreadMenuItem.setAttribute("checked", viewType == nsMsgViewType.eShowThreadsWithUnread); var watchedTheadsWithUnreadMenuItem = document.getElementById("viewWatchedThreadsWithUnreadMenuItem"); if(watchedTheadsWithUnreadMenuItem) watchedTheadsWithUnreadMenuItem.setAttribute("checked", viewType == nsMsgViewType.eShowWatchedThreadsWithUnread); var ignoredTheadsMenuItem = document.getElementById("viewIgnoredThreadsMenuItem"); if(ignoredTheadsMenuItem) ignoredTheadsMenuItem.setAttribute("checked", (viewFlags & nsMsgViewFlagsType.kShowIgnored) != 0); } function InitMessageMenu() { var aMessage = GetFirstSelectedMessage(); var isNews = false; if(aMessage) { isNews = IsNewsMessage(aMessage); } //We show reply to Newsgroups only for news messages. var replyNewsgroupMenuItem = document.getElementById("replyNewsgroupMainMenu"); if(replyNewsgroupMenuItem) { replyNewsgroupMenuItem.setAttribute("hidden", isNews ? "" : "true"); } //For mail messages we say reply. For news we say ReplyToSender. var replyMenuItem = document.getElementById("replyMainMenu"); if(replyMenuItem) { replyMenuItem.setAttribute("hidden", !isNews ? "" : "true"); } var replySenderMenuItem = document.getElementById("replySenderMainMenu"); if(replySenderMenuItem) { replySenderMenuItem.setAttribute("hidden", isNews ? "" : "true"); } // we only kill and watch threads for news var threadMenuSeparator = document.getElementById("threadItemsSeparator"); if (threadMenuSeparator) { threadMenuSeparator.setAttribute("hidden", isNews ? "" : "true"); } var killThreadMenuItem = document.getElementById("killThread"); if (killThreadMenuItem) { killThreadMenuItem.setAttribute("hidden", isNews ? "" : "true"); } var watchThreadMenuItem = document.getElementById("watchThread"); if (watchThreadMenuItem) { watchThreadMenuItem.setAttribute("hidden", isNews ? "" : "true"); } // disable the move and copy menus if there are no messages selected. // disable the move menu if we can't delete msgs from the folder var moveMenu = document.getElementById("moveMenu"); if(moveMenu) { var msgFolder = GetLoadedMsgFolder(); var enableMenuItem = aMessage && msgFolder && msgFolder.canDeleteMessages; moveMenu.setAttribute("disabled", !enableMenuItem); } var copyMenu = document.getElementById("copyMenu"); if(copyMenu) copyMenu.setAttribute("disabled", !aMessage); document.commandDispatcher.updateCommands('create-menu-message'); } 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) disallow_classes_no_html = disallow_classes; // else disallow_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 == false && html_as == 0 && disallow_classes == 0) AllowHTML_checked = true; else if (prefer_plaintext == false && html_as == 3 && disallow_classes > 0) Sanitized_checked = true; else if (prefer_plaintext == true && 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) { if (!messageUri) return false; else return (messageUri.substring(0,14) == "news-message:/"); } function IsImapMessage(messageUri) { if (!messageUri) return false; else return (messageUri.substring(0,14) == "imap-message:/"); } function SetMenuItemLabel(menuItemId, customLabel) { var menuItem = document.getElementById(menuItemId); if(menuItem) menuItem.setAttribute('label', customLabel); } function InitMessageLabel(menuType) { /* this code gets the label strings and changes the menu labels */ var prefs = Components.classes["@mozilla.org/preferences;1"].getService(Components.interfaces.nsIPref); var prefBranch = prefs.getDefaultBranch(null); var color; try { var msgFolder = GetLoadedMsgFolder(); var msgDatabase = msgFolder.getMsgDatabase(msgWindow); var numSelected = GetNumSelectedMessages(); var indices = GetSelectedIndices(gDBView); var isChecked = true; var checkedLabel; var msgKey; if (numSelected > 0) { msgKey = gDBView.getKeyAt(indices[0]); checkedLabel = msgDatabase.GetMsgHdrForKey(msgKey).label; if (numSelected > 1) { for (var i = 1; i < indices.length; i++) { msgKey = gDBView.getKeyAt(indices[i]); if (msgDatabase.GetMsgHdrForKey(msgKey).label == checkedLabel) { continue; } isChecked = false; break; } } } else { isChecked = false; } } catch(ex) { isChecked = false; } for (var label = 0; label <= 5; label++) { try { var prefString = prefs.getComplexValue("mailnews.labels.description." + label, Components.interfaces.nsIPrefLocalizedString); var formattedPrefString = gMessengerBundle.getFormattedString("labelMenuItemFormat" + label, [prefString], 1); var menuItemId = menuType + "-labelMenuItem" + label; var menuItem = document.getElementById(menuItemId); SetMenuItemLabel(menuItemId, formattedPrefString); if (isChecked && label == checkedLabel) menuItem.setAttribute("checked", "true"); else menuItem.setAttribute("checked", "false"); // commented out for now until UE decides on how to show the Labels menu items. // This code will color either the text or background for the Labels menu items. /***** if (label != 0) { color = prefBranch.getCharPref("mailnews.labels.color." + label); // this colors the text of the menuitem only. //menuItem.setAttribute("style", ("color: " + color)); // this colors the background of the menuitem and // when selected, text becomes white. //menuItem.setAttribute("style", ("color: #FFFFFF")); //menuItem.setAttribute("style", ("background-color: " + color)); } ****/ } catch(ex) { } } document.commandDispatcher.updateCommands('create-menu-label'); } 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 UpdateDeleteCommand() { var value = "value"; var uri = GetFirstSelectedMessage(); if (IsNewsMessage(uri)) value += "News"; else if (SelectedMessagesAreDeleted()) value += "IMAPDeleted"; if (GetNumSelectedMessages() < 2) value += "Message"; else value += "Messages"; goSetMenuValue("cmd_delete", value); goSetAccessKey("cmd_delete", value + "AccessKey"); } function SelectedMessagesAreDeleted() { try { const MSG_FLAG_IMAP_DELETED = 0x200000; return gDBView.hdrForFirstSelectedMessage.flags & MSG_FLAG_IMAP_DELETED; } catch (ex) { return 0; } } function SelectedMessagesAreRead() { var isRead; try { isRead = gDBView.hdrForFirstSelectedMessage.isRead; } catch (ex) { isRead = false; } return isRead; } function SelectedMessagesAreFlagged() { var isFlagged; try { isFlagged = gDBView.hdrForFirstSelectedMessage.isFlagged; } catch (ex) { isFlagged = false; } return isFlagged; } function getMsgToolbarMenu_init() { document.commandDispatcher.updateCommands('create-menu-getMsgToolbar'); } function GetFirstSelectedMsgFolder() { var result = null; var selectedFolders = GetSelectedMsgFolders(); if (selectedFolders.length > 0) { result = selectedFolders[0]; } return result; } function GetWindowMediator() { if (gWindowManagerInterface) return gWindowManagerInterface; var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(); return (gWindowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator)); } function GetInboxFolder(server) { try { var rootMsgFolder = server.rootMsgFolder; //now find Inbox var outNumFolders = new Object(); var inboxFolder = rootMsgFolder.getFoldersWithFlag(0x1000, 1, outNumFolders); return inboxFolder.QueryInterface(Components.interfaces.nsIMsgFolder); } catch (ex) { dump(ex + "\n"); } return null; } function GetMessagesForInboxOnServer(server) { var inboxFolder = GetInboxFolder(server); if (!inboxFolder) return; var folders = new Array(1); folders[0] = inboxFolder; var compositeDataSource = GetCompositeDataSource("GetNewMessages"); GetNewMessages(folders, compositeDataSource); } function MsgGetMessage() { // if offline, prompt for getting messages if(CheckOnline()) { GetFolderMessages(); } else { var option = PromptGetMessagesOffline(); if(option == 0) { if (!gOfflineManager) GetOfflineMgrService(); gOfflineManager.goOnline(false /* sendUnsentMessages */, false /* playbackOfflineImapOperations */, msgWindow); GetFolderMessages(); } } } function MsgGetMessagesForAllServers(defaultServer) { // now log into any server try { var allServers = accountManager.allServers; for (var i=0;i 0) { messenger.sendUnsentMessages(currentIdentity, msgWindow); // right now, all identities point to the same unsent messages // folder, so to avoid sending multiple copies of the // unsent messages, we only call messenger.SendUnsentMessages() once // see bug #89150 for details break; } } } } } function GetMessagesForAllAuthenticatedAccounts() { try { var allServers = accountManager.allServers; for (var i=0;i 0) { var readMailDB = outputPFC.getMsgDatabase(msgWindow); if (readMailDB) { var hdrInDestDB = readMailDB.getMsgHdrForMessageID(messageID); if (hdrInDestDB) copyToOfflineFolder = false; } } } if (copyToOfflineFolder) { var messages = Components.classes["@mozilla.org/supports-array;1"].createInstance(Components.interfaces.nsISupportsArray); messages.AppendElement(msgHdr); res = outputPFC.copyMessages(currentMsgFolder, messages, false /*isMove*/, msgWindow /* nsIMsgWindow */, null /* listener */, false /* isFolder */, false /*allowUndo*/ ); } } } function MsgSearchMessages() { var preselectedFolder = null; if ("GetFirstSelectedMsgFolder" in window) preselectedFolder = GetFirstSelectedMsgFolder(); var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(); var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator); var searchWindow = windowManagerInterface.getMostRecentWindow("mailnews:search"); if (searchWindow) searchWindow.focus(); else window.openDialog("chrome://messenger/content/SearchDialog.xul", "", "chrome,resizable,status,centerscreen,dialog=no", { folder: preselectedFolder }); } function MsgSearchAddresses() { var windowManager = Components.classes['@mozilla.org/appshell/window-mediator;1'].getService(); var windowManagerInterface = windowManager.QueryInterface(Components.interfaces.nsIWindowMediator); var abSearchWindow = windowManagerInterface.getMostRecentWindow("mailnews:absearch"); if (abSearchWindow) abSearchWindow.focus(); else window.openDialog("chrome://messenger/content/ABSearchDialog.xul", "", "chrome,resizable,status,centerscreen,dialog=no", {directory: null}); } var gLastMessageUriToLoad = null; var gThreadPaneCommandUpdater = null; function ThreadPaneOnClick(event) { // we only care about button 0 (left click) events if (event.button != 0) return; // we are already handling marking as read and flagging // in nsMsgDBView.cpp // so all we need to worry about here is double clicks // and column header. // // we get in here for clicks on the "treecol" (headers) // and the "scrollbarbutton" (scrollbar buttons) // we don't want those events to cause a "double click" var t = event.originalTarget; if (t.localName == "treecol") { HandleColumnClick(t.id); } else if (event.detail == 2 && t.localName == "treechildren") { var row = new Object; var colID = new Object; var childElt = new Object; var tree = GetThreadTree(); // figure out what cell the click was in tree.treeBoxObject.getCellAt(event.clientX, event.clientY, row, colID, childElt); if (row.value == -1) return; // if the cell is in a "cycler" column // or if the user double clicked on the twisty, // don't open the message in a new window var col = document.getElementById(colID.value); if (col && col.getAttribute("cycler") != "true" && (childElt.value != "twisty")) { ThreadPaneDoubleClick(); // double clicking should not toggle the open / close state of the // thread. this will happen if we don't prevent the event from // bubbling to the default handler in tree.xml event.preventBubble(); } } } function nsMsgDBViewCommandUpdater() {} 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 driven, thread pane"); }, displayMessageChanged : function(aFolder, aSubject, aKeywords) { setTitleFromFolder(aFolder, aSubject); gHaveLoadedMessage = true; SetKeywords(aKeywords); }, QueryInterface : function(iid) { if(iid.equals(Components.interfaces.nsIMsgDBViewCommandUpdater)) return this; throw Components.results.NS_NOINTERFACE; return null; } } function HandleColumnClick(columnID) { var sortType = ConvertColumnIDToSortType(columnID); // if sortType is 0, this is an unsupported sort type // return, since we can't sort by that column. if (sortType == 0) { return; } var dbview = GetDBView(); if (sortType == nsMsgViewSortType.byThread) { //do not allow sorting by thread in search view. if (dbview && dbview.isSearchView) return; } if (dbview.sortType == sortType) { MsgReverseSortThreadPane(); } else { MsgSortThreadPane(sortType); } } function MsgComposeDraftMessage() { var loadedFolder = GetLoadedMsgFolder(); var messageArray = GetSelectedMessages(); ComposeMessage(msgComposeType.Draft, msgComposeFormat.Default, loadedFolder, messageArray); } function ThreadPaneDoubleClick() { if (IsSpecialFolderSelected(MSG_FOLDER_FLAG_DRAFTS)) { MsgComposeDraftMessage(); } else if(IsSpecialFolderSelected(MSG_FOLDER_FLAG_TEMPLATES)) { var loadedFolder = GetLoadedMsgFolder(); var messageArray = GetSelectedMessages(); ComposeMessage(msgComposeType.Template, msgComposeFormat.Default, loadedFolder, messageArray); } else { MsgOpenSelectedMessages(); } } function ThreadPaneKeyPress(event) { if (event.keyCode == 13) ThreadPaneDoubleClick(); } function MsgSortByDate() { MsgSortThreadPane(nsMsgViewSortType.byDate); } function MsgSortBySenderOrRecipient() { if (IsSpecialFolderSelected(MSG_FOLDER_FLAG_SENTMAIL | MSG_FOLDER_FLAG_DRAFTS | MSG_FOLDER_FLAG_QUEUE)) { MsgSortThreadPane(nsMsgViewSortType.byRecipient); } else { MsgSortThreadPane(nsMsgViewSortType.byAuthor); } } function MsgSortByStatus() { MsgSortThreadPane(nsMsgViewSortType.byStatus); } function MsgSortByLabel() { MsgSortThreadPane(nsMsgViewSortType.byLabel); } function MsgSortBySubject() { MsgSortThreadPane(nsMsgViewSortType.bySubject); } function MsgSortByLocation() { MsgSortThreadPane(nsMsgViewSortType.byLocation); } function MsgSortByFlagged() { MsgSortThreadPane(nsMsgViewSortType.byFlagged); } function MsgSortByPriority() { MsgSortThreadPane(nsMsgViewSortType.byPriority); } function MsgSortBySize() { MsgSortThreadPane(nsMsgViewSortType.bySize); } function MsgSortByUnread() { MsgSortThreadPane(nsMsgViewSortType.byUnread); } function MsgSortByOrderReceived() { MsgSortThreadPane(nsMsgViewSortType.byId); } function MsgSortByTotal() { dump("XXX fix MsgSortByTotal\n"); //MsgSortThreadPane(nsMsgViewSortType.byTotal); } function MsgSortByThread() { var dbview = GetDBView(); if(dbview && dbview.isSearchView) //do not allow sorting by thread in search view. return; MsgSortThreadPane(nsMsgViewSortType.byThread); } function MsgSortThreadPane(sortType) { var dbview = GetDBView(); dbview.sort(sortType, nsMsgViewSortOrder.ascending); UpdateSortIndicators(sortType, nsMsgViewSortOrder.ascending); } function MsgReverseSortThreadPane() { var dbview = GetDBView(); if (dbview.sortOrder == nsMsgViewSortOrder.ascending) { MsgSortDescending(); } else { MsgSortAscending(); } } function MsgSortAscending() { var dbview = GetDBView(); dbview.sort(dbview.sortType, nsMsgViewSortOrder.ascending); UpdateSortIndicators(dbview.sortType, nsMsgViewSortOrder.ascending); } function MsgSortDescending() { var dbview = GetDBView(); dbview.sort(dbview.sortType, nsMsgViewSortOrder.descending); UpdateSortIndicators(dbview.sortType, nsMsgViewSortOrder.descending); } function UpdateSortIndicators(sortType, sortOrder) { var colID = ConvertSortTypeToColumnID(sortType); var sortedColumn; // set the sort indicator on the column we are sorted by if (colID) { sortedColumn = document.getElementById(colID); if (sortedColumn) { if (sortOrder == nsMsgViewSortOrder.ascending) { sortedColumn.setAttribute("sortDirection","ascending"); } else { sortedColumn.setAttribute("sortDirection","descending"); } // remove the sort indicator from all the columns // except the one we are sorted by var currCol = sortedColumn.parentNode.firstChild; while (currCol) { if (currCol != sortedColumn && currCol.localName == "treecol") currCol.removeAttribute("sortDirection"); currCol = currCol.nextSibling; } } } } function IsSpecialFolderSelected(flags) { var selectedFolder = GetThreadPaneFolder(); return IsSpecialFolder(selectedFolder, flags); } function GetThreadTree() { if (gThreadTree) return gThreadTree; gThreadTree = document.getElementById('threadTree'); return gThreadTree; } function GetThreadPaneFolder() { try { return gDBView.msgFolder; } catch (ex) { return null; } } function EnsureRowInThreadTreeIsVisible(index) { if (index < 0) return; var tree = GetThreadTree(); tree.treeBoxObject.ensureRowIsVisible(index); } function ThreadPaneOnLoad() { var tree = GetThreadTree(); tree.addEventListener("click",ThreadPaneOnClick,true); // The mousedown event listener below should only be added in the thread // pane of the mailnews 3pane window, not in the advanced search window. if(tree.parentNode.id == "searchResultListBox") return; tree.addEventListener("mousedown",TreeOnMouseDown,true); } function ThreadPaneSelectionChanged() { var treeBoxObj = GetThreadTree().treeBoxObject; var treeSelection = treeBoxObj.selection; if (!gRightMouseButtonDown) treeBoxObj.view.selectionChanged(); }