Index: mail/base/content/hiddenWindow.js
===================================================================
RCS file: /cvsroot/mozilla/mail/base/content/hiddenWindow.js,v
retrieving revision 1.7
diff -u -8 -p -r1.7 hiddenWindow.js
--- mail/base/content/hiddenWindow.js 29 Sep 2006 22:27:22 -0000 1.7
+++ mail/base/content/hiddenWindow.js 31 Aug 2007 22:15:27 -0000
@@ -51,17 +51,17 @@ function hiddenWindowStartup()
'viewTextSizeMenu', 'menu_textZoomEnlarge', 'menu_textZoomReduce',
'goNextMenu', 'menu_nextMsg', 'menu_nextUnreadMsg', 'menu_nextUnreadThread',
'goPreviousMenu', 'menu_prevMsg', 'menu_prevUnreadMsg', 'menu_goForward', 'menu_goBack',
'goStartPage', 'newMsgCmd', 'replyMainMenu', 'replySenderMainMenu', 'replyNewsgroupMainMenu',
'menu_replyToAll', 'menu_forwardMsg', 'forwardAsMenu', 'menu_editMsgAsNew', 'openMessageWindowMenuitem',
'moveMenu', 'copyMenu', 'moveToFolderAgain', 'tagMenu', 'markMenu',
'markReadMenuItem', 'menu_markThreadAsRead', 'menu_markReadByDate', 'menu_markAllRead',
'markFlaggedMenuItem', 'menu_markAsJunk', 'menu_markAsNotJunk', 'createFilter',
- 'killThread', 'watchThread', 'applyFilters', 'runJunkControls', 'deleteJunk', 'menu_import',
+ 'killThread', 'pruneThread', 'watchThread', 'applyFilters', 'runJunkControls', 'deleteJunk', 'menu_import',
'searchMailCmd', 'searchAddressesCmd', 'filtersCmd', 'junkMailCmd',
'cmd_close', 'minimizeWindow', 'zoomWindow'];
var id;
var element;
for (id in disabledItems)
{
element = document.getElementById(disabledItems[id]);
if (element)
Index: mail/base/content/mail3PaneWindowCommands.js
===================================================================
RCS file: /cvsroot/mozilla/mail/base/content/mail3PaneWindowCommands.js,v
retrieving revision 1.40
diff -u -8 -p -r1.40 mail3PaneWindowCommands.js
--- mail/base/content/mail3PaneWindowCommands.js 28 Aug 2007 03:18:48 -0000 1.40
+++ mail/base/content/mail3PaneWindowCommands.js 31 Aug 2007 22:15:27 -0000
@@ -231,16 +231,17 @@ var DefaultController =
return true;
case "cmd_downloadFlagged":
case "cmd_downloadSelected":
case "cmd_synchronizeOffline":
return MailOfflineMgr.isOnline();
case "cmd_watchThread":
case "cmd_killThread":
+ case "cmd_pruneThread":
return(isNewsURI(GetFirstSelectedMessage()));
default:
return false;
}
},
isCommandEnabled: function(command)
@@ -266,16 +267,17 @@ var DefaultController =
gDBView.getCommandStatus(nsMsgViewCommandType.deleteNoTrash, enabled, checkStatus);
return enabled.value;
case "button_junk":
UpdateJunkToolbarButton();
if (gDBView)
gDBView.getCommandStatus(nsMsgViewCommandType.junk, enabled, checkStatus);
return enabled.value;
case "cmd_killThread":
+ case "cmd_pruneThread":
return GetNumSelectedMessages() > 0;
case "cmd_watchThread":
if (gDBView)
gDBView.getCommandStatus(nsMsgViewCommandType.toggleThreadWatched, enabled, checkStatus);
return enabled.value;
case "cmd_createFilterFromPopup":
case "cmd_createFilterFromMenu":
var loadedFolder = GetLoadedMsgFolder();
@@ -500,16 +502,19 @@ var DefaultController =
MarkCurrentMessageAsRead();
SetNextMessageAfterDelete();
gDBView.doCommand(nsMsgViewCommandType.deleteNoTrash);
break;
case "cmd_killThread":
/* kill thread kills the thread and then does a next unread */
GoNextMessage(nsMsgNavigationType.toggleThreadKilled, true);
break;
+ case "cmd_pruneThread":
+ GoNextMessage(nsMsgNavigationType.toggleThreadPruned, true);
+ break;
case "cmd_watchThread":
gDBView.doCommand(nsMsgViewCommandType.toggleThreadWatched);
break;
case "button_next":
case "cmd_nextUnreadMsg":
MsgNextUnreadMessage();
break;
case "cmd_nextUnreadThread":
Index: mail/base/content/mailWindowOverlay.js
===================================================================
RCS file: /cvsroot/mozilla/mail/base/content/mailWindowOverlay.js,v
retrieving revision 1.178
diff -u -8 -p -r1.178 mailWindowOverlay.js
--- mail/base/content/mailWindowOverlay.js 25 Aug 2007 21:10:51 -0000 1.178
+++ mail/base/content/mailWindowOverlay.js 31 Aug 2007 22:15:28 -0000
@@ -339,16 +339,19 @@ function InitMessageMenu()
// 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 pruneThreadMenuItem = document.getElementById("pruneThread");
+ if (pruneThreadMenuItem)
+ pruneThreadMenuItem.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");
var msgFolder = GetLoadedMsgFolder();
Index: mail/base/content/mailWindowOverlay.xul
===================================================================
RCS file: /cvsroot/mozilla/mail/base/content/mailWindowOverlay.xul,v
retrieving revision 1.221
diff -u -8 -p -r1.221 mailWindowOverlay.xul
--- mail/base/content/mailWindowOverlay.xul 28 Aug 2007 03:18:48 -0000 1.221
+++ mail/base/content/mailWindowOverlay.xul 31 Aug 2007 22:15:28 -0000
@@ -230,16 +230,17 @@
+
@@ -359,16 +360,17 @@
+
#ifdef XP_WIN
@@ -1795,16 +1797,24 @@
+
Index: mail/base/content/messageWindow.js
===================================================================
RCS file: /cvsroot/mozilla/mail/base/content/messageWindow.js,v
retrieving revision 1.52
diff -u -8 -p -r1.52 messageWindow.js
--- mail/base/content/messageWindow.js 28 Aug 2007 03:18:48 -0000 1.52
+++ mail/base/content/messageWindow.js 31 Aug 2007 22:15:28 -0000
@@ -766,16 +766,17 @@ var MessageWindowController =
supportsCommand: function(command)
{
switch ( command )
{
case "cmd_delete":
case "cmd_undo":
case "cmd_redo":
case "cmd_killThread":
+ case "cmd_pruneThread":
case "cmd_watchThread":
case "button_delete":
case "button_junk":
case "cmd_shiftDelete":
case "cmd_saveAsFile":
case "cmd_saveAsTemplate":
case "cmd_viewPageSource":
case "cmd_getMsgsForAuthAccounts":
Index: mail/locales/en-US/chrome/messenger/FilterEditor.dtd
===================================================================
RCS file: /cvsroot/mozilla/mail/locales/en-US/chrome/messenger/FilterEditor.dtd,v
retrieving revision 1.8
diff -u -8 -p -r1.8 FilterEditor.dtd
--- mail/locales/en-US/chrome/messenger/FilterEditor.dtd 21 Feb 2007 21:28:54 -0000 1.8
+++ mail/locales/en-US/chrome/messenger/FilterEditor.dtd 31 Aug 2007 22:15:28 -0000
@@ -44,10 +44,11 @@
+
Index: mail/locales/en-US/chrome/messenger/filter.properties
===================================================================
RCS file: /cvsroot/mozilla/mail/locales/en-US/chrome/messenger/filter.properties,v
retrieving revision 1.6
diff -u -8 -p -r1.6 filter.properties
--- mail/locales/en-US/chrome/messenger/filter.properties 5 Mar 2007 20:42:45 -0000 1.6
+++ mail/locales/en-US/chrome/messenger/filter.properties 31 Aug 2007 22:15:28 -0000
@@ -41,8 +41,9 @@ filterAction8=tagged
filterAction9=replied
filterAction10=forwarded
filterAction11=execution stopped
filterAction12=deleted from POP3 server
filterAction13=left on POP3 server
filterAction14=junk score
filterAction15=body fetched from POP3 server
filterAction16=copied to folder
+filterAction17=thread pruned
Index: mail/locales/en-US/chrome/messenger/messenger.dtd
===================================================================
RCS file: /cvsroot/mozilla/mail/locales/en-US/chrome/messenger/messenger.dtd,v
retrieving revision 1.66
diff -u -8 -p -r1.66 messenger.dtd
--- mail/locales/en-US/chrome/messenger/messenger.dtd 25 Aug 2007 21:10:52 -0000 1.66
+++ mail/locales/en-US/chrome/messenger/messenger.dtd 31 Aug 2007 22:15:29 -0000
@@ -337,16 +337,19 @@
+
+
+
Index: mail/themes/pinstripe/mail/jar.mn
===================================================================
RCS file: /cvsroot/mozilla/mail/themes/pinstripe/mail/jar.mn,v
retrieving revision 1.14
diff -u -8 -p -r1.14 jar.mn
--- mail/themes/pinstripe/mail/jar.mn 25 Aug 2007 07:41:46 -0000 1.14
+++ mail/themes/pinstripe/mail/jar.mn 31 Aug 2007 22:15:29 -0000
@@ -175,22 +175,24 @@ classic.jar:
skin/classic/messenger/icons/symbol-replied-selected.png (icons/symbol-replied-selected.png)
skin/classic/messenger/icons/symbol-imapdeleted.png (icons/symbol-imapdeleted.png)
skin/classic/messenger/icons/symbol-imapdeleted-selected.png (icons/symbol-imapdeleted-selected.png)
skin/classic/messenger/icons/symbol-null.png (icons/symbol-null.png)
skin/classic/messenger/icons/template-folder.png (icons/template-folder.png)
skin/classic/messenger/icons/thread-closed-eye-selected.png (icons/thread-closed-eye-selected.png)
skin/classic/messenger/icons/thread-closed-eye.png (icons/thread-closed-eye.png)
skin/classic/messenger/icons/thread-closed-kill.png (icons/thread-closed-kill.png)
+ skin/classic/messenger/icons/thread-closed-prune.png (icons/thread-closed-prune.png)
skin/classic/messenger/icons/thread-closed-offl-eye.png (icons/thread-closed-offl-eye.png)
skin/classic/messenger/icons/thread-closed-offl-kill.png (icons/thread-closed-offl-kill.png)
skin/classic/messenger/icons/thread-closed-selected.png (icons/thread-closed-selected.png)
skin/classic/messenger/icons/thread-closed.png (icons/thread-closed.png)
skin/classic/messenger/icons/thread-new-closed-eye.png (icons/thread-new-closed-eye.png)
skin/classic/messenger/icons/thread-new-closed-kill.png (icons/thread-new-closed-kill.png)
+ skin/classic/messenger/icons/thread-new-closed-prune.png (icons/thread-new-closed-prune.png)
skin/classic/messenger/icons/thread-new-closed-offl-eye.png (icons/thread-new-closed-offl-eye.png)
skin/classic/messenger/icons/thread-new-closed-offl-kill.png (icons/thread-new-closed-offl-kill.png)
skin/classic/messenger/icons/thread-new-closed.png (icons/thread-new-closed.png)
skin/classic/messenger/icons/threadcol.png (icons/threadcol.png)
skin/classic/messenger/icons/unreadmail-selected.png (icons/unreadmail-selected.png)
skin/classic/messenger/icons/unreadmail.png (icons/unreadmail.png)
skin/classic/messenger/icons/unthreadcol.png (icons/unthreadcol.png)
skin/classic/messenger/icons/online.png (icons/online.png)
Index: mail/themes/pinstripe/mail/mailWindow1.css
===================================================================
RCS file: /cvsroot/mozilla/mail/themes/pinstripe/mail/mailWindow1.css,v
retrieving revision 1.12
diff -u -8 -p -r1.12 mailWindow1.css
--- mail/themes/pinstripe/mail/mailWindow1.css 2 Jul 2007 03:20:31 -0000 1.12
+++ mail/themes/pinstripe/mail/mailWindow1.css 31 Aug 2007 22:15:29 -0000
@@ -327,16 +327,20 @@ treechildren::-moz-tree-image(subjectCol
treechildren::-moz-tree-image(news, threadCol, watch) {
list-style-image: url("chrome://messenger/skin/icons/thread-closed-eye.png");
}
treechildren::-moz-tree-image(news, threadCol, ignore) {
list-style-image: url("chrome://messenger/skin/icons/thread-closed-kill.png");
}
+treechildren::-moz-tree-image(news, threadCol, prune) {
+ list-style-image: url("chrome://messenger/skin/icons/thread-closed-prune.png");
+}
+
#sizeCol,
#unreadCol,
#totalCol {
text-align: right;
}
#threadPaneBox {
margin-top: -1px;
Index: mail/themes/pinstripe/mail/icons/thread-closed-prune.jpg
===================================================================
RCS file: mail/themes/pinstripe/mail/icons/thread-closed-prune.jpg
diff -N mail/themes/pinstripe/mail/icons/thread-closed-prune.jpg
Binary files /dev/null and thread-closed-prune.jpg differ
Index: mail/themes/pinstripe/mail/icons/thread-new-closed-prune.png
===================================================================
RCS file: mail/themes/pinstripe/mail/icons/thread-new-closed-prune.png
diff -N mail/themes/pinstripe/mail/icons/thread-new-closed-prune.png
Binary files /dev/null and thread-new-closed-prune.png differ
Index: mail/themes/qute/mail/jar.mn
===================================================================
RCS file: /cvsroot/mozilla/mail/themes/qute/mail/jar.mn,v
retrieving revision 1.20
diff -u -8 -p -r1.20 jar.mn
--- mail/themes/qute/mail/jar.mn 25 Aug 2007 07:41:37 -0000 1.20
+++ mail/themes/qute/mail/jar.mn 31 Aug 2007 22:15:29 -0000
@@ -89,16 +89,17 @@ classic.jar:
skin/classic/messenger/icons/attachment-col.png (icons/attachment-col.png)
skin/classic/messenger/icons/attachment.png (icons/attachment.png)
skin/classic/messenger/icons/junk-col.png (icons/junk-col.png)
skin/classic/messenger/icons/thread-col.png (icons/thread-col.png)
skin/classic/messenger/icons/thread-col-sorta.png (icons/thread-col-sorta.png)
skin/classic/messenger/icons/thread-col-sortd.png (icons/thread-col-sortd.png)
skin/classic/messenger/icons/thread.png (icons/thread.png)
skin/classic/messenger/icons/thread-ignored.png (icons/thread-ignored.png)
+ skin/classic/messenger/icons/thread-pruned.png (icons/thread-pruned.png)
skin/classic/messenger/icons/thread-watched.png (icons/thread-watched.png)
skin/classic/messenger/icons/flag-col.png (icons/flag-col.png)
skin/classic/messenger/icons/flag.png (icons/flag.png)
skin/classic/messenger/icons/server.png (icons/server.png)
skin/classic/messenger/icons/readcol.png (icons/readcol.png)
skin/classic/messenger/icons/unreadmail.png (icons/unreadmail.png)
skin/classic/messenger/icons/Search-bar.png (icons/Search-bar.png)
skin/classic/messenger/icons/search-arrow.gif (icons/search-arrow.gif)
Index: mail/themes/qute/mail/mailWindow1.css
===================================================================
RCS file: /cvsroot/mozilla/mail/themes/qute/mail/mailWindow1.css,v
retrieving revision 1.21
diff -u -8 -p -r1.21 mailWindow1.css
--- mail/themes/qute/mail/mailWindow1.css 2 Jul 2007 03:20:32 -0000 1.21
+++ mail/themes/qute/mail/mailWindow1.css 31 Aug 2007 22:15:29 -0000
@@ -145,16 +145,20 @@ treechildren::-moz-tree-image(threadCol,
treechildren::-moz-tree-image(news, threadCol, watch) {
list-style-image: url("chrome://messenger/skin/icons/thread-watched.png");
}
treechildren::-moz-tree-image(news, threadCol, ignore) {
list-style-image: url("chrome://messenger/skin/icons/thread-ignored.png");
}
+treechildren::-moz-tree-image(news, threadCol, prune) {
+ list-style-image: url("chrome://messenger/skin/icons/thread-pruned.png");
+}
+
/* ..... read column ..... */
treecol.readColumnHeader {
list-style-image: url("chrome://messenger/skin/icons/readcol.png");
-moz-padding-end: 5px;
padding-bottom: 5px;
}
Index: mail/themes/qute/mail/icons/thread-pruned.png
===================================================================
RCS file: mail/themes/qute/mail/icons/thread-pruned.png
diff -N mail/themes/qute/mail/icons/thread-pruned.png
Binary files /dev/null and thread-pruned.png differ
Index: mailnews/base/public/nsIMsgDBView.idl
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/public/nsIMsgDBView.idl,v
retrieving revision 1.53
diff -u -8 -p -r1.53 nsIMsgDBView.idl
--- mailnews/base/public/nsIMsgDBView.idl 24 May 2007 20:03:04 -0000 1.53
+++ mailnews/base/public/nsIMsgDBView.idl 31 Aug 2007 22:15:29 -0000
@@ -234,16 +234,18 @@ interface nsMsgNavigationType
*/
const nsMsgNavigationTypeValue forward = 16;
const nsMsgNavigationTypeValue firstFlagged = 17;
const nsMsgNavigationTypeValue nextFlagged = 18;
const nsMsgNavigationTypeValue previousFlagged = 19;
const nsMsgNavigationTypeValue firstNew = 20;
const nsMsgNavigationTypeValue editUndo = 21;
const nsMsgNavigationTypeValue editRedo = 22;
+
+ const nsMsgNavigationTypeValue toggleThreadPruned = 23;
};
[scriptable, uuid(8b3de23c-09c8-484c-9269-d35cf7865b2a)]
interface nsIMsgDBView : nsISupports
{
void open(in nsIMsgFolder folder, in nsMsgViewSortTypeValue sortType, in nsMsgViewSortOrderValue sortOrder, in nsMsgViewFlagsTypeValue viewFlags, out long count);
void openWithHdrs(in nsISimpleEnumerator aHeaders, in nsMsgViewSortTypeValue aSortType,
Index: mailnews/base/public/nsIMsgHdr.idl
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/public/nsIMsgHdr.idl,v
retrieving revision 1.31
diff -u -8 -p -r1.31 nsIMsgHdr.idl
--- mailnews/base/public/nsIMsgHdr.idl 3 Dec 2004 20:16:53 -0000 1.31
+++ mailnews/base/public/nsIMsgHdr.idl 31 Aug 2007 22:15:29 -0000
@@ -59,16 +59,19 @@ interface nsIMsgDBHdr : nsISupports
unsigned long getUint32Property(in string propertyName);
void setUint32Property(in string propertyName,
in unsigned long propertyVal);
// accessors, to make our JS cleaner
readonly attribute boolean isRead;
readonly attribute boolean isFlagged;
+ // Special accessor that checks if a message should be pruned
+ readonly attribute boolean isPruned;
+
// Mark message routines
void markRead(in boolean read);
void markFlagged(in boolean flagged);
void markHasAttachments(in boolean hasAttachments);
attribute nsMsgPriorityValue priority;
void setPriorityString(in string priority);
Index: mailnews/base/resources/content/mail3PaneWindowCommands.js
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/resources/content/mail3PaneWindowCommands.js,v
retrieving revision 1.153
diff -u -8 -p -r1.153 mail3PaneWindowCommands.js
--- mailnews/base/resources/content/mail3PaneWindowCommands.js 26 Jun 2007 23:57:29 -0000 1.153
+++ mailnews/base/resources/content/mail3PaneWindowCommands.js 31 Aug 2007 22:15:29 -0000
@@ -229,16 +229,17 @@ var DefaultController =
return true;
case "cmd_downloadFlagged":
case "cmd_downloadSelected":
case "cmd_synchronizeOffline":
return(CheckOnline());
case "cmd_watchThread":
case "cmd_killThread":
+ case "cmd_pruneThread":
return(isNewsURI(GetFirstSelectedMessage()));
default:
return false;
}
},
isCommandEnabled: function(command)
@@ -264,16 +265,17 @@ var DefaultController =
gDBView.getCommandStatus(nsMsgViewCommandType.deleteNoTrash, enabled, checkStatus);
return enabled.value;
case "button_junk":
UpdateJunkToolbarButton();
if (gDBView)
gDBView.getCommandStatus(nsMsgViewCommandType.junk, enabled, checkStatus);
return enabled.value;
case "cmd_killThread":
+ case "cmd_pruneThread":
return GetNumSelectedMessages() > 0;
case "cmd_watchThread":
if (gDBView)
gDBView.getCommandStatus(nsMsgViewCommandType.toggleThreadWatched, enabled, checkStatus);
return enabled.value;
case "cmd_createFilterFromPopup":
case "cmd_createFilterFromMenu":
var loadedFolder = GetLoadedMsgFolder();
@@ -508,16 +510,19 @@ var DefaultController =
}
SetNextMessageAfterDelete();
gDBView.doCommand(nsMsgViewCommandType.deleteNoTrash);
break;
case "cmd_killThread":
/* kill thread kills the thread and then does a next unread */
GoNextMessage(nsMsgNavigationType.toggleThreadKilled, true);
break;
+ case "cmd_pruneThread":
+ GoNextMessage(nsMsgNavigationType.toggleThreadPruned, true);
+ break;
case "cmd_watchThread":
gDBView.doCommand(nsMsgViewCommandType.toggleThreadWatched);
break;
case "button_next":
case "cmd_nextUnreadMsg":
MsgNextUnreadMessage();
break;
case "cmd_nextUnreadThread":
Index: mailnews/base/resources/content/mailWindowOverlay.js
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/resources/content/mailWindowOverlay.js,v
retrieving revision 1.260
diff -u -8 -p -r1.260 mailWindowOverlay.js
--- mailnews/base/resources/content/mailWindowOverlay.js 13 Aug 2007 09:33:16 -0000 1.260
+++ mailnews/base/resources/content/mailWindowOverlay.js 31 Aug 2007 22:15:30 -0000
@@ -333,16 +333,20 @@ function InitMessageMenu()
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 pruneThreadMenuItem = document.getElementById("pruneThread");
+ if (pruneThreadMenuItem) {
+ pruneThreadMenuItem.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 messages from the folder.
var moveMenu = document.getElementById("moveMenu");
Index: mailnews/base/resources/content/mailWindowOverlay.xul
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/resources/content/mailWindowOverlay.xul,v
retrieving revision 1.335
diff -u -8 -p -r1.335 mailWindowOverlay.xul
--- mailnews/base/resources/content/mailWindowOverlay.xul 29 Aug 2007 15:30:35 -0000 1.335
+++ mailnews/base/resources/content/mailWindowOverlay.xul 31 Aug 2007 22:15:30 -0000
@@ -239,16 +239,17 @@
+
@@ -348,16 +349,17 @@
+
+
Index: mailnews/base/resources/content/messageWindow.js
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/resources/content/messageWindow.js,v
retrieving revision 1.113
diff -u -8 -p -r1.113 messageWindow.js
--- mailnews/base/resources/content/messageWindow.js 26 Jun 2007 23:57:29 -0000 1.113
+++ mailnews/base/resources/content/messageWindow.js 31 Aug 2007 22:15:30 -0000
@@ -611,16 +611,17 @@ var MessageWindowController =
supportsCommand: function(command)
{
switch (command)
{
case "cmd_delete":
case "cmd_undo":
case "cmd_redo":
case "cmd_killThread":
+ case "cmd_pruneThread":
case "cmd_watchThread":
case "button_delete":
case "button_junk":
case "cmd_shiftDelete":
case "cmd_saveAsFile":
case "cmd_saveAsTemplate":
case "cmd_viewPageSource":
case "cmd_getMsgsForAuthAccounts":
Index: mailnews/base/search/public/nsMsgFilterCore.idl
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/search/public/nsMsgFilterCore.idl,v
retrieving revision 1.15
diff -u -8 -p -r1.15 nsMsgFilterCore.idl
--- mailnews/base/search/public/nsMsgFilterCore.idl 14 Aug 2006 04:56:43 -0000 1.15
+++ mailnews/base/search/public/nsMsgFilterCore.idl 31 Aug 2007 22:15:30 -0000
@@ -78,10 +78,11 @@ interface nsMsgFilterAction {
const long Forward=10;
const long StopExecution=11;
const long DeleteFromPop3Server=12;
const long LeaveOnPop3Server=13;
const long JunkScore=14;
const long FetchBodyFromPop3Server=15;
const long CopyToFolder=16;
const long AddTag=17;
+ const long PruneThread=18;
};
Index: mailnews/base/search/resources/content/FilterEditor.js
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/search/resources/content/FilterEditor.js,v
retrieving revision 1.100
diff -u -8 -p -r1.100 FilterEditor.js
--- mailnews/base/search/resources/content/FilterEditor.js 30 Jan 2007 05:45:25 -0000 1.100
+++ mailnews/base/search/resources/content/FilterEditor.js 31 Aug 2007 22:15:30 -0000
@@ -54,17 +54,18 @@ var nsMsgSearchScope = Components.interf
var gPrefBranch;
var gMailSession = null;
var gFilterActionList;
var gFilterActionStrings = ["none", "movemessage", "setpriorityto", "deletemessage",
"markasread", "ignorethread", "watchthread", "markasflagged",
"label", "replytomessage", "forwardmessage", "stopexecution",
"deletefrompopserver", "leaveonpopserver", "setjunkscore",
- "fetchfrompopserver", "copymessage", "addtagtomessage"];
+ "fetchfrompopserver", "copymessage", "addtagtomessage",
+ "prunethread"];
var nsMsgFilterAction = Components.interfaces.nsMsgFilterAction;
var gFilterEditorMsgWindow = null;
function filterEditorOnLoad()
{
initializeSearchWidgets();
Index: mailnews/base/search/resources/content/searchWidgets.xml
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/search/resources/content/searchWidgets.xml,v
retrieving revision 1.16
diff -u -8 -p -r1.16 searchWidgets.xml
--- mailnews/base/search/resources/content/searchWidgets.xml 21 Feb 2007 21:29:25 -0000 1.16
+++ mailnews/base/search/resources/content/searchWidgets.xml 31 Aug 2007 22:15:31 -0000
@@ -75,16 +75,17 @@
+
Index: mailnews/base/search/src/nsMsgFilter.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/search/src/nsMsgFilter.cpp,v
retrieving revision 1.120
diff -u -8 -p -r1.120 nsMsgFilter.cpp
--- mailnews/base/search/src/nsMsgFilter.cpp 6 Aug 2007 18:43:56 -0000 1.120
+++ mailnews/base/search/src/nsMsgFilter.cpp 31 Aug 2007 22:15:31 -0000
@@ -867,16 +867,17 @@ struct RuleActionsTableEntry
static struct RuleActionsTableEntry ruleActionsTable[] =
{
{ nsMsgFilterAction::MoveToFolder, nsMsgFilterType::Inbox, 0, "Move to folder"},
{ nsMsgFilterAction::CopyToFolder, nsMsgFilterType::Inbox, 0, "Copy to folder"},
{ nsMsgFilterAction::ChangePriority, nsMsgFilterType::Inbox, 0, "Change priority"},
{ nsMsgFilterAction::Delete, nsMsgFilterType::All, 0, "Delete"},
{ nsMsgFilterAction::MarkRead, nsMsgFilterType::All, 0, "Mark read"},
{ nsMsgFilterAction::KillThread, nsMsgFilterType::All, 0, "Ignore thread"},
+ { nsMsgFilterAction::PruneThread, nsMsgFilterType::All, 0, "Prune thread"},
{ nsMsgFilterAction::WatchThread, nsMsgFilterType::All, 0, "Watch thread"},
{ nsMsgFilterAction::MarkFlagged, nsMsgFilterType::All, 0, "Mark flagged"},
{ nsMsgFilterAction::Label, nsMsgFilterType::All, 0, "Label"},
{ nsMsgFilterAction::Reply, nsMsgFilterType::All, 0, "Reply"},
{ nsMsgFilterAction::Forward, nsMsgFilterType::All, 0, "Forward"},
{ nsMsgFilterAction::StopExecution, nsMsgFilterType::All, 0, "Stop execution"},
{ nsMsgFilterAction::DeleteFromPop3Server, nsMsgFilterType::Inbox, 0, "Delete from Pop3 server"},
{ nsMsgFilterAction::LeaveOnPop3Server, nsMsgFilterType::Inbox, 0, "Leave on Pop3 server"},
Index: mailnews/base/search/src/nsMsgFilterService.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/search/src/nsMsgFilterService.cpp,v
retrieving revision 1.61
diff -u -8 -p -r1.61 nsMsgFilterService.cpp
--- mailnews/base/search/src/nsMsgFilterService.cpp 12 Jun 2007 04:56:18 -0000 1.61
+++ mailnews/base/search/src/nsMsgFilterService.cpp 31 Aug 2007 22:15:31 -0000
@@ -597,16 +597,29 @@ nsresult nsMsgFilterAfterTheFact::ApplyF
m_curFolderDB->MarkThreadIgnored(msgThread, threadKey, PR_TRUE, nsnull);
else
m_curFolderDB->MarkThreadWatched(msgThread, threadKey, PR_TRUE, nsnull);
}
}
}
}
break;
+ case nsMsgFilterAction::PruneThread:
+ {
+ for (PRUint32 msgIndex = 0; msgIndex < m_searchHits.GetSize(); msgIndex++)
+ {
+ nsCOMPtr msgHdr;
+ m_searchHitHdrs->QueryElementAt(msgIndex, NS_GET_IID(nsIMsgDBHdr), getter_AddRefs(msgHdr));
+ if (msgHdr)
+ {
+ m_curFolderDB->MarkHeaderPruned(msgHdr, PR_TRUE, nsnull);
+ }
+ }
+ }
+ break;
case nsMsgFilterAction::ChangePriority:
{
nsMsgPriorityValue filterPriority;
filterAction->GetPriority(&filterPriority);
for (PRUint32 msgIndex = 0; msgIndex < m_searchHits.GetSize(); msgIndex++)
{
nsCOMPtr msgHdr;
m_searchHitHdrs->QueryElementAt(msgIndex, NS_GET_IID(nsIMsgDBHdr), getter_AddRefs(msgHdr));
Index: mailnews/base/src/nsMsgDBView.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/src/nsMsgDBView.cpp,v
retrieving revision 1.286
diff -u -8 -p -r1.286 nsMsgDBView.cpp
--- mailnews/base/src/nsMsgDBView.cpp 24 Aug 2007 18:05:53 -0000 1.286
+++ mailnews/base/src/nsMsgDBView.cpp 31 Aug 2007 22:15:32 -0000
@@ -84,16 +84,17 @@ nsIAtom * nsMsgDBView::kRepliedMsgAtom =
nsIAtom * nsMsgDBView::kForwardedMsgAtom = nsnull;
nsIAtom * nsMsgDBView::kOfflineMsgAtom = nsnull;
nsIAtom * nsMsgDBView::kFlaggedMsgAtom = nsnull;
nsIAtom * nsMsgDBView::kImapDeletedMsgAtom = nsnull;
nsIAtom * nsMsgDBView::kAttachMsgAtom = nsnull;
nsIAtom * nsMsgDBView::kHasUnreadAtom = nsnull;
nsIAtom * nsMsgDBView::kWatchThreadAtom = nsnull;
nsIAtom * nsMsgDBView::kIgnoreThreadAtom = nsnull;
+nsIAtom * nsMsgDBView::kPruneThreadAtom = nsnull;
nsIAtom * nsMsgDBView::kHasImageAtom = nsnull;
nsIAtom * nsMsgDBView::kJunkMsgAtom = nsnull;
nsIAtom * nsMsgDBView::kNotJunkMsgAtom = nsnull;
nsIAtom * nsMsgDBView::kDummyMsgAtom = nsnull;
nsIAtom * nsMsgDBView::kLabelColorWhiteAtom = nsnull;
nsIAtom * nsMsgDBView::kLabelColorBlackAtom = nsnull;
@@ -192,16 +193,17 @@ void nsMsgDBView::InitializeAtomsAndLite
kForwardedMsgAtom = NS_NewAtom("forwarded");
kOfflineMsgAtom = NS_NewAtom("offline");
kFlaggedMsgAtom = NS_NewAtom("flagged");
kImapDeletedMsgAtom = NS_NewAtom("imapdeleted");
kAttachMsgAtom = NS_NewAtom("attach");
kHasUnreadAtom = NS_NewAtom("hasUnread");
kWatchThreadAtom = NS_NewAtom("watch");
kIgnoreThreadAtom = NS_NewAtom("ignore");
+ kPruneThreadAtom = NS_NewAtom("prune");
kHasImageAtom = NS_NewAtom("hasimage");
kJunkMsgAtom = NS_NewAtom("junk");
kNotJunkMsgAtom = NS_NewAtom("notjunk");
kDummyMsgAtom = NS_NewAtom("dummy");
#ifdef SUPPORT_PRIORITY_COLORS
kHighestPriorityAtom = NS_NewAtom("priority-highest");
kHighPriorityAtom = NS_NewAtom("priority-high");
kLowestPriorityAtom = NS_NewAtom("priority-lowest");
@@ -241,16 +243,17 @@ nsMsgDBView::~nsMsgDBView()
NS_IF_RELEASE(kForwardedMsgAtom);
NS_IF_RELEASE(kOfflineMsgAtom);
NS_IF_RELEASE(kFlaggedMsgAtom);
NS_IF_RELEASE(kImapDeletedMsgAtom);
NS_IF_RELEASE(kAttachMsgAtom);
NS_IF_RELEASE(kHasUnreadAtom);
NS_IF_RELEASE(kWatchThreadAtom);
NS_IF_RELEASE(kIgnoreThreadAtom);
+ NS_IF_RELEASE(kPruneThreadAtom);
NS_IF_RELEASE(kHasImageAtom);
NS_IF_RELEASE(kJunkMsgAtom);
NS_IF_RELEASE(kNotJunkMsgAtom);
NS_IF_RELEASE(kDummyMsgAtom);
#ifdef SUPPORT_PRIORITY_COLORS
NS_IF_RELEASE(kHighestPriorityAtom);
NS_IF_RELEASE(kHighPriorityAtom);
@@ -1181,16 +1184,19 @@ NS_IMETHODIMP nsMsgDBView::GetCellProper
properties->AppendElement(kRepliedMsgAtom);
if (flags & MSG_FLAG_FORWARDED)
properties->AppendElement(kForwardedMsgAtom);
if (flags & MSG_FLAG_NEW)
properties->AppendElement(kNewMsgAtom);
+ if (flags & MSG_FLAG_IGNORED)
+ properties->AppendElement(kPruneThreadAtom);
+
nsCOMPtr localFolder = do_QueryInterface(m_folder);
if ((flags & MSG_FLAG_OFFLINE) || (localFolder && !(flags & MSG_FLAG_PARTIAL)))
properties->AppendElement(kOfflineMsgAtom);
if (flags & MSG_FLAG_ATTACHMENT)
properties->AppendElement(kAttachMsgAtom);
@@ -4693,16 +4699,21 @@ nsresult nsMsgDBView::AddHdr(nsIMsgDBHd
nsCOMPtr thread;
m_db->GetThreadContainingMsgHdr(msgHdr, getter_AddRefs(thread));
if (thread)
{
thread->GetFlags(&flags);
if (flags & MSG_FLAG_IGNORED)
return NS_OK;
}
+
+ PRBool pruned;
+ msgHdr->GetIsPruned(&pruned);
+ if (pruned)
+ return NS_OK;
}
nsMsgKey msgKey, threadId;
nsMsgKey threadParent;
msgHdr->GetMessageKey(&msgKey);
msgHdr->GetThreadId(&threadId);
msgHdr->GetThreadParent(&threadParent);
@@ -4789,16 +4800,21 @@ nsresult nsMsgDBView::ListIdsInThreadOrd
nsCOMPtr supports;
nsCOMPtr msgHdr;
while (NS_SUCCEEDED(rv) && NS_SUCCEEDED(rv = msgEnumerator->HasMoreElements(&hasMore)) && hasMore)
{
rv = msgEnumerator->GetNext(getter_AddRefs(supports));
if (NS_SUCCEEDED(rv) && supports)
{
msgHdr = do_QueryInterface(supports);
+ PRBool pruned;
+ msgHdr->GetIsPruned(&pruned);
+ if (pruned && !(m_viewFlags & nsMsgViewFlagsType::kShowIgnored))
+ continue;
+
nsMsgKey msgKey;
PRUint32 msgFlags, newFlags;
msgHdr->GetMessageKey(&msgKey);
msgHdr->GetFlags(&msgFlags);
AdjustReadFlag(msgHdr, &msgFlags);
m_keys.InsertAt(*viewIndex, msgKey);
// ### TODO - how about hasChildren flag?
m_flags.InsertAt(*viewIndex, msgFlags & ~MSG_VIEW_FLAGS);
@@ -4845,16 +4861,21 @@ nsresult nsMsgDBView::ListIdsInThread(ns
PRUint32 numChildren;
threadHdr->GetNumChildren(&numChildren);
for (i = 1; i < numChildren; i++)
{
nsCOMPtr msgHdr;
threadHdr->GetChildHdrAt(i, getter_AddRefs(msgHdr));
if (msgHdr != nsnull)
{
+ PRBool pruned;
+ msgHdr->GetIsPruned(&pruned);
+ if (pruned && !(m_viewFlags & nsMsgViewFlagsType::kShowIgnored))
+ continue;
+
nsMsgKey msgKey;
PRUint32 msgFlags, newFlags;
msgHdr->GetMessageKey(&msgKey);
msgHdr->GetFlags(&msgFlags);
AdjustReadFlag(msgHdr, &msgFlags);
m_keys.InsertAt(viewIndex, msgKey);
m_flags.InsertAt(viewIndex, msgFlags & ~MSG_VIEW_FLAGS);
// here, we're either flat, or we're grouped - in either case, level is 1
@@ -4920,16 +4941,21 @@ nsresult nsMsgDBView::ListUnreadIdsInThr
threadHdr->GetNumChildren(&numChildren);
PRUint32 i;
for (i = 0; i < numChildren; i++)
{
nsCOMPtr msgHdr;
threadHdr->GetChildHdrAt(i, getter_AddRefs(msgHdr));
if (msgHdr != nsnull)
{
+ PRBool pruned;
+ msgHdr->GetIsPruned(&pruned);
+ if (pruned && !(m_viewFlags & nsMsgViewFlagsType::kShowIgnored))
+ continue;
+
nsMsgKey msgKey;
PRUint32 msgFlags;
msgHdr->GetMessageKey(&msgKey);
msgHdr->GetFlags(&msgFlags);
PRBool isRead = AdjustReadFlag(msgHdr, &msgFlags);
// determining the level is going to be tricky, since we're not storing the
// level in the db anymore. It will mean looking up the view for each of the
// ancestors of the current msg until we find one in the view. I guess we could
@@ -5440,16 +5466,33 @@ nsresult nsMsgDBView::NavigateFromPos(ns
}
else
{
*pResultIndex = nsMsgViewIndex_None;
*pResultKey = nsMsgKey_None;
return NS_OK;
}
}
+ case nsMsgNavigationType::toggleThreadPruned:
+ {
+ PRBool resultPruned;
+ nsUInt32Array selection;
+ GetSelectedIndices(&selection);
+ TogglePruned(selection.GetData(), selection.GetSize(), &threadIndex, &resultPruned);
+ if (resultPruned)
+ {
+ return NavigateFromPos(nsMsgNavigationType::nextUnreadMessage, threadIndex, pResultKey, pResultIndex, pThreadIndex, PR_TRUE);
+ }
+ else
+ {
+ *pResultIndex = nsMsgViewIndex_None;
+ *pResultKey = nsMsgKey_None;
+ return NS_OK;
+ }
+ }
// check where navigate says this will take us. If we have the message in the view,
// return it. Otherwise, return an error.
case nsMsgNavigationType::back:
case nsMsgNavigationType::forward:
{
nsCString folderUri, msgUri;
nsCString viewFolderUri;
nsCOMPtr curFolder = m_viewFolder ? m_viewFolder : m_folder;
@@ -5763,16 +5806,53 @@ nsresult nsMsgDBView::ToggleIgnored(nsMs
if (resultIndex)
*resultIndex = threadIndex;
if (resultToggleState)
*resultToggleState = !ignored;
return NS_OK;
}
+nsresult nsMsgDBView::TogglePruned(nsMsgViewIndex * indices, PRInt32 numIndices, nsMsgViewIndex *resultIndex, PRBool *resultToggleState)
+{
+ nsCOMPtr header;
+ nsresult rv;
+
+ // Ignored state is toggled based on the first selected thread
+ if (numIndices > 1)
+ NS_QuickSort(indices, numIndices, sizeof(nsMsgViewIndex), CompareViewIndices, nsnull);
+ rv = GetMsgHdrForViewIndex(indices[0], getter_AddRefs(header));
+ PRUint32 msgFlags;
+ header->GetFlags(&msgFlags);
+ PRUint32 ignored = msgFlags & MSG_FLAG_IGNORED;
+
+ // Process threads in reverse order
+ // Otherwise collapsing the threads will invalidate the indices
+ nsMsgViewIndex msgIndex = nsMsgViewIndex_None;
+ while (numIndices)
+ {
+ numIndices--;
+ if (indices[numIndices] < msgIndex)
+ {
+ msgIndex = indices[numIndices];
+ rv = GetMsgHdrForViewIndex(msgIndex, getter_AddRefs(header));
+ header->GetFlags(&msgFlags);
+ if ((msgFlags & MSG_FLAG_IGNORED) == ignored)
+ SetThreadPruned(header, msgIndex, !ignored);
+ }
+ }
+
+ if (resultIndex)
+ *resultIndex = msgIndex;
+ if (resultToggleState)
+ *resultToggleState = !ignored;
+
+ return NS_OK;
+}
+
nsMsgViewIndex nsMsgDBView::GetThreadFromMsgIndex(nsMsgViewIndex index,
nsIMsgThread **threadHdr)
{
nsMsgKey msgKey = GetAt(index);
nsMsgViewIndex threadIndex;
NS_ENSURE_ARG(threadHdr);
nsresult rv = GetThreadContainingIndex(index, threadHdr);
@@ -5831,16 +5911,66 @@ nsresult nsMsgDBView::SetThreadIgnored(n
nsMsgKeyArray idsMarkedRead;
MarkThreadRead(thread, threadIndex, idsMarkedRead, PR_TRUE);
CollapseByIndex(threadIndex, nsnull);
}
return m_db->MarkThreadIgnored(thread, m_keys[threadIndex], ignored, this);
}
+nsresult nsMsgDBView::SetThreadPruned(nsIMsgDBHdr *header, nsMsgViewIndex msgIndex, PRBool ignored)
+{
+ if (!IsValidIndex(msgIndex))
+ return NS_MSG_INVALID_DBVIEW_INDEX;
+
+ NoteChange(msgIndex, 1, nsMsgViewNotificationCode::changed);
+ nsresult rv;
+
+ rv = m_db->MarkHeaderPruned(header, ignored, this);
+ NS_ENSURE_SUCCESS(rv,rv);
+
+ if (ignored)
+ {
+ nsCOMPtr thread;
+ nsresult rv;
+ rv = m_db->GetThreadContainingMsgHdr(header,getter_AddRefs(thread));
+ if (NS_FAILED(rv))
+ return NS_OK; // So we didn't mark threads read
+
+ PRUint32 children, current;
+ thread->GetNumChildren(&children);
+
+ nsMsgKey headKey;
+ header->GetMessageKey(&headKey);
+
+ for (current=0; current < children; current++)
+ {
+ nsMsgKey newKey;
+ thread->GetChildKeyAt(current,&newKey);
+ if (newKey == headKey)
+ break;
+ }
+
+ for (; current < children; current++)
+ {
+ nsCOMPtr nextHdr;
+ PRBool isPruned;
+
+ thread->GetChildHdrAt(current, getter_AddRefs(nextHdr));
+ nextHdr->GetIsPruned(&isPruned);
+
+ // Ideally, the messages should stop processing here.
+ // However, the children are ordered not by thread...
+ if (isPruned)
+ nextHdr->MarkRead(PR_TRUE);
+ }
+ }
+ return NS_OK;
+}
+
nsresult nsMsgDBView::SetThreadWatched(nsIMsgThread *thread, nsMsgViewIndex index, PRBool watched)
{
if (!IsValidIndex(index))
return NS_MSG_INVALID_DBVIEW_INDEX;
NoteChange(index, 1, nsMsgViewNotificationCode::changed);
return m_db->MarkThreadWatched(thread, m_keys[index], watched, this);
}
Index: mailnews/base/src/nsMsgDBView.h
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/src/nsMsgDBView.h,v
retrieving revision 1.99
diff -u -8 -p -r1.99 nsMsgDBView.h
--- mailnews/base/src/nsMsgDBView.h 15 Aug 2007 00:44:08 -0000 1.99
+++ mailnews/base/src/nsMsgDBView.h 31 Aug 2007 22:15:32 -0000
@@ -135,16 +135,17 @@ protected:
static nsIAtom* kForwardedMsgAtom;
static nsIAtom* kOfflineMsgAtom;
static nsIAtom* kFlaggedMsgAtom;
static nsIAtom* kImapDeletedMsgAtom;
static nsIAtom* kAttachMsgAtom;
static nsIAtom* kHasUnreadAtom;
static nsIAtom* kWatchThreadAtom;
static nsIAtom* kIgnoreThreadAtom;
+ static nsIAtom* kPruneThreadAtom;
static nsIAtom* kHasImageAtom;
#ifdef SUPPORT_PRIORITY_COLORS
static nsIAtom* kHighestPriorityAtom;
static nsIAtom* kHighPriorityAtom;
static nsIAtom* kLowestPriorityAtom;
static nsIAtom* kLowPriorityAtom;
#endif
@@ -295,16 +296,17 @@ protected:
nsresult AndExtraFlag(nsMsgViewIndex index, PRUint32 andflag);
nsresult SetExtraFlag(nsMsgViewIndex index, PRUint32 extraflag);
virtual nsresult RemoveByIndex(nsMsgViewIndex index);
virtual void OnExtraFlagChanged(nsMsgViewIndex /*index*/, PRUint32 /*extraFlag*/) {}
virtual void OnHeaderAddedOrDeleted() {}
nsresult ToggleWatched( nsMsgViewIndex* indices, PRInt32 numIndices);
nsresult SetThreadWatched(nsIMsgThread *thread, nsMsgViewIndex index, PRBool watched);
nsresult SetThreadIgnored(nsIMsgThread *thread, nsMsgViewIndex threadIndex, PRBool ignored);
+ nsresult SetThreadPruned(nsIMsgDBHdr *header, nsMsgViewIndex msgIndex, PRBool ignored);
nsresult DownloadForOffline(nsIMsgWindow *window, nsMsgViewIndex *indices, PRInt32 numIndices);
nsresult DownloadFlaggedForOffline(nsIMsgWindow *window);
nsMsgViewIndex GetThreadFromMsgIndex(nsMsgViewIndex index, nsIMsgThread **threadHdr);
// for sorting
nsresult GetFieldTypeAndLenForSort(nsMsgViewSortTypeValue sortType, PRUint16 *pMaxLen, eFieldType *pFieldType);
nsresult GetCollationKey(nsIMsgDBHdr *msgHdr, nsMsgViewSortTypeValue sortType, PRUint8 **result,
PRUint32 *len, nsIMsgCustomColumnHandler* colHandler = nsnull);
@@ -326,16 +328,17 @@ protected:
nsresult FindFirstNew(nsMsgViewIndex *pResultIndex);
nsresult FindPrevUnread(nsMsgKey startKey, nsMsgKey *pResultKey, nsMsgKey *resultThreadId);
nsresult FindFirstFlagged(nsMsgViewIndex *pResultIndex);
nsresult FindPrevFlagged(nsMsgViewIndex startIndex, nsMsgViewIndex *pResultIndex);
nsresult MarkThreadOfMsgRead(nsMsgKey msgId, nsMsgViewIndex msgIndex, nsMsgKeyArray &idsMarkedRead, PRBool bRead);
nsresult MarkThreadRead(nsIMsgThread *threadHdr, nsMsgViewIndex threadIndex, nsMsgKeyArray &idsMarkedRead, PRBool bRead);
PRBool IsValidIndex(nsMsgViewIndex index);
nsresult ToggleIgnored(nsMsgViewIndex * indices, PRInt32 numIndices, nsMsgViewIndex *resultIndex, PRBool *resultToggleState);
+ nsresult TogglePruned(nsMsgViewIndex * indices, PRInt32 numIndices, nsMsgViewIndex *resultIndex, PRBool *resultToggleState);
PRBool OfflineMsgSelected(nsMsgViewIndex * indices, PRInt32 numIndices);
PRBool NonDummyMsgSelected(nsMsgViewIndex * indices, PRInt32 numIndices);
PRUnichar * GetString(const PRUnichar *aStringName);
nsresult GetPrefLocalizedString(const char *aPrefName, nsString& aResult);
nsresult GetLabelPrefStringAndAtom(const char *aPrefName, nsString& aColor, nsIAtom** aColorAtom);
nsresult AppendKeywordProperties(const char *keywords, nsISupportsArray *properties, PRBool addSelectedTextProperty);
nsresult InitLabelStrings(void);
nsresult CopyDBView(nsMsgDBView *aNewMsgDBView, nsIMessenger *aMessengerInstance, nsIMsgWindow *aMsgWindow, nsIMsgDBViewCommandUpdater *aCmdUpdater);
Index: mailnews/base/src/nsMsgGroupThread.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/src/nsMsgGroupThread.cpp,v
retrieving revision 1.11
diff -u -8 -p -r1.11 nsMsgGroupThread.cpp
--- mailnews/base/src/nsMsgGroupThread.cpp 29 May 2007 22:19:47 -0000 1.11
+++ mailnews/base/src/nsMsgGroupThread.cpp 31 Aug 2007 22:15:32 -0000
@@ -201,17 +201,17 @@ nsresult nsMsgGroupThread::AddChildFromG
nsMsgKey newHdrKey = 0;
child->GetFlags(&newHdrFlags);
child->GetMessageKey(&newHdrKey);
child->GetDateInSeconds(&msgDate);
if (msgDate > m_newestMsgDate)
SetNewestMsgDate(msgDate);
- child->AndFlags(~(MSG_FLAG_WATCHED | MSG_FLAG_IGNORED), &newHdrFlags);
+ child->AndFlags(~(MSG_FLAG_WATCHED), &newHdrFlags);
PRUint32 numChildren;
// get the num children before we add the new header.
GetNumChildren(&numChildren);
// if this is an empty thread, set the root key to this header's key
if (numChildren == 0)
m_threadRootKey = newHdrKey;
Index: mailnews/base/src/nsMsgThreadedDBView.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/base/src/nsMsgThreadedDBView.cpp,v
retrieving revision 1.74
diff -u -8 -p -r1.74 nsMsgThreadedDBView.cpp
--- mailnews/base/src/nsMsgThreadedDBView.cpp 5 Oct 2005 18:22:51 -0000 1.74
+++ mailnews/base/src/nsMsgThreadedDBView.cpp 31 Aug 2007 22:15:32 -0000
@@ -244,16 +244,25 @@ nsresult nsMsgThreadedDBView::AddKeys(ns
for (PRInt32 i = 0; i < numKeysToAdd; i++)
{
PRInt32 threadFlag = pFlags[i];
PRInt32 flag = threadFlag;
// skip ignored threads.
if ((threadFlag & MSG_FLAG_IGNORED) && !(m_viewFlags & nsMsgViewFlagsType::kShowIgnored))
continue;
+
+ // skip ignored subthreads
+ nsCOMPtr msgHdr;
+ PRBool pruned;
+ m_db->GetMsgHdrForKey(pKeys[i], getter_AddRefs(msgHdr));
+ msgHdr->GetIsPruned(&pruned);
+ if (pruned && !(m_viewFlags & nsMsgViewFlagsType::kShowIgnored))
+ continue;
+
// by default, make threads collapsed, unless we're in only viewing new msgs
if (flag & MSG_VIEW_FLAG_HASCHILDREN)
flag |= MSG_FLAG_ELIDED;
// should this be persistent? Doesn't seem to need to be.
flag |= MSG_VIEW_FLAG_ISTHREAD;
m_keys.Add(pKeys[i]);
m_flags.Add(flag);
@@ -454,17 +463,17 @@ nsresult nsMsgThreadedDBView::ListThread
nsMsgKey msgKey;
msgHdr->GetMessageKey(&msgKey);
msgHdr->GetFlags(&msgFlags);
// turn off high byte of msg flags - used for view flags.
msgFlags &= ~MSG_VIEW_FLAGS;
pOutput[numListed] = msgKey;
pLevels[numListed] = 0;
// turn off these flags on msg hdr - they belong in thread
- msgHdr->AndFlags(~(MSG_FLAG_WATCHED | MSG_FLAG_IGNORED), &newMsgFlags);
+ msgHdr->AndFlags(~(MSG_FLAG_WATCHED), &newMsgFlags);
AdjustReadFlag(msgHdr, &msgFlags);
// try adding in MSG_VIEW_FLAG_ISTHREAD flag for unreadonly view.
pFlags[numListed] = msgFlags | MSG_VIEW_FLAG_ISTHREAD | threadFlags;
if (numChildren > 1)
pFlags[numListed] |= MSG_VIEW_FLAG_HASCHILDREN;
numListed++;
}
@@ -715,18 +724,20 @@ nsMsgViewIndex nsMsgThreadedDBView::GetI
}
return parentIndex;
}
nsresult nsMsgThreadedDBView::AddMsgToThreadNotInView(nsIMsgThread *threadHdr, nsIMsgDBHdr *msgHdr, PRBool ensureListed)
{
nsresult rv = NS_OK;
PRUint32 threadFlags;
+ PRBool msgPruned;
threadHdr->GetFlags(&threadFlags);
- if (!(threadFlags & MSG_FLAG_IGNORED))
+ msgHdr->GetIsPruned(&msgPruned);
+ if (!(threadFlags & MSG_FLAG_IGNORED) && !msgPruned)
rv = AddHdr(msgHdr);
return rv;
}
// This method just removes the specified line from the view. It does
// NOT delete it from the database.
nsresult nsMsgThreadedDBView::RemoveByIndex(nsMsgViewIndex index)
{
Index: mailnews/db/msgdb/public/nsIMsgDatabase.idl
===================================================================
RCS file: /cvsroot/mozilla/mailnews/db/msgdb/public/nsIMsgDatabase.idl,v
retrieving revision 1.50
diff -u -8 -p -r1.50 nsIMsgDatabase.idl
--- mailnews/db/msgdb/public/nsIMsgDatabase.idl 25 Apr 2007 03:24:58 -0000 1.50
+++ mailnews/db/msgdb/public/nsIMsgDatabase.idl 31 Aug 2007 22:15:32 -0000
@@ -199,16 +199,18 @@ interface nsIMsgDatabase : nsIDBChangeA
[noscript] void MarkThreadRead(in nsIMsgThread thread,
in nsIDBChangeListener instigator, in nsMsgKeyArrayPtr thoseMarked);
void MarkThreadIgnored(in nsIMsgThread thread, in nsMsgKey threadKey, in boolean bIgnored,
in nsIDBChangeListener instigator);
void MarkThreadWatched(in nsIMsgThread thread, in nsMsgKey threadKey, in boolean bWatched,
in nsIDBChangeListener instigator);
+ void MarkHeaderPruned(in nsIMsgDBHdr msg, in boolean bIgnored,
+ in nsIDBChangeListener instigator);
boolean IsRead(in nsMsgKey key);
boolean IsIgnored(in nsMsgKey key);
boolean IsMarked(in nsMsgKey key);
boolean HasAttachments(in nsMsgKey key);
[noscript] void MarkAllRead(in nsMsgKeyArrayPtr thoseMarked);
Index: mailnews/db/msgdb/src/nsMsgDatabase.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/db/msgdb/src/nsMsgDatabase.cpp,v
retrieving revision 1.388
diff -u -8 -p -r1.388 nsMsgDatabase.cpp
--- mailnews/db/msgdb/src/nsMsgDatabase.cpp 14 Aug 2007 21:12:32 -0000 1.388
+++ mailnews/db/msgdb/src/nsMsgDatabase.cpp 31 Aug 2007 22:15:33 -0000
@@ -2117,16 +2117,34 @@ nsMsgDatabase::MarkThreadIgnored(nsIMsgT
nsCOMPtr msg;
nsresult rv = GetMsgHdrForKey(threadKey, getter_AddRefs(msg));
NS_ENSURE_SUCCESS(rv, rv);
return NotifyHdrChangeAll(msg, oldThreadFlags, threadFlags, instigator);
}
NS_IMETHODIMP
+nsMsgDatabase::MarkHeaderPruned(nsIMsgDBHdr *msg, PRBool bIgnored,
+ nsIDBChangeListener *instigator)
+{
+ PRUint32 msgFlags;
+ msg->GetFlags(&msgFlags);
+ PRUint32 oldFlags = msgFlags;
+ if (bIgnored)
+ {
+ msgFlags |= MSG_FLAG_IGNORED;
+ }
+ else
+ msgFlags &= ~MSG_FLAG_IGNORED;
+ msg->SetFlags(msgFlags);
+
+ return NotifyHdrChangeAll(msg, oldFlags, msgFlags, instigator);
+}
+
+NS_IMETHODIMP
nsMsgDatabase::MarkThreadWatched(nsIMsgThread *thread, nsMsgKey threadKey, PRBool bWatched,
nsIDBChangeListener *instigator)
{
NS_ENSURE_ARG(thread);
PRUint32 threadFlags;
thread->GetFlags(&threadFlags);
PRUint32 oldThreadFlags = threadFlags; // not quite right, since we probably want msg hdr flags.
if (bWatched)
Index: mailnews/db/msgdb/src/nsMsgHdr.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/db/msgdb/src/nsMsgHdr.cpp,v
retrieving revision 1.122
diff -u -8 -p -r1.122 nsMsgHdr.cpp
--- mailnews/db/msgdb/src/nsMsgHdr.cpp 6 Aug 2007 18:43:56 -0000 1.122
+++ mailnews/db/msgdb/src/nsMsgHdr.cpp 31 Aug 2007 22:15:33 -0000
@@ -198,25 +198,25 @@ NS_IMETHODIMP nsMsgHdr::GetFlags(PRUint3
{
if (!(m_initedValues & FLAGS_INITED))
InitFlags();
if (m_mdb)
*result = m_mdb->GetStatusFlags(this, m_flags);
else
*result = m_flags;
#ifdef DEBUG_bienvenu
- NS_ASSERTION(! (*result & (MSG_FLAG_ELIDED | MSG_FLAG_IGNORED)), "shouldn't be set in db");
+ NS_ASSERTION(! (*result & (MSG_FLAG_ELIDED)), "shouldn't be set in db");
#endif
return NS_OK;
}
NS_IMETHODIMP nsMsgHdr::SetFlags(PRUint32 flags)
{
#ifdef DEBUG_bienvenu
- NS_ASSERTION(! (flags & (MSG_FLAG_ELIDED | MSG_FLAG_IGNORED)), "shouldn't set this flag on db");
+ NS_ASSERTION(! (flags & (MSG_FLAG_ELIDED)), "shouldn't set this flag on db");
#endif
m_initedValues |= FLAGS_INITED;
m_flags = flags;
// don't write out MSG_FLAG_NEW to MDB.
return SetUInt32Column(m_flags & ~MSG_FLAG_NEW, m_mdb->m_flagsColumnToken);
}
NS_IMETHODIMP nsMsgHdr::OrFlags(PRUint32 flags, PRUint32 *result)
@@ -717,16 +717,18 @@ NS_IMETHODIMP nsMsgHdr::SetThreadParent(
return NS_OK;
}
NS_IMETHODIMP nsMsgHdr::GetThreadParent(nsMsgKey *result)
{
nsresult res;
if(!(m_initedValues & THREAD_PARENT_INITED))
{
+ if (!(m_initedValues & FLAGS_INITED))
+ InitFlags();
res = GetUInt32Column(m_mdb->m_threadParentColumnToken, &m_threadParent, nsMsgKey_None);
if (NS_SUCCEEDED(res))
m_initedValues |= THREAD_PARENT_INITED;
}
*result = m_threadParent;
return NS_OK;
}
@@ -849,8 +851,33 @@ NS_IMETHODIMP nsMsgHdr::GetIsRead(PRBool
NS_IMETHODIMP nsMsgHdr::GetIsFlagged(PRBool *isFlagged)
{
NS_ENSURE_ARG_POINTER(isFlagged);
if (!(m_initedValues & FLAGS_INITED))
InitFlags();
*isFlagged = m_flags & MSG_FLAG_MARKED;
return NS_OK;
}
+
+NS_IMETHODIMP nsMsgHdr::GetIsPruned(PRBool *isPruned)
+{
+ NS_ENSURE_ARG_POINTER(isPruned);
+ if (!(m_initedValues & FLAGS_INITED))
+ InitFlags();
+ *isPruned = m_flags & MSG_FLAG_IGNORED;
+
+ if (!*isPruned)
+ {
+ nsMsgKey threadParent;
+ GetThreadParent(&threadParent);
+
+ if (threadParent != nsMsgKey_None)
+ {
+ nsCOMPtr parentHdr;
+ (void) m_mdb->GetMsgHdrForKey(threadParent, getter_AddRefs(parentHdr));
+
+ if (!parentHdr)
+ return NS_OK;
+ parentHdr->GetIsPruned(isPruned);
+ }
+ }
+ return NS_OK;
+}
Index: mailnews/db/msgdb/src/nsMsgThread.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/db/msgdb/src/nsMsgThread.cpp,v
retrieving revision 1.89
diff -u -8 -p -r1.89 nsMsgThread.cpp
--- mailnews/db/msgdb/src/nsMsgThread.cpp 6 Aug 2007 18:43:56 -0000 1.89
+++ mailnews/db/msgdb/src/nsMsgThread.cpp 31 Aug 2007 22:15:33 -0000
@@ -231,23 +231,20 @@ NS_IMETHODIMP nsMsgThread::AddChild(nsIM
nsIMdbRow *hdrRow = hdr->GetMDBRow();
hdr->GetRawFlags(&newHdrFlags);
hdr->GetMessageKey(&newHdrKey);
hdr->GetDateInSeconds(&msgDate);
if (msgDate > m_newestMsgDate)
SetNewestMsgDate(msgDate);
- if (newHdrFlags & MSG_FLAG_IGNORED)
- SetFlags(m_flags | MSG_FLAG_IGNORED);
-
if (newHdrFlags & MSG_FLAG_WATCHED)
SetFlags(m_flags | MSG_FLAG_WATCHED);
- child->AndFlags(~(MSG_FLAG_WATCHED | MSG_FLAG_IGNORED), &newHdrFlags);
+ child->AndFlags(~(MSG_FLAG_WATCHED), &newHdrFlags);
PRUint32 numChildren;
PRUint32 childIndex = 0;
// get the num children before we add the new header.
GetNumChildren(&numChildren);
// if this is an empty thread, set the root key to this header's key
if (numChildren == 0)
@@ -389,17 +386,19 @@ NS_IMETHODIMP nsMsgThread::AddChild(nsIM
// Move child to keep thread sorted in ascending date order
if (!hdrMoved && moveIndex > 0)
{
mdb_pos outPos;
m_mdbTable->MoveRow(m_mdbDB->GetEnv(), hdrRow, -1, moveIndex, &outPos);
}
// do this after we've put the new hdr in the thread
- if (m_flags & MSG_FLAG_IGNORED && m_mdbDB)
+ PRBool isPruned;
+ child->GetIsPruned(&isPruned);
+ if (m_flags & MSG_FLAG_IGNORED && m_mdbDB && isPruned)
m_mdbDB->MarkHdrRead(child, PR_TRUE, nsnull);
#ifdef DEBUG_bienvenu1
nsMsgDatabase *msgDB = static_cast(m_mdbDB);
msgDB->DumpThread(m_threadRootKey);
#endif
return rv;
}
Index: mailnews/imap/src/nsImapMailFolder.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/imap/src/nsImapMailFolder.cpp,v
retrieving revision 1.786
diff -u -8 -p -r1.786 nsImapMailFolder.cpp
--- mailnews/imap/src/nsImapMailFolder.cpp 14 Aug 2007 20:25:54 -0000 1.786
+++ mailnews/imap/src/nsImapMailFolder.cpp 31 Aug 2007 22:15:34 -0000
@@ -3170,18 +3170,27 @@ NS_IMETHODIMP nsImapMailFolder::ApplyFil
{
nsMsgKeyArray keysToFlag;
keysToFlag.Add(msgKey);
mDatabase->MarkHdrMarked(msgHdr, PR_TRUE, nsnull);
StoreImapFlags(kImapMsgFlaggedFlag, PR_TRUE, keysToFlag.GetArray(), keysToFlag.GetSize(), nsnull);
}
break;
case nsMsgFilterAction::KillThread:
- // The db will check for this flag when a hdr gets added to the db, and set the flag appropriately on the thread object
- msgHdr->OrFlags(MSG_FLAG_IGNORED, &newFlags);
+ {
+ nsCOMPtr thread;
+ PRUint32 threadFlags;
+ mDatabase->GetThreadContainingMsgHdr(msgHdr,getter_AddRefs(thread));
+ thread->GetFlags(&threadFlags);
+ threadFlags |= MSG_FLAG_IGNORED;
+ thread->SetFlags(threadFlags);
+ break;
+ }
+ case nsMsgFilterAction::PruneThread:
+ msgHdr->OrFlags(MSG_FLAG_WATCHED, &newFlags);
break;
case nsMsgFilterAction::WatchThread:
msgHdr->OrFlags(MSG_FLAG_WATCHED, &newFlags);
break;
case nsMsgFilterAction::ChangePriority:
{
nsMsgPriorityValue filterPriority;
filterAction->GetPriority(&filterPriority);
Index: mailnews/local/src/nsParseMailbox.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/local/src/nsParseMailbox.cpp,v
retrieving revision 1.292
diff -u -8 -p -r1.292 nsParseMailbox.cpp
--- mailnews/local/src/nsParseMailbox.cpp 6 Aug 2007 18:43:57 -0000 1.292
+++ mailnews/local/src/nsParseMailbox.cpp 31 Aug 2007 22:15:35 -0000
@@ -1924,18 +1924,27 @@ NS_IMETHODIMP nsParseNewMailState::Apply
}
}
break;
case nsMsgFilterAction::MarkRead:
msgIsNew = PR_FALSE;
MarkFilteredMessageRead(msgHdr);
break;
case nsMsgFilterAction::KillThread:
- // The db will check for this flag when a hdr gets added to the db, and set the flag appropriately on the thread object
- msgHdr->OrFlags(MSG_FLAG_IGNORED, &newFlags);
+ {
+ nsCOMPtr thread;
+ PRUint32 threadFlags;
+ m_mailDB->GetThreadContainingMsgHdr(msgHdr,getter_AddRefs(thread));
+ thread->GetFlags(&threadFlags);
+ threadFlags |= MSG_FLAG_IGNORED;
+ thread->SetFlags(threadFlags);
+ break;
+ }
+ case nsMsgFilterAction::PruneThread:
+ msgHdr->OrFlags(MSG_FLAG_WATCHED, &newFlags);
break;
case nsMsgFilterAction::WatchThread:
msgHdr->OrFlags(MSG_FLAG_WATCHED, &newFlags);
break;
case nsMsgFilterAction::MarkFlagged:
msgHdr->MarkFlagged(PR_TRUE);
break;
case nsMsgFilterAction::ChangePriority:
Index: mailnews/news/src/nsNNTPNewsgroupList.cpp
===================================================================
RCS file: /cvsroot/mozilla/mailnews/news/src/nsNNTPNewsgroupList.cpp,v
retrieving revision 1.137
diff -u -8 -p -r1.137 nsNNTPNewsgroupList.cpp
--- mailnews/news/src/nsNNTPNewsgroupList.cpp 14 Jun 2007 03:14:51 -0000 1.137
+++ mailnews/news/src/nsNNTPNewsgroupList.cpp 31 Aug 2007 22:15:35 -0000
@@ -786,17 +786,26 @@ NS_IMETHODIMP nsNNTPNewsgroupList::Apply
m_addHdrToDB = PR_FALSE;
break;
case nsMsgFilterAction::MarkRead:
m_newsDB->MarkHdrRead(m_newMsgHdr, PR_TRUE, nsnull);
break;
case nsMsgFilterAction::KillThread:
{
PRUint32 newFlags;
- // The db will check for this flag when a hdr gets added to the db, and set the flag appropriately on the thread object
+ nsCOMPtr < nsIMsgThread > thread;
+ m_newsDB->GetThreadContainingMsgHdr(m_newMsgHdr, getter_AddRefs(thread) );
+ thread->GetFlags(&newFlags);
+ newFlags |= MSG_FLAG_IGNORED;
+ thread->SetFlags(newFlags);
+ }
+ break;
+ case nsMsgFilterAction::PruneThread:
+ {
+ PRUint32 newFlags;
m_newMsgHdr->OrFlags(MSG_FLAG_IGNORED, &newFlags);
}
break;
case nsMsgFilterAction::WatchThread:
{
PRUint32 newFlags;
m_newMsgHdr->OrFlags(MSG_FLAG_WATCHED, &newFlags);
}