From 7841f2f822b87edda9cb5c6c02c54ba47b080509 Mon Sep 17 00:00:00 2001 From: "sspitzer%netscape.com" Date: Tue, 9 Oct 2001 23:40:23 +0000 Subject: [PATCH] fix for #19254. propagate unread state of subfolders to parents if the parent is closed. r/sr=bienvenu --- .../base/resources/content/folderPane.xul | 10 ++- mailnews/base/src/nsMsgFolderDataSource.cpp | 88 ++++++++++++------- mailnews/base/src/nsMsgFolderDataSource.h | 22 +++-- themes/classic/messenger/mac/folderPane.css | 5 ++ themes/classic/messenger/win/folderPane.css | 5 ++ themes/modern/messenger/folderPane.css | 5 ++ 6 files changed, 87 insertions(+), 48 deletions(-) diff --git a/mailnews/base/resources/content/folderPane.xul b/mailnews/base/resources/content/folderPane.xul index 0a7c82ac0848..a4c594064d57 100644 --- a/mailnews/base/resources/content/folderPane.xul +++ b/mailnews/base/resources/content/folderPane.xul @@ -73,6 +73,9 @@ + @@ -100,15 +103,18 @@ isServer-?isServer newMessages-?newMessages hasUnreadMessages-?hasUnreadMessages + subfoldersHaveUnreadMessages-?subfoldersHaveUnreadMessages isSecure-?isSecure serverType-?serverType noSelect-?noSelect"/> + properties="hasUnreadMessages-?hasUnreadMessages + subfoldersHaveUnreadMessages-?subfoldersHaveUnreadMessages"/> + properties="hasUnreadMessages-?hasUnreadMessages + subfoldersHaveUnreadMessages-?subfoldersHaveUnreadMessages"/> diff --git a/mailnews/base/src/nsMsgFolderDataSource.cpp b/mailnews/base/src/nsMsgFolderDataSource.cpp index 4eaf6ff7403e..0c351445ca3e 100644 --- a/mailnews/base/src/nsMsgFolderDataSource.cpp +++ b/mailnews/base/src/nsMsgFolderDataSource.cpp @@ -1021,11 +1021,11 @@ nsresult nsMsgFolderDataSource::createFolderNode(nsIMsgFolder* folder, else if ((kNC_BiffState == property)) rv = createBiffStateNodeFromFolder(folder, target); else if ((kNC_HasUnreadMessages == property)) - rv = createHasUnreadMessagesNode(folder, target); + rv = createHasUnreadMessagesNode(folder, PR_FALSE, target); else if ((kNC_NewMessages == property)) rv = createNewMessagesNode(folder, target); else if ((kNC_SubfoldersHaveUnreadMessages == property)) - rv = createSubfoldersHaveUnreadMessagesNode(folder, target); + rv = createHasUnreadMessagesNode(folder, PR_TRUE, target); else if ((kNC_Child == property)) rv = createFolderChildNode(folder, target); else if ((kNC_NoSelect == property)) @@ -1565,29 +1565,29 @@ nsMsgFolderDataSource::createUnreadMessagesNode(nsIMsgFolder *folder, } nsresult -nsMsgFolderDataSource::createHasUnreadMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target) +nsMsgFolderDataSource::createHasUnreadMessagesNode(nsIMsgFolder *folder, PRBool aIncludeSubfolders, nsIRDFNode **target) { + nsresult rv; - nsresult rv; + PRBool isServer; + rv = folder->GetIsServer(&isServer); + if (NS_FAILED(rv)) return rv; - PRBool isServer; - rv = folder->GetIsServer(&isServer); - if (NS_FAILED(rv)) return rv; + *target = kFalseLiteral; - *target = kFalseLiteral; + PRInt32 totalUnreadMessages; + if(!isServer) + { + rv = folder->GetNumUnread(aIncludeSubfolders, &totalUnreadMessages); + if(NS_FAILED(rv)) return rv; + if(totalUnreadMessages > 0) + *target = kTrueLiteral; + else + *target = kFalseLiteral; + } - PRInt32 totalUnreadMessages; - if(!isServer) - { - rv = folder->GetNumUnread(PR_FALSE, &totalUnreadMessages); - if(NS_FAILED(rv)) return rv; - if(totalUnreadMessages > 0) - *target = kTrueLiteral; - else - *target = kFalseLiteral; - } - NS_IF_ADDREF(*target); - return NS_OK; + NS_IF_ADDREF(*target); + return NS_OK; } nsresult @@ -1603,18 +1603,15 @@ nsMsgFolderDataSource::OnUnreadMessagePropertyChanged(nsIMsgFolder *folder, PRIn NotifyPropertyChanged(folderResource, kNC_TotalUnreadMessages, newNode); //Now see if hasUnreadMessages has changed - nsCOMPtr oldHasUnreadMessages; - nsCOMPtr newHasUnreadMessages; if(oldValue <=0 && newValue >0) { - oldHasUnreadMessages = kFalseLiteral; - newHasUnreadMessages = kTrueLiteral; - NotifyPropertyChanged(folderResource, kNC_HasUnreadMessages, newHasUnreadMessages); + NotifyPropertyChanged(folderResource, kNC_HasUnreadMessages, kTrueLiteral); + NotifyAncestors(folder, kNC_SubfoldersHaveUnreadMessages, kTrueLiteral); } else if(oldValue > 0 && newValue <= 0) { - newHasUnreadMessages = kFalseLiteral; - NotifyPropertyChanged(folderResource, kNC_HasUnreadMessages, newHasUnreadMessages); + NotifyPropertyChanged(folderResource, kNC_HasUnreadMessages, kFalseLiteral); + NotifyAncestors(folder, kNC_SubfoldersHaveUnreadMessages, kFalseLiteral); } //We will have to change the folderTreeName also @@ -1673,6 +1670,36 @@ nsMsgFolderDataSource::NotifyFolderTreeNameChanged(nsIMsgFolder* aFolder, return NS_OK; } +nsresult +nsMsgFolderDataSource::NotifyAncestors(nsIMsgFolder *aFolder, nsIRDFResource *aPropertyResource, nsIRDFNode *aNode) +{ + PRBool isServer = PR_FALSE; + nsresult rv = aFolder->GetIsServer(&isServer); + NS_ENSURE_SUCCESS(rv,rv); + + if (isServer) { + // done, stop + return NS_OK; + } + + nsCOMPtr folder = do_QueryInterface(aFolder, &rv); + NS_ENSURE_SUCCESS(rv,rv); + + nsCOMPtr parentFolder; + rv = folder->GetParent(getter_AddRefs(parentFolder)); + NS_ENSURE_SUCCESS(rv,rv); + + nsCOMPtr parentFolderResource = do_QueryInterface(parentFolder,&rv); + NS_ENSURE_SUCCESS(rv,rv); + + NotifyPropertyChanged(parentFolderResource, aPropertyResource, aNode); + + nsCOMPtr parentMsgFolder = do_QueryInterface(parentFolder, &rv); + NS_ENSURE_SUCCESS(rv,rv); + + return NotifyAncestors(parentMsgFolder, aPropertyResource, aNode); +} + // New Messages nsresult @@ -1762,13 +1789,6 @@ nsMsgFolderDataSource::GetNumMessagesNode(PRInt32 numMessages, nsIRDFNode **node return NS_OK; } -nsresult -nsMsgFolderDataSource::createSubfoldersHaveUnreadMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target) -{ - createNode(NS_LITERAL_STRING("true").get(), target, getRDFService()); - return NS_OK; -} - nsresult nsMsgFolderDataSource::createFolderChildNode(nsIMsgFolder *folder, nsIRDFNode **target) diff --git a/mailnews/base/src/nsMsgFolderDataSource.h b/mailnews/base/src/nsMsgFolderDataSource.h index 1247110256f7..361a4debcf0e 100644 --- a/mailnews/base/src/nsMsgFolderDataSource.h +++ b/mailnews/base/src/nsMsgFolderDataSource.h @@ -153,18 +153,17 @@ protected: nsIRDFNode **target); nsresult createFolderCanCompactNode(nsIMsgFolder *folder, nsIRDFNode **target); - nsresult createTotalMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); - nsresult createUnreadMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); - nsresult createCharsetNode(nsIMsgFolder *folder, nsIRDFNode **target); + nsresult createTotalMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); + nsresult createUnreadMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); + nsresult createCharsetNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createBiffStateNodeFromFolder(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createBiffStateNodeFromFlag(PRUint32 flag, nsIRDFNode **target); - nsresult createHasUnreadMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); - nsresult createNewMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); - nsresult createSubfoldersHaveUnreadMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); + nsresult createHasUnreadMessagesNode(nsIMsgFolder *folder, PRBool aIncludeSubfolders, nsIRDFNode **target); + nsresult createNewMessagesNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderNoSelectNode(nsIMsgFolder *folder, nsIRDFNode **target); - nsresult createFolderSynchronizeNode(nsIMsgFolder *folder, nsIRDFNode **target); - nsresult createFolderSyncDisabledNode(nsIMsgFolder *folder, nsIRDFNode **target); + nsresult createFolderSynchronizeNode(nsIMsgFolder *folder, nsIRDFNode **target); + nsresult createFolderSyncDisabledNode(nsIMsgFolder *folder, nsIRDFNode **target); nsresult createFolderChildNode(nsIMsgFolder *folder, nsIRDFNode **target); @@ -201,10 +200,9 @@ protected: nsresult NotifyFolderTreeNameChanged(nsIMsgFolder *folder, PRInt32 aUnreadMessages); nsresult NotifyFolderTreeSimpleNameChanged(nsIMsgFolder *folder); nsresult NotifyFolderNameChanged(nsIMsgFolder *folder); - - nsresult GetNumMessagesNode(PRInt32 numMessages, nsIRDFNode **node); - - nsresult CreateLiterals(nsIRDFService *rdf); + nsresult NotifyAncestors(nsIMsgFolder *aFolder, nsIRDFResource *aPropertyResource, nsIRDFNode *aNode); + nsresult GetNumMessagesNode(PRInt32 numMessages, nsIRDFNode **node); + nsresult CreateLiterals(nsIRDFService *rdf); static nsIRDFResource* kNC_Child; static nsIRDFResource* kNC_Folder; diff --git a/themes/classic/messenger/mac/folderPane.css b/themes/classic/messenger/mac/folderPane.css index b8105fe99f93..c108af8a00d5 100644 --- a/themes/classic/messenger/mac/folderPane.css +++ b/themes/classic/messenger/mac/folderPane.css @@ -143,6 +143,11 @@ outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-nntp, /* All Servers */ +outlinerbody:-moz-outliner-cell-text(closed, subfoldersHaveUnreadMessages-true) +{ + font-weight: bold; +} + outlinerbody:-moz-outliner-cell-text(folderNameCol, isServer-true), outlinerbody:-moz-outliner-cell-text(hasUnreadMessages-true) { font-weight: bold; diff --git a/themes/classic/messenger/win/folderPane.css b/themes/classic/messenger/win/folderPane.css index 3ad4a24b1d3f..58073d862385 100644 --- a/themes/classic/messenger/win/folderPane.css +++ b/themes/classic/messenger/win/folderPane.css @@ -139,6 +139,11 @@ outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-nntp, /* ::::: All Servers ::::: */ +outlinerbody:-moz-outliner-cell-text(closed, subfoldersHaveUnreadMessages-true) +{ + font-weight: bold; +} + outlinerbody:-moz-outliner-cell-text(folderNameCol, isServer-true), outlinerbody:-moz-outliner-cell-text(hasUnreadMessages-true) { font-weight: bold; diff --git a/themes/modern/messenger/folderPane.css b/themes/modern/messenger/folderPane.css index 7cc5211c41d0..784241eaee0d 100644 --- a/themes/modern/messenger/folderPane.css +++ b/themes/modern/messenger/folderPane.css @@ -136,6 +136,11 @@ outlinerbody:-moz-outliner-image(folderNameCol, isServer-true, serverType-nntp, /* ::::: All Servers ::::: */ +outlinerbody:-moz-outliner-cell-text(closed, subfoldersHaveUnreadMessages-true) +{ + font-weight: bold; +} + outlinerbody:-moz-outliner-cell-text(folderNameCol, isServer-true), outlinerbody:-moz-outliner-cell-text(hasUnreadMessages-true) { font-weight: bold;