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

mailcommon

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

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