diff --git a/mozilla/mailnews/base/public/nsIMsgViewNavigationService.idl b/mozilla/mailnews/base/public/nsIMsgViewNavigationService.idl index a911cc8dc43..e7c1555dec9 100644 --- a/mozilla/mailnews/base/public/nsIMsgViewNavigationService.idl +++ b/mozilla/mailnews/base/public/nsIMsgViewNavigationService.idl @@ -56,5 +56,7 @@ interface nsIMsgViewNavigationService : nsISupports { in boolean wrapAround, in boolean isThreaded); void OpenTreeitemAndDescendants(in nsIDOMNode treeitem); + + void EnsureDocumentIsLoaded(in nsIDOMXULDocument document); }; diff --git a/mozilla/mailnews/base/resources/content/commandglue.js b/mozilla/mailnews/base/resources/content/commandglue.js index 449c8c94b6a..7a85d3be7ad 100644 --- a/mozilla/mailnews/base/resources/content/commandglue.js +++ b/mozilla/mailnews/base/resources/content/commandglue.js @@ -24,21 +24,6 @@ */ -var msgComposeService = Components.classes['component://netscape/messengercompose'].getService(); -msgComposeService = msgComposeService.QueryInterface(Components.interfaces.nsIMsgComposeService); -var mailSession = Components.classes["component://netscape/messenger/services/session"].getService(Components.interfaces.nsIMsgMailSession); -var accountManager = Components.classes["component://netscape/messenger/account-manager"].getService(Components.interfaces.nsIMsgAccountManager); - -var RDF = Components.classes['component://netscape/rdf/rdf-service'].getService(); -RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService); - -var prefs = Components.classes['component://netscape/preferences'].getService(); -prefs = prefs.QueryInterface(Components.interfaces.nsIPref); -var showPerformance = prefs.GetBoolPref('mail.showMessengerPerformance'); - -var msgNavigationService = Components.classes['component://netscape/messenger/msgviewnavigationservice'].getService(); -msgNavigationService= msgNavigationService.QueryInterface(Components.interfaces.nsIMsgViewNavigationService); - var gBeforeFolderLoadTime; function OpenURL(url) @@ -316,15 +301,80 @@ function UpdateStatusMessageCounts(folder) } +function SaveThreadPaneSelection() +{ + var tree = GetThreadTree(); + var selectedItems = tree.selectedItems; + var numSelected = selectedItems.length; + + var selectionArray = new Array(numSelected); + + for(var i = 0; i < numSelected; i++) + { + selectionArray[i] = selectedItems[i].getAttribute("id"); + } + + return selectionArray; +} + +function RestoreThreadPaneSelection(selectionArray) +{ + var tree = GetThreadTree(); + var numSelected = selectionArray.length; + + msgNavigationService.EnsureDocumentIsLoaded(document); + + var messageElement; + for(var i = 0 ; i < numSelected; i++) + { + messageElement = document.getElementById(selectionArray[i]); + + if(!messageElement && messageView.showThreads) + { + var treeFolder = GetThreadTreeFolder(); + var folderURI = treeFolder.getAttribute('ref'); + var folderResource = RDF.GetResource(folderURI); + var folder = folderResource.QueryInterface(Components.interfaces.nsIMsgFolder); + + var messageResource = RDF.GetResource(selectionArray[i]); + var message = messageResource.QueryInterface(Components.interfaces.nsIMessage); + + var topLevelMessage = GetTopLevelMessageForMessage(message, folder); + var topLevelResource = topLevelMessage.QueryInterface(Components.interfaces.nsIRDFResource); + var topLevelURI = topLevelResource.Value; + var topElement = document.getElementById(topLevelURI); + if(topElement) + { + msgNavigationService.OpenTreeitemAndDescendants(topElement); + } + + messageElement = document.getElementById(selectionArray[i]); + + } + tree.addItemToSelection(messageElement); + if(messageElement && (i==0)) + tree.ensureElementIsVisible(messageElement); + } + +} + function SortThreadPane(column, sortKey, secondarySortKey) { var node = document.getElementById(column); if(!node) return false; - return SortColumn(node, sortKey, secondarySortKey); + var selection = SaveThreadPaneSelection(); + var beforeSortTime = new Date(); + var result = SortColumn(node, sortKey, secondarySortKey); + var afterSortTime = new Date(); + var timeToSort = (afterSortTime.getTime() - beforeSortTime.getTime())/1000; + if(showPerformance) + dump("timeToSort is " + timeToSort + "seconds\n"); + RestoreThreadPaneSelection(selection); + return result; } function SortFolderPane(column, sortKey) @@ -596,34 +646,6 @@ function ShowThreads(showThreads) } } -function FolderTest5000() -{ - - folderDataSource = folderDataSource.QueryInterface(Components.interfaces.nsIRDFDataSource); - - var childProperty = RDF.GetResource("http://home.netscape.com/NC-rdf#MessageChild"); - - var folderResource = RDF.GetResource("mailbox://scottip@nsmail-2.mcom.com/test5000"); - - var beforeTime = new Date(); - - var messageChildren = folderDataSource.GetTargets(folderResource, childProperty, true); - - var afterGetTargetsTime = new Date(); - var timeToLoad = (afterGetTargetsTime.getTime() - beforeTime.getTime())/1000; - dump("Time to load is " + timeToLoad + " seconds\n"); - - messageChildren = messageChildren.QueryInterface(Components.interfaces.nsISimpleEnumerator); - - while(messageChildren.HasMoreElements()) - { - messageChildren.GetNext(); - } - - var afterTime = new Date(); - timeToLoad = (afterTime.getTime() - beforeTime.getTime())/1000; - dump("Time to load is " + timeToLoad + " seconds\n"); -} function GetNextMessageAfterDelete(messages) { diff --git a/mozilla/mailnews/base/resources/content/messenger.xul b/mozilla/mailnews/base/resources/content/messenger.xul index 7f6ddcbe421..14929c69971 100644 --- a/mozilla/mailnews/base/resources/content/messenger.xul +++ b/mozilla/mailnews/base/resources/content/messenger.xul @@ -599,7 +599,6 @@ Rights Reserved. - diff --git a/mozilla/mailnews/base/resources/content/msgMail3PaneWindow.js b/mozilla/mailnews/base/resources/content/msgMail3PaneWindow.js index 69b1ba5fa8f..b2193945dfe 100644 --- a/mozilla/mailnews/base/resources/content/msgMail3PaneWindow.js +++ b/mozilla/mailnews/base/resources/content/msgMail3PaneWindow.js @@ -35,6 +35,26 @@ var accountManagerDSProgID = datasourceProgIDPrefix + "msgaccountmanager"; var folderDSProgID = datasourceProgIDPrefix + "mailnewsfolders"; var messageDSProgID = datasourceProgIDPrefix + "mailnewsmessages"; +var messenger; +var accountManagerDataSource; +var folderDataSource; +var messageDataSource; +var pref; +var statusFeedback; +var messageView; +var msgWindow; + +var msgComposeService; +var mailSession; +var accountManager; +var RDF; +var showPerformance; +var msgNavigationService; + +var msgComposeType; +var msgComposeFormat; +var Bundle; + var gFolderTree; var gThreadTree; var gThreadAndMessagePaneSplitter = null; @@ -47,29 +67,6 @@ var gCurrentLoadingFolderIsThreaded = false; var gCurrentLoadingFolderSortID =""; -// get the messenger instance -var messenger = Components.classes[messengerProgID].createInstance(); -messenger = messenger.QueryInterface(Components.interfaces.nsIMessenger); - -//Create datasources -var accountManagerDataSource = Components.classes[accountManagerDSProgID].createInstance(); -var folderDataSource = Components.classes[folderDSProgID].createInstance(); -var messageDataSource = Components.classes[messageDSProgID].createInstance(); - -var pref = Components.classes[prefProgID].getService(Components.interfaces.nsIPref); - -//Create windows status feedback -var statusFeedback = Components.classes[statusFeedbackProgID].createInstance(); -statusFeedback = statusFeedback.QueryInterface(Components.interfaces.nsIMsgStatusFeedback); - -//Create message view object -var messageView = Components.classes[messageViewProgID].createInstance(); -messageView = messageView.QueryInterface(Components.interfaces.nsIMessageView); - -//Create message window object -var msgWindow = Components.classes[msgWindowProgID].createInstance(); -msgWindow = msgWindow.QueryInterface(Components.interfaces.nsIMsgWindow); - // the folderListener object var folderListener = { OnItemAdded: function(parentItem, item, view) {}, @@ -138,6 +135,8 @@ var folderListener = { gCurrentLoadingFolderURI = ""; //Now let's select the first new message if there is one var beforeScrollToNew = new Date(); + msgNavigationService.EnsureDocumentIsLoaded(document); + ScrollToFirstNewMessage(); var afterScrollToNew = new Date(); var timeToScroll = (afterScrollToNew.getTime() - beforeScrollToNew.getTime())/1000; @@ -160,6 +159,9 @@ var folderListener = { /* Functions related to startup */ function OnLoadMessenger() { + var beforeLoadMessenger = new Date(); + + CreateGlobals(); verifyAccounts(); loadStartPage(); @@ -214,6 +216,15 @@ function OnLoadMessenger() catch (ex) { dump("failed to set the view headers menu item\n"); } + + var afterLoadMessenger = new Date(); + + var timeToLoad = (afterLoadMessenger.getTime() - beforeLoadMessenger.getTime())/1000; + if(showPerformance) + { + dump("Time in OnLoadMessger is " + timeToLoad + " seconds\n"); + } + } function OnUnloadMessenger() @@ -233,6 +244,54 @@ function OnUnloadMessenger() } +function CreateGlobals() +{ + // get the messenger instance + messenger = Components.classes[messengerProgID].createInstance(); + messenger = messenger.QueryInterface(Components.interfaces.nsIMessenger); + + //Create datasources + accountManagerDataSource = Components.classes[accountManagerDSProgID].createInstance(); + folderDataSource = Components.classes[folderDSProgID].createInstance(); + messageDataSource = Components.classes[messageDSProgID].createInstance(); + + pref = Components.classes[prefProgID].getService(Components.interfaces.nsIPref); + + //Create windows status feedback + statusFeedback = Components.classes[statusFeedbackProgID].createInstance(); + statusFeedback = statusFeedback.QueryInterface(Components.interfaces.nsIMsgStatusFeedback); + + //Create message view object + messageView = Components.classes[messageViewProgID].createInstance(); + messageView = messageView.QueryInterface(Components.interfaces.nsIMessageView); + + //Create message window object + msgWindow = Components.classes[msgWindowProgID].createInstance(); + msgWindow = msgWindow.QueryInterface(Components.interfaces.nsIMsgWindow); + + msgComposeService = Components.classes['component://netscape/messengercompose'].getService(); + msgComposeService = msgComposeService.QueryInterface(Components.interfaces.nsIMsgComposeService); + + mailSession = Components.classes["component://netscape/messenger/services/session"].getService(Components.interfaces.nsIMsgMailSession); + + accountManager = Components.classes["component://netscape/messenger/account-manager"].getService(Components.interfaces.nsIMsgAccountManager); + + RDF = Components.classes['component://netscape/rdf/rdf-service'].getService(); + RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService); + + showPerformance = pref.GetBoolPref('mail.showMessengerPerformance'); + + msgNavigationService = Components.classes['component://netscape/messenger/msgviewnavigationservice'].getService(); + msgNavigationService= msgNavigationService.QueryInterface(Components.interfaces.nsIMsgViewNavigationService); + + msgComposeType = Components.interfaces.nsIMsgCompType; + msgComposeFormat = Components.interfaces.nsIMsgCompFormat; + Bundle = srGetStrBundle("chrome://messenger/locale/messenger.properties"); + + + +} + function verifyAccounts() { try { var am = Components.classes[accountManagerProgID].getService(Components.interfaces.nsIMsgAccountManager); @@ -304,6 +363,9 @@ function loadStartFolder() dump('InboxURI = ' + inboxURI + '\n'); //first, let's see if it's already in the dom. This will make life easier. + //We need to make sure content is built by this time + msgNavigationService.EnsureDocumentIsLoaded(document); + var inbox = document.getElementById(inboxURI); //if it's not here we will have to make sure it's open. @@ -318,6 +380,7 @@ function loadStartFolder() } catch(ex) { + dump(ex); dump('Exception in LoadStartFolder caused by no default account. We know about this\n'); } @@ -510,13 +573,14 @@ function FindMessenger() function RefreshThreadTreeView() { + var selection = SaveThreadPaneSelection(); + var currentFolder = GetThreadTreeFolder(); var currentFolderID = currentFolder.getAttribute('ref'); - //This will make us lose selection when this happens. - //need to figure out if we have to save off selection or if - //tree widget is responsible for this. ClearThreadTreeSelection(); currentFolder.setAttribute('ref', currentFolderID); + + RestoreThreadPaneSelection(selection); } function ClearThreadTreeSelection() diff --git a/mozilla/mailnews/base/resources/content/widgetglue.js b/mozilla/mailnews/base/resources/content/widgetglue.js index 8377f281d63..3d85358ace1 100644 --- a/mozilla/mailnews/base/resources/content/widgetglue.js +++ b/mozilla/mailnews/base/resources/content/widgetglue.js @@ -24,12 +24,6 @@ * and then calls a function/command in commandglue */ -var msgComposeType = Components.interfaces.nsIMsgCompType; -var msgComposeFormat = Components.interfaces.nsIMsgCompFormat; -var Bundle = srGetStrBundle("chrome://messenger/locale/messenger.properties"); - -var prefs = Components.classes['component://netscape/preferences'].getService(); -prefs = prefs.QueryInterface(Components.interfaces.nsIPref); // Controller object for folder pane var FolderPaneController = @@ -422,7 +416,7 @@ function MsgForwardMessage(event) dump("\nMsgForwardMessage from XUL\n"); var forwardType = 0; try { - var forwardType = prefs.GetIntPref("mail.forward_message_mode"); + var forwardType = pref.GetIntPref("mail.forward_message_mode"); } catch (e) {dump ("failed to retrieve pref mail.forward_message_mode");} if (forwardType == 0) @@ -897,19 +891,19 @@ function MsgViewIgnoreThread() {} function MsgViewAllHeaders() { - prefs.SetIntPref("mail.show_headers",2); + pref.SetIntPref("mail.show_headers",2); MsgReload(); return true; } function MsgViewNormalHeaders() { - prefs.SetIntPref("mail.show_headers",1); + pref.SetIntPref("mail.show_headers",1); MsgReload(); return true; } function MsgViewBriefHeaders() { - prefs.SetIntPref("mail.show_headers",0); + pref.SetIntPref("mail.show_headers",0); MsgReload(); return true; } diff --git a/mozilla/mailnews/base/src/nsMsgViewNavigationService.cpp b/mozilla/mailnews/base/src/nsMsgViewNavigationService.cpp index 210c3a5e62b..e397cfe97d9 100644 --- a/mozilla/mailnews/base/src/nsMsgViewNavigationService.cpp +++ b/mozilla/mailnews/base/src/nsMsgViewNavigationService.cpp @@ -28,6 +28,7 @@ #include "nsIMessage.h" #include "nsIMsgFolder.h" #include "nsIMsgThread.h" +#include "nsIDocument.h" typedef PRBool (*navigationFunction)(nsIDOMXULElement *message, navigationInfoPtr info); @@ -557,6 +558,20 @@ nsresult nsMsgViewNavigationService::FindNextMessageUnthreaded(navigationInfoPtr return NS_OK; } +NS_IMETHODIMP nsMsgViewNavigationService::EnsureDocumentIsLoaded(nsIDOMXULDocument *xulDocument) +{ + nsresult rv; + + nsCOMPtr document = do_QueryInterface(xulDocument); + if(!document) + return NS_ERROR_FAILURE; + + rv = document->FlushPendingNotifications(); + + return rv; + +} + //Finds the next message in a threaded view. nsresult nsMsgViewNavigationService::FindNextMessageInThreads(nsIDOMNode *startMessage, navigationInfoPtr info, nsIDOMNode **nextMessage) {