From 3eac1eae4fe0a24d41eb1c4df6c7b01cb3088e5d Mon Sep 17 00:00:00 2001 From: Don Sanders Date: Mon, 22 Aug 2005 09:15:24 +0000 Subject: [PATCH] Include online IMAP folders as filter action targets in the filter dialog. Use action scheduler for manual filtering and for online IMAP filtering when an online IMAP folder is specified as the target of any filter action. Set the action scheduler account in KMAcctImap, so that per account filtering works with the action scheduler (oops). In the old filter system, KMFilterMgr explicityly ignore online IMAP targets. GUI: Online IMAP folders are now shown in the filter dialog. GUI: An information dialog is shown when an online IMAP GUI: folder is specified as the target of a filter action GUI: in the filter dialog. svn path=/branches/KDE/3.5/kdepim/; revision=451939 --- actionscheduler.cpp | 1 + kmacctimap.cpp | 7 +++++-- kmfilteraction.cpp | 15 ++++++++++++--- kmfilterdlg.cpp | 8 ++++++++ kmfiltermgr.cpp | 33 +++++++++++++++++++++++++++++++++ kmfiltermgr.h | 7 +++++++ kmheaders.cpp | 4 +++- 7 files changed, 69 insertions(+), 6 deletions(-) diff --git a/actionscheduler.cpp b/actionscheduler.cpp index 07ad5359d..2600c7d87 100644 --- a/actionscheduler.cpp +++ b/actionscheduler.cpp @@ -569,6 +569,7 @@ void ActionScheduler::filterMessage() (!mAccount || (mAccount && (*mFilterIt).applyOnAccount(mAccountId)))) || ((mSet & KMFilterMgr::Explicit) && (*mFilterIt).applyOnExplicit())) { + // filter is applicable if ( FilterLog::instance()->isLogging() ) { QString logText( i18n( "Evaluating filter rules: " ) ); diff --git a/kmacctimap.cpp b/kmacctimap.cpp index 97c0b27bf..239b5b7f9 100644 --- a/kmacctimap.cpp +++ b/kmacctimap.cpp @@ -398,11 +398,13 @@ void KMAcctImap::postProcessNewMail( KMFolder * folder ) QValueListIterator filterIt = mFilterSerNums.begin(); QValueList inTransit; - if (ActionScheduler::isEnabled()) { + if (ActionScheduler::isEnabled() || + kmkernel->filterMgr()->atLeastOneOnlineImapFolderTarget()) { KMFilterMgr::FilterSet set = KMFilterMgr::Inbound; QValueList filters = kmkernel->filterMgr()->filters(); if (!mScheduler) { mScheduler = new KMail::ActionScheduler( set, filters ); + mScheduler->setAccountId( id() ); connect( mScheduler, SIGNAL(filtered(Q_UINT32)), this, SLOT(slotFiltered(Q_UINT32)) ); } else { mScheduler->setFilterList( filters ); @@ -440,7 +442,8 @@ void KMAcctImap::postProcessNewMail( KMFolder * folder ) continue; } - if (ActionScheduler::isEnabled()) { + if (ActionScheduler::isEnabled() || + kmkernel->filterMgr()->atLeastOneOnlineImapFolderTarget()) { mScheduler->execFilters( msg ); } else { if (msg->transferInProgress()) { diff --git a/kmfilteraction.cpp b/kmfilteraction.cpp index 4cf918b32..554e1e321 100644 --- a/kmfilteraction.cpp +++ b/kmfilteraction.cpp @@ -279,8 +279,6 @@ QWidget* KMFilterActionWithFolder::createParamWidget( QWidget* parent ) const { FolderRequester *req = new FolderRequester( parent, kmkernel->getKMMainWidget()->folderTree() ); - if (!ActionScheduler::isEnabled()) - req->setShowImapFolders( false ); setParamWidgetValue( req ); return req; } @@ -1328,7 +1326,18 @@ KMFilterAction::ReturnCode KMFilterActionMove::process(KMMessage* msg) const if ( !mFolder ) return ErrorButGoOn; - MessageProperty::setFilterFolder( msg, mFolder ); + ActionScheduler *handler = MessageProperty::filterHandler( msg ); + if (handler) { + MessageProperty::setFilterFolder( msg, mFolder ); + } else { + // The old filtering system does not support online imap targets. + // Skip online imap targets when using the old system. + KMFolder *check; + check = kmkernel->imapFolderMgr()->findIdString( argsAsString() ); + if (mFolder && (check != mFolder)) { + MessageProperty::setFilterFolder( msg, mFolder ); + } + } return GoOn; } diff --git a/kmfilterdlg.cpp b/kmfilterdlg.cpp index 42a352ce5..929cf76b7 100644 --- a/kmfilterdlg.cpp +++ b/kmfilterdlg.cpp @@ -721,6 +721,14 @@ void KMFilterListBox::slotApplyFilterChanges() // block attemts to use filters (currently a no-op) fm->beginUpdate(); fm->setFilters( newFilters ); + if (fm->atLeastOneOnlineImapFolderTarget()) { + QString str = i18n("At least one filter targets a folder on an online " + "IMAP account. Such filters will only be applied " + "when manually filtering and when filtering " + "incoming online IMAP mail."); + KMessageBox::information( this, str, QString::null, + "filterDlgOnlineImapCheck" ); + } // allow usage of the filters again. fm->endUpdate(); fm->writeConfig(); diff --git a/kmfiltermgr.cpp b/kmfiltermgr.cpp index c146303f0..b0fb26f69 100644 --- a/kmfiltermgr.cpp +++ b/kmfiltermgr.cpp @@ -15,6 +15,7 @@ using KMail::FilterLog; #include "kmfolderindex.h" #include "messageproperty.h" using KMail::MessageProperty; +#include "kmfoldermgr.h" // other KDE headers #include @@ -34,6 +35,8 @@ KMFilterMgr::KMFilterMgr( bool popFilter ) : mEditDialog( 0 ), bPopFilter( popFilter ), mShowLater( false ), + mDirtyBufferedFolderTarget( true ), + mBufferedFolderTarget( true ), mRefCount( 0 ) { if (bPopFilter) @@ -53,6 +56,7 @@ KMFilterMgr::~KMFilterMgr() void KMFilterMgr::clear() { + mDirtyBufferedFolderTarget = true; for ( QValueListIterator it = mFilters.begin() ; it != mFilters.end() ; ++it ) { delete *it; @@ -300,6 +304,33 @@ bool KMFilterMgr::atLeastOneIncomingFilterAppliesTo( unsigned int accountID ) co return false; } +bool KMFilterMgr::atLeastOneOnlineImapFolderTarget() +{ + if (!mDirtyBufferedFolderTarget) + return mBufferedFolderTarget; + + mDirtyBufferedFolderTarget = false; + + QValueListConstIterator it = mFilters.constBegin(); + for ( ; it != mFilters.constEnd() ; ++it ) { + KMFilter *filter = *it; + QPtrListIterator jt( *filter->actions() ); + for ( jt.toFirst() ; jt.current() ; ++jt ) { + KMFilterActionWithFolder *f = dynamic_cast(*jt); + if (!f) + continue; + QString name = f->argsAsString(); + KMFolder *folder = kmkernel->imapFolderMgr()->findIdString( name ); + if (folder) { + mBufferedFolderTarget = true; + return true; + } + } + } + mBufferedFolderTarget = false; + return false; +} + //----------------------------------------------------------------------------- void KMFilterMgr::ref(void) { @@ -388,6 +419,7 @@ const QString KMFilterMgr::createUniqueName( const QString & name ) void KMFilterMgr::appendFilters( const QValueList &filters, bool replaceIfNameExists ) { + mDirtyBufferedFolderTarget = true; beginUpdate(); if ( replaceIfNameExists ) { QValueListConstIterator it1 = filters.constBegin(); @@ -420,6 +452,7 @@ void KMFilterMgr::slotFolderRemoved( KMFolder * aFolder ) //----------------------------------------------------------------------------- bool KMFilterMgr::folderRemoved(KMFolder* aFolder, KMFolder* aNewFolder) { + mDirtyBufferedFolderTarget = true; bool rem = false; QValueListConstIterator it = mFilters.constBegin(); for ( ; it != mFilters.constEnd() ; ++it ) diff --git a/kmfiltermgr.h b/kmfiltermgr.h index 9a708e8a4..81e5236d5 100644 --- a/kmfiltermgr.h +++ b/kmfiltermgr.h @@ -76,6 +76,10 @@ public: * for example; * */ bool atLeastOneIncomingFilterAppliesTo( unsigned int accountID ) const; + /** Returns whether at least one filter targets a folder on an + * online IMAP account. + * */ + bool atLeastOneOnlineImapFolderTarget(); /** Check for existing filters with the &p name and extend the "name" to "name (i)" until no match is found for i=1..n */ @@ -177,6 +181,9 @@ private: QValueList mFilters; bool bPopFilter; bool mShowLater; + bool mDirtyBufferedFolderTarget; + bool mBufferedFolderTarget; + int mRefCount; }; diff --git a/kmheaders.cpp b/kmheaders.cpp index b88cb0ad6..68e0650d4 100644 --- a/kmheaders.cpp +++ b/kmheaders.cpp @@ -1314,7 +1314,9 @@ void KMHeaders::setFolderInfoStatus () //----------------------------------------------------------------------------- void KMHeaders::applyFiltersOnMsg() { - if (ActionScheduler::isEnabled()) { // uses action scheduler + if (ActionScheduler::isEnabled() || + kmkernel->filterMgr()->atLeastOneOnlineImapFolderTarget()) { + // uses action scheduler KMFilterMgr::FilterSet set = KMFilterMgr::Explicit; QValueList filters = kmkernel->filterMgr()->filters(); ActionScheduler *scheduler = new ActionScheduler( set, filters, this );