From 28402a32478f945d7ec89423c631f9cf802df8da Mon Sep 17 00:00:00 2001 From: "bienvenu%nventure.com" Date: Tue, 30 May 2006 20:02:41 +0000 Subject: [PATCH] fix 66771 add match all search term for filters and virtual folders, sr=mscott --- mail/base/content/commandglue.js | 5 +++ .../chrome/messenger/searchTermOverlay.dtd | 2 ++ .../base/resources/content/commandglue.js | 5 +++ .../base/search/public/nsIMsgSearchTerm.idl | 9 ++--- mailnews/base/search/public/nsMsgSearchTerm.h | 1 + .../search/resources/content/SearchDialog.js | 3 +- .../resources/content/searchTermOverlay.js | 36 ++++++++++++++++--- .../resources/content/searchTermOverlay.xul | 1 + .../locale/en-US/searchTermOverlay.dtd | 13 ------- mailnews/base/search/src/nsMsgFilter.cpp | 21 +++++++---- mailnews/base/search/src/nsMsgFilter.h | 1 - mailnews/base/search/src/nsMsgFilterList.cpp | 13 +++++++ mailnews/base/search/src/nsMsgLocalSearch.cpp | 7 ++++ mailnews/base/search/src/nsMsgSearchTerm.cpp | 35 ++++++++++++------ .../resources/content/mailViewSetup.js | 3 ++ 15 files changed, 113 insertions(+), 42 deletions(-) diff --git a/mail/base/content/commandglue.js b/mail/base/content/commandglue.js index 00340ac1066..6bba6ff6a30 100644 --- a/mail/base/content/commandglue.js +++ b/mail/base/content/commandglue.js @@ -1016,6 +1016,11 @@ function getSearchTermString(searchTerms) if (condition.length > 1) condition += ' '; + if (term.matchAll) + { + condition = "ALL"; + break; + } condition += (term.booleanAnd) ? "AND (" : "OR ("; condition += term.termAsString + ')'; } diff --git a/mail/locales/en-US/chrome/messenger/searchTermOverlay.dtd b/mail/locales/en-US/chrome/messenger/searchTermOverlay.dtd index bc2ea3e3281..676802005c7 100644 --- a/mail/locales/en-US/chrome/messenger/searchTermOverlay.dtd +++ b/mail/locales/en-US/chrome/messenger/searchTermOverlay.dtd @@ -2,6 +2,8 @@ + + - - - - diff --git a/mailnews/base/search/src/nsMsgFilter.cpp b/mailnews/base/search/src/nsMsgFilter.cpp index b56f57bd670..218426981aa 100644 --- a/mailnews/base/search/src/nsMsgFilter.cpp +++ b/mailnews/base/search/src/nsMsgFilter.cpp @@ -749,33 +749,40 @@ nsresult nsMsgFilter::SaveRule(nsIOFileStream *aStream) PRUint32 count; m_termList->Count(&count); for (searchIndex = 0; searchIndex < count && NS_SUCCEEDED(err); - searchIndex++) + searchIndex++) { nsCAutoString stream; - + nsCOMPtr term; m_termList->QueryElementAt(searchIndex, NS_GET_IID(nsIMsgSearchTerm), (void **)getter_AddRefs(term)); if (!term) continue; - + if (condition.Length() > 1) condition += ' '; - + PRBool booleanAnd; + PRBool matchAll; term->GetBooleanAnd(&booleanAnd); - if (booleanAnd) + term->GetMatchAll(&matchAll); + if (matchAll) + { + condition += "ALL"; + break; + } + else if (booleanAnd) condition += "AND ("; else condition += "OR ("; - + nsresult searchError = term->GetTermAsString(stream); if (NS_FAILED(searchError)) { err = searchError; break; } - + condition += stream; condition += ')'; } diff --git a/mailnews/base/search/src/nsMsgFilter.h b/mailnews/base/search/src/nsMsgFilter.h index b7a9c9d357d..1c2685d2f19 100644 --- a/mailnews/base/search/src/nsMsgFilter.h +++ b/mailnews/base/search/src/nsMsgFilter.h @@ -115,7 +115,6 @@ protected: PRPackedBool m_enabled; PRPackedBool m_temporary; PRPackedBool m_unparseable; - nsIMsgFilterList *m_filterList; /* owning filter list */ nsCOMPtr m_termList; /* linked list of criteria terms */ nsCOMPtr m_scope; /* default for mail rules is inbox, but news rules could diff --git a/mailnews/base/search/src/nsMsgFilterList.cpp b/mailnews/base/search/src/nsMsgFilterList.cpp index cb2bc9504de..8b07ebab8bd 100644 --- a/mailnews/base/search/src/nsMsgFilterList.cpp +++ b/mailnews/base/search/src/nsMsgFilterList.cpp @@ -719,11 +719,24 @@ nsresult nsMsgFilterList::LoadTextFilters(nsIOFileStream *aStream) // what about values with close parens and quotes? e.g., (body, isn't, "foo")") // I guess interior quotes will need to be escaped - ("foo\")") // which will get written out as (\"foo\\")\") and read in as ("foo\")" +// ALL means match all messages. NS_IMETHODIMP nsMsgFilterList::ParseCondition(nsIMsgFilter *aFilter, const char *aCondition) { PRBool done = PR_FALSE; nsresult err = NS_OK; const char *curPtr = aCondition; + if (!strcmp(aCondition, "ALL")) + { + nsMsgSearchTerm *newTerm = new nsMsgSearchTerm; + + if (newTerm) + { + newTerm->m_matchAll = PR_TRUE; + aFilter->AppendTerm(newTerm); + } + return (newTerm) ? NS_OK : NS_ERROR_OUT_OF_MEMORY; + } + while (!done) { // insert code to save the boolean operator if there is one for this search term.... diff --git a/mailnews/base/search/src/nsMsgLocalSearch.cpp b/mailnews/base/search/src/nsMsgLocalSearch.cpp index 796313d6ca2..44007a15580 100644 --- a/mailnews/base/search/src/nsMsgLocalSearch.cpp +++ b/mailnews/base/search/src/nsMsgLocalSearch.cpp @@ -441,9 +441,16 @@ nsresult nsMsgSearchOfflineMail::ProcessSearchTerm(nsIMsgDBHdr *msgToMatch, PRBool charsetOverride = PR_FALSE; /* XXX BUG 68706 */ PRUint32 msgFlags; PRBool result; + PRBool matchAll; NS_ENSURE_ARG_POINTER(pResult); + aTerm->GetMatchAll(&matchAll); + if (matchAll) + { + *pResult = PR_TRUE; + return NS_OK; + } *pResult = PR_FALSE; nsMsgSearchAttribValue attrib; diff --git a/mailnews/base/search/src/nsMsgSearchTerm.cpp b/mailnews/base/search/src/nsMsgSearchTerm.cpp index 39b97b09527..f68fe307eee 100644 --- a/mailnews/base/search/src/nsMsgSearchTerm.cpp +++ b/mailnews/base/search/src/nsMsgSearchTerm.cpp @@ -22,6 +22,7 @@ * Contributor(s): * Seth Spitzer * Jungshik Shin + * David Bienvenu * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), @@ -342,6 +343,7 @@ nsMsgSearchTerm::nsMsgSearchTerm() m_attribute = nsMsgSearchAttrib::Default; mBeginsGrouping = PR_FALSE; mEndsGrouping = PR_FALSE; + m_matchAll = PR_FALSE; } nsMsgSearchTerm::nsMsgSearchTerm ( @@ -357,6 +359,7 @@ nsMsgSearchTerm::nsMsgSearchTerm ( if (attrib > nsMsgSearchAttrib::OtherHeader && attrib < nsMsgSearchAttrib::kNumMsgSearchAttributes && arbitraryHeader) m_arbitraryHeader = arbitraryHeader; nsMsgResultElement::AssignValues (val, &m_value); + m_matchAll = PR_FALSE; } @@ -495,6 +498,11 @@ NS_IMETHODIMP nsMsgSearchTerm::GetTermAsString (nsACString &outStream) nsCAutoString outputStr; nsresult ret; + if (m_matchAll) + { + outStream = "ALL"; + return NS_OK; + } ret = NS_MsgGetStringForAttribute(m_attribute, &attrib); if (ret != NS_OK) return ret; @@ -641,18 +649,23 @@ nsMsgSearchTerm::ParseAttribute(char *inStream, nsMsgSearchAttribValue *attrib) nsresult nsMsgSearchTerm::DeStreamNew (char *inStream, PRInt16 /*length*/) { - char *commaSep = PL_strchr(inStream, ','); - nsresult rv = ParseAttribute(inStream, &m_attribute); // will allocate space for arbitrary header if necessary + if (!strcmp(inStream, "ALL")) + { + m_matchAll = PR_TRUE; + return NS_OK; + } + char *commaSep = PL_strchr(inStream, ','); + nsresult rv = ParseAttribute(inStream, &m_attribute); // will allocate space for arbitrary header if necessary NS_ENSURE_SUCCESS(rv, rv); - if (!commaSep) - return NS_ERROR_INVALID_ARG; - char *secondCommaSep = PL_strchr(commaSep + 1, ','); - if (commaSep) - rv = ParseOperator(commaSep + 1, &m_operator); + if (!commaSep) + return NS_ERROR_INVALID_ARG; + char *secondCommaSep = PL_strchr(commaSep + 1, ','); + if (commaSep) + rv = ParseOperator(commaSep + 1, &m_operator); NS_ENSURE_SUCCESS(rv, rv); - if (secondCommaSep) - ParseValue(secondCommaSep + 1); - return NS_OK; + if (secondCommaSep) + ParseValue(secondCommaSep + 1); + return NS_OK; } @@ -1369,7 +1382,7 @@ nsresult nsMsgSearchTerm::InitHeaderAddressParser() NS_IMPL_GETSET(nsMsgSearchTerm, Attrib, nsMsgSearchAttribValue, m_attribute) NS_IMPL_GETSET(nsMsgSearchTerm, Op, nsMsgSearchOpValue, m_operator) - +NS_IMPL_GETSET(nsMsgSearchTerm, MatchAll, PRBool, m_matchAll) NS_IMETHODIMP nsMsgSearchTerm::GetValue(nsIMsgSearchValue **aResult) diff --git a/mailnews/extensions/mailviews/resources/content/mailViewSetup.js b/mailnews/extensions/mailviews/resources/content/mailViewSetup.js index ac36254eb1a..a03bfcbea11 100644 --- a/mailnews/extensions/mailviews/resources/content/mailViewSetup.js +++ b/mailnews/extensions/mailviews/resources/content/mailViewSetup.js @@ -118,6 +118,9 @@ function initializeMailViewOverrides() //orButton.setAttribute('label', 'Any of the following'); //var andButton = document.getElementById('and'); //andButton.setAttribute('label', 'All of the following'); + // matchAll doesn't make sense for views, since views are a single folder + hideMatchAllItem(); + } function UpdateAfterCustomHeaderChange()