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
wilder-work
Don Sanders 21 years ago
parent f2ef01a9da
commit 3eac1eae4f
  1. 1
      actionscheduler.cpp
  2. 7
      kmacctimap.cpp
  3. 15
      kmfilteraction.cpp
  4. 8
      kmfilterdlg.cpp
  5. 33
      kmfiltermgr.cpp
  6. 7
      kmfiltermgr.h
  7. 4
      kmheaders.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( "<b>Evaluating filter rules:</b> " ) );

@ -398,11 +398,13 @@ void KMAcctImap::postProcessNewMail( KMFolder * folder )
QValueListIterator<Q_UINT32> filterIt = mFilterSerNums.begin();
QValueList<Q_UINT32> inTransit;
if (ActionScheduler::isEnabled()) {
if (ActionScheduler::isEnabled() ||
kmkernel->filterMgr()->atLeastOneOnlineImapFolderTarget()) {
KMFilterMgr::FilterSet set = KMFilterMgr::Inbound;
QValueList<KMFilter*> 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()) {

@ -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;
}

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

@ -15,6 +15,7 @@ using KMail::FilterLog;
#include "kmfolderindex.h"
#include "messageproperty.h"
using KMail::MessageProperty;
#include "kmfoldermgr.h"
// other KDE headers
#include <kdebug.h>
@ -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<KMFilter*> 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<KMFilter*> it = mFilters.constBegin();
for ( ; it != mFilters.constEnd() ; ++it ) {
KMFilter *filter = *it;
QPtrListIterator<KMFilterAction> jt( *filter->actions() );
for ( jt.toFirst() ; jt.current() ; ++jt ) {
KMFilterActionWithFolder *f = dynamic_cast<KMFilterActionWithFolder*>(*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<KMFilter*> &filters,
bool replaceIfNameExists )
{
mDirtyBufferedFolderTarget = true;
beginUpdate();
if ( replaceIfNameExists ) {
QValueListConstIterator<KMFilter*> 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<KMFilter*> it = mFilters.constBegin();
for ( ; it != mFilters.constEnd() ; ++it )

@ -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<KMFilter *> mFilters;
bool bPopFilter;
bool mShowLater;
bool mDirtyBufferedFolderTarget;
bool mBufferedFolderTarget;
int mRefCount;
};

@ -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<KMFilter*> filters = kmkernel->filterMgr()->filters();
ActionScheduler *scheduler = new ActionScheduler( set, filters, this );

Loading…
Cancel
Save