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 );