fix for #17801. r=putterman. make it so "next" will take you across folders.

still work to be done before this feature is perfect, but this gets the
ball rolling.
This commit is contained in:
sspitzer%netscape.com 2000-11-05 02:29:47 +00:00
parent d22a8ccf15
commit 9c447f45a0
3 changed files with 80 additions and 2 deletions

View File

@ -39,6 +39,7 @@ var gCurrentLoadingFolderSortDirection = null;
var gCurrentDisplayedMessage = null; var gCurrentDisplayedMessage = null;
var gNextMessageAfterDelete = null; var gNextMessageAfterDelete = null;
var gNextMessageAfterLoad = false;
var gActiveThreadPaneSortColumn = ""; var gActiveThreadPaneSortColumn = "";
@ -101,7 +102,7 @@ var folderListener = {
if(resource) if(resource)
{ {
var uri = resource.Value; var uri = resource.Value;
//dump("In OnFolderLoaded for " + uri +"\n"); dump("In OnFolderLoaded for " + uri +"\n");
if(uri == gCurrentFolderToReroot) if(uri == gCurrentFolderToReroot)
{ {
gCurrentFolderToReroot=""; gCurrentFolderToReroot="";
@ -114,6 +115,15 @@ var folderListener = {
gCurrentLoadingFolderSortID = ""; gCurrentLoadingFolderSortID = "";
gCurrentLoadingFolderSortDirection = null; gCurrentLoadingFolderSortDirection = null;
if (gNextMessageAfterLoad) {
gNextMessageAfterLoad = false;
GoNextMessage(navigateUnread, true);
msgNavigationService.EnsureDocumentIsLoaded(document);
SetFocusThreadPane();
PositionThreadPane();
}
} }
} }
if(uri == gCurrentLoadingFolderURI) if(uri == gCurrentLoadingFolderURI)
@ -884,6 +894,7 @@ function SelectFolder(folderUri)
function SelectMessage(messageUri) function SelectMessage(messageUri)
{ {
dump("SelectMessage: " + messageUri + "\n");
var tree = GetThreadTree(); var tree = GetThreadTree();
var treeitem = document.getElementById(messageUri); var treeitem = document.getElementById(messageUri);
if(tree && treeitem) if(tree && treeitem)

View File

@ -26,6 +26,56 @@ var navigateUnread = 1;
var navigateFlagged = 2; var navigateFlagged = 2;
var navigateNew = 3; var navigateNew = 3;
var Bundle = srGetStrBundle("chrome://messenger/locale/messenger.properties");
var commonDialogs = Components.classes["@mozilla.org/appshell/commonDialogs;1"].getService();
commonDialogs = commonDialogs.QueryInterface(Components.interfaces.nsICommonDialogs);
function FindNextFolder(originalFolderURI)
{
if (!originalFolderURI) return;
var originalFolderResource = RDF.GetResource(originalFolderURI);
var folder = originalFolderResource.QueryInterface(Components.interfaces.nsIFolder);
if (!folder) return null;
dump("folder = " + folder.URI + "\n");
try {
var subFolderEnumerator = folder.GetSubFolders();
var done = false;
while (!done) {
var element = subFolderEnumerator.currentItem();
var currentSubFolder = element.QueryInterface(Components.interfaces.nsIMsgFolder);
dump("current folder = " + currentSubFolder.URI + "\n");
if (currentSubFolder.getNumUnread(false /* don't descend */) > 0) {
dump("if the child has unread, use it.\n");
return currentSubFolder.URI;
}
else if (currentSubFolder.getNumUnread(true /* descend */) > 0) {
dump("if the child doesn't have any unread, but it's children do, recurse\n");
return FindNextFolder(currentSubFolder.URI);
}
try {
subFolderEnumerator.next();
}
catch (ex) {
done=true;
}
} // while
}
catch (ex) {
// one way to get here is if the folder has no sub folders
}
if (folder.parent && folder.parent.URI) {
dump("parent = " + folder.parent.URI + "\n");
return FindNextFolder(folder.parent.URI);
}
else {
dump("no parent\n");
}
return null;
}
/*GoNextMessage finds the message that matches criteria and selects it. /*GoNextMessage finds the message that matches criteria and selects it.
nextFunction is the function that will be used to detertime if a message matches criteria. nextFunction is the function that will be used to detertime if a message matches criteria.
@ -57,8 +107,24 @@ function GoNextMessage(type, startFromBeginning )
var nextMessage = msgNavigationService.FindNextMessage(type, tree, currentMessage, RDF, document, startFromBeginning, messageView.showThreads); var nextMessage = msgNavigationService.FindNextMessage(type, tree, currentMessage, RDF, document, startFromBeginning, messageView.showThreads);
//Only change the selection if there's a valid nextMessage //Only change the selection if there's a valid nextMessage
if(nextMessage && (nextMessage != currentMessage)) if(nextMessage && (nextMessage != currentMessage)) {
ChangeSelection(tree, nextMessage); ChangeSelection(tree, nextMessage);
}
else if (type == navigateUnread) {
var treeFolder = GetThreadTreeFolder();
var originalFolderURI = treeFolder.getAttribute('ref');
var nextFolderURI = FindNextFolder(originalFolderURI);
if (nextFolderURI && (originalFolderURI != nextFolderURI)) {
var nextFolderResource = RDF.GetResource(nextFolderURI);
var nextFolder = nextFolderResource.QueryInterface(Components.interfaces.nsIMsgFolder);
var promptText = Bundle.formatStringFromName("advanceNextPrompt", [ nextFolder.name ], 1);
if (commonDialogs.Confirm(window, promptText, promptText)) {
gNextMessageAfterLoad = true;
SelectFolder(nextFolderURI);
}
}
}
} }
var afterGoNextMessage = new Date(); var afterGoNextMessage = new Date();

View File

@ -34,6 +34,7 @@ removeFolder=Delete Folder...
newFolder=New Folder... newFolder=New Folder...
newSubfolder=New Subfolder... newSubfolder=New Subfolder...
getNextNMessages=Get Next %S News Messages getNextNMessages=Get Next %S News Messages
advanceNextPrompt=Advance to next unread message in %S?
titleNewsPreHost=on titleNewsPreHost=on
titleMailPreHost=for titleMailPreHost=for
replyToSender=Reply to Sender replyToSender=Reply to Sender