• 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
  • search
searchpatternedit.cpp
Go to the documentation of this file.
1 /* -*- mode: C++; c-file-style: "gnu" -*-
2 
3  Author: Marc Mutz <mutz@kde.org>
4 
5  This program is free software; you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or
8  (at your option) any later version.
9 
10  This program is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License along
16  with this program; if not, write to the Free Software Foundation, Inc.,
17  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
19 
20 #include "searchpatternedit.h"
21 #include "rulewidgethandlermanager.h"
22 using MailCommon::RuleWidgetHandlerManager;
23 
24 #include <pimcommon/widgets/minimumcombobox.h>
25 #include <KComboBox>
26 #include <KDebug>
27 #include <KDialog>
28 #include <KLocale>
29 #include <KPushButton>
30 #include <KLineEdit>
31 
32 #include <QButtonGroup>
33 #include <QByteArray>
34 #include <QHBoxLayout>
35 #include <QRadioButton>
36 #include <QResizeEvent>
37 #include <QStackedWidget>
38 
39 // Definition of special rule field strings
40 // Note: Also see SearchRule::matches() and ruleFieldToEnglish() if
41 // you change the following i18n-ized strings!
42 // Note: The index of the values in the following array has to correspond to
43 // the value of the entries in the enum in SearchRuleWidget.
44 
45 #undef I18N_NOOP
46 #define I18N_NOOP(t) 0, t
47 #undef I18N_NOOP2
48 #define I18N_NOOP2(c,t) c, t
49 
50 using namespace MailCommon;
51 
52 static const struct {
53  const char *internalName;
54  const char *context;
55  const char *displayName;
56 
57  QString getLocalizedDisplayName() const
58  {
59  return i18nc( context, displayName );
60  }
61 
62 } SpecialRuleFields[] = {
63  { "<message>", I18N_NOOP( "Complete Message" ) },
64  { "<body>", I18N_NOOP( "Body of Message" ) },
65  { "<any header>", I18N_NOOP( "Anywhere in Headers" ) },
66  { "<recipients>", I18N_NOOP( "All Recipients" ) },
67  { "<size>", I18N_NOOP( "Size in Bytes" ) },
68  { "<age in days>", I18N_NOOP( "Age in Days" ) },
69  { "<status>", I18N_NOOP( "Message Status" ) },
70  { "<tag>", I18N_NOOP( "Message Tag" ) },
71  { "Subject", I18N_NOOP2( "Subject of an email.", "Subject" ) },
72  { "From", I18N_NOOP( "From" ) },
73  { "To", I18N_NOOP2( "Receiver of an email.", "To" ) },
74  { "CC", I18N_NOOP( "CC" ) },
75  { "Reply-To", I18N_NOOP( "Reply To" ) },
76  { "Organization", I18N_NOOP( "Organization" ) },
77  { "<date>", I18N_NOOP( "Date" ) }
78 };
79 static const int SpecialRuleFieldsCount =
80  sizeof( SpecialRuleFields ) / sizeof( *SpecialRuleFields );
81 
82 //=============================================================================
83 //
84 // class SearchRuleWidget
85 //
86 //=============================================================================
87 
88 SearchRuleWidget::SearchRuleWidget(QWidget *parent, SearchRule::Ptr aRule,
89  SearchPatternEdit::SearchPatternEditOptions options ,
90  SearchPatternEdit::SearchModeType modeType)
91  : QWidget( parent ),
92  mRuleField( 0 ),
93  mFunctionStack( 0 ),
94  mValueStack( 0 )
95 {
96  initFieldList( options );
97  initWidget( modeType );
98 
99  if ( aRule ) {
100  setRule( aRule );
101  } else {
102  reset();
103  }
104 }
105 
106 void SearchRuleWidget::setPatternEditOptions( SearchPatternEdit::SearchPatternEditOptions options )
107 {
108  SearchRule::Ptr srule = rule();
109  QByteArray currentText = srule->field();
110 
111  initFieldList( options );
112 
113  mRuleField->clear();
114  mRuleField->addItems( mFilterFieldList );
115  KCompletion *comp = mRuleField->completionObject();
116  comp->clear();
117  comp->insertItems(mFilterFieldList);
118  mRuleField->setMaxCount( mRuleField->count() );
119  mRuleField->adjustSize();
120 
121  const bool headersOnly = ( options & MailCommon::SearchPatternEdit::HeadersOnly );
122  const bool notShowSize = ( options & MailCommon::SearchPatternEdit::NotShowSize );
123  const bool notShowDate = ( options & MailCommon::SearchPatternEdit::NotShowDate );
124  const bool absoluteDates = ( options & MailCommon::SearchPatternEdit::AbsoluteDate );
125 
126  if ( headersOnly && ( currentText != "<message>") && ( currentText != "<body>" ) ) {
127  mRuleField->setItemText( 0, QString::fromLatin1( currentText ) );
128  } else {
129  mRuleField->setItemText( 0, QString() );
130  }
131 
132  if ( notShowSize && ( currentText != "<size>") ) {
133  mRuleField->setItemText( 0, QString::fromLatin1( currentText ) );
134  } else {
135  mRuleField->setItemText( 0, QString() );
136  }
137 
138  if ( notShowDate && ( currentText != "<date>") ) {
139  mRuleField->setItemText( 0, QString::fromLatin1( currentText ) );
140  } else {
141  mRuleField->setItemText( 0, QString() );
142  }
143 
144  if ( !absoluteDates && ( currentText != "<age in days>") ) {
145  mRuleField->setItemText( 0, QString::fromLatin1( currentText ) );
146  } else {
147  mRuleField->setItemText( 0, QString() );
148  }
149 }
150 
151 
152 
153 void SearchRuleWidget::initWidget(SearchPatternEdit::SearchModeType modeType)
154 {
155  QHBoxLayout *hlay = new QHBoxLayout( this );
156  hlay->setSpacing( KDialog::spacingHint() );
157  hlay->setMargin( 0 );
158 
159  // initialize the header field combo box
160  mRuleField = new PimCommon::MinimumComboBox( this );
161  mRuleField->setObjectName( QLatin1String("mRuleField") );
162  mRuleField->setEditable( true );
163  KLineEdit *edit = new KLineEdit;
164  edit->setClickMessage( i18n("Choose or type your own criteria"));
165  mRuleField->setToolTip(i18n("Choose or type your own criteria"));
166  edit->setClearButtonShown(true);
167  mRuleField->setLineEdit(edit);
168  mRuleField->setTrapReturnKey(true);
169 
170  mRuleField->addItems( mFilterFieldList );
171  KCompletion *comp = mRuleField->completionObject();
172  comp->setIgnoreCase(true);
173  comp->insertItems(mFilterFieldList);
174  comp->setCompletionMode(KGlobalSettings::CompletionPopupAuto);
175 
176  // don't show sliders when popping up this menu
177  mRuleField->setMaxCount( mRuleField->count() );
178  mRuleField->adjustSize();
179  hlay->addWidget( mRuleField );
180 
181  // initialize the function/value widget stack
182  mFunctionStack = new QStackedWidget( this );
183  //Don't expand the widget in vertical direction
184  mFunctionStack->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
185 
186  hlay->addWidget( mFunctionStack );
187 
188  mValueStack = new QStackedWidget( this );
189  hlay->addWidget( mValueStack );
190  hlay->setStretchFactor( mValueStack, 10 );
191 
192  mAdd = new KPushButton( this );
193  mAdd->setIcon( KIcon( QLatin1String("list-add") ) );
194  mAdd->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
195  hlay->addWidget( mAdd );
196 
197  mRemove = new KPushButton( this );
198  mRemove->setIcon( KIcon( QLatin1String("list-remove") ) );
199  mRemove->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
200  hlay->addWidget( mRemove );
201 
202  RuleWidgetHandlerManager::instance()->setIsNepomukSearch(modeType==SearchPatternEdit::NepomukMode);
203 
204  RuleWidgetHandlerManager::instance()->createWidgets( mFunctionStack, mValueStack, this );
205 
206  // redirect focus to the header field combo box
207  setFocusProxy( mRuleField );
208 
209  connect( mRuleField, SIGNAL(activated(QString)),
210  this, SLOT(slotRuleFieldChanged(QString)) );
211  connect( mRuleField, SIGNAL(editTextChanged(QString)),
212  this, SLOT(slotRuleFieldChanged(QString)) );
213  connect( mRuleField, SIGNAL(editTextChanged(QString)),
214  this, SIGNAL(fieldChanged(QString)) );
215 
216  connect( mAdd, SIGNAL(clicked()),
217  this, SLOT(slotAddWidget()) );
218  connect( mRemove, SIGNAL(clicked()),
219  this, SLOT(slotRemoveWidget()) );
220 }
221 
222 void SearchRuleWidget::updateAddRemoveButton( bool addButtonEnabled, bool removeButtonEnabled )
223 {
224  mAdd->setEnabled( addButtonEnabled );
225  mRemove->setEnabled( removeButtonEnabled );
226 }
227 
228 void SearchRuleWidget::slotAddWidget()
229 {
230  emit addWidget( this );
231 }
232 
233 void SearchRuleWidget::slotRemoveWidget()
234 {
235  emit removeWidget( this );
236 }
237 
238 void SearchRuleWidget::setRule( SearchRule::Ptr aRule )
239 {
240  Q_ASSERT( aRule );
241 
242  kDebug() << "(" << aRule->asString() << ")";
243 
244  //--------------set the field
245  int i = indexOfRuleField( aRule->field() );
246 
247  mRuleField->blockSignals( true );
248 
249  if ( i < 0 ) { // not found -> user defined field
250  mRuleField->setItemText( 0, QString::fromLatin1( aRule->field() ) );
251  i = 0;
252  } else { // found in the list of predefined fields
253  mRuleField->setItemText( 0, QString() );
254  }
255 
256  mRuleField->setCurrentIndex( i );
257  mRuleField->blockSignals( false );
258 
259  RuleWidgetHandlerManager::instance()->setRule( mFunctionStack, mValueStack, aRule );
260 }
261 
262 SearchRule::Ptr SearchRuleWidget::rule() const
263 {
264  const QByteArray ruleField = ruleFieldToEnglish( mRuleField->currentText() );
265 
266  const SearchRule::Function function =
267  RuleWidgetHandlerManager::instance()->function( ruleField, mFunctionStack );
268 
269  const QString value =
270  RuleWidgetHandlerManager::instance()->value( ruleField, mFunctionStack, mValueStack );
271 
272  return SearchRule::createInstance( ruleField, function, value );
273 }
274 
275 void SearchRuleWidget::reset()
276 {
277  mRuleField->blockSignals( true );
278  mRuleField->setItemText( 0, QString() );
279  mRuleField->setCurrentIndex( 0 );
280  mRuleField->blockSignals( false );
281 
282  RuleWidgetHandlerManager::instance()->reset( mFunctionStack, mValueStack );
283 }
284 
285 void SearchRuleWidget::slotFunctionChanged()
286 {
287  const QByteArray ruleField = ruleFieldToEnglish( mRuleField->currentText() );
288  RuleWidgetHandlerManager::instance()->update( ruleField, mFunctionStack, mValueStack );
289  const QString prettyValue =
290  RuleWidgetHandlerManager::instance()->prettyValue( ruleField, mFunctionStack, mValueStack );
291 
292  emit contentsChanged( prettyValue );
293 }
294 
295 void SearchRuleWidget::slotValueChanged()
296 {
297  const QByteArray ruleField = ruleFieldToEnglish( mRuleField->currentText() );
298 
299  const QString prettyValue =
300  RuleWidgetHandlerManager::instance()->prettyValue( ruleField, mFunctionStack, mValueStack );
301 
302  emit contentsChanged( prettyValue );
303 }
304 
305 void SearchRuleWidget::slotReturnPressed()
306 {
307  emit returnPressed();
308 }
309 
310 QByteArray SearchRuleWidget::ruleFieldToEnglish( const QString & i18nVal )
311 {
312  for ( int i = 0; i < SpecialRuleFieldsCount; ++i ) {
313  if ( i18nVal == SpecialRuleFields[i].getLocalizedDisplayName() ) {
314  return SpecialRuleFields[i].internalName;
315  }
316  }
317  return i18nVal.toLatin1();
318 }
319 
320 int SearchRuleWidget::ruleFieldToId( const QString & i18nVal )
321 {
322  for ( int i = 0; i < SpecialRuleFieldsCount; ++i ) {
323  if ( i18nVal == SpecialRuleFields[i].getLocalizedDisplayName() ) {
324  return i;
325  }
326  }
327  return -1; // no pseudo header
328 }
329 
330 static QString displayNameFromInternalName( const QString & internal )
331 {
332  for ( int i = 0; i < SpecialRuleFieldsCount; ++i ) {
333  if ( internal == QLatin1String(SpecialRuleFields[i].internalName) ) {
334  return SpecialRuleFields[i].getLocalizedDisplayName();
335  }
336  }
337  return QLatin1String(internal.toLatin1());
338 }
339 
340 int SearchRuleWidget::indexOfRuleField( const QByteArray &aName ) const
341 {
342  if ( aName.isEmpty() ) {
343  return -1;
344  }
345 
346  const QString i18n_aName = displayNameFromInternalName( QLatin1String(aName) );
347  const int nbRuleField = mRuleField->count();
348  for ( int i = 1; i < nbRuleField; ++i ) {
349  if ( mRuleField->itemText( i ) == i18n_aName ) {
350  return i;
351  }
352  }
353 
354  return -1;
355 }
356 
357 void SearchRuleWidget::initFieldList( SearchPatternEdit::SearchPatternEditOptions options )
358 {
359  const bool headersOnly = ( options & MailCommon::SearchPatternEdit::HeadersOnly );
360  const bool absoluteDates = ( options & MailCommon::SearchPatternEdit::AbsoluteDate );
361  const bool notShowSize = ( options & MailCommon::SearchPatternEdit::NotShowSize );
362  const bool notShowDate = ( options & MailCommon::SearchPatternEdit::NotShowDate );
363 
364  mFilterFieldList.clear();
365  mFilterFieldList.append( QString() ); // empty entry for user input
366 
367  if ( !headersOnly ) {
368  mFilterFieldList.append( SpecialRuleFields[Message].getLocalizedDisplayName() );
369  mFilterFieldList.append( SpecialRuleFields[Body].getLocalizedDisplayName() );
370  }
371  mFilterFieldList.append( SpecialRuleFields[AnyHeader].getLocalizedDisplayName() );
372  mFilterFieldList.append( SpecialRuleFields[Recipients].getLocalizedDisplayName() );
373  if ( !notShowSize )
374  mFilterFieldList.append( SpecialRuleFields[Size].getLocalizedDisplayName() );
375  if ( !absoluteDates ) {
376  mFilterFieldList.append( SpecialRuleFields[AgeInDays].getLocalizedDisplayName() );
377  }
378 
379  mFilterFieldList.append( SpecialRuleFields[Subject].getLocalizedDisplayName() );
380  mFilterFieldList.append( SpecialRuleFields[From].getLocalizedDisplayName() );
381  mFilterFieldList.append( SpecialRuleFields[To].getLocalizedDisplayName() );
382  mFilterFieldList.append( SpecialRuleFields[CC].getLocalizedDisplayName() );
383  mFilterFieldList.append( SpecialRuleFields[Status].getLocalizedDisplayName() );
384  mFilterFieldList.append( SpecialRuleFields[Tag].getLocalizedDisplayName() );
385  mFilterFieldList.append( i18n( SpecialRuleFields[ReplyTo].displayName ) );
386  mFilterFieldList.append( i18n( SpecialRuleFields[Organization].displayName ) );
387 
388  if ( !notShowDate )
389  mFilterFieldList.append( i18n( SpecialRuleFields[Date].displayName ) );
390 
391  // these others only represent message headers and you can add to
392  // them as you like
393  mFilterFieldList.append( QLatin1String("List-Id") );
394  mFilterFieldList.append( QLatin1String("Resent-From") );
395  mFilterFieldList.append( QLatin1String("X-Loop") );
396  mFilterFieldList.append( QLatin1String("X-Mailing-List") );
397  mFilterFieldList.append( QLatin1String("X-Spam-Flag") );
398 }
399 
400 void SearchRuleWidget::slotRuleFieldChanged( const QString &field )
401 {
402  RuleWidgetHandlerManager::instance()->update(
403  ruleFieldToEnglish( field ), mFunctionStack, mValueStack );
404 }
405 
406 //=============================================================================
407 //
408 // class KMFilterActionWidgetLister (the filter action editor)
409 //
410 //=============================================================================
411 
412 SearchRuleWidgetLister::SearchRuleWidgetLister( QWidget *parent, SearchPatternEdit::SearchPatternEditOptions options, SearchPatternEdit::SearchModeType modeType)
413  : KWidgetLister( false, 2, FILTER_MAX_RULES, parent )
414 {
415  mRuleList = 0;
416 
417  mTypeMode = modeType;
418  mOptions = options;
419 }
420 
421 SearchRuleWidgetLister::~SearchRuleWidgetLister()
422 {
423 }
424 
425 void SearchRuleWidgetLister::setPatternEditOptions( SearchPatternEdit::SearchPatternEditOptions options )
426 {
427  mOptions = options;
428  foreach ( QWidget *w, widgets() ) {
429  qobject_cast<SearchRuleWidget*>( w )->setPatternEditOptions( options );
430  }
431 }
432 
433 void SearchRuleWidgetLister::setRuleList( QList<SearchRule::Ptr> *aList )
434 {
435  Q_ASSERT( aList );
436 
437  if ( mRuleList && mRuleList != aList ) {
438  regenerateRuleListFromWidgets();
439  }
440 
441  mRuleList = aList;
442 
443  if ( !widgets().isEmpty() ) { // move this below next 'if'?
444  widgets().first()->blockSignals( true );
445  }
446 
447  if ( aList->isEmpty() ) {
448  slotClear();
449  widgets().first()->blockSignals( false );
450  return;
451  }
452 
453  int superfluousItems = (int)mRuleList->count() - widgetsMaximum();
454  if ( superfluousItems > 0 ) {
455  kDebug() << "Clipping rule list to" << widgetsMaximum() << "items!";
456 
457  for ( ; superfluousItems ; superfluousItems-- ) {
458  mRuleList->removeLast();
459  }
460  }
461 
462  // set the right number of widgets
463  setNumberOfShownWidgetsTo( qMax( (int)mRuleList->count(), widgetsMinimum() ) );
464 
465  // load the actions into the widgets
466  QList<QWidget*> widgetList = widgets();
467  QList<SearchRule::Ptr>::const_iterator rIt;
468  QList<SearchRule::Ptr>::const_iterator rItEnd( mRuleList->constEnd() );
469  QList<QWidget*>::const_iterator wIt = widgetList.constBegin();
470  QList<QWidget*>::const_iterator wItEnd = widgetList.constEnd();
471  for ( rIt = mRuleList->constBegin();
472  rIt != rItEnd && wIt != wItEnd; ++rIt, ++wIt ) {
473  qobject_cast<SearchRuleWidget*>( *wIt )->setRule( (*rIt) );
474  }
475  for ( ; wIt != wItEnd; ++wIt ) {
476  qobject_cast<SearchRuleWidget*>( *wIt )->reset();
477  }
478 
479  Q_ASSERT( !widgets().isEmpty() );
480  widgets().first()->blockSignals(false);
481  updateAddRemoveButton();
482 }
483 
484 void SearchRuleWidgetLister::slotAddWidget( QWidget *w )
485 {
486  addWidgetAfterThisWidget( w );
487  updateAddRemoveButton();
488 }
489 
490 void SearchRuleWidgetLister::slotRemoveWidget( QWidget *w )
491 {
492  removeWidget( w );
493  updateAddRemoveButton();
494 }
495 
496 void SearchRuleWidgetLister::reconnectWidget( SearchRuleWidget *w )
497 {
498  connect( w, SIGNAL(addWidget(QWidget*)),
499  this, SLOT(slotAddWidget(QWidget*)), Qt::UniqueConnection );
500  connect( w, SIGNAL(removeWidget(QWidget*)),
501  this, SLOT(slotRemoveWidget(QWidget*)), Qt::UniqueConnection );
502 }
503 
504 void SearchRuleWidgetLister::updateAddRemoveButton()
505 {
506  QList<QWidget*> widgetList = widgets();
507  const int numberOfWidget( widgetList.count() );
508  bool addButtonEnabled = false;
509  bool removeButtonEnabled = false;
510  if ( numberOfWidget <= widgetsMinimum() ) {
511  addButtonEnabled = true;
512  removeButtonEnabled = false;
513  } else if ( numberOfWidget >= widgetsMaximum() ) {
514  addButtonEnabled = false;
515  removeButtonEnabled = true;
516  } else {
517  addButtonEnabled = true;
518  removeButtonEnabled = true;
519  }
520  QList<QWidget*>::ConstIterator wIt = widgetList.constBegin();
521  QList<QWidget*>::ConstIterator wEnd = widgetList.constEnd();
522  for ( ; wIt != wEnd ;++wIt ) {
523  SearchRuleWidget *w = qobject_cast<SearchRuleWidget*>( *wIt );
524  w->updateAddRemoveButton( addButtonEnabled, removeButtonEnabled );
525  }
526 }
527 
528 void SearchRuleWidgetLister::reset()
529 {
530  if ( mRuleList ) {
531  regenerateRuleListFromWidgets();
532  }
533 
534  mRuleList = 0;
535  slotClear();
536  updateAddRemoveButton();
537 }
538 
539 QWidget *SearchRuleWidgetLister::createWidget( QWidget *parent )
540 {
541  SearchRuleWidget *w =
542  new SearchRuleWidget( parent, SearchRule::Ptr(), mOptions, mTypeMode );
543  reconnectWidget( w );
544  return w;
545 }
546 
547 void SearchRuleWidgetLister::clearWidget( QWidget *aWidget )
548 {
549  if ( aWidget ) {
550  SearchRuleWidget *w = static_cast<SearchRuleWidget*>( aWidget );
551  w->reset();
552  reconnectWidget( w );
553  updateAddRemoveButton();
554  }
555 }
556 
557 void SearchRuleWidgetLister::regenerateRuleListFromWidgets()
558 {
559  if ( !mRuleList ) {
560  return;
561  }
562 
563  mRuleList->clear();
564 
565  foreach ( const QWidget *w, widgets() ) {
566  SearchRule::Ptr r = qobject_cast<const SearchRuleWidget*>( w )->rule();
567  if ( r && !r->isEmpty() ) {
568  mRuleList->append( r );
569  }
570  }
571  updateAddRemoveButton();
572 }
573 
574 //=============================================================================
575 //
576 // class SearchPatternEdit
577 //
578 //=============================================================================
579 
580 SearchPatternEdit::SearchPatternEdit( QWidget *parent, SearchPatternEditOptions options, SearchModeType modeType )
581  : QWidget( parent ), mAllMessageRBtn( 0 )
582 {
583  setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
584  setObjectName( QLatin1String("SearchPatternEdit") );
585  initLayout( options, modeType );
586 }
587 
588 SearchPatternEdit::~SearchPatternEdit()
589 {
590 }
591 
592 void SearchPatternEdit::updateSearchPattern()
593 {
594  mRuleLister->regenerateRuleListFromWidgets();
595 }
596 
597 void SearchPatternEdit::setPatternEditOptions( SearchPatternEdit::SearchPatternEditOptions options )
598 {
599  mRuleLister->setPatternEditOptions(options);
600 }
601 
602 
603 void SearchPatternEdit::initLayout( SearchPatternEditOptions options, SearchModeType modeType )
604 {
605  QVBoxLayout *layout = new QVBoxLayout( this );
606  layout->setMargin( 0 );
607 
608  const bool matchAllMessages = ( options & MailCommon::SearchPatternEdit::MatchAllMessages );
609  //------------the radio buttons
610  mAllRBtn = new QRadioButton( i18n( "Match a&ll of the following" ), this );
611  mAnyRBtn = new QRadioButton( i18n( "Match an&y of the following" ), this );
612  if ( matchAllMessages ) {
613  mAllMessageRBtn = new QRadioButton( i18n( "Match all messages" ), this );
614  }
615 
616  mAllRBtn->setObjectName( QLatin1String("mAllRBtn") );
617  mAllRBtn->setChecked( true );
618  mAnyRBtn->setObjectName( QLatin1String("mAnyRBtn") );
619  mAnyRBtn->setChecked( false );
620  if ( matchAllMessages ) {
621  mAllMessageRBtn->setObjectName( QLatin1String("mAllMessageRBtn") );
622  mAllMessageRBtn->setChecked(false);
623  }
624  layout->addWidget( mAllRBtn );
625  layout->addWidget( mAnyRBtn );
626  if ( matchAllMessages ) {
627  layout->addWidget( mAllMessageRBtn );
628  }
629 
630  QButtonGroup *bg = new QButtonGroup( this );
631  bg->addButton( mAllRBtn );
632  bg->addButton( mAnyRBtn );
633  if ( matchAllMessages ) {
634  bg->addButton( mAllMessageRBtn );
635  }
636 
637  //------------connect a few signals
638  connect( bg, SIGNAL(buttonClicked(QAbstractButton*)),
639  this, SLOT(slotRadioClicked(QAbstractButton*)) );
640 
641  //------------the list of SearchRuleWidget's
642  mRuleLister =
643  new SearchRuleWidgetLister(
644  this, options, modeType);
645 
646  mRuleLister->slotClear();
647 
648  if ( !mRuleLister->widgets().isEmpty() ) {
649  const int numberOfWidget( mRuleLister->widgets().count() );
650  for ( int i = 0; i < numberOfWidget; ++i ) {
651  SearchRuleWidget *srw = static_cast<SearchRuleWidget*>( mRuleLister->widgets().at(i) );
652  connect( srw, SIGNAL(fieldChanged(QString)),
653  this, SLOT(slotAutoNameHack()) );
654  connect( srw, SIGNAL(contentsChanged(QString)),
655  this, SLOT(slotAutoNameHack()) );
656  connect( srw, SIGNAL(returnPressed()),
657  this, SIGNAL(returnPressed()) );
658  }
659  } else {
660  kDebug() << "No first SearchRuleWidget, though slotClear() has been called!";
661  }
662 
663  connect( mRuleLister, SIGNAL(widgetAdded(QWidget*)),
664  this, SLOT(slotRuleAdded(QWidget*)) );
665  connect( mRuleLister, SIGNAL(widgetRemoved()), this, SIGNAL(patternChanged()) );
666  connect( mRuleLister, SIGNAL(clearWidgets()), this, SIGNAL(patternChanged()));
667 
668  layout->addWidget( mRuleLister );
669 }
670 
671 void SearchPatternEdit::setSearchPattern( SearchPattern *aPattern )
672 {
673  Q_ASSERT( aPattern );
674 
675  mRuleLister->setRuleList( aPattern );
676 
677  mPattern = aPattern;
678 
679  blockSignals( true );
680  if ( mPattern->op() == SearchPattern::OpOr ) {
681  mAnyRBtn->setChecked( true );
682  } else if ( mPattern->op() == SearchPattern::OpAnd ) {
683  mAllRBtn->setChecked( true );
684  } else if ( mAllMessageRBtn && ( mPattern->op() == SearchPattern::OpAll ) ) {
685  mAllMessageRBtn->setChecked( true );
686  }
687  mRuleLister->setEnabled( mPattern->op() != SearchPattern::OpAll );
688  blockSignals( false );
689 
690  setEnabled( true );
691  emit patternChanged();
692 }
693 
694 void SearchPatternEdit::reset()
695 {
696  mRuleLister->reset();
697 
698  blockSignals(true);
699  mAllRBtn->setChecked( true );
700  blockSignals(false);
701 
702  setEnabled( false );
703  emit patternChanged();
704 }
705 
706 void SearchPatternEdit::slotRadioClicked( QAbstractButton *aRBtn )
707 {
708  if ( mPattern ) {
709  if ( aRBtn == mAllRBtn ) {
710  mPattern->setOp( SearchPattern::OpAnd );
711  } else if ( aRBtn == mAnyRBtn ) {
712  mPattern->setOp( SearchPattern::OpOr );
713  } else if ( aRBtn == mAllMessageRBtn ) {
714  mPattern->setOp( SearchPattern::OpAll );
715  }
716  mRuleLister->setEnabled( mPattern->op() != SearchPattern::OpAll );
717  emit patternChanged();
718  }
719 }
720 
721 void SearchPatternEdit::slotAutoNameHack()
722 {
723  mRuleLister->regenerateRuleListFromWidgets();
724  emit maybeNameChanged();
725  emit patternChanged();
726 }
727 
728 void SearchPatternEdit::slotRuleAdded( QWidget *newRuleWidget )
729 {
730  SearchRuleWidget *srw = static_cast<SearchRuleWidget*>( newRuleWidget );
731  connect( srw, SIGNAL(fieldChanged(QString)), this, SLOT(slotAutoNameHack()) );
732  connect( srw, SIGNAL(contentsChanged(QString)), this, SLOT(slotAutoNameHack()) );
733  connect( srw, SIGNAL(returnPressed()), this, SIGNAL(returnPressed()) );
734  emit patternChanged();
735 }
736 #include "searchpatternedit.moc"
rulewidgethandlermanager.h
MailCommon::SearchRuleWidgetLister::createWidget
virtual QWidget * createWidget(QWidget *parent)
Definition: searchpatternedit.cpp:539
MailCommon::SearchRuleWidget::slotRuleFieldChanged
void slotRuleFieldChanged(const QString &)
Definition: searchpatternedit.cpp:400
MailCommon::SearchPattern::OpAll
Definition: searchpattern.h:608
MailCommon::SearchPatternEdit::updateSearchPattern
void updateSearchPattern()
Updates the search pattern according to the current widget values.
Definition: searchpatternedit.cpp:592
MailCommon::SearchRuleWidgetLister::clearWidget
virtual void clearWidget(QWidget *aWidget)
Definition: searchpatternedit.cpp:547
MailCommon::RuleWidgetHandlerManager::instance
static RuleWidgetHandlerManager * instance()
Definition: rulewidgethandlermanager.h:59
MailCommon::SearchPattern::op
SearchPattern::Operator op() const
Returns the filter operator.
Definition: searchpattern.h:705
MailCommon::SearchRuleWidgetLister
Definition: searchpatternedit.h:284
MailCommon::SearchPatternEdit::AbsoluteDate
Definition: searchpatternedit.h:85
MailCommon::SearchPatternEdit::maybeNameChanged
void maybeNameChanged()
This signal is emitted whenever the name of the processed search pattern may have changed...
MailCommon::RuleWidgetHandlerManager::createWidgets
void createWidgets(QStackedWidget *functionStack, QStackedWidget *valueStack, const QObject *receiver) const
Definition: rulewidgethandlermanager.cpp:123
MailCommon::RuleWidgetHandlerManager::function
MailCommon::SearchRule::Function function(const QByteArray &field, const QStackedWidget *functionStack) const
Definition: rulewidgethandlermanager.cpp:157
MailCommon::SearchPattern::OpOr
Definition: searchpattern.h:607
MailCommon::SearchRuleWidget::contentsChanged
void contentsChanged(const QString &)
This signal is emitted whenever the user alters the contents/value of the rule.
MailCommon::SearchRuleWidget::slotFunctionChanged
void slotFunctionChanged()
Definition: searchpatternedit.cpp:285
SpecialRuleFieldsCount
static const int SpecialRuleFieldsCount
Definition: searchpatternedit.cpp:79
MailCommon::SearchRuleWidget::removeWidget
void removeWidget(QWidget *)
MailCommon::SearchRuleWidget::Recipients
Definition: searchpatternedit.h:191
MailCommon::SearchPatternEdit::NotShowDate
Definition: searchpatternedit.h:88
QWidget
MailCommon::SearchRuleWidget::slotReturnPressed
void slotReturnPressed()
Definition: searchpatternedit.cpp:305
searchpatternedit.h
MailCommon::SearchRuleWidget::Date
Definition: searchpatternedit.h:202
internalName
const char * internalName
Definition: searchpatternedit.cpp:53
MailCommon::RuleWidgetHandlerManager::setRule
void setRule(QStackedWidget *functionStack, QStackedWidget *valueStack, const MailCommon::SearchRule::Ptr rule) const
Definition: rulewidgethandlermanager.cpp:208
MailCommon::SearchRuleWidget::Organization
Definition: searchpatternedit.h:201
MailCommon::SearchRuleWidget::From
Definition: searchpatternedit.h:197
MailCommon::SearchRuleWidget::addWidget
void addWidget(QWidget *)
MailCommon::SearchRuleWidget::AgeInDays
Definition: searchpatternedit.h:193
MailCommon::SearchRuleWidget::slotRemoveWidget
void slotRemoveWidget()
Definition: searchpatternedit.cpp:233
MailCommon::SearchRuleWidget::Subject
Definition: searchpatternedit.h:196
MailCommon::RuleWidgetHandlerManager::setIsNepomukSearch
void setIsNepomukSearch(bool isNepomukSearch)
Definition: rulewidgethandlermanager.cpp:82
MailCommon::SearchRule::Ptr
boost::shared_ptr< SearchRule > Ptr
Defines a pointer to a search rule.
Definition: searchpattern.h:69
MailCommon::RuleWidgetHandlerManager
Singleton to manage the list of RuleWidgetHandlers.
Definition: rulewidgethandlermanager.h:50
MailCommon::SearchRuleWidget::slotAddWidget
void slotAddWidget()
Definition: searchpatternedit.cpp:228
MailCommon::RuleWidgetHandlerManager::value
QString value(const QByteArray &field, const QStackedWidget *functionStack, const QStackedWidget *valueStack) const
Definition: rulewidgethandlermanager.cpp:170
MailCommon::SearchRuleWidgetLister::slotAddWidget
void slotAddWidget(QWidget *)
Definition: searchpatternedit.cpp:484
MailCommon::SearchRuleWidget::Size
Definition: searchpatternedit.h:192
MailCommon::SearchRuleWidget::returnPressed
void returnPressed()
MailCommon::SearchRuleWidget::AnyHeader
Definition: searchpatternedit.h:190
MailCommon::SearchRule::Function
Function
Describes operators for comparison of field and contents.
Definition: searchpattern.h:80
MailCommon::SearchRuleWidget::Body
Definition: searchpatternedit.h:189
MailCommon::SearchPatternEdit::setPatternEditOptions
void setPatternEditOptions(SearchPatternEdit::SearchPatternEditOptions options)
Definition: searchpatternedit.cpp:597
MailCommon::SearchRuleWidget::SearchRuleWidget
SearchRuleWidget(QWidget *parent=0, MailCommon::SearchRule::Ptr aRule=MailCommon::SearchRule::Ptr(), SearchPatternEdit::SearchPatternEditOptions options=(SearchPatternEdit::SearchPatternEditOptions)(SearchPatternEdit::None), SearchPatternEdit::SearchModeType modeType=SearchPatternEdit::StandardMode)
Constructor.
Definition: searchpatternedit.cpp:88
MailCommon::SearchRuleWidget::CC
Definition: searchpatternedit.h:199
MailCommon::Tag
Definition: tag.h:41
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::SearchPatternEdit::SearchModeType
SearchModeType
Definition: searchpatternedit.h:92
I18N_NOOP2
#define I18N_NOOP2(c, t)
Definition: searchpatternedit.cpp:48
MailCommon::SearchRuleWidget::Status
Definition: searchpatternedit.h:194
MailCommon::SearchRuleWidget::reset
void reset()
Resets the rule currently worked on and updates the widget accordingly.
Definition: searchpatternedit.cpp:275
MailCommon::SearchRuleWidget
A widget to edit a single MailCommon::SearchRule.
Definition: searchpatternedit.h:173
MailCommon::SearchRuleWidget::ruleFieldToEnglish
static QByteArray ruleFieldToEnglish(const QString &i18nVal)
Used internally to translate i18n-ized pseudo-headers back to English.
Definition: searchpatternedit.cpp:310
MailCommon::SearchPattern
This class is an abstraction of a search over messages.
Definition: searchpattern.h:595
displayName
const char * displayName
Definition: searchpatternedit.cpp:55
MailCommon::SearchRuleWidget::ReplyTo
Definition: searchpatternedit.h:200
MailCommon::RuleWidgetHandlerManager::reset
void reset(QStackedWidget *functionStack, QStackedWidget *valueStack) const
Definition: rulewidgethandlermanager.cpp:198
MailCommon::RuleWidgetHandlerManager::prettyValue
QString prettyValue(const QByteArray &field, const QStackedWidget *functionStack, const QStackedWidget *valueStack) const
Definition: rulewidgethandlermanager.cpp:184
MailCommon::SearchRuleWidget::updateAddRemoveButton
void updateAddRemoveButton(bool addButtonEnabled, bool removeButtonEnabled)
Definition: searchpatternedit.cpp:222
MailCommon::SearchRuleWidgetLister::reset
void reset()
Definition: searchpatternedit.cpp:528
MailCommon::RuleWidgetHandlerManager::update
void update(const QByteArray &field, QStackedWidget *functionStack, QStackedWidget *valueStack) const
Definition: rulewidgethandlermanager.cpp:222
displayNameFromInternalName
static QString displayNameFromInternalName(const QString &internal)
Definition: searchpatternedit.cpp:330
SpecialRuleFields
static const struct @6 SpecialRuleFields[]
MailCommon::SearchPattern::OpAnd
Definition: searchpattern.h:606
MailCommon::SearchRuleWidget::setPatternEditOptions
void setPatternEditOptions(MailCommon::SearchPatternEdit::SearchPatternEditOptions options)
Definition: searchpatternedit.cpp:106
MailCommon::SearchRuleWidgetLister::setPatternEditOptions
void setPatternEditOptions(SearchPatternEdit::SearchPatternEditOptions options)
Definition: searchpatternedit.cpp:425
MailCommon::SearchRuleWidgetLister::setRuleList
void setRuleList(QList< MailCommon::SearchRule::Ptr > *aList)
Definition: searchpatternedit.cpp:433
MailCommon::SearchPatternEdit::~SearchPatternEdit
~SearchPatternEdit()
Definition: searchpatternedit.cpp:588
MailCommon::SearchPatternEdit::setSearchPattern
void setSearchPattern(MailCommon::SearchPattern *aPattern)
Sets the search pattern.
Definition: searchpatternedit.cpp:671
MailCommon::SearchPatternEdit::NotShowSize
Definition: searchpatternedit.h:87
MailCommon::SearchPatternEdit::SearchPatternEdit
SearchPatternEdit(QWidget *parent=0, SearchPatternEditOptions options=(SearchPatternEditOptions)(None), SearchModeType modeType=StandardMode)
Constructor.
Definition: searchpatternedit.cpp:580
MailCommon::SearchRuleWidget::ruleFieldToId
static int ruleFieldToId(const QString &i18nVal)
Definition: searchpatternedit.cpp:320
MailCommon::SearchRuleWidget::rule
MailCommon::SearchRule::Ptr rule() const
Returns a reference to the currently-worked-on MailCommon::SearchRule.
Definition: searchpatternedit.cpp:262
MailCommon::SearchPatternEdit::patternChanged
void patternChanged()
This signal is emitted wherenever the search pattern changes in some way.
MailCommon::SearchPatternEdit::NepomukMode
Definition: searchpatternedit.h:94
context
const char * context
Definition: searchpatternedit.cpp:54
MailCommon::SearchPattern::setOp
void setOp(SearchPattern::Operator aOp)
Sets the filter operator.
Definition: searchpattern.h:713
MailCommon::SearchPatternEdit::MatchAllMessages
Definition: searchpatternedit.h:86
MailCommon::SearchRuleWidget::fieldChanged
void fieldChanged(const QString &)
This signal is emitted whenever the user alters the field.
MailCommon::SearchRuleWidget::slotValueChanged
void slotValueChanged()
Definition: searchpatternedit.cpp:295
I18N_NOOP
#define I18N_NOOP(t)
Definition: searchpatternedit.cpp:46
MailCommon::SearchRuleWidget::Message
Definition: searchpatternedit.h:188
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
MailCommon::SearchRuleWidget::To
Definition: searchpatternedit.h:198
MailCommon::SearchRuleWidget::indexOfRuleField
int indexOfRuleField(const QByteArray &aName) const
Used internally to find the corresponding index into the field ComboBox.
Definition: searchpatternedit.cpp:340
MailCommon::FILTER_MAX_RULES
const int FILTER_MAX_RULES
Definition: searchpattern.h:54
MailCommon::SearchRuleWidgetLister::slotRemoveWidget
void slotRemoveWidget(QWidget *)
Definition: searchpatternedit.cpp:490
MailCommon::SearchRuleWidget::setRule
void setRule(MailCommon::SearchRule::Ptr aRule)
Sets the rule.
Definition: searchpatternedit.cpp:238
MailCommon::SearchPatternEdit::HeadersOnly
Definition: searchpatternedit.h:84
MailCommon::SearchPatternEdit::returnPressed
void returnPressed()
QList
MailCommon::SearchRuleWidgetLister::SearchRuleWidgetLister
SearchRuleWidgetLister(QWidget *parent=0, SearchPatternEdit::SearchPatternEditOptions opt=(SearchPatternEdit::SearchPatternEditOptions)(SearchPatternEdit::None), SearchPatternEdit::SearchModeType modeType=SearchPatternEdit::StandardMode)
Definition: searchpatternedit.cpp:412
MailCommon::SearchRuleWidgetLister::~SearchRuleWidgetLister
virtual ~SearchRuleWidgetLister()
Definition: searchpatternedit.cpp:421
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