diff --git a/mailnews/base/search/resources/content/FilterListDialog.js b/mailnews/base/search/resources/content/FilterListDialog.js index f4bf6842336b..6e3ae1ee469f 100644 --- a/mailnews/base/search/resources/content/FilterListDialog.js +++ b/mailnews/base/search/resources/content/FilterListDialog.js @@ -158,6 +158,17 @@ function onServerClick(event) selectServer(item.id); } +function CanRunFiltersAfterTheFact(aServer) +{ + // can't manually run news filters yet + if (aServer.type == "nntp") + return false; + + // filter after the fact is implement using search + // so if you can't search, you can't filter after the fact + return aServer.canSearchMessages; +} + // roots the tree at the specified server function setServer(uri) { @@ -180,12 +191,7 @@ function setServer(uri) gRunFiltersFolderPicker.setAttribute("ref", uri); // run filters after the fact not supported by news - if (msgFolder.server.type == "nntp" && !msgFolder.isServer) { - gRunFiltersFolderPicker.setAttribute("hidden", "true"); - gRunFiltersButton.setAttribute("hidden", "true"); - gRunFiltersFolderPickerLabel.setAttribute("hidden", "true"); - } - else { + if (CanRunFiltersAfterTheFact(msgFolder.server)) { gRunFiltersFolderPicker.removeAttribute("hidden"); gRunFiltersButton.removeAttribute("hidden"); gRunFiltersFolderPickerLabel.removeAttribute("hidden"); @@ -193,6 +199,11 @@ function setServer(uri) // for POP3 and IMAP, select the first folder, which is the INBOX gRunFiltersFolderPicker.selectedIndex = 0; } + else { + gRunFiltersFolderPicker.setAttribute("hidden", "true"); + gRunFiltersButton.setAttribute("hidden", "true"); + gRunFiltersFolderPickerLabel.setAttribute("hidden", "true"); + } // Get the first folder uri for this server. INBOX for // imap and pop accts and 1st news group for news. diff --git a/mailnews/base/src/nsMsgDBView.cpp b/mailnews/base/src/nsMsgDBView.cpp index 5c78d7b7fe6a..0035c009ed3c 100644 --- a/mailnews/base/src/nsMsgDBView.cpp +++ b/mailnews/base/src/nsMsgDBView.cpp @@ -1999,6 +1999,31 @@ NS_IMETHODIMP nsMsgDBView::DoCommand(nsMsgViewCommandTypeValue command) return rv; } +PRBool nsMsgDBView::ServerSupportsFilterAfterTheFact() +{ + NS_ASSERTION(m_folder, "no folder!"); + if (!m_folder) + return PR_FALSE; // unexpected + + // can't manually run news filters yet + if (mIsNews) + return PR_FALSE; + + nsCOMPtr server; + nsresult rv = m_folder->GetServer(getter_AddRefs(server)); + if (NS_FAILED(rv)) + return PR_FALSE; // unexpected + + // filter after the fact is implement using search + // so if you can't search, you can't filter after the fact + PRBool canSearch; + rv = server->GetCanSearchMessages(&canSearch); + if (NS_FAILED(rv)) + return PR_FALSE; // unexpected + + return canSearch; +} + NS_IMETHODIMP nsMsgDBView::GetCommandStatus(nsMsgViewCommandTypeValue command, PRBool *selectable_p, nsMsgViewCommandCheckStateValue *selected_p) { nsresult rv = NS_OK; @@ -2026,10 +2051,11 @@ NS_IMETHODIMP nsMsgDBView::GetCommandStatus(nsMsgViewCommandTypeValue command, P } 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; + *selectable_p = GetSize(); + if (*selectable_p) + *selectable_p = ServerSupportsFilterAfterTheFact(); break; case nsMsgViewCommandType::runJunkControls: // disable if no messages @@ -5391,7 +5417,8 @@ nsMsgDBView::GetKeyForFirstSelectedMessage(nsMsgKey *key) PRInt32 startRange; PRInt32 endRange; nsresult rv = mTreeSelection->GetRangeAt(0, &startRange, &endRange); - NS_ENSURE_SUCCESS(rv, rv); + // don't assert, it is legal for nothing to be selected + if (NS_FAILED(rv)) return rv; // check that the first index is valid, it may not be if nothing is selected if (startRange >= 0 && startRange < GetSize()) { diff --git a/mailnews/base/src/nsMsgDBView.h b/mailnews/base/src/nsMsgDBView.h index b5e1f56cdbd8..c6cb27b33f6e 100644 --- a/mailnews/base/src/nsMsgDBView.h +++ b/mailnews/base/src/nsMsgDBView.h @@ -376,6 +376,7 @@ private: static nsDateFormatSelector m_dateFormatDefault; static nsDateFormatSelector m_dateFormatThisWeek; static nsDateFormatSelector m_dateFormatToday; + PRBool ServerSupportsFilterAfterTheFact(); }; #endif