sorting and threading now remember selection. Removed Test5000 message. Cleaned up
js a bit and moved globals into one function. r =alecf. git-svn-id: svn://10.0.0.236/trunk@59715 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -56,5 +56,7 @@ interface nsIMsgViewNavigationService : nsISupports {
|
||||
in boolean wrapAround, in boolean isThreaded);
|
||||
|
||||
void OpenTreeitemAndDescendants(in nsIDOMNode treeitem);
|
||||
|
||||
void EnsureDocumentIsLoaded(in nsIDOMXULDocument document);
|
||||
};
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -599,7 +599,6 @@ Rights Reserved.
|
||||
<menuseparator/>
|
||||
<menuitem value="&backCmd.label;" disabled="true" oncommand="MsgGoBack();"/>
|
||||
<menuitem value="&forwardCmd.label;" disabled="true" oncommand="MsgGoForward();"/>
|
||||
<menuitem value="5000 message folder test" oncommand="FolderTest5000();"/>
|
||||
</menupopup>
|
||||
</menu>
|
||||
<menu value="&msgMenu.label;">
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<nsIDocument> 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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user