• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

mailcommon

  • sources
  • kde-4.12
  • kdepim
  • mailcommon
  • filter
kmfilterdialog.cpp
Go to the documentation of this file.
1 /*
2  Filter Dialog
3  Author: Marc Mutz <mutz@kde.org>
4  based upon work by Stefan Taferner <taferner@kde.org>
5 
6  Copyright (c) 2011-2012-2013 Laurent Montel <montel@kde.org>
7 
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12 
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License along
19  with this program; if not, write to the Free Software Foundation, Inc.,
20  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 */
22 
23 #include "kmfilterdialog.h"
24 
25 #include "filteractiondict.h"
26 #include "filteractionwidget.h"
27 #include "filterimporterexporter.h"
28 #include "filterselectiondialog.h"
29 using MailCommon::FilterImporterExporter;
30 #include "filtermanager.h"
31 #include "folderrequester.h"
32 #include "kernel/mailkernel.h"
33 #include "util/mailutil.h"
34 #include "search/searchpatternedit.h"
35 #include "filterconverter/filterconverttosieve.h"
36 
37 #include <Akonadi/AgentInstance>
38 #include <Akonadi/AgentType>
39 #include <Akonadi/ItemFetchJob>
40 
41 #include <KComboBox>
42 #include <KConfigGroup>
43 #include <KDebug>
44 #include <KIconDialog>
45 #include <KIconLoader>
46 #include <KInputDialog>
47 #include <KJob>
48 #include <KKeySequenceWidget>
49 #include <KListWidgetSearchLine>
50 #include <KLocale>
51 #include <KMessageBox>
52 #include <KPushButton>
53 #include <KTabWidget>
54 #include <KWindowSystem>
55 
56 #include <QApplication>
57 #include <QHeaderView>
58 #include <QButtonGroup>
59 #include <QCheckBox>
60 #include <QGridLayout>
61 #include <QLabel>
62 #include <QListWidget>
63 #include <QMenu>
64 #include <QRadioButton>
65 #include <QTreeWidget>
66 #include <QVBoxLayout>
67 #include <QShortcut>
68 #include <QSplitter>
69 #include <QPointer>
70 
71 Q_DECLARE_METATYPE(MailCommon::FilterImporterExporter::FilterType)
72 using namespace MailCommon;
73 
74 namespace MailCommon {
75 
76 AccountList::AccountList( QWidget *parent )
77  : QTreeWidget( parent )
78 {
79  setColumnCount( 2 );
80  QStringList headerNames;
81  headerNames << i18n( "Account Name" ) << i18n( "Type" );
82  setHeaderItem( new QTreeWidgetItem( headerNames ) );
83  setAllColumnsShowFocus( true );
84  setFrameStyle( QFrame::WinPanel + QFrame::Sunken );
85  setSortingEnabled( false );
86  setRootIsDecorated( false );
87  setSortingEnabled( true );
88  sortByColumn( 0, Qt::AscendingOrder );
89  header()->setMovable( false );
90 }
91 
92 AccountList::~AccountList()
93 {
94 }
95 
96 void AccountList::updateAccountList( MailCommon::MailFilter *filter )
97 {
98  clear();
99 
100  QTreeWidgetItem *top = 0;
101  // Block the signals here, otherwise we end up calling
102  // slotApplicableAccountsChanged(), which will read the incomplete item
103  // state and write that back to the filter
104  blockSignals( true );
105  const Akonadi::AgentInstance::List lst = MailCommon::Util::agentInstances();
106  const int nbAccount = lst.count();
107  for ( int i = 0; i <nbAccount; ++i ) {
108  const Akonadi::AgentInstance agent = lst.at( i );
109  QTreeWidgetItem *listItem = new QTreeWidgetItem( this, top );
110  listItem->setText( 0, agent.name() );
111  listItem->setText( 1, agent.type().name() );
112  listItem->setText( 2, agent.identifier() );
113  if ( filter ) {
114  listItem->setCheckState( 0,
115  filter->applyOnAccount( agent.identifier() ) ?
116  Qt::Checked :
117  Qt::Unchecked );
118  }
119  top = listItem;
120  }
121  blockSignals( false );
122 
123  // make sure our hidden column is really hidden (Qt tends to re-show it)
124  hideColumn( 2 );
125  resizeColumnToContents( 0 );
126  resizeColumnToContents( 1 );
127 
128  top = topLevelItem( 0 );
129  if ( top ) {
130  setCurrentItem( top );
131  }
132 }
133 
134 void AccountList::applyOnAccount( MailCommon::MailFilter *filter )
135 {
136  QTreeWidgetItemIterator it( this );
137 
138  while ( QTreeWidgetItem *item = *it ) {
139  const QString id = item->text( 2 );
140  filter->setApplyOnAccount( id, item->checkState( 0 ) == Qt::Checked );
141  ++it;
142  }
143 }
144 
145 void AccountList::applyOnAccount( const QStringList &lstAccount )
146 {
147  clear();
148 
149  QTreeWidgetItem *top = 0;
150  // Block the signals here, otherwise we end up calling
151  // slotApplicableAccountsChanged(), which will read the incomplete item
152  // state and write that back to the filter
153  blockSignals( true );
154  const Akonadi::AgentInstance::List lst = MailCommon::Util::agentInstances();
155  const int nbAccount = lst.count();
156  for ( int i = 0; i <nbAccount; ++i ) {
157  const Akonadi::AgentInstance agent = lst.at( i );
158  QTreeWidgetItem *listItem = new QTreeWidgetItem( this, top );
159  listItem->setText( 0, agent.name() );
160  listItem->setText( 1, agent.type().name() );
161  listItem->setText( 2, agent.identifier() );
162  listItem->setCheckState( 0, lstAccount.contains( agent.identifier() ) ?
163  Qt::Checked : Qt::Unchecked );
164  top = listItem;
165  }
166  blockSignals( false );
167 
168  // make sure our hidden column is really hidden (Qt tends to re-show it)
169  hideColumn( 2 );
170  resizeColumnToContents( 0 );
171  resizeColumnToContents( 1 );
172 
173  top = topLevelItem( 0 );
174  if ( top ) {
175  setCurrentItem( top );
176  }
177 }
178 
179 QStringList AccountList::selectedAccount()
180 {
181  QStringList lstAccount;
182  QTreeWidgetItemIterator it( this );
183 
184  while ( QTreeWidgetItem *item = *it ) {
185  if ( item->checkState( 0 ) == Qt::Checked ) {
186  lstAccount << item->text( 2 );
187  }
188  ++it;
189  }
190  return lstAccount;
191 }
192 
193 QListWidgetFilterItem::QListWidgetFilterItem( const QString &text, QListWidget *parent )
194  : QListWidgetItem( text, parent ), mFilter( 0 )
195 {
196 }
197 
198 QListWidgetFilterItem::~QListWidgetFilterItem()
199 {
200  delete mFilter;
201 }
202 
203 void QListWidgetFilterItem::setFilter( MailCommon::MailFilter *filter )
204 {
205  mFilter = filter;
206  setCheckState( filter->isEnabled() ? Qt::Checked : Qt::Unchecked );
207 }
208 
209 MailCommon::MailFilter *QListWidgetFilterItem::filter()
210 {
211  return mFilter;
212 }
213 
214 // What's this help texts
215 const char *_wt_filterlist =
216  I18N_NOOP( "<qt><p>This is the list of defined filters. "
217  "They are processed top-to-bottom.</p>"
218  "<p>Click on any filter to edit it "
219  "using the controls in the right-hand half "
220  "of the dialog.</p></qt>" );
221 
222 const char *_wt_filterlist_new =
223  I18N_NOOP( "<qt><p>Click this button to create a new filter.</p>"
224  "<p>The filter will be inserted just before the currently-"
225  "selected one, but you can always change that "
226  "later on.</p>"
227  "<p>If you have clicked this button accidentally, you can undo this "
228  "by clicking on the <em>Delete</em> button.</p></qt>" );
229 
230 const char *_wt_filterlist_copy =
231  I18N_NOOP( "<qt><p>Click this button to copy a filter.</p>"
232  "<p>If you have clicked this button accidentally, you can undo this "
233  "by clicking on the <em>Delete</em> button.</p></qt>" );
234 
235 const char *_wt_filterlist_delete =
236  I18N_NOOP( "<qt><p>Click this button to <em>delete</em> the currently-"
237  "selected filter from the list above.</p>"
238  "<p>There is no way to get the filter back once "
239  "it is deleted, but you can always leave the "
240  "dialog by clicking <em>Cancel</em> to discard the "
241  "changes made.</p></qt>" );
242 
243 const char *_wt_filterlist_up =
244  I18N_NOOP( "<qt><p>Click this button to move the currently-"
245  "selected filter <em>up</em> one in the list above.</p>"
246  "<p>This is useful since the order of the filters in the list "
247  "determines the order in which they are tried on messages: "
248  "The topmost filter gets tried first.</p>"
249  "<p>If you have clicked this button accidentally, you can undo this "
250  "by clicking on the <em>Down</em> button.</p></qt>" );
251 
252 const char *_wt_filterlist_down =
253  I18N_NOOP( "<qt><p>Click this button to move the currently-"
254  "selected filter <em>down</em> one in the list above.</p>"
255  "<p>This is useful since the order of the filters in the list "
256  "determines the order in which they are tried on messages: "
257  "The topmost filter gets tried first.</p>"
258  "<p>If you have clicked this button accidentally, you can undo this "
259  "by clicking on the <em>Up</em> button.</p></qt>" );
260 
261 const char *_wt_filterlist_top =
262  I18N_NOOP( "<qt><p>Click this button to move the currently-"
263  "selected filter to top of list.</p>"
264  "<p>This is useful since the order of the filters in the list "
265  "determines the order in which they are tried on messages: "
266  "The topmost filter gets tried first.</p></qt>" );
267 
268 const char *_wt_filterlist_bottom =
269  I18N_NOOP( "<qt><p>Click this button to move the currently-"
270  "selected filter to bottom of list.</p>"
271  "<p>This is useful since the order of the filters in the list "
272  "determines the order in which they are tried on messages: "
273  "The topmost filter gets tried first.</p></qt>" );
274 
275 const char *_wt_filterlist_rename =
276  I18N_NOOP( "<qt><p>Click this button to rename the currently-selected filter.</p>"
277  "<p>Filters are named automatically, as long as they start with "
278  "\"&lt;\".</p>"
279  "<p>If you have renamed a filter accidentally and want automatic "
280  "naming back, click this button and select <em>Clear</em> followed "
281  "by <em>OK</em> in the appearing dialog.</p></qt>" );
282 
283 const char *_wt_filterdlg_showLater =
284  I18N_NOOP( "<qt><p>Check this button to force the confirmation dialog to be "
285  "displayed.</p><p>This is useful if you have defined a ruleset that tags "
286  "messages to be downloaded later. Without the possibility to force "
287  "the dialog popup, these messages could never be downloaded if no "
288  "other large messages were waiting on the server, or if you wanted to "
289  "change the ruleset to tag the messages differently.</p></qt>" );
290 
291 //=============================================================================
292 //
293 // class KMFilterDialog (the filter dialog)
294 //
295 //=============================================================================
296 
297 
298 
299 KMFilterDialog::KMFilterDialog( const QList<KActionCollection*> &actionCollection,
300  QWidget *parent, bool createDummyFilter )
301  : KDialog( parent ),
302  mFilter( 0 ),
303  mDoNotClose( false ),
304  mIgnoreFilterUpdates( true )
305 {
306  setCaption( i18n( "Filter Rules" ) );
307  setButtons( Help|Ok|Apply|Cancel|User1|User2|User3);
308  setModal( false );
309  setButtonFocus( Ok );
310  KWindowSystem::setIcons( winId(),
311  qApp->windowIcon().pixmap( IconSize( KIconLoader::Desktop ),
312  IconSize( KIconLoader::Desktop ) ),
313  qApp->windowIcon().pixmap( IconSize( KIconLoader::Small ),
314  IconSize( KIconLoader::Small ) ) );
315  setHelp( QLatin1String("filters"), QLatin1String("kmail") );
316  setButtonText( User1, i18n( "Import..." ) );
317  setButtonText( User2, i18n( "Export..." ) );
318  setButtonText( User3, i18n( "Convert to..." ) );
319  QMenu *menu = new QMenu();
320 
321  QAction *act = new QAction( i18n( "KMail filters" ), this );
322  act->setData( QVariant::fromValue(MailCommon::FilterImporterExporter::KMailFilter) );
323  menu->addAction( act );
324 
325  act = new QAction( i18n( "Thunderbird filters" ), this );
326  act->setData( QVariant::fromValue(MailCommon::FilterImporterExporter::ThunderBirdFilter) );
327  menu->addAction( act );
328 
329  act = new QAction( i18n( "Evolution filters" ), this );
330  act->setData( QVariant::fromValue(MailCommon::FilterImporterExporter::EvolutionFilter) );
331  menu->addAction( act );
332 
333  act = new QAction( i18n( "Sylpheed filters" ), this );
334  act->setData( QVariant::fromValue(MailCommon::FilterImporterExporter::SylpheedFilter) );
335  menu->addAction( act );
336 
337  act = new QAction( i18n( "Procmail filters" ), this );
338  act->setData( QVariant::fromValue(MailCommon::FilterImporterExporter::ProcmailFilter) );
339  menu->addAction( act );
340 
341  act = new QAction( i18n( "Balsa filters" ), this );
342  act->setData( QVariant::fromValue(MailCommon::FilterImporterExporter::BalsaFilter) );
343  menu->addAction( act );
344 
345  act = new QAction( i18n( "Claws Mail filters" ), this );
346  act->setData( QVariant::fromValue(MailCommon::FilterImporterExporter::ClawsMailFilter) );
347  menu->addAction( act );
348 
349  connect( menu, SIGNAL(triggered(QAction*)), SLOT(slotImportFilter(QAction*)) );
350 
351  button( KDialog::User1 )->setMenu( menu );
352 
353  menu = new QMenu();
354 
355  act = new QAction( i18n( "Sieve script" ), this );
356  connect(act, SIGNAL(triggered(bool)), SLOT(slotExportAsSieveScript()));
357  menu->addAction( act );
358  button( KDialog::User3 )->setMenu( menu );
359 
360 
361  connect( this, SIGNAL(user2Clicked()),
362  this, SLOT(slotExportFilters()) );
363  enableButtonApply( false );
364 
365  QWidget *w = new QWidget( this );
366  setMainWidget( w );
367  QVBoxLayout *topVLayout = new QVBoxLayout( w );
368  QHBoxLayout *topLayout = new QHBoxLayout;
369  topVLayout->addLayout( topLayout );
370  topLayout->setSpacing( spacingHint() );
371  topLayout->setMargin( 0 );
372  QVBoxLayout *vbl2 = 0;
373 
374  QSplitter *splitter = new QSplitter;
375  splitter->setChildrenCollapsible(false);
376  topLayout->addWidget(splitter);
377 
378  mFilterList = new KMFilterListBox( i18n( "Available Filters" ) );
379  splitter->addWidget(mFilterList);
380  KTabWidget *tabWidget = new KTabWidget;
381  splitter->addWidget(tabWidget);
382 
383  QWidget *page1 = new QWidget( tabWidget );
384  tabWidget->addTab( page1, i18nc( "General mail filter settings.", "General" ) );
385  QHBoxLayout * hbl = new QHBoxLayout( page1 );
386  hbl->setSpacing( spacingHint() );
387  hbl->setMargin( marginHint() );
388 
389  QWidget *page2 = new QWidget( tabWidget );
390  tabWidget->addTab( page2, i18nc( "Advanced mail filter settings.","Advanced" ) );
391  vbl2 = new QVBoxLayout( page2 );
392  vbl2->setSpacing( spacingHint() );
393  vbl2->setMargin( marginHint() );
394 
395  QVBoxLayout *vbl = new QVBoxLayout();
396  hbl->addLayout( vbl );
397  vbl->setSpacing( spacingHint() );
398  hbl->setStretchFactor( vbl, 2 );
399 
400  QGroupBox *patternGroupBox = new QGroupBox( i18n( "Filter Criteria" ), page1 );
401  QHBoxLayout *layout = new QHBoxLayout( patternGroupBox );
402  mPatternEdit =
403  new MailCommon::SearchPatternEdit(
404  patternGroupBox, MailCommon::SearchPatternEdit::MatchAllMessages );
405  layout->addWidget( mPatternEdit );
406 
407  vbl->addWidget( patternGroupBox, 0, Qt::AlignTop );
408 
409  QGroupBox *agb = new QGroupBox( i18n( "Filter Actions" ), page1 );
410  QHBoxLayout *layout2 = new QHBoxLayout;
411  mActionLister = new MailCommon::FilterActionWidgetLister( agb );
412  layout2->addWidget( mActionLister );
413  agb->setLayout( layout2 );
414  vbl->addWidget( agb, 0, Qt::AlignTop );
415 
416  mAdvOptsGroup = new QGroupBox( i18n( "Advanced Options" ), page2 );
417  {
418  QGridLayout *gl = new QGridLayout();
419  QVBoxLayout *vbl3 = new QVBoxLayout();
420  gl->addLayout( vbl3, 0, 0 );
421  vbl3->setSpacing( spacingHint() );
422  vbl3->addStretch( 1 );
423 
424  mApplyOnIn = new QCheckBox( i18n( "Apply this filter to incoming messages:" ), mAdvOptsGroup );
425  vbl3->addWidget( mApplyOnIn );
426 
427  QButtonGroup *bg = new QButtonGroup( mAdvOptsGroup );
428 
429  mApplyOnForAll = new QRadioButton( i18n( "from all accounts" ), mAdvOptsGroup );
430  bg->addButton( mApplyOnForAll );
431  vbl3->addWidget( mApplyOnForAll );
432 
433  mApplyOnForTraditional =
434  new QRadioButton( i18n( "from all but online IMAP accounts" ), mAdvOptsGroup );
435  bg->addButton( mApplyOnForTraditional );
436  vbl3->addWidget( mApplyOnForTraditional );
437 
438  mApplyOnForChecked =
439  new QRadioButton( i18n( "from checked accounts only" ), mAdvOptsGroup );
440  bg->addButton( mApplyOnForChecked );
441  vbl3->addWidget( mApplyOnForChecked );
442  vbl3->addStretch( 2 );
443 
444  mAccountList = new AccountList( mAdvOptsGroup );
445  gl->addWidget( mAccountList, 0, 1, 4, 3 );
446 
447  mApplyOnOut =
448  new QCheckBox( i18n( "Apply this filter to &sent messages" ), mAdvOptsGroup );
449  mApplyOnOut->setToolTip(
450  i18n( "<p>The filter will be triggered <b>after</b> the message is sent "
451  "and it will only affect the local copy of the message.</p>"
452  "<p>If the recipient's copy also needs to be modified, "
453  "please use \"Apply this filter <b>before</b> sending messages\".</p>" ) );
454  gl->addWidget( mApplyOnOut, 4, 0, 1, 4 );
455 
456  mApplyBeforeOut =
457  new QCheckBox( i18n( "Apply this filter &before sending messages" ), mAdvOptsGroup );
458  mApplyBeforeOut->setToolTip(
459  i18n( "<p>The filter will be triggered <b>before</b> the message is sent "
460  "and it will affect both the local copy and the sent copy of the message.</p>"
461  "<p>This is required if the recipient's copy also needs to be modified.</p>" ) );
462  gl->addWidget( mApplyBeforeOut, 5, 0, 1, 4 );
463 
464 
465  mApplyOnCtrlJ =
466  new QCheckBox( i18n( "Apply this filter on manual &filtering" ), mAdvOptsGroup );
467  gl->addWidget( mApplyOnCtrlJ, 6, 0, 1, 4 );
468 
469  mStopProcessingHere =
470  new QCheckBox( i18n( "If this filter &matches, stop processing here" ), mAdvOptsGroup );
471  gl->addWidget( mStopProcessingHere, 7, 0, 1, 4 );
472 
473  mConfigureShortcut =
474  new QCheckBox( i18n( "Add this filter to the Apply Filter menu" ), mAdvOptsGroup );
475  gl->addWidget( mConfigureShortcut, 8, 0, 1, 2 );
476 
477  QLabel *keyButtonLabel = new QLabel( i18n( "Shortcut:" ), mAdvOptsGroup );
478  keyButtonLabel->setAlignment( Qt::AlignVCenter | Qt::AlignRight );
479  gl->addWidget( keyButtonLabel, 8, 2, 1, 1 );
480 
481  mKeySeqWidget = new KKeySequenceWidget( mAdvOptsGroup );
482  mKeySeqWidget->setObjectName( QLatin1String("FilterShortcutSelector") );
483  gl->addWidget( mKeySeqWidget, 8, 3, 1, 1 );
484  mKeySeqWidget->setEnabled( false );
485  mKeySeqWidget->setModifierlessAllowed( true );
486  mKeySeqWidget->setCheckActionCollections( actionCollection );
487 
488  mConfigureToolbar =
489  new QCheckBox( i18n( "Additionally add this filter to the toolbar" ), mAdvOptsGroup );
490  gl->addWidget( mConfigureToolbar, 9, 0, 1, 4 );
491  mConfigureToolbar->setEnabled( false );
492 
493  KHBox *hbox = new KHBox( mAdvOptsGroup );
494  mFilterActionLabel = new QLabel( i18n( "Icon for this filter:" ), hbox );
495  mFilterActionLabel->setEnabled( false );
496 
497  mFilterActionIconButton = new KIconButton( hbox );
498  mFilterActionLabel->setBuddy( mFilterActionIconButton );
499  mFilterActionIconButton->setIconType( KIconLoader::NoGroup, KIconLoader::Action, false );
500  mFilterActionIconButton->setIconSize( 16 );
501  mFilterActionIconButton->setIcon( QLatin1String("system-run") );
502  mFilterActionIconButton->setEnabled( false );
503 
504  gl->addWidget( hbox, 10, 0, 1, 4 );
505 
506  mAdvOptsGroup->setLayout( gl );
507  }
508  vbl2->addWidget( mAdvOptsGroup, 0, Qt::AlignTop );
509 
510  QHBoxLayout *applySpecificFiltersLayout = new QHBoxLayout;
511  QLabel *lab = new QLabel( i18n( "Run selected filter(s) on: " ) );
512  applySpecificFiltersLayout->addWidget( lab );
513  mFolderRequester = new MailCommon::FolderRequester;
514  mFolderRequester->setNotAllowToCreateNewFolder(true);
515  applySpecificFiltersLayout->addWidget( mFolderRequester );
516  connect( mFolderRequester, SIGNAL(folderChanged(Akonadi::Collection)),
517  this, SLOT(slotFolderChanged(Akonadi::Collection)) );
518  mRunNow = new KPushButton( i18n( "Run Now" ) );
519  mRunNow->setEnabled( false );
520  applySpecificFiltersLayout->addWidget( mRunNow );
521  connect( mRunNow, SIGNAL(clicked()), this, SLOT(slotRunFilters()) );
522  topVLayout->addLayout( applySpecificFiltersLayout );
523  // spacer:
524  vbl->addStretch( 1 );
525 
526  // load the filter parts into the edit widgets
527  connect( mFilterList, SIGNAL(filterSelected(MailCommon::MailFilter*)),
528  this, SLOT(slotFilterSelected(MailCommon::MailFilter*)) );
529 
530  // transfer changes from the 'Apply this filter on...'
531  // combo box to the filter
532  connect( mApplyOnIn, SIGNAL(clicked()),
533  this, SLOT(slotApplicabilityChanged()) );
534  connect( mApplyOnForAll, SIGNAL(clicked()),
535  this, SLOT(slotApplicabilityChanged()) );
536  connect( mApplyOnForTraditional, SIGNAL(clicked()),
537  this, SLOT(slotApplicabilityChanged()) );
538  connect( mApplyOnForChecked, SIGNAL(clicked()),
539  this, SLOT(slotApplicabilityChanged()) );
540  connect( mApplyBeforeOut, SIGNAL(clicked()),
541  this, SLOT(slotApplicabilityChanged()) );
542  connect( mApplyOnOut, SIGNAL(clicked()),
543  this, SLOT(slotApplicabilityChanged()) );
544  connect( mApplyOnCtrlJ, SIGNAL(clicked()),
545  this, SLOT(slotApplicabilityChanged()) );
546  connect( mAccountList, SIGNAL(itemChanged(QTreeWidgetItem*,int)),
547  this, SLOT(slotApplicableAccountsChanged()) );
548 
549  // transfer changes from the 'stop processing here'
550  // check box to the filter
551  connect( mStopProcessingHere, SIGNAL(toggled(bool)),
552  this, SLOT(slotStopProcessingButtonToggled(bool)) );
553 
554  connect( mConfigureShortcut, SIGNAL(toggled(bool)),
555  this, SLOT(slotConfigureShortcutButtonToggled(bool)) );
556 
557  connect( mKeySeqWidget, SIGNAL(keySequenceChanged(QKeySequence)),
558  this, SLOT(slotShortcutChanged(QKeySequence)) );
559 
560  connect( mConfigureToolbar, SIGNAL(toggled(bool)),
561  this, SLOT(slotConfigureToolbarButtonToggled(bool)) );
562 
563  connect( mFilterActionIconButton, SIGNAL(iconChanged(QString)),
564  this, SLOT(slotFilterActionIconChanged(QString)) );
565 
566  // reset all widgets here
567  connect( mFilterList, SIGNAL(resetWidgets()),
568  this, SLOT(slotReset()) );
569 
570  connect( mFilterList, SIGNAL(applyWidgets()),
571  this, SLOT(slotUpdateFilter()) );
572 
573  // support auto-naming the filter
574  connect( mPatternEdit, SIGNAL(maybeNameChanged()),
575  mFilterList, SLOT(slotUpdateFilterName()) );
576 
577  // save filters on 'Apply' or 'OK'
578  connect( this, SIGNAL(buttonClicked(KDialog::ButtonCode)),
579  mFilterList, SLOT(slotApplyFilterChanges(KDialog::ButtonCode)) );
580  connect( button( KDialog::Apply ), SIGNAL(clicked(bool)), this, SLOT(slotApply()) );
581 
582  // save dialog size on 'OK'
583  connect( this, SIGNAL(okClicked()),
584  this, SLOT(slotSaveSize()) );
585 
586  // destruct the dialog on close and Cancel
587  connect( this, SIGNAL(closeClicked()),
588  this, SLOT(slotFinished()) );
589  connect( this, SIGNAL(cancelClicked()),
590  this, SLOT(slotFinished()) );
591 
592  // disable closing when user wants to continue editing
593  connect( mFilterList, SIGNAL(abortClosing()),
594  this, SLOT(slotDisableAccept()) );
595 
596  connect( mFilterList, SIGNAL(filterCreated()), this, SLOT(slotDialogUpdated()) );
597  connect( mFilterList, SIGNAL(filterRemoved(QList<MailCommon::MailFilter*>)),
598  this, SLOT(slotDialogUpdated()) );
599  connect( mFilterList, SIGNAL(filterUpdated(MailCommon::MailFilter*)),
600  this, SLOT(slotDialogUpdated()) );
601  connect( mFilterList, SIGNAL(filterOrderAltered()), this, SLOT(slotDialogUpdated()) );
602  connect( mPatternEdit, SIGNAL(patternChanged()), this, SLOT(slotDialogUpdated()) );
603  connect( mActionLister, SIGNAL(widgetAdded(QWidget*)), this, SLOT(slotDialogUpdated()) );
604  connect( mActionLister, SIGNAL(widgetRemoved()), this, SLOT(slotDialogUpdated()) );
605  connect( mActionLister, SIGNAL(filterModified()), this, SLOT(slotDialogUpdated()) );
606  connect( mActionLister, SIGNAL(clearWidgets()), this, SLOT(slotDialogUpdated()) );
607  KConfigGroup myGroup( KernelIf->config(), "Geometry" );
608  const QSize size = myGroup.readEntry( "filterDialogSize", QSize() );
609  if ( size != QSize() ) {
610  resize( size );
611  } else {
612  adjustSize();
613  }
614 
615  // load the filter list (emits filterSelected())
616  mFilterList->loadFilterList( createDummyFilter );
617  mIgnoreFilterUpdates = false;
618 }
619 
620 void KMFilterDialog::accept()
621 {
622  if ( mDoNotClose ) {
623  mDoNotClose = false; // only abort current close attempt
624  } else {
625  KDialog::accept();
626  slotFinished();
627  }
628 }
629 
630 void KMFilterDialog::slotApply()
631 {
632  enableButtonApply( false );
633 }
634 
635 void KMFilterDialog::slotFinished()
636 {
637  deleteLater();
638 }
639 
640 void KMFilterDialog::slotFolderChanged( const Akonadi::Collection &collection )
641 {
642  mRunNow->setEnabled( collection.isValid() );
643 }
644 
645 void KMFilterDialog::slotRunFilters()
646 {
647  if ( !mFolderRequester->collection().isValid() ) {
648  KMessageBox::information(
649  this,
650  i18nc( "@info",
651  "Unable to apply this filter since there are no folders selected." ),
652  i18n( "No folder selected." ) );
653  return;
654  }
655 
656  if ( isButtonEnabled( KDialog::Apply ) ) {
657  KMessageBox::information(
658  this,
659  i18nc( "@info",
660  "Some filters were changed and not saved yet. "
661  "You must save your filters before they can be applied." ),
662  i18n( "Filters changed." ) );
663  return;
664  }
665  SearchRule::RequiredPart requiredPart = SearchRule::Envelope;
666  const QStringList selectedFiltersId = mFilterList->selectedFilterId( requiredPart, mFolderRequester->collection().resource() );
667  if ( selectedFiltersId.isEmpty() ) {
668  KMessageBox::information(
669  this,
670  i18nc( "@info",
671  "Unable to apply a filter since there are no filters currently selected." ),
672  i18n( "No filters selected." ) );
673  return;
674  }
675  Akonadi::ItemFetchJob *job = new Akonadi::ItemFetchJob( mFolderRequester->collection(), this );
676  job->setProperty( "requiredPart", QVariant::fromValue( requiredPart ) );
677  job->setProperty( "listFilters", QVariant::fromValue( selectedFiltersId ) );
678 
679  connect( job, SIGNAL(result(KJob*)),
680  this, SLOT(slotFetchItemsForFolderDone(KJob*)) );
681 
682  mRunNow->setEnabled( false ); //Disable it
683 }
684 
685 void KMFilterDialog::slotFetchItemsForFolderDone( KJob *job )
686 {
687  Akonadi::ItemFetchJob *fjob = dynamic_cast<Akonadi::ItemFetchJob*>( job );
688  Q_ASSERT( fjob );
689 
690  QStringList filtersId;
691  if ( fjob->property( "listFilters" ).isValid() ) {
692  filtersId = fjob->property( "listFilters" ).toStringList();
693  }
694 
695  SearchRule::RequiredPart requiredPart = SearchRule::Envelope;
696  if ( fjob->property( "requiredPart" ).isValid() ) {
697  requiredPart = fjob->property( "requiredPart" ).value<SearchRule::RequiredPart>();
698  }
699  Akonadi::Item::List items = fjob->items();
700  mRunNow->setEnabled( true );
701  MailCommon::FilterManager::instance()->filter( items, requiredPart, filtersId );
702 }
703 
704 void KMFilterDialog::slotSaveSize() {
705  KConfigGroup myGroup( KernelIf->config(), "Geometry" );
706  myGroup.writeEntry( "filterDialogSize", size() );
707  myGroup.sync();
708 }
709 
710 void KMFilterDialog::slotFilterSelected( MailFilter *aFilter )
711 {
712  Q_ASSERT( aFilter );
713  mIgnoreFilterUpdates = true;
714  mActionLister->setActionList( aFilter->actions() );
715 
716  mAdvOptsGroup->setEnabled( true );
717 
718  mPatternEdit->setSearchPattern( aFilter->pattern() );
719  mFilter = aFilter;
720 
721  kDebug() << "apply on inbound ==" << aFilter->applyOnInbound();
722  kDebug() << "apply on outbound ==" << aFilter->applyOnOutbound();
723  kDebug() << "apply before outbound == " << aFilter->applyBeforeOutbound();
724  kDebug() << "apply on explicit ==" << aFilter->applyOnExplicit();
725 
726  // NOTE: setting these values activates the slot that sets them in
727  // the filter! So make sure we have the correct values _before_ we
728  // set the first one:
729  const bool applyOnIn = aFilter->applyOnInbound();
730  const bool applyOnForAll = aFilter->applicability() == MailFilter::All;
731  const bool applyOnTraditional = aFilter->applicability() == MailFilter::ButImap;
732  const bool applyBeforeOut = aFilter->applyBeforeOutbound();
733  const bool applyOnOut = aFilter->applyOnOutbound();
734  const bool applyOnExplicit = aFilter->applyOnExplicit();
735  const bool stopHere = aFilter->stopProcessingHere();
736  const bool configureShortcut = aFilter->configureShortcut();
737  const bool configureToolbar = aFilter->configureToolbar();
738  const QString icon = aFilter->icon();
739  const KShortcut shortcut( aFilter->shortcut() );
740 
741  mApplyOnIn->setChecked( applyOnIn );
742  mApplyOnForAll->setEnabled( applyOnIn );
743  mApplyOnForTraditional->setEnabled( applyOnIn );
744  mApplyOnForChecked->setEnabled( applyOnIn );
745  mApplyOnForAll->setChecked( applyOnForAll );
746  mApplyOnForTraditional->setChecked( applyOnTraditional );
747  mApplyOnForChecked->setChecked( !applyOnForAll && !applyOnTraditional );
748  mAccountList->setEnabled( mApplyOnForChecked->isEnabled() && mApplyOnForChecked->isChecked() );
749  slotUpdateAccountList();
750  mApplyBeforeOut->setChecked( applyBeforeOut );
751  mApplyOnOut->setChecked( applyOnOut );
752  mApplyOnCtrlJ->setChecked( applyOnExplicit );
753  mStopProcessingHere->setChecked( stopHere );
754  mConfigureShortcut->setChecked( configureShortcut );
755  mKeySeqWidget->setKeySequence( shortcut.primary(),
756  KKeySequenceWidget::NoValidate );
757  mConfigureToolbar->setChecked( configureToolbar );
758  mFilterActionIconButton->setIcon( icon );
759  mIgnoreFilterUpdates = false;
760 }
761 
762 void KMFilterDialog::slotReset()
763 {
764  mFilter = 0;
765  mPatternEdit->reset();
766 
767  mActionLister->reset();
768  mAdvOptsGroup->setEnabled( false );
769  slotUpdateAccountList();
770 }
771 
772 void KMFilterDialog::slotUpdateFilter()
773 {
774  mPatternEdit->updateSearchPattern();
775  mActionLister->updateActionList();
776 }
777 
778 void KMFilterDialog::slotApplicabilityChanged()
779 {
780  if ( mFilter ) {
781  mFilter->setApplyOnInbound( mApplyOnIn->isChecked() );
782  mFilter->setApplyBeforeOutbound( mApplyBeforeOut->isChecked() );
783  mFilter->setApplyOnOutbound( mApplyOnOut->isChecked() );
784  mFilter->setApplyOnExplicit( mApplyOnCtrlJ->isChecked() );
785  if ( mApplyOnForAll->isChecked() ) {
786  mFilter->setApplicability( MailFilter::All );
787  } else if ( mApplyOnForTraditional->isChecked() ) {
788  mFilter->setApplicability( MailFilter::ButImap );
789  } else if ( mApplyOnForChecked->isChecked() ) {
790  mFilter->setApplicability( MailFilter::Checked );
791  }
792 
793  mApplyOnForAll->setEnabled( mApplyOnIn->isChecked() );
794  mApplyOnForTraditional->setEnabled( mApplyOnIn->isChecked() );
795  mApplyOnForChecked->setEnabled( mApplyOnIn->isChecked() );
796  mAccountList->setEnabled( mApplyOnForChecked->isEnabled() && mApplyOnForChecked->isChecked() );
797 
798  // Advanced tab functionality - Update list of accounts this filter applies to
799  mAccountList->applyOnAccount(mFilter);
800 
801  // Enable the apply button
802  slotDialogUpdated();
803 
804  kDebug() << "Setting filter to be applied at"
805  << ( mFilter->applyOnInbound() ? "incoming " : "" )
806  << ( mFilter->applyOnOutbound() ? "outgoing " : "" )
807  << ( mFilter->applyBeforeOutbound() ? "before_outgoing " : "" )
808  << ( mFilter->applyOnExplicit() ? "explicit CTRL-J" : "" );
809  }
810 }
811 
812 void KMFilterDialog::slotApplicableAccountsChanged()
813 {
814  // Advanced tab functionality - Update list of accounts this filter applies to
815  if ( mFilter && mApplyOnForChecked->isEnabled() && mApplyOnForChecked->isChecked() ) {
816 
817  QTreeWidgetItemIterator it( mAccountList );
818 
819  while ( QTreeWidgetItem *item = *it ) {
820  const QString id = item->text( 2 );
821  mFilter->setApplyOnAccount( id, item->checkState( 0 ) == Qt::Checked );
822  ++it;
823  }
824 
825  // Enable the apply button
826  slotDialogUpdated();
827  }
828 }
829 
830 void KMFilterDialog::slotStopProcessingButtonToggled( bool aChecked )
831 {
832  if ( mFilter ) {
833  mFilter->setStopProcessingHere( aChecked );
834 
835  // Enable the apply button
836  slotDialogUpdated();
837  }
838 }
839 
840 void KMFilterDialog::slotConfigureShortcutButtonToggled( bool aChecked )
841 {
842  if ( mFilter ) {
843  mFilter->setConfigureShortcut( aChecked );
844  mKeySeqWidget->setEnabled( aChecked );
845  mConfigureToolbar->setEnabled( aChecked );
846  mFilterActionIconButton->setEnabled( aChecked );
847  mFilterActionLabel->setEnabled( aChecked );
848 
849  // Enable the apply button
850  slotDialogUpdated();
851  }
852 }
853 
854 void KMFilterDialog::slotShortcutChanged( const QKeySequence &newSeq )
855 {
856  if ( mFilter ) {
857  mKeySeqWidget->applyStealShortcut();
858  mFilter->setShortcut( KShortcut( newSeq ) );
859 
860  // Enable the apply button
861  slotDialogUpdated();
862  }
863 }
864 
865 void KMFilterDialog::slotConfigureToolbarButtonToggled( bool aChecked )
866 {
867  if ( mFilter ) {
868  mFilter->setConfigureToolbar( aChecked );
869  // Enable the apply button
870  slotDialogUpdated();
871  }
872 }
873 
874 void KMFilterDialog::slotFilterActionIconChanged( const QString &icon )
875 {
876  if ( mFilter ) {
877  mFilter->setIcon( icon );
878  // Enable the apply button
879  slotDialogUpdated();
880  }
881 }
882 
883 void KMFilterDialog::slotUpdateAccountList()
884 {
885  mAccountList->updateAccountList(mFilter);
886 }
887 
888 //=============================================================================
889 //
890 // class KMFilterListBox (the filter list manipulator)
891 //
892 //=============================================================================
893 
894 KMFilterListBox::KMFilterListBox( const QString & title, QWidget *parent )
895  : QGroupBox( title, parent )
896 {
897  QVBoxLayout *layout = new QVBoxLayout();
898 
899  //----------- the list box
900  mListWidget = new QListWidget(this);
901  mListWidget->setMinimumWidth(150);
902  mListWidget->setWhatsThis( i18n(_wt_filterlist) );
903  mListWidget->setDragDropMode( QAbstractItemView::InternalMove );
904  mListWidget->setSelectionMode( QAbstractItemView::ExtendedSelection );
905  connect( mListWidget->model(),
906  SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)),
907  SLOT(slotRowsMoved(QModelIndex,int,int,QModelIndex,int)) );
908 
909  KListWidgetSearchLine *mSearchListWidget = new KListWidgetSearchLine( this, mListWidget );
910  mSearchListWidget->setTrapReturnKey( true );
911  mSearchListWidget->setClickMessage(
912  i18nc( "@info/plain Displayed grayed-out inside the textbox, verb to search",
913  "Search" ) );
914 
915  layout->addWidget( mSearchListWidget );
916  layout->addWidget( mListWidget );
917 
918  //----------- the first row of buttons
919  KHBox *hb = new KHBox( this );
920  hb->setSpacing( 4 );
921 
922  mBtnTop = new KPushButton( QString(), hb );
923  mBtnTop->setIcon( KIcon( QLatin1String("go-top") ) );
924  mBtnTop->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) );
925  mBtnTop->setMinimumSize( mBtnTop->sizeHint() * 1.2 );
926 
927  mBtnUp = new KPushButton( QString(), hb );
928  mBtnUp->setAutoRepeat( true );
929  mBtnUp->setIcon( KIcon( QLatin1String("go-up") ) );
930  mBtnUp->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) );
931  mBtnUp->setMinimumSize( mBtnUp->sizeHint() * 1.2 );
932  mBtnDown = new KPushButton( QString(), hb );
933  mBtnDown->setAutoRepeat( true );
934  mBtnDown->setIcon( KIcon( QLatin1String("go-down") ) );
935  mBtnDown->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) );
936  mBtnDown->setMinimumSize( mBtnDown->sizeHint() * 1.2 );
937 
938  mBtnBottom = new KPushButton( QString(), hb );
939  mBtnBottom->setIcon( KIcon( QLatin1String("go-bottom") ) );
940  mBtnBottom->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) );
941  mBtnBottom->setMinimumSize( mBtnBottom->sizeHint() * 1.2 );
942 
943  mBtnUp->setToolTip( i18nc( "Move selected filter up.", "Up" ) );
944  mBtnDown->setToolTip( i18nc( "Move selected filter down.", "Down" ) );
945  mBtnTop->setToolTip( i18nc( "Move selected filter to the top.", "Top" ) );
946  mBtnBottom->setToolTip( i18nc( "Move selected filter to the bottom.", "Bottom" ) );
947  mBtnUp->setWhatsThis( i18n( _wt_filterlist_up ) );
948  mBtnDown->setWhatsThis( i18n( _wt_filterlist_down ) );
949  mBtnBottom->setWhatsThis( i18n( _wt_filterlist_bottom ) );
950  mBtnTop->setWhatsThis( i18n( _wt_filterlist_top ) );
951 
952  layout->addWidget( hb );
953 
954  //----------- the second row of buttons
955  hb = new KHBox( this );
956  hb->setSpacing( 4 );
957  mBtnNew = new QPushButton( QString(), hb );
958  mBtnNew->setIcon( KIcon( QLatin1String("document-new") ) );
959  mBtnNew->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) );
960  mBtnNew->setMinimumSize( mBtnNew->sizeHint() * 1.2 );
961  mBtnCopy = new QPushButton( QString(), hb );
962  mBtnCopy->setIcon( KIcon( QLatin1String("edit-copy") ) );
963  mBtnCopy->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) );
964  mBtnCopy->setMinimumSize( mBtnCopy->sizeHint() * 1.2 );
965  mBtnDelete = new QPushButton( QString(), hb );
966  mBtnDelete->setIcon( KIcon( QLatin1String("edit-delete") ) );
967  mBtnDelete->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) );
968  mBtnDelete->setMinimumSize( mBtnDelete->sizeHint() * 1.2 );
969  mBtnRename = new QPushButton( i18n( "Rename..." ), hb );
970  mBtnNew->setToolTip( i18nc( "@action:button in filter list manipulator", "New" ) );
971  mBtnCopy->setToolTip( i18n( "Copy" ) );
972  mBtnDelete->setToolTip( i18n( "Delete" ) );
973  mBtnNew->setWhatsThis( i18n( _wt_filterlist_new ) );
974  mBtnCopy->setWhatsThis( i18n( _wt_filterlist_copy ) );
975  mBtnDelete->setWhatsThis( i18n( _wt_filterlist_delete ) );
976  mBtnRename->setWhatsThis( i18n( _wt_filterlist_rename ) );
977 
978  layout->addWidget( hb );
979  setLayout( layout );
980 
981  QShortcut *shortcut = new QShortcut( this );
982  shortcut->setKey( Qt::Key_Delete );
983  connect( shortcut, SIGNAL(activated()), SLOT(slotDelete()) );
984 
985  //----------- now connect everything
986  connect( mListWidget, SIGNAL(currentRowChanged(int)),
987  this, SLOT(slotSelected(int)) );
988  connect( mListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
989  this, SLOT(slotRename()) );
990  connect( mListWidget, SIGNAL(itemChanged(QListWidgetItem*)),
991  this, SLOT(slotFilterEnabledChanged(QListWidgetItem*)));
992 
993  connect( mListWidget, SIGNAL(itemSelectionChanged()),
994  this, SLOT(slotSelectionChanged()));
995 
996  connect( mBtnUp, SIGNAL(clicked()),
997  this, SLOT(slotUp()) );
998  connect( mBtnDown, SIGNAL(clicked()),
999  this, SLOT(slotDown()) );
1000  connect( mBtnTop, SIGNAL(clicked()),
1001  this, SLOT(slotTop()) );
1002  connect( mBtnBottom, SIGNAL(clicked()),
1003  this, SLOT(slotBottom()) );
1004 
1005  connect( mBtnNew, SIGNAL(clicked()),
1006  this, SLOT(slotNew()) );
1007  connect( mBtnCopy, SIGNAL(clicked()),
1008  this, SLOT(slotCopy()) );
1009  connect( mBtnDelete, SIGNAL(clicked()),
1010  this, SLOT(slotDelete()) );
1011  connect( mBtnRename, SIGNAL(clicked()),
1012  this, SLOT(slotRename()) );
1013 
1014  // the dialog should call loadFilterList()
1015  // when all signals are connected.
1016  enableControls();
1017 }
1018 
1019 KMFilterListBox::~KMFilterListBox()
1020 {
1021 }
1022 
1023 bool KMFilterListBox::itemIsValid( QListWidgetItem *item ) const
1024 {
1025  if ( !item ) {
1026  kDebug() << "Called while no filter is selected, ignoring.";
1027  return false;
1028  }
1029  if ( item->isHidden() ) {
1030  return false;
1031  }
1032  return true;
1033 }
1034 
1035 void KMFilterListBox::slotFilterEnabledChanged( QListWidgetItem *item )
1036 {
1037  if ( !item ) {
1038  kDebug() << "Called while no filter is selected, ignoring.";
1039  return;
1040  }
1041  QListWidgetFilterItem *itemFilter = static_cast<QListWidgetFilterItem*>( item );
1042  MailCommon::MailFilter *filter = itemFilter->filter();
1043  filter->setEnabled( ( item->checkState() == Qt::Checked ) );
1044  emit filterUpdated( filter );
1045 }
1046 
1047 void KMFilterListBox::slotRowsMoved( const QModelIndex &,
1048  int sourcestart, int sourceEnd,
1049  const QModelIndex &, int destinationRow )
1050 {
1051  Q_UNUSED( sourceEnd );
1052  Q_UNUSED( sourcestart );
1053  Q_UNUSED( destinationRow );
1054  enableControls();
1055 
1056  emit filterOrderAltered();
1057 }
1058 
1059 void KMFilterListBox::createFilter( const QByteArray &field, const QString &value )
1060 {
1061  SearchRule::Ptr newRule = SearchRule::createInstance( field, SearchRule::FuncContains, value );
1062 
1063  MailFilter *newFilter = new MailFilter();
1064  newFilter->pattern()->append( newRule );
1065  newFilter->pattern()->setName( QString::fromLatin1( "<%1>: %2" ).
1066  arg( QString::fromLatin1( field ) ).
1067  arg( value ) );
1068 
1069  FilterActionDesc *desc = MailCommon::FilterManager::filterActionDict()->value( QLatin1String("transfer") );
1070  if ( desc ) {
1071  newFilter->actions()->append( desc->create() );
1072  }
1073 
1074  insertFilter( newFilter );
1075  enableControls();
1076 }
1077 
1078 void KMFilterListBox::slotUpdateFilterName()
1079 {
1080  QListWidgetItem *item = mListWidget->currentItem();
1081  if ( !item ) {
1082  kDebug() << "Called while no filter is selected, ignoring.";
1083  return;
1084  }
1085  QListWidgetFilterItem *itemFilter = static_cast<QListWidgetFilterItem*>( item );
1086  MailCommon::MailFilter *filter = itemFilter->filter();
1087 
1088  SearchPattern *p = filter->pattern();
1089  if ( !p ) {
1090  return;
1091  }
1092 
1093  QString shouldBeName = p->name();
1094  QString displayedName = itemFilter->text();
1095 
1096  if ( shouldBeName.trimmed().isEmpty() ) {
1097  filter->setAutoNaming( true );
1098  }
1099 
1100  if ( filter->isAutoNaming() ) {
1101  // auto-naming of patterns
1102  if ( !p->isEmpty() && p->first() && !p->first()->field().trimmed().isEmpty() ) {
1103  shouldBeName = QString::fromLatin1( "<%1>: %2" ).
1104  arg( QString::fromLatin1( p->first()->field() ) ).
1105  arg( p->first()->contents() );
1106  } else {
1107  shouldBeName = QLatin1Char('<') + i18n( "unnamed" ) + QLatin1Char('>');
1108  }
1109  p->setName( shouldBeName );
1110  }
1111 
1112  if ( displayedName == shouldBeName ) {
1113  return;
1114  }
1115 
1116  filter->setToolbarName( shouldBeName );
1117 
1118  mListWidget->blockSignals( true );
1119  itemFilter->setText( shouldBeName );
1120  mListWidget->blockSignals( false );
1121 }
1122 
1123 void KMFilterListBox::slotApplyFilterChanges( KDialog::ButtonCode button )
1124 {
1125  bool closeAfterSaving;
1126  if ( button == KDialog::Ok ) {
1127  closeAfterSaving = true;
1128  } else if ( button == KDialog::Apply ) {
1129  closeAfterSaving = false;
1130  } else {
1131  return; // ignore close and cancel
1132  }
1133 
1134  if ( mListWidget->currentItem() ) {
1135  emit applyWidgets();
1136  slotSelected( mListWidget->currentRow() );
1137  }
1138 
1139  // by now all edit widgets should have written back
1140  // their widget's data into our filter list.
1141 
1142  const QList<MailFilter*> newFilters = filtersForSaving( closeAfterSaving );
1143 
1144  MailCommon::FilterManager::instance()->setFilters( newFilters );
1145 }
1146 
1147 QList<MailFilter *> KMFilterListBox::filtersForSaving( bool closeAfterSaving ) const
1148 {
1149  const_cast<KMFilterListBox*>( this )->applyWidgets(); // signals aren't const
1150  QList<MailFilter *> filters;
1151  QStringList emptyFilters;
1152  const int numberOfFilter( mListWidget->count() );
1153  for ( int i = 0; i <numberOfFilter; ++i ) {
1154  QListWidgetFilterItem *itemFilter =
1155  static_cast<QListWidgetFilterItem*>( mListWidget->item( i ) );
1156  MailFilter *f = new MailFilter( *itemFilter->filter() ); // deep copy
1157 
1158  f->purify();
1159  if ( !f->isEmpty() ) {
1160  // the filter is valid:
1161  filters.append( f );
1162  } else {
1163  // the filter is invalid:
1164  emptyFilters << f->name();
1165  delete f;
1166  }
1167  }
1168 
1169  // report on invalid filters:
1170  if ( !emptyFilters.empty() ) {
1171  if ( closeAfterSaving ) {
1172  // Ok clicked. Give option to continue editing
1173  int response =
1174  KMessageBox::warningContinueCancelList(
1175  0,
1176  i18n( "The following filters are invalid (e.g. containing no actions "
1177  "or no search rules). Discard or edit invalid filters?" ),
1178  emptyFilters,
1179  QString(),
1180  KGuiItem( i18n( "Discard" ) ),
1181  KStandardGuiItem::cancel(),
1182  QLatin1String("ShowInvalidFilterWarning") );
1183  if ( response == KMessageBox::Cancel ) {
1184  emit abortClosing();
1185  }
1186  } else {
1187  // Apply clicked. Just warn.
1188  KMessageBox::informationList(
1189  0,
1190  i18n( "The following filters have not been saved because they were invalid "
1191  "(e.g. containing no actions or no search rules)." ),
1192  emptyFilters,
1193  QString(),
1194  QLatin1String("ShowInvalidFilterWarning") );
1195  }
1196  }
1197  return filters;
1198 }
1199 
1200 void KMFilterListBox::slotSelectionChanged()
1201 {
1202  if ( mListWidget->selectedItems().count() > 1 ) {
1203  resetWidgets();
1204  }
1205  enableControls();
1206 }
1207 
1208 void KMFilterListBox::slotSelected( int aIdx )
1209 {
1210  if ( aIdx >= 0 && aIdx < mListWidget->count() ) {
1211  QListWidgetFilterItem *itemFilter =
1212  static_cast<QListWidgetFilterItem*>( mListWidget->item( aIdx ) );
1213  MailFilter *f = itemFilter->filter();
1214 
1215  if ( f ) {
1216  emit filterSelected( f );
1217  } else {
1218  emit resetWidgets();
1219  }
1220  } else {
1221  emit resetWidgets();
1222  }
1223  enableControls();
1224 }
1225 
1226 void KMFilterListBox::slotNew()
1227 {
1228  QListWidgetItem *item = mListWidget->currentItem();
1229  if ( item && item->isHidden() ) {
1230  return;
1231  }
1232  // just insert a new filter.
1233  insertFilter( new MailFilter() );
1234  enableControls();
1235 }
1236 
1237 void KMFilterListBox::slotCopy()
1238 {
1239  QListWidgetItem *item = mListWidget->currentItem();
1240  if ( !itemIsValid( item ) ) {
1241  return;
1242  }
1243 
1244  // make sure that all changes are written to the filter before we copy it
1245  emit applyWidgets();
1246  QListWidgetFilterItem *itemFilter = static_cast<QListWidgetFilterItem*>( item );
1247 
1248  MailFilter *filter = itemFilter->filter();
1249 
1250  // enableControls should make sure this method is
1251  // never called when no filter is selected.
1252  Q_ASSERT( filter );
1253 
1254  // inserts a copy of the current filter.
1255  MailFilter *copyFilter = new MailFilter( *filter );
1256  copyFilter->setShortcut( KShortcut() );
1257 
1258  insertFilter( copyFilter );
1259  enableControls();
1260 }
1261 
1262 void KMFilterListBox::slotDelete()
1263 {
1264  QListWidgetItem *itemFirst = mListWidget->currentItem();
1265  if ( !itemIsValid( itemFirst ) ) {
1266  return;
1267  }
1268  const bool uniqFilterSelected = ( mListWidget->selectedItems().count() == 1 );
1269 
1270  QListWidgetFilterItem *itemFilter = static_cast<QListWidgetFilterItem*>( itemFirst );
1271  MailCommon::MailFilter *filter = itemFilter->filter();
1272  const QString filterName = filter->pattern()->name();
1273  if ( uniqFilterSelected ) {
1274  if ( KMessageBox::questionYesNo(
1275  this,
1276  i18n( "Do you want to remove the filter \"%1\"?",filterName ),
1277  i18n( "Remove Filter" ) ) == KMessageBox::No ) {
1278  return;
1279  }
1280  } else {
1281  if ( KMessageBox::questionYesNo(
1282  this,
1283  i18n( "Do you want to remove selected filters?" ),
1284  i18n( "Remove Filters" ) ) == KMessageBox::No ) {
1285  return;
1286  }
1287  }
1288 
1289  const int oIdxSelItem = mListWidget->currentRow();
1290  QList<MailCommon::MailFilter*>lst;
1291 
1292  emit resetWidgets();
1293 
1294  Q_FOREACH ( QListWidgetItem *item, mListWidget->selectedItems() ) {
1295  QListWidgetFilterItem *itemFilter = static_cast<QListWidgetFilterItem*>( item );
1296 
1297  MailCommon::MailFilter *filter = itemFilter->filter();
1298  lst << filter;
1299 
1300  // remove the filter from both the listbox
1301  QListWidgetItem *item2 = mListWidget->takeItem( mListWidget->row( item ) );
1302  delete item2;
1303  }
1304  const int count = mListWidget->count();
1305  // and set the new current item.
1306  if ( count > oIdxSelItem ) {
1307  // oIdxItem is still a valid index
1308  mListWidget->setCurrentRow( oIdxSelItem );
1309  } else if ( count ) {
1310  // oIdxSelIdx is no longer valid, but the
1311  // list box isn't empty
1312  mListWidget->setCurrentRow( count - 1 );
1313  }
1314 
1315  // work around a problem when deleting the first item in a QListWidget:
1316  // after takeItem, slotSelectionChanged is emitted with 1, but the row 0
1317  // remains selected and another selectCurrentRow(0) does not trigger the
1318  // selectionChanged signal
1319  // (qt-copy as of 2006-12-22 / gungl)
1320  if ( oIdxSelItem == 0 ) {
1321  slotSelected( 0 );
1322  }
1323  enableControls();
1324 
1325  emit filterRemoved( lst );
1326 }
1327 
1328 void KMFilterListBox::slotTop()
1329 {
1330  QList<QListWidgetItem*> listWidgetItem = selectedFilter();
1331  if ( listWidgetItem.isEmpty() ) {
1332  return;
1333  }
1334 
1335  const int numberOfItem( listWidgetItem.count() );
1336  if ( ( numberOfItem == 1 ) && ( mListWidget->currentRow() == 0 ) ) {
1337  kDebug() << "Called while the _topmost_ filter is selected, ignoring.";
1338  return;
1339  }
1340 
1341  QListWidgetItem *item = 0;
1342  bool wasMoved = false;
1343  for ( int i = 0; i<numberOfItem; ++i ) {
1344  const int posItem = mListWidget->row( listWidgetItem.at( i ) );
1345  if ( posItem == i ) {
1346  continue;
1347  }
1348  item = mListWidget->takeItem( mListWidget->row( listWidgetItem.at( i ) ) );
1349  mListWidget->insertItem( i, item );
1350  wasMoved = true;
1351  }
1352 
1353  if ( wasMoved ) {
1354  enableControls();
1355  emit filterOrderAltered();
1356  }
1357 }
1358 
1359 QList<QListWidgetItem*> KMFilterListBox::selectedFilter()
1360 {
1361  QList<QListWidgetItem*> listWidgetItem;
1362  const int numberOfFilters = mListWidget->count();
1363  for ( int i = 0; i<numberOfFilters; ++i ) {
1364  if ( mListWidget->item(i)->isSelected() && !mListWidget->item(i)->isHidden() ) {
1365  listWidgetItem << mListWidget->item(i);
1366  }
1367  }
1368  return listWidgetItem;
1369 }
1370 
1371 QStringList KMFilterListBox::selectedFilterId( SearchRule::RequiredPart& requiredPart, const QString& resource ) const
1372 {
1373  QStringList listFilterId;
1374  requiredPart = SearchRule::Envelope;
1375  const int numberOfFilters = mListWidget->count();
1376  for ( int i = 0; i <numberOfFilters; ++i ) {
1377  if ( mListWidget->item(i)->isSelected() && !mListWidget->item(i)->isHidden() ) {
1378  const QString id =
1379  static_cast<QListWidgetFilterItem*>( mListWidget->item( i ) )->filter()->identifier();
1380  listFilterId << id;
1381  requiredPart = qMax(requiredPart,
1382  static_cast<QListWidgetFilterItem*>( mListWidget->item( i ) )->filter()->requiredPart(resource));
1383  }
1384  }
1385  return listFilterId;
1386 }
1387 
1388 void KMFilterListBox::slotBottom()
1389 {
1390  QList<QListWidgetItem*> listWidgetItem = selectedFilter();
1391  if ( listWidgetItem.isEmpty() ) {
1392  return;
1393  }
1394 
1395  const int numberOfElement( mListWidget->count() );
1396  const int numberOfItem( listWidgetItem.count() );
1397  if ( ( numberOfItem == 1 ) && ( mListWidget->currentRow() == numberOfElement - 1 ) ) {
1398  kDebug() << "Called while the _last_ filter is selected, ignoring.";
1399  return;
1400  }
1401 
1402  QListWidgetItem *item = 0;
1403  int j = 0;
1404  bool wasMoved = false;
1405  for ( int i = numberOfItem-1; i>= 0; --i, j++ ) {
1406  const int posItem = mListWidget->row( listWidgetItem.at( i ) );
1407  if ( posItem == ( numberOfElement-1 -j ) ) {
1408  continue;
1409  }
1410  item = mListWidget->takeItem( mListWidget->row( listWidgetItem.at( i ) ) );
1411  mListWidget->insertItem( numberOfElement-j, item );
1412  wasMoved = true;
1413  }
1414 
1415  if ( wasMoved ) {
1416  enableControls();
1417  emit filterOrderAltered();
1418  }
1419 }
1420 
1421 void KMFilterListBox::slotUp()
1422 {
1423  QList<QListWidgetItem*> listWidgetItem = selectedFilter();
1424  if ( listWidgetItem.isEmpty() ) {
1425  return;
1426  }
1427 
1428  const int numberOfItem( listWidgetItem.count() );
1429  if ( ( numberOfItem == 1 ) && ( mListWidget->currentRow() == 0 ) ) {
1430  kDebug() << "Called while the _topmost_ filter is selected, ignoring.";
1431  return;
1432  }
1433  bool wasMoved = false;
1434 
1435  for ( int i = 0; i<numberOfItem; ++i ) {
1436  const int posItem = mListWidget->row( listWidgetItem.at( i ) );
1437  if ( posItem == i ) {
1438  continue;
1439  }
1440  swapNeighbouringFilters( posItem, posItem - 1 );
1441  wasMoved = true;
1442  }
1443  if ( wasMoved ) {
1444  enableControls();
1445  emit filterOrderAltered();
1446  }
1447 }
1448 
1449 void KMFilterListBox::slotDown()
1450 {
1451  QList<QListWidgetItem*> listWidgetItem = selectedFilter();
1452  if ( listWidgetItem.isEmpty() ) {
1453  return;
1454  }
1455 
1456  const int numberOfElement( mListWidget->count() );
1457  const int numberOfItem( listWidgetItem.count() );
1458  if ( ( numberOfItem == 1 ) && ( mListWidget->currentRow() == numberOfElement - 1 ) ) {
1459  kDebug() << "Called while the _last_ filter is selected, ignoring.";
1460  return;
1461  }
1462 
1463  int j = 0;
1464  bool wasMoved = false;
1465  for ( int i = numberOfItem-1; i>= 0; --i, j++ ) {
1466  const int posItem = mListWidget->row( listWidgetItem.at( i ) );
1467  if ( posItem == ( numberOfElement-1 -j ) ) {
1468  continue;
1469  }
1470  swapNeighbouringFilters( posItem, posItem + 1 );
1471  wasMoved = true;
1472  }
1473 
1474  if ( wasMoved ) {
1475  enableControls();
1476  emit filterOrderAltered();
1477  }
1478 }
1479 
1480 void KMFilterListBox::slotRename()
1481 {
1482  QListWidgetItem *item = mListWidget->currentItem();
1483  if ( !itemIsValid(item) ) {
1484  return;
1485  }
1486  QListWidgetFilterItem *itemFilter = static_cast<QListWidgetFilterItem*>( item );
1487 
1488  bool okPressed = false;
1489  MailFilter *filter = itemFilter->filter();
1490 
1491  // enableControls should make sure this method is
1492  // never called when no filter is selected.
1493  Q_ASSERT( filter );
1494 
1495  // allow empty names - those will turn auto-naming on again
1496  QValidator *validator = new QRegExpValidator( QRegExp( QLatin1String(".*") ), 0 );
1497  QString newName =
1498  KInputDialog::getText (
1499  i18n( "Rename Filter" ),
1500  i18n( "Rename filter \"%1\" to:\n(leave the field empty for automatic naming)",
1501  filter->pattern()->name() ), /*label*/
1502  filter->pattern()->name(), /* initial value */
1503  &okPressed,
1504  window(),
1505  validator );
1506  delete validator;
1507 
1508  if ( !okPressed ) {
1509  return;
1510  }
1511 
1512  if ( newName.isEmpty() ) {
1513  // bait for slotUpdateFilterName to
1514  // use automatic naming again.
1515  filter->pattern()->setName( QLatin1String("<>") );
1516  filter->setAutoNaming( true );
1517  } else {
1518  filter->pattern()->setName( newName );
1519  filter->setAutoNaming( false );
1520  }
1521 
1522  slotUpdateFilterName();
1523 
1524  emit filterUpdated( filter );
1525 }
1526 
1527 void KMFilterListBox::enableControls()
1528 {
1529  const int currentIndex = mListWidget->currentRow();
1530  const bool theFirst = ( currentIndex == 0 );
1531  const int numberOfElement( mListWidget->count() );
1532  const bool theLast = ( currentIndex >= numberOfElement - 1 );
1533  const bool aFilterIsSelected = ( currentIndex >= 0 );
1534 
1535  const int numberOfSelectedItem( mListWidget->selectedItems().count() );
1536  const bool uniqFilterSelected = ( numberOfSelectedItem == 1 );
1537  const bool allItemSelected = ( numberOfSelectedItem == numberOfElement );
1538 
1539  mBtnUp->setEnabled( aFilterIsSelected && ( ( uniqFilterSelected && !theFirst ) ||
1540  ( !uniqFilterSelected ) ) && !allItemSelected );
1541  mBtnDown->setEnabled( aFilterIsSelected &&
1542  ( ( uniqFilterSelected && !theLast ) ||
1543  ( !uniqFilterSelected ) ) && !allItemSelected );
1544 
1545  mBtnCopy->setEnabled( aFilterIsSelected && uniqFilterSelected );
1546  mBtnDelete->setEnabled( aFilterIsSelected );
1547  mBtnRename->setEnabled( aFilterIsSelected && uniqFilterSelected );
1548 
1549  mBtnTop->setEnabled( aFilterIsSelected &&
1550  ( ( uniqFilterSelected && !theFirst ) ||
1551  ( !uniqFilterSelected ) ) && !allItemSelected );
1552 
1553  mBtnBottom->setEnabled( aFilterIsSelected &&
1554  ( ( uniqFilterSelected && !theLast ) ||
1555  ( !uniqFilterSelected ) ) && !allItemSelected );
1556  if ( aFilterIsSelected ) {
1557  mListWidget->scrollToItem( mListWidget->currentItem() );
1558  }
1559 }
1560 
1561 void KMFilterListBox::loadFilterList( bool createDummyFilter )
1562 {
1563  Q_ASSERT( mListWidget );
1564  setEnabled( false );
1565  emit resetWidgets();
1566  // we don't want the insertion to
1567  // cause flicker in the edit widgets.
1568  blockSignals( true );
1569 
1570  // clear both lists
1571  mListWidget->clear();
1572 
1573  const QList<MailFilter*> filters = MailCommon::FilterManager::instance()->filters();
1574  foreach ( MailFilter *filter, filters ) {
1575  QListWidgetFilterItem *item =
1576  new QListWidgetFilterItem( filter->pattern()->name(), mListWidget );
1577  item->setFilter( new MailFilter( *filter ) );
1578  mListWidget->addItem( item );
1579  }
1580 
1581  blockSignals(false);
1582  setEnabled(true);
1583 
1584  // create an empty filter when there's none, to avoid a completely
1585  // disabled dialog (usability tests indicated that the new-filter
1586  // button is too hard to find that way):
1587  const int numberOfItem( mListWidget->count() );
1588  if ( !numberOfItem && createDummyFilter ) {
1589  slotNew();
1590  }
1591 
1592  if ( numberOfItem > 0 ) {
1593  mListWidget->setCurrentRow( 0 );
1594  }
1595 
1596  enableControls();
1597 }
1598 
1599 void KMFilterListBox::insertFilter( MailFilter *aFilter )
1600 {
1601  // must be really a filter...
1602  Q_ASSERT( aFilter );
1603  const int currentIndex = mListWidget->currentRow();
1604  // if mIdxSelItem < 0, QListBox::insertItem will append.
1605  QListWidgetFilterItem *item = new QListWidgetFilterItem( aFilter->pattern()->name() );
1606  item->setFilter( aFilter );
1607  mListWidget->insertItem( currentIndex, item );
1608  mListWidget->clearSelection();
1609  if ( currentIndex < 0 ) {
1610  mListWidget->setCurrentRow( mListWidget->count() - 1 );
1611  } else {
1612  // insert just before selected
1613  mListWidget->setCurrentRow( currentIndex );
1614  }
1615 
1616  emit filterCreated();
1617  emit filterOrderAltered();
1618 }
1619 
1620 void KMFilterListBox::appendFilter( MailFilter *aFilter )
1621 {
1622  QListWidgetFilterItem *item =
1623  new QListWidgetFilterItem( aFilter->pattern()->name(), mListWidget );
1624 
1625  item->setFilter( aFilter );
1626  mListWidget->addItem( item );
1627 
1628  emit filterCreated();
1629 }
1630 
1631 void KMFilterListBox::swapNeighbouringFilters( int untouchedOne, int movedOne )
1632 {
1633  // must be neighbours...
1634  Q_ASSERT( untouchedOne - movedOne == 1 || movedOne - untouchedOne == 1 );
1635 
1636  // untouchedOne is at idx. to move it down(up),
1637  // remove item at idx+(-)1 w/o deleting it.
1638  QListWidgetItem *item = mListWidget->takeItem( movedOne );
1639  // now selected item is at idx(idx-1), so
1640  // insert the other item at idx, ie. above(below).
1641  mListWidget->insertItem( untouchedOne, item );
1642 }
1643 
1644 void KMFilterDialog::slotImportFilter( QAction *act )
1645 {
1646  if ( act ) {
1647  importFilters( act->data().value<MailCommon::FilterImporterExporter::FilterType>() );
1648  }
1649 }
1650 
1651 void KMFilterDialog::importFilters( MailCommon::FilterImporterExporter::FilterType type )
1652 {
1653  FilterImporterExporter importer( this );
1654  bool canceled = false;
1655  QList<MailFilter *> filters = importer.importFilters( canceled, type );
1656  if ( canceled ) {
1657  return;
1658  }
1659 
1660  if ( filters.isEmpty() ) {
1661  KMessageBox::information( this, i18n( "No filter was imported." ) );
1662  return;
1663  }
1664  QStringList listOfFilter;
1665  QList<MailFilter*>::ConstIterator end( filters.constEnd() );
1666 
1667  for ( QList<MailFilter*>::ConstIterator it = filters.constBegin(); it != end; ++it ) {
1668  mFilterList->appendFilter( *it ); // no need to deep copy, ownership passes to the list
1669  listOfFilter << (*it)->name();
1670  }
1671 
1672  KMessageBox::informationList(
1673  this,
1674  i18n( "Filters which were imported:" ),
1675  listOfFilter );
1676 }
1677 
1678 void KMFilterDialog::slotExportFilters()
1679 {
1680  FilterImporterExporter exporter( this );
1681  QList<MailFilter *> filters = mFilterList->filtersForSaving( false );
1682  exporter.exportFilters( filters );
1683 }
1684 
1685 void KMFilterDialog::slotDisableAccept()
1686 {
1687  mDoNotClose = true;
1688 }
1689 
1690 void KMFilterDialog::slotDialogUpdated()
1691 {
1692  kDebug() << "Detected a change in data bound to the dialog!";
1693  if ( !mIgnoreFilterUpdates ) {
1694  enableButtonApply( true );
1695  }
1696 }
1697 
1698 void KMFilterDialog::slotExportAsSieveScript()
1699 {
1700  if ( isButtonEnabled( KDialog::Apply ) ) {
1701  KMessageBox::information(
1702  this,
1703  i18nc( "@info",
1704  "Some filters were changed and not saved yet. "
1705  "You must save your filters before they can be exported." ),
1706  i18n( "Filters changed." ) );
1707  return;
1708  }
1709  KMessageBox::information(this, i18n("We cannot convert all KMail filters to sieve scripts but we can try :)"), i18n("Convert KMail filters to sieve scripts"));
1710  QList<MailFilter *> filters = mFilterList->filtersForSaving( false );
1711  QPointer<FilterSelectionDialog> dlg = new FilterSelectionDialog( this );
1712  dlg->setFilters( filters );
1713  if ( dlg->exec() == QDialog::Accepted ) {
1714  QList<MailFilter*> lst = dlg->selectedFilters();
1715  if (!lst.isEmpty()) {
1716  FilterConvertToSieve convert(lst);
1717  convert.convert();
1718  qDeleteAll(lst);
1719  }
1720  }
1721  delete dlg;
1722 }
1723 
1724 }
1725 
1726 #include "kmfilterdialog.moc"
MailCommon::KMFilterListBox::~KMFilterListBox
~KMFilterListBox()
Destructor.
Definition: kmfilterdialog.cpp:1019
MailCommon::KMFilterDialog::mKeySeqWidget
KKeySequenceWidget * mKeySeqWidget
Definition: kmfilterdialog.h:466
MailCommon::MailFilter::setConfigureShortcut
void setConfigureShortcut(bool aShort)
Set whether this filter should be plugged into the filter menu.
Definition: mailfilter.cpp:317
MailCommon::FilterManager::setFilters
void setFilters(const QList< MailCommon::MailFilter * > &filters)
Replace the list of filters of the filter manager with the given list of filters. ...
Definition: filtermanager.cpp:269
MailCommon::Util::agentInstances
MAILCOMMON_EXPORT Akonadi::AgentInstance::List agentInstances(bool excludeMailTransport=true)
Definition: mailutil.cpp:149
MailCommon::MailFilter::applyOnExplicit
bool applyOnExplicit() const
Definition: mailfilter.cpp:227
folderrequester.h
MailCommon::KMFilterDialog::mApplyOnCtrlJ
QCheckBox * mApplyOnCtrlJ
Definition: kmfilterdialog.h:452
MailCommon::KMFilterListBox::mBtnNew
QPushButton * mBtnNew
The various action buttons.
Definition: kmfilterdialog.h:269
MailCommon::KMFilterListBox::filterRemoved
void filterRemoved(const QList< MailCommon::MailFilter * > &filter)
Emitted when a filter is deleted.
KernelIf
#define KernelIf
Definition: mailkernel.h:186
MailCommon::AccountList::~AccountList
~AccountList()
Definition: kmfilterdialog.cpp:92
MailCommon::SearchPatternEdit::updateSearchPattern
void updateSearchPattern()
Updates the search pattern according to the current widget values.
Definition: searchpatternedit.cpp:592
MailCommon::KMFilterDialog::mApplyOnIn
QCheckBox * mApplyOnIn
Lets the user select whether to apply this filter on inbound/outbound messages, both, or only on explicit CTRL-J.
Definition: kmfilterdialog.h:452
MailCommon::KMFilterDialog::mApplyOnOut
QCheckBox * mApplyOnOut
Definition: kmfilterdialog.h:452
MailCommon::KMFilterDialog::mFilterActionIconButton
KIconButton * mFilterActionIconButton
Definition: kmfilterdialog.h:465
MailCommon::KMFilterListBox::slotDown
void slotDown()
Called when the user clicks the 'Down' button.
Definition: kmfilterdialog.cpp:1449
MailCommon::MailFilter::isEmpty
bool isEmpty() const
Check for empty pattern and action list.
Definition: mailfilter.cpp:563
MailCommon::KMFilterDialog::slotRunFilters
void slotRunFilters()
Definition: kmfilterdialog.cpp:645
MailCommon::QListWidgetFilterItem
Definition: kmfilterdialog.h:476
MailCommon::FilterImporterExporter::ClawsMailFilter
Definition: filterimporterexporter.h:63
MailCommon::_wt_filterlist_down
const char * _wt_filterlist_down
Definition: kmfilterdialog.cpp:252
MailCommon::KMFilterListBox::mBtnRename
QPushButton * mBtnRename
Definition: kmfilterdialog.h:274
QTreeWidget
MailCommon::KMFilterListBox::slotUpdateFilterName
void slotUpdateFilterName()
Called when the name of a filter might have changed (e.g.
Definition: kmfilterdialog.cpp:1078
MailCommon::_wt_filterdlg_showLater
const char * _wt_filterdlg_showLater
Definition: kmfilterdialog.cpp:283
text
const char * text
Definition: mdnadvicedialog.cpp:52
MailCommon::KMFilterDialog::slotApply
void slotApply()
Called wherenever the apply button is pressed.
Definition: kmfilterdialog.cpp:630
filterselectiondialog.h
MailCommon::KMFilterDialog::slotStopProcessingButtonToggled
void slotStopProcessingButtonToggled(bool aChecked)
Definition: kmfilterdialog.cpp:830
MailCommon::FilterImporterExporter::BalsaFilter
Definition: filterimporterexporter.h:62
MailCommon::FilterActionWidgetLister::reset
void reset()
Resets the action widgets.
Definition: filteractionwidget.cpp:385
MailCommon::FilterActionWidgetLister
A container widget for a list of FilterActionWidgets.
Definition: filteractionwidget.h:115
MailCommon::KMFilterDialog::slotFilterActionIconChanged
void slotFilterActionIconChanged(const QString &icon)
Definition: kmfilterdialog.cpp:874
MailCommon::MailFilter::shortcut
const KShortcut & shortcut() const
Definition: mailfilter.cpp:348
QWidget
searchpatternedit.h
MailCommon::KMFilterDialog::slotApplicableAccountsChanged
void slotApplicableAccountsChanged()
Definition: kmfilterdialog.cpp:812
MailCommon::MailFilter::setApplyOnOutbound
void setApplyOnOutbound(bool aApply=true)
Set whether this filter should be applied on outbound messages (aApply == true) or not...
Definition: mailfilter.cpp:192
MailCommon::KMFilterDialog::mConfigureShortcut
QCheckBox * mConfigureShortcut
Definition: kmfilterdialog.h:462
MailCommon::KMFilterListBox::mBtnDown
QPushButton * mBtnDown
Definition: kmfilterdialog.h:273
MailCommon::MailFilter::setShortcut
void setShortcut(const KShortcut &shortcut)
Set the shortcut to be used if plugged into the filter menu or toolbar.
Definition: mailfilter.cpp:343
MailCommon::KMFilterListBox::abortClosing
void abortClosing() const
Emitted when the user decides to continue editing after being warned about invalid filters...
MailCommon::KMFilterDialog::mAdvOptsGroup
QGroupBox * mAdvOptsGroup
Definition: kmfilterdialog.h:467
MailCommon::KMFilterDialog::slotFinished
void slotFinished()
Called when the dialog is closed (finished).
Definition: kmfilterdialog.cpp:635
KDialog
MailCommon::MailFilter::actions
QList< FilterAction * > * actions()
Provides a reference to the internal action list.
Definition: mailfilter.cpp:172
id
SearchRule::Function id
Definition: daterulewidgethandler.cpp:34
MailCommon::SearchRule::Ptr
boost::shared_ptr< SearchRule > Ptr
Defines a pointer to a search rule.
Definition: searchpattern.h:69
MailCommon::KMFilterDialog::mActionLister
MailCommon::FilterActionWidgetLister * mActionLister
The widget that allows editing of the filter actions.
Definition: kmfilterdialog.h:448
MailCommon::KMFilterListBox::mListWidget
QListWidget * mListWidget
The listbox displaying the filter list.
Definition: kmfilterdialog.h:266
MailCommon::_wt_filterlist_delete
const char * _wt_filterlist_delete
Definition: kmfilterdialog.cpp:235
MailCommon::MailFilter::ButImap
Definition: mailfilter.h:70
MailCommon::KMFilterListBox::insertFilter
void insertFilter(MailCommon::MailFilter *aFilter)
Definition: kmfilterdialog.cpp:1599
MailCommon::QListWidgetFilterItem::QListWidgetFilterItem
QListWidgetFilterItem(const QString &text, QListWidget *parent=0)
Definition: kmfilterdialog.cpp:193
MailCommon::FilterActionWidgetLister::setActionList
void setActionList(QList< MailCommon::FilterAction * > *list)
Sets the list of filter actions, the lister will create FilterActionWidgets for.
Definition: filteractionwidget.cpp:292
MailCommon::KMFilterDialog::mPatternEdit
MailCommon::SearchPatternEdit * mPatternEdit
The widget that allows editing of the filter pattern.
Definition: kmfilterdialog.h:445
MailCommon::FilterManager::filter
void filter(const Akonadi::Item &item, const QString &identifier, const QString &resourceId) const
Apply filters interface.
Definition: filtermanager.cpp:239
MailCommon::MailFilter::purify
void purify()
Remove empty rules (and actions one day).
Definition: mailfilter.cpp:538
MailCommon::QListWidgetFilterItem::filter
MailCommon::MailFilter * filter()
Definition: kmfilterdialog.cpp:209
MailCommon::KMFilterDialog::mDoNotClose
bool mDoNotClose
Definition: kmfilterdialog.h:472
MailCommon::KMFilterListBox::applyWidgets
void applyWidgets()
Emitted when this widget wants the edit widgets to apply the changes to the current filter...
MailCommon::FolderRequester::collection
Akonadi::Collection collection() const
Returns the selected collection.
Definition: folderrequester.cpp:105
MailCommon::KMFilterDialog::slotDisableAccept
void slotDisableAccept()
Called when a user decides to continue editing invalid filters.
Definition: kmfilterdialog.cpp:1685
MailCommon::MailFilter::setStopProcessingHere
void setStopProcessingHere(bool aStop)
Definition: mailfilter.cpp:307
MailCommon::_wt_filterlist_bottom
const char * _wt_filterlist_bottom
Definition: kmfilterdialog.cpp:268
MailCommon::KMFilterDialog::slotUpdateFilter
void slotUpdateFilter()
Definition: kmfilterdialog.cpp:772
MailCommon::KMFilterListBox::mBtnCopy
QPushButton * mBtnCopy
Definition: kmfilterdialog.h:270
MailCommon::KMFilterDialog::slotFolderChanged
void slotFolderChanged(const Akonadi::Collection &)
Definition: kmfilterdialog.cpp:640
MailCommon::SearchPatternEdit
Definition: searchpatternedit.h:77
MailCommon::MailFilter::setApplyBeforeOutbound
void setApplyBeforeOutbound(bool aApply=true)
Set whether this filter should be applied on outbound messages before sending (aApply == TRUE) or not...
Definition: mailfilter.cpp:197
MailCommon::KMFilterDialog::mFolderRequester
MailCommon::FolderRequester * mFolderRequester
Definition: kmfilterdialog.h:470
MailCommon::KMFilterListBox::slotFilterEnabledChanged
void slotFilterEnabledChanged(QListWidgetItem *item)
Definition: kmfilterdialog.cpp:1035
MailCommon::AccountList::selectedAccount
QStringList selectedAccount()
Definition: kmfilterdialog.cpp:179
filteractionwidget.h
kmfilterdialog.h
MailCommon::KMFilterDialog::slotFilterSelected
void slotFilterSelected(MailCommon::MailFilter *aFilter)
Internally connected to KMFilterListBox::filterSelected.
Definition: kmfilterdialog.cpp:710
MailCommon::FilterImporterExporter
Utility class that provides persisting of filters to/from KConfig.
Definition: filterimporterexporter.h:53
MailCommon::KMFilterListBox::slotBottom
void slotBottom()
Called when the user clicks the 'Bottom' button.
Definition: kmfilterdialog.cpp:1388
MailCommon::QListWidgetFilterItem::setFilter
void setFilter(MailCommon::MailFilter *filter)
Definition: kmfilterdialog.cpp:203
MailCommon::_wt_filterlist_up
const char * _wt_filterlist_up
Definition: kmfilterdialog.cpp:243
MailCommon::MailFilter::setToolbarName
void setToolbarName(const QString &toolbarName)
This sets the toolbar name for this filter.
Definition: mailfilter.cpp:338
MailCommon::KMFilterDialog::slotFetchItemsForFolderDone
void slotFetchItemsForFolderDone(KJob *job)
Definition: kmfilterdialog.cpp:685
MailCommon::FolderRequester
A widget that contains a KLineEdit which shows the current folder and a button that fires a FolderSel...
Definition: folderrequester.h:59
MailCommon::SearchPatternEdit::reset
void reset()
Called when the widget should let go of the currently referenced filter and disable itself...
Definition: searchpatternedit.cpp:694
MailCommon::MailFilter::applyOnOutbound
bool applyOnOutbound() const
Definition: mailfilter.cpp:202
MailCommon::MailFilter::setEnabled
void setEnabled(bool)
Definition: mailfilter.cpp:739
MailCommon::MailFilter::configureShortcut
bool configureShortcut() const
Definition: mailfilter.cpp:323
QGroupBox
MailCommon::MailFilter::configureToolbar
bool configureToolbar() const
Definition: mailfilter.cpp:333
MailCommon::KMFilterListBox::filterSelected
void filterSelected(MailCommon::MailFilter *filter)
Emitted when a new filter has been selected by the user or if the current filter has changed after a ...
MailCommon::SearchRule::RequiredPart
RequiredPart
Definition: searchpattern.h:104
MailCommon::KMFilterListBox::filtersForSaving
QList< MailCommon::MailFilter * > filtersForSaving(bool closeAfterSaving) const
Returns a list of copies of the current list of filters.
Definition: kmfilterdialog.cpp:1147
MailCommon::SearchPattern
This class is an abstraction of a search over messages.
Definition: searchpattern.h:595
MailCommon::KMFilterListBox::filterUpdated
void filterUpdated(MailCommon::MailFilter *filter)
Emitted when a filter is updated (e.g.
MailCommon::MailFilter::applyOnAccount
bool applyOnAccount(const QString &id) const
Definition: mailfilter.cpp:289
MailCommon::MailFilter::isEnabled
bool isEnabled() const
Return if filter is enabled or not.
Definition: mailfilter.cpp:734
MailCommon::KMFilterListBox::appendFilter
void appendFilter(MailCommon::MailFilter *aFilter)
Definition: kmfilterdialog.cpp:1620
MailCommon::FilterImporterExporter::FilterType
FilterType
Definition: filterimporterexporter.h:56
MailCommon::MailFilter::applyOnInbound
bool applyOnInbound() const
Definition: mailfilter.cpp:217
MailCommon::KMFilterListBox::createFilter
void createFilter(const QByteArray &field, const QString &value)
Called from KMFilterDialog.
Definition: kmfilterdialog.cpp:1059
QListWidgetItem
MailCommon::FilterImporterExporter::SylpheedFilter
Definition: filterimporterexporter.h:60
MailCommon::KMFilterListBox::loadFilterList
void loadFilterList(bool createDummyFilter)
Loads the filter list and selects the first filter.
Definition: kmfilterdialog.cpp:1561
MailCommon::KMFilterListBox::filterCreated
void filterCreated()
Emitted when a new filter is created.
MailCommon::KMFilterDialog::mApplyOnForChecked
QRadioButton * mApplyOnForChecked
Definition: kmfilterdialog.h:456
MailCommon::_wt_filterlist
const char * _wt_filterlist
Definition: kmfilterdialog.cpp:215
MailCommon::MailFilter::stopProcessingHere
bool stopProcessingHere() const
Definition: mailfilter.cpp:312
MailCommon::FilterManager::instance
static FilterManager * instance()
Returns the global filter manager object.
Definition: filtermanager.cpp:101
MailCommon::KMFilterDialog::slotConfigureToolbarButtonToggled
void slotConfigureToolbarButtonToggled(bool aChecked)
Definition: kmfilterdialog.cpp:865
MailCommon::FolderRequester::setNotAllowToCreateNewFolder
void setNotAllowToCreateNewFolder(bool notCreateNewFolder)
Definition: folderrequester.cpp:190
MailCommon::FilterActionDesc
Auxiliary struct for FilterActionDict.
Definition: filteractiondict.h:36
MailCommon::FilterConvertToSieve
Definition: filterconverttosieve.h:25
MailCommon::FilterManager::filterActionDict
static FilterActionDict * filterActionDict()
Returns the global filter action dictionary.
Definition: filtermanager.cpp:109
MailCommon::KMFilterListBox::slotNew
void slotNew()
Called when the user clicks the 'New' button.
Definition: kmfilterdialog.cpp:1226
MailCommon::AccountList
Definition: kmfilterdialog.h:84
MailCommon::KMFilterListBox::slotCopy
void slotCopy()
Called when the user clicks the 'Copy' button.
Definition: kmfilterdialog.cpp:1237
MailCommon::KMFilterDialog::slotExportFilters
void slotExportFilters()
Called when a user clicks the export filters button.
Definition: kmfilterdialog.cpp:1678
MailCommon::SearchRule::Envelope
Definition: searchpattern.h:105
MailCommon::SearchRule::FuncContains
Definition: searchpattern.h:82
MailCommon::FilterImporterExporter::ProcmailFilter
Definition: filterimporterexporter.h:61
MailCommon::KMFilterDialog::mAccountList
AccountList * mAccountList
ListView that shows the accounts in the advanced tab.
Definition: kmfilterdialog.h:459
MailCommon::KMFilterListBox::slotApplyFilterChanges
void slotApplyFilterChanges(KDialog::ButtonCode)
Called when the user clicks either 'Apply' or 'OK' in KMFilterDialog.
Definition: kmfilterdialog.cpp:1123
MailCommon::KMFilterDialog::mApplyOnForAll
QRadioButton * mApplyOnForAll
For a filter applied to inbound messages selects whether to apply this filter to all accounts or to s...
Definition: kmfilterdialog.h:456
MailCommon::_wt_filterlist_new
const char * _wt_filterlist_new
Definition: kmfilterdialog.cpp:222
MailCommon::KMFilterListBox::KMFilterListBox
KMFilterListBox(const QString &title, QWidget *parent=0)
Constructor.
Definition: kmfilterdialog.cpp:894
MailCommon::MailFilter::All
Definition: mailfilter.h:70
MailCommon::KMFilterListBox::slotSelectionChanged
void slotSelectionChanged()
Definition: kmfilterdialog.cpp:1200
MailCommon::SearchPatternEdit::setSearchPattern
void setSearchPattern(MailCommon::SearchPattern *aPattern)
Sets the search pattern.
Definition: searchpatternedit.cpp:671
MailCommon::MailFilter::setIcon
void setIcon(const QString &icon)
Set the icon to be used if plugged into the filter menu or toolbar.
Definition: mailfilter.cpp:353
MailCommon::FilterImporterExporter::exportFilters
void exportFilters(const QList< MailFilter * > &filters, const KUrl &fileName=KUrl(), bool saveAll=false)
Exports the given filters to a file which is asked from the user.
Definition: filterimporterexporter.cpp:340
MailCommon::KMFilterDialog::slotSaveSize
void slotSaveSize()
Definition: kmfilterdialog.cpp:704
MailCommon::MailFilter::applicability
AccountType applicability() const
Definition: mailfilter.cpp:237
MailCommon::KMFilterListBox::slotTop
void slotTop()
Called when the user clicks the 'Top' button.
Definition: kmfilterdialog.cpp:1328
MailCommon::KMFilterListBox::mBtnDelete
QPushButton * mBtnDelete
Definition: kmfilterdialog.h:271
MailCommon::MailFilter::setApplicability
void setApplicability(AccountType aApply=All)
Set whether this filter should be applied on inbound messages for all accounts (aApply == All) or inb...
Definition: mailfilter.cpp:232
mailkernel.h
filterimporterexporter.h
MailCommon::KMFilterListBox::slotRowsMoved
void slotRowsMoved(const QModelIndex &, int, int, const QModelIndex &, int)
Definition: kmfilterdialog.cpp:1047
MailCommon::KMFilterListBox::resetWidgets
void resetWidgets()
Emitted when this widget wants the edit widgets to let go of their filter reference.
MailCommon::KMFilterDialog::slotUpdateAccountList
void slotUpdateAccountList()
Update the list of accounts shown in the advanced tab.
Definition: kmfilterdialog.cpp:883
MailCommon::KMFilterDialog::slotApplicabilityChanged
void slotApplicabilityChanged()
Definition: kmfilterdialog.cpp:778
MailCommon::MailFilter::icon
QString icon() const
Definition: mailfilter.cpp:358
MailCommon::KMFilterDialog::KMFilterDialog
KMFilterDialog(const QList< KActionCollection * > &actionCollection, QWidget *parent=0, bool createDummyFilter=true)
Creates the filter dialog.
Definition: kmfilterdialog.cpp:299
MailCommon::KMFilterListBox::mBtnTop
QPushButton * mBtnTop
Definition: kmfilterdialog.h:275
MailCommon::KMFilterDialog::slotShortcutChanged
void slotShortcutChanged(const QKeySequence &newSeq)
Definition: kmfilterdialog.cpp:854
MailCommon::MailFilter::setConfigureToolbar
void setConfigureToolbar(bool aTool)
Set whether this filter should be plugged into the toolbar.
Definition: mailfilter.cpp:328
MailCommon::KMFilterDialog::mFilterList
KMFilterListBox * mFilterList
The widget that contains the ListBox showing the filters, and the controls to remove filters...
Definition: kmfilterdialog.h:442
MailCommon::KMFilterListBox::mBtnBottom
QPushButton * mBtnBottom
Definition: kmfilterdialog.h:276
MailCommon::MailFilter::setAutoNaming
void setAutoNaming(bool useAutomaticNames)
Set the mode for using automatic naming for the filter.
Definition: mailfilter.cpp:363
MailCommon::MailFilter::name
QString name() const
Equivalent to ()->name().
Definition: mailfilter.cpp:123
MailCommon::AccountList::updateAccountList
void updateAccountList(MailCommon::MailFilter *filter)
Definition: kmfilterdialog.cpp:96
MailCommon::KMFilterDialog::slotConfigureShortcutButtonToggled
void slotConfigureShortcutButtonToggled(bool aChecked)
Definition: kmfilterdialog.cpp:840
MailCommon::FilterManager::filters
QList< MailCommon::MailFilter * > filters() const
Returns the filter list of the manager.
Definition: filtermanager.cpp:277
MailCommon::KMFilterListBox
Definition: kmfilterdialog.h:97
MailCommon::SearchPatternEdit::MatchAllMessages
Definition: searchpatternedit.h:86
MailCommon::KMFilterDialog::slotDialogUpdated
void slotDialogUpdated()
Called whenever a change in the filters configuration is detected, to enable the Apply button...
Definition: kmfilterdialog.cpp:1690
MailCommon::FilterActionDesc::create
FilterActionNewFunc create
Definition: filteractiondict.h:39
MailCommon::KMFilterDialog::mApplyOnForTraditional
QRadioButton * mApplyOnForTraditional
Definition: kmfilterdialog.h:456
MailCommon::MailFilter::setApplyOnExplicit
void setApplyOnExplicit(bool aApply=true)
Set whether this filter should be applied on explicit (CTRL-J) filtering (aApply == true) or not...
Definition: mailfilter.cpp:222
MailCommon::_wt_filterlist_top
const char * _wt_filterlist_top
Definition: kmfilterdialog.cpp:261
I18N_NOOP
#define I18N_NOOP(t)
Definition: searchpatternedit.cpp:46
MailCommon::MailFilter::setApplyOnInbound
void setApplyOnInbound(bool aApply=true)
Set whether this filter should be applied on inbound messages (aApply == true) or not...
Definition: mailfilter.cpp:212
MailCommon::KMFilterDialog::mConfigureToolbar
QCheckBox * mConfigureToolbar
Definition: kmfilterdialog.h:463
MailCommon::MailFilter::Checked
Definition: mailfilter.h:70
MailCommon::KMFilterDialog::mFilterActionLabel
QLabel * mFilterActionLabel
Definition: kmfilterdialog.h:464
KHBox
MailCommon::_wt_filterlist_copy
const char * _wt_filterlist_copy
Definition: kmfilterdialog.cpp:230
MailCommon::SearchRule::createInstance
static SearchRule::Ptr createInstance(const QByteArray &field=0, Function function=FuncContains, const QString &contents=QString())
Creates a new search rule of a certain type by instantiating the appropriate subclass depending on th...
Definition: searchpattern.cpp:140
filtermanager.h
MailCommon::MailFilter::setApplyOnAccount
void setApplyOnAccount(const QString &id, bool aApply=true)
Set whether this filter should be applied on inbound messages for the account with id (id)...
Definition: mailfilter.cpp:280
MailCommon::FilterSelectionDialog
Definition: filterselectiondialog.h:35
MailCommon::MailFilter::applyBeforeOutbound
bool applyBeforeOutbound() const
Definition: mailfilter.cpp:207
MailCommon::KMFilterDialog::mFilter
MailCommon::MailFilter * mFilter
Definition: kmfilterdialog.h:469
MailCommon::_wt_filterlist_rename
const char * _wt_filterlist_rename
Definition: kmfilterdialog.cpp:275
MailCommon::KMFilterListBox::slotUp
void slotUp()
Called when the user clicks the 'Up' button.
Definition: kmfilterdialog.cpp:1421
MailCommon::MailFilter::isAutoNaming
bool isAutoNaming() const
Definition: mailfilter.cpp:368
MailCommon::KMFilterDialog::accept
virtual void accept()
Override QDialog::accept to allow disabling close.
Definition: kmfilterdialog.cpp:620
MailCommon::KMFilterDialog::mRunNow
KPushButton * mRunNow
Definition: kmfilterdialog.h:471
MailCommon::AccountList::applyOnAccount
void applyOnAccount(MailCommon::MailFilter *filter)
Definition: kmfilterdialog.cpp:134
MailCommon::MailFilter::pattern
SearchPattern * pattern()
Provides a reference to the internal pattern.
Definition: mailfilter.cpp:182
MailCommon::MailFilter
Definition: mailfilter.h:42
MailCommon::KMFilterListBox::slotRename
void slotRename()
Called when the user clicks the 'Rename' button.
Definition: kmfilterdialog.cpp:1480
MailCommon::KMFilterListBox::selectedFilterId
QStringList selectedFilterId(SearchRule::RequiredPart &requiredPart, const QString &resource) const
Definition: kmfilterdialog.cpp:1371
MailCommon::KMFilterDialog::mStopProcessingHere
QCheckBox * mStopProcessingHere
Definition: kmfilterdialog.h:461
MailCommon::SearchPattern::setName
void setName(const QString &newName)
Sets the name of the search pattern.
Definition: searchpattern.h:697
mailutil.h
MailCommon::FilterImporterExporter::EvolutionFilter
Definition: filterimporterexporter.h:59
MailCommon::KMFilterListBox::mBtnUp
QPushButton * mBtnUp
Definition: kmfilterdialog.h:272
MailCommon::KMFilterListBox::slotSelected
void slotSelected(int aIdx)
Called when the user clicks on a filter in the filter list.
Definition: kmfilterdialog.cpp:1208
MailCommon::KMFilterDialog::mIgnoreFilterUpdates
bool mIgnoreFilterUpdates
Definition: kmfilterdialog.h:473
MailCommon::QListWidgetFilterItem::~QListWidgetFilterItem
~QListWidgetFilterItem()
Definition: kmfilterdialog.cpp:198
MailCommon::KMFilterListBox::slotDelete
void slotDelete()
Called when the user clicks the 'Delete' button.
Definition: kmfilterdialog.cpp:1262
MailCommon::FilterActionWidgetLister::updateActionList
void updateActionList()
Updates the action list according to the current action widget values.
Definition: filteractionwidget.cpp:380
MailCommon::SearchPattern::name
QString name() const
Returns the name of the search pattern.
Definition: searchpattern.h:688
MailCommon::KMFilterListBox::filterOrderAltered
void filterOrderAltered()
Emitted whenever the order in which the filters are displayed is changed.
MailCommon::KMFilterDialog::slotReset
void slotReset()
Definition: kmfilterdialog.cpp:762
MailCommon::KMFilterDialog::mApplyBeforeOut
QCheckBox * mApplyBeforeOut
Definition: kmfilterdialog.h:452
filteractiondict.h
QList
MailCommon::KMFilterDialog::slotImportFilter
void slotImportFilter(QAction *)
Called when a user clicks the import filters button.
Definition: kmfilterdialog.cpp:1644
filterconverttosieve.h
MailCommon::FilterImporterExporter::ThunderBirdFilter
Definition: filterimporterexporter.h:58
MailCommon::FilterImporterExporter::KMailFilter
Definition: filterimporterexporter.h:57
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:15 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

mailcommon

Skip menu "mailcommon"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal