diff --git a/mailnews/base/public/nsIMsgDBView.idl b/mailnews/base/public/nsIMsgDBView.idl index 349828fb5104..bafb404c08b3 100644 --- a/mailnews/base/public/nsIMsgDBView.idl +++ b/mailnews/base/public/nsIMsgDBView.idl @@ -200,6 +200,10 @@ interface nsMsgViewCommandType const nsMsgViewCommandTypeValue junk = 27; const nsMsgViewCommandTypeValue unjunk = 28; const nsMsgViewCommandTypeValue undeleteMsg = 29; + + const nsMsgViewCommandTypeValue applyFilters = 30; + const nsMsgViewCommandTypeValue runJunkControls = 31; + const nsMsgViewCommandTypeValue deleteJunk = 32; }; [scriptable, uuid(65903eb2-1dd2-11b2-ac45-c5b69c1618d7)] diff --git a/mailnews/base/resources/content/mail3PaneWindowCommands.js b/mailnews/base/resources/content/mail3PaneWindowCommands.js index ed3ce9cc0dec..d1ac19d98e23 100644 --- a/mailnews/base/resources/content/mail3PaneWindowCommands.js +++ b/mailnews/base/resources/content/mail3PaneWindowCommands.js @@ -194,6 +194,9 @@ var DefaultController = case "cmd_markAsFlagged": case "cmd_markAsJunk": case "cmd_markAsNotJunk": + case "cmd_applyFilters": + case "cmd_runJunkControls": + case "cmd_deleteJunk": case "cmd_label0": case "cmd_label1": case "cmd_label2": @@ -309,6 +312,18 @@ var DefaultController = case "button_file": case "cmd_file": return (GetNumSelectedMessages() > 0 ); + case "cmd_applyFilters": + if (gDBView) + gDBView.getCommandStatus(nsMsgViewCommandType.applyFilters, enabled, checkStatus); + return enabled.value; + case "cmd_runJunkControls": + if (gDBView) + gDBView.getCommandStatus(nsMsgViewCommandType.runJunkControls, enabled, checkStatus); + return enabled.value; + case "cmd_deleteJunk": + if (gDBView) + gDBView.getCommandStatus(nsMsgViewCommandType.deleteJunk, enabled, checkStatus); + return enabled.value; case "button_mark": case "cmd_markAsRead": case "cmd_markThreadAsRead": @@ -562,7 +577,7 @@ var DefaultController = MsgMarkThreadAsRead(); return; case "cmd_markAllRead": - gDBView.doCommand(nsMsgViewCommandType.markAllRead); + gDBView.doCommand(nsMsgViewCommandType.markAllRead); return; case "button_junk": MsgJunk(); @@ -574,11 +589,20 @@ var DefaultController = MsgMarkAsFlagged(null); return; case "cmd_markAsJunk": - JunkSelectedMessages(true); + JunkSelectedMessages(true); return; case "cmd_markAsNotJunk": - JunkSelectedMessages(false); + JunkSelectedMessages(false); return; + case "cmd_applyFilters": + MsgApplyFilters(null); + return; + case "cmd_runJunkControls": + analyzeFolderForJunk(); + return; + case "cmd_deleteJunk": + deleteJunkInFolder(); + return; case "cmd_label0": gDBView.doCommand(nsMsgViewCommandType.label0); return; diff --git a/mailnews/base/resources/content/mailCommands.js b/mailnews/base/resources/content/mailCommands.js index ac4f9e4789c0..0c44b329581d 100644 --- a/mailnews/base/resources/content/mailCommands.js +++ b/mailnews/base/resources/content/mailCommands.js @@ -525,3 +525,55 @@ function JunkSelectedMessages(setAsJunk) gDBView.doCommand(setAsJunk ? nsMsgViewCommandType.junk : nsMsgViewCommandType.unjunk); } + +function deleteJunkInFolder() +{ + var view = GetDBView(); + + // need to expand all threads, so we find everything + view.doCommand(nsMsgViewCommandType.expandAll); + + var treeView = view.QueryInterface(Components.interfaces.nsITreeView); + var count = treeView.rowCount; + if (!count) + return; + + var treeSelection = treeView.selection; + + var clearedSelection = false; + + // select the junk messages + for (var i = 0; i < count; i++) + { + var messageUri = view.getURIForViewIndex(i); + var msgHdr = messenger.messageServiceFromURI(messageUri).messageURIToMsgHdr(messageUri); + var junkScore = msgHdr.getStringProperty("junkscore"); + var isJunk = ((junkScore != "") && (junkScore != "0")); + // if the message is junk, select it. + if (isJunk) + { + // only do this once + if (!clearedSelection) + { + // clear the current selection + // since we will be deleting all selected messages + treeSelection.clearSelection(); + clearedSelection = true; + } + treeSelection.rangedSelect(i, i, true /* augment */); + } + } + + // if we didn't clear the selection + // there was no junk, so bail. + if (!clearedSelection) + return; + + // delete the selected messages + // + // XXX todo + // should we try to set next message after delete + // to the the previous selected message, if it was not junk? + SetNextMessageAfterDelete(); + view.doCommand(nsMsgViewCommandType.deleteMsg); +} \ No newline at end of file diff --git a/mailnews/base/resources/content/mailWindowOverlay.xul b/mailnews/base/resources/content/mailWindowOverlay.xul index 244ac9bafeaa..d6272d039b1f 100644 --- a/mailnews/base/resources/content/mailWindowOverlay.xul +++ b/mailnews/base/resources/content/mailWindowOverlay.xul @@ -273,8 +273,14 @@ Rights Reserved. - + + + + @@ -1518,7 +1524,7 @@ Rights Reserved. - + - + observes="cmd_applyFilters"/> + observes="cmd_runJunkControls"/> + + + + diff --git a/mailnews/base/src/nsMsgDBView.cpp b/mailnews/base/src/nsMsgDBView.cpp index 5a6b3ebf42a0..a5dee6ebc110 100644 --- a/mailnews/base/src/nsMsgDBView.cpp +++ b/mailnews/base/src/nsMsgDBView.cpp @@ -2012,6 +2012,25 @@ NS_IMETHODIMP nsMsgDBView::GetCommandStatus(nsMsgViewCommandTypeValue command, P *selectable_p = haveSelection; } break; + case nsMsgViewCommandType::applyFilters: + // can't manually run news filters yet + // disable if no messages + // XXX todo, check that we have filters, and at least one is enabled + *selectable_p = GetSize() && !mIsNews; + break; + case nsMsgViewCommandType::runJunkControls: + // disable if no messages + // no JMC on news yet + // XXX todo, check that we have JMC enabled? + *selectable_p = GetSize() && !mIsNews; + break; + case nsMsgViewCommandType::deleteJunk: + { + // disable if no messages, or if we can't delete (like news and certain imap folders) + PRBool canDelete; + *selectable_p = GetSize() && (m_folder && NS_SUCCEEDED(m_folder->GetCanDeleteMessages(&canDelete)) && canDelete); + } + break; case nsMsgViewCommandType::markMessagesRead: case nsMsgViewCommandType::markMessagesUnread: case nsMsgViewCommandType::toggleMessageRead: