00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "filtersetupdialog.h"
00019
00020 FilterSetupDialog::FilterSetupDialog( QWidget* parent, FilterSetupItem* item )
00021 : KDialog( parent )
00022 {
00023
00024 filter = item;
00025
00026
00027 if( item != NULL )
00028 {
00029 if( item->getName() == DEFAULT_FILTER_NAME )
00030 setCaption( i18nc( "@title:window", "New filter" ) );
00031 else
00032 setCaption( i18nc( "@title:window", "Edit filter" ) );
00033 }
00034
00035
00036 QWidget* pgMain = new QWidget( this );
00037 setMainWidget( pgMain );
00038 QVBoxLayout* layMain = new QVBoxLayout( pgMain );
00039
00040
00041 QHBoxLayout* layName = new QHBoxLayout();
00042 layMain->addLayout( layName );
00043 QLabel* lblName = new QLabel( i18nc( "@label:textbox name of the filter", "Name:" ), pgMain );
00044 layName->addWidget( lblName );
00045 txtName = new KLineEdit( pgMain );
00046 layName->addWidget( txtName );
00047
00048
00049 QGroupBox* gboxCriteria = new QGroupBox( i18nc( "@title:group", "Filter Criterias" ), pgMain );
00050 QVBoxLayout* layCriteria = new QVBoxLayout();
00051 gboxCriteria->setLayout( layCriteria );
00052 layMain->addWidget( gboxCriteria );
00053
00054 QGroupBox* gboxAction = new QGroupBox( i18nc( "@title:group", "Filter Action" ), pgMain );
00055 QHBoxLayout* layAction = new QHBoxLayout();
00056 gboxAction->setLayout( layAction );
00057 layMain->addWidget( gboxAction );
00058
00059
00060 QHBoxLayout* layLinkage = new QHBoxLayout();
00061 layCriteria->addLayout( layLinkage );
00062 grpLinkage = new QButtonGroup( NULL );
00063
00064 QRadioButton* btnMatchAll = new QRadioButton( i18nc( "@option:radio all criterias must match", "Match all of the following" ), gboxCriteria );
00065 QRadioButton* btnMatchAny = new QRadioButton( i18nc( "@option:radio just any criterias must match", "Match any of the following" ), gboxCriteria );
00066 grpLinkage->addButton( btnMatchAll, ID_BUTTON_LINKAGE_MATCH_ALL );
00067 grpLinkage->addButton( btnMatchAny, ID_BUTTON_LINKAGE_MATCH_ANY );
00068 layLinkage->addWidget( btnMatchAll );
00069 layLinkage->addWidget( btnMatchAny );
00070
00071 switch( DEFAULT_FILTER_CRITERIA_LINKAGE )
00072 {
00073 case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ALL : btnMatchAll->setChecked( true ); break;
00074 case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ANY : btnMatchAny->setChecked( true ); break;
00075 default : btnMatchAll->setChecked( true ); break;
00076 }
00077
00078
00079 wdgCriteriasHolding = new QWidget( gboxCriteria );
00080 layCriteriasHolding = new QVBoxLayout( wdgCriteriasHolding );
00081 layCriteria->addWidget( wdgCriteriasHolding );
00082
00083
00084 QHBoxLayout* layButtons = new QHBoxLayout();
00085 layCriteria->addLayout( layButtons );
00086 btnAddCriteria = new KPushButton( KGuiItem( i18nc( "@action:button show more criterias", "More" ), "button_more", i18nc( "@info:tooltip", "Add a further criteria." ) ), gboxCriteria );
00087 btnRemoveCriteria = new KPushButton( KGuiItem( i18nc( "@action:button how fewer criterias", "Fewer" ), "button_fewer", i18nc( "@info:tooltip", "Remove the last criteria." ) ), gboxCriteria );
00088 btnAddCriteria->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Fixed );
00089 btnRemoveCriteria->setSizePolicy( QSizePolicy::Maximum, QSizePolicy::Fixed );
00090 layButtons->addWidget( btnAddCriteria );
00091 layButtons->addWidget( btnRemoveCriteria );
00092 layButtons->addStretch();
00093 connect( btnAddCriteria, SIGNAL( clicked() ), this, SLOT( slotAddCriteriaWidget() ) );
00094 connect( btnRemoveCriteria, SIGNAL( clicked() ), this, SLOT( slotRemoveCriteriaWidget() ) );
00095
00096
00097 cmbAction = new KComboBox( gboxAction );
00098 layAction->addWidget( cmbAction );
00099 cmbAction->setToolTip( i18nc( "@info:tooltip", "Choose the action for all mails which are filtered by this filter." ) );
00100 connect( cmbAction, SIGNAL( activated( int ) ), this, SLOT( slotActionChanged( int ) ) );
00101
00102
00103 cmbAction->insertItem( ID_COMBO_FILTER_ACTION_PASS, i18nc( "@item:inlistbox show the filtered mail", "Show" ) );
00104 cmbAction->insertItem( ID_COMBO_FILTER_ACTION_DELETE, i18nc( "@item:inlistbox delete the filtered mail", "Delete" ) );
00105 cmbAction->insertItem( ID_COMBO_FILTER_ACTION_MARK, i18nc( "@item:inlistbox mark the filtered mail", "Mark" ) );
00106 cmbAction->insertItem( ID_COMBO_FILTER_ACTION_MOVE, i18nc( "@item:inlistbox write the filtered mail into a mailbox", "Move" ) );
00107 cmbAction->insertItem( ID_COMBO_FILTER_ACTION_SPAMCHECK, i18nc( "@item:inlistbox check the filtered mail for spam", "Spamcheck" ) );
00108 cmbAction->insertItem( ID_COMBO_FILTER_ACTION_IGNORE, i18nc( "@item:inlistbox ignore the filtered mail", "Ignore" ) );
00109
00110
00111 txtMailbox = new KLineEdit( gboxAction );
00112 layAction->addWidget( txtMailbox );
00113
00114
00115 btnMailboxWizard= new KPushButton( KGuiItem( QString(), "tools-wizard" ), gboxAction );
00116 layAction->addWidget( btnMailboxWizard );
00117 btnMailboxWizard->setToolTip( i18nc( "@info:tooltip", "Choose the mailbox" ) );
00118 connect( btnMailboxWizard, SIGNAL( clicked() ), this, SLOT( slotOpenMailBoxWizard() ) );
00119
00120
00121 switch( DEFAULT_FILTER_ACTION )
00122 {
00123 case CONFIG_VALUE_FILTER_ACTION_PASS : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_PASS ); break;
00124 case CONFIG_VALUE_FILTER_ACTION_DELETE : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_DELETE ); break;
00125 case CONFIG_VALUE_FILTER_ACTION_MARK : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_MARK ); break;
00126 case CONFIG_VALUE_FILTER_ACTION_MOVE : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_MOVE ); break;
00127 case CONFIG_VALUE_FILTER_ACTION_SPAMCHECK : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_SPAMCHECK ); break;
00128 case CONFIG_VALUE_FILTER_ACTION_IGNORE : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_IGNORE ); break;
00129 }
00130
00131
00132 slotActionChanged( cmbAction->currentIndex() );
00133
00134
00135
00136 if( item == NULL )
00137 {
00138 slotAddCriteriaWidget();
00139 }
00140
00141
00142 if( filter != NULL )
00143 fillDialog();
00144 }
00145
00146
00147 FilterSetupDialog::~FilterSetupDialog()
00148 {
00149 }
00150
00151 void FilterSetupDialog::fillDialog( )
00152 {
00153
00154 if( filter == NULL )
00155 {
00156 kdError() << "FilterSetupDialog::fillDialog: The given pointer to the filter setup item is NULL." << endl;
00157 return;
00158 }
00159
00160
00161 txtName->setText( filter->getName() );
00162
00163
00164 QRadioButton* btnToCheck;
00165 switch( filter->getCriteriaLinkage() )
00166 {
00167 case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ALL : btnToCheck = static_cast<QRadioButton*>( grpLinkage->button( ID_BUTTON_LINKAGE_MATCH_ALL ) ); break;
00168 case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ANY : btnToCheck = static_cast<QRadioButton*>( grpLinkage->button( ID_BUTTON_LINKAGE_MATCH_ANY ) ); break;
00169 default : kdError() << "FilterSetupDialog::fillDialog: The Filter Setup Item of filter " << filter->getName() << " has returned an invalid linkage value. Set default value." << endl;
00170 switch( DEFAULT_FILTER_CRITERIA_LINKAGE )
00171 {
00172 case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ALL : btnToCheck = static_cast<QRadioButton*>( grpLinkage->button( ID_BUTTON_LINKAGE_MATCH_ALL ) ); break;
00173 case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ANY : btnToCheck = static_cast<QRadioButton*>( grpLinkage->button( ID_BUTTON_LINKAGE_MATCH_ANY ) ); break;
00174 default: kdError() << "FilterSetupDialog::fillDialog: The default value DEFAULT_FILTER_CRITERIA_LINKAGE in constants.h is also invalid. Set linkage to ALL." << endl;
00175 btnToCheck = static_cast<QRadioButton*>( grpLinkage->button( ID_BUTTON_LINKAGE_MATCH_ALL ) );
00176 break;
00177 }
00178 break;
00179 }
00180 btnToCheck->setChecked( true );
00181
00182
00183
00184 FilterCriteriaList_Type criteriaList = filter->getCriteriaList();
00185
00186 if( !criteriaList.empty() )
00187 {
00188 FilterCriteriaList_Type::iterator it;
00189 for( it = criteriaList.begin(); it != criteriaList.end(); ++it )
00190 {
00191
00192 int source = (*it).source;
00193 int condition = (*it).condition;
00194
00195
00196 switch( source )
00197 {
00198 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_FROM :
00199 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_TO :
00200 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_SUBJECT :
00201 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_HEADER :
00202 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_ACCOUNT : addCriteriaWidget( source, condition, (*it).txtValue, (*it).cs ); break;
00203
00204 case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_SIZE : addCriteriaWidget( source, condition, (*it).numValue ); break;
00205 default : kdError() << "FilterSetupDialog::fillDialog: The Filter Setup Item of filter " << filter->getName() << " has returned an invalid criteria. Add an empty criteria." << endl;
00206 break;
00207 }
00208 }
00209 }
00210 else
00211 {
00212
00213 slotAddCriteriaWidget();
00214 }
00215
00216
00217
00218 switch( filter->getAction() )
00219 {
00220 case CONFIG_VALUE_FILTER_ACTION_PASS : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_PASS ); break;
00221 case CONFIG_VALUE_FILTER_ACTION_DELETE : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_DELETE ); break;
00222 case CONFIG_VALUE_FILTER_ACTION_MARK : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_MARK ); break;
00223 case CONFIG_VALUE_FILTER_ACTION_MOVE : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_MOVE ); break;
00224 case CONFIG_VALUE_FILTER_ACTION_IGNORE : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_IGNORE ); break;
00225 case CONFIG_VALUE_FILTER_ACTION_SPAMCHECK : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_SPAMCHECK ); break;
00226 default : kdError() << "FilterSetupDialog:: fillDialog: The Filter Setup Item of filter " << filter->getName() << " has returned an invalid action value. Set default value." << endl;
00227 switch( DEFAULT_FILTER_ACTION )
00228 {
00229 case CONFIG_VALUE_FILTER_ACTION_PASS : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_PASS ); break;
00230 case CONFIG_VALUE_FILTER_ACTION_DELETE : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_DELETE ); break;
00231 case CONFIG_VALUE_FILTER_ACTION_MARK : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_MARK ); break;
00232 case CONFIG_VALUE_FILTER_ACTION_MOVE : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_MOVE ); break;
00233 case CONFIG_VALUE_FILTER_ACTION_IGNORE : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_IGNORE ); break;
00234 case CONFIG_VALUE_FILTER_ACTION_SPAMCHECK : cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_SPAMCHECK ); break;
00235 default: kdError() << "FilterSetupDialog::fillDialog: The default value DEFAULT_FILTER_ACTION in constants.h is also invalid. Set action to PASS." << endl;
00236 cmbAction->setCurrentIndex( ID_COMBO_FILTER_ACTION_PASS );
00237 break;
00238 }
00239 }
00240
00241
00242 if( filter->getAction() == CONFIG_VALUE_FILTER_ACTION_MOVE )
00243 txtMailbox->setText( filter->getMailBox() );
00244
00245
00246 slotActionChanged( cmbAction->currentIndex() );
00247
00248 }
00249
00250 FilterCriteriaWidget* FilterSetupDialog::slotAddCriteriaWidget( )
00251 {
00252
00253 FilterCriteriaWidget* crit = new FilterCriteriaWidget( wdgCriteriasHolding );
00254 crit->setHidden( false );
00255
00256
00257 layCriteriasHolding->addWidget( crit );
00258
00259
00260 const QObjectList critList = wdgCriteriasHolding->children();
00261
00262 if( critList.count() <= 2 )
00263 btnRemoveCriteria->setEnabled( false );
00264 else
00265 btnRemoveCriteria->setEnabled( true );
00266
00267
00268
00269 return crit;
00270 }
00271
00272 void FilterSetupDialog::slotRemoveCriteriaWidget( )
00273 {
00274
00275 QObjectList critList = wdgCriteriasHolding->children();
00276
00277
00278
00279
00280 if( critList.count() <= 2 ) return;
00281
00282
00283 QListIterator<QObject*> it( critList );
00284 while( it.hasNext() )
00285 kdDebug() << it.next()->objectName() << endl;
00286
00287
00288 it.toBack();
00289 QObject* obj = it.previous();
00290
00291
00292 if( obj->objectName() == FILTER_CRITERIA_WIDGET_NAME )
00293 {
00294 ((QWidget*)obj)->setHidden( true );
00295 layCriteriasHolding->removeWidget( (QWidget*)obj );
00296 critList.removeAll( obj );
00297 delete obj;
00298 }
00299 else
00300 kdError() << "FilterSetupDialog::slotRemoveCriteriaWidget: the last object of the criteria widget holding is not a criteria widget." << endl;
00301
00302
00303 if( critList.count() <= 2 )
00304 btnRemoveCriteria->setEnabled( false );
00305 else
00306 btnRemoveCriteria->setEnabled( true );
00307
00308 }
00309
00310 void FilterSetupDialog::addCriteriaWidget( int source, int condition, uint value )
00311 {
00312
00313 if( source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_SIZE )
00314 {
00315 kdError() << "FilterSetupDialog::addCriteriaWidget: invalid source parameter." << endl;
00316 return;
00317 }
00318
00319 if( condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_EQUAL &&
00320 condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_NOT_EQUAL &&
00321 condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_GREATER &&
00322 condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_GREATER_EQUAL &&
00323 condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_LESS &&
00324 condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_LESS_EQUAL )
00325 {
00326 kdError() << "FilterSetupDialog::addCriteriaWidget: invalid condition parameter." << endl;
00327 return;
00328 }
00329
00330
00331 FilterCriteriaWidget* crit = slotAddCriteriaWidget();
00332
00333
00334 crit->setNumCriteria( source, condition, value );
00335 }
00336
00337 void FilterSetupDialog::addCriteriaWidget( int source, int condition, QString value, bool cs )
00338 {
00339
00340 if( source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_FROM &&
00341 source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_TO &&
00342 source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_SUBJECT &&
00343 source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_HEADER &&
00344 source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_ACCOUNT )
00345 {
00346 kdError() << "FilterSetupDialog::addCriteriaWidget: invalid source parameter." << endl;
00347 return;
00348 }
00349
00350 if( condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_CONTAINS &&
00351 condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_NOT_CONTAINS &&
00352 condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_EQUALS &&
00353 condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_NOT_EQUALS &&
00354 condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_REGEXPR &&
00355 condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_NOT_REGEXPR )
00356 {
00357 kdError() << "FilterSetupDialog::addCriteriaWidget: invalid condition parameter." << endl;
00358 return;
00359 }
00360
00361
00362 FilterCriteriaWidget* crit = slotAddCriteriaWidget();
00363
00364
00365 if( source == CONFIG_VALUE_FILTER_CRITERIA_SOURCE_HEADER )
00366 {
00367 crit->setTextListCriteria( source, condition, value, cs );
00368 }
00369 else
00370 {
00371 crit->setTextCriteria( source, condition, value, cs );
00372 }
00373
00374 }
00375
00376 void FilterSetupDialog::slotButtonClicked( int button )
00377 {
00378
00379 if( button != KDialog::Ok )
00380 {
00381 KDialog::slotButtonClicked( button );
00382 return;
00383 }
00384
00385
00386
00387
00388
00389 filter->setName( txtName->text() );
00390
00391
00392 switch( grpLinkage->checkedId() )
00393 {
00394 case ID_BUTTON_LINKAGE_MATCH_ALL : filter->setCriteriaLinkage( CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ALL ); break;
00395 case ID_BUTTON_LINKAGE_MATCH_ANY : filter->setCriteriaLinkage( CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ANY ); break;
00396 default : kdDebug() << "FilterSetupDialog::slotOk: Invalid linkage value. Set default value." << endl;
00397 filter->setCriteriaLinkage( DEFAULT_FILTER_CRITERIA_LINKAGE ); break;
00398 }
00399
00400
00401 switch( cmbAction->currentIndex() )
00402 {
00403 case ID_COMBO_FILTER_ACTION_PASS : filter->setAction( CONFIG_VALUE_FILTER_ACTION_PASS ); break;
00404 case ID_COMBO_FILTER_ACTION_DELETE : filter->setAction( CONFIG_VALUE_FILTER_ACTION_DELETE ); break;
00405 case ID_COMBO_FILTER_ACTION_MARK : filter->setAction( CONFIG_VALUE_FILTER_ACTION_MARK ); break;
00406 case ID_COMBO_FILTER_ACTION_MOVE : filter->setAction( CONFIG_VALUE_FILTER_ACTION_MOVE ); break;
00407 case ID_COMBO_FILTER_ACTION_IGNORE : filter->setAction( CONFIG_VALUE_FILTER_ACTION_IGNORE ); break;
00408 case ID_COMBO_FILTER_ACTION_SPAMCHECK : filter->setAction( CONFIG_VALUE_FILTER_ACTION_SPAMCHECK ); break;
00409 default : kdDebug() << "FilterSetupDialog::slotOk: Invalid action value. Set default value." << endl;
00410 filter->setAction( DEFAULT_FILTER_ACTION ); break;
00411 }
00412
00413
00414 if( cmbAction->currentIndex() == ID_COMBO_FILTER_ACTION_MOVE )
00415 filter->setMailBox( txtMailbox->text() );
00416
00417
00418
00419
00420 QObjectList children = wdgCriteriasHolding->children();
00421
00422
00423 QListIterator<QObject*> it( children );
00424
00425 QObject* obj;
00426 FilterCriteriaList_Type critList;
00427
00428
00429 while ( it.hasNext() )
00430 {
00431
00432 obj = it.next();
00433
00434 if( obj->objectName() == FILTER_CRITERIA_WIDGET_NAME )
00435 {
00436
00437 FilterCriteria_Type crit = ( (FilterCriteriaWidget*)obj )->getValues();
00438
00439
00440 critList.push_back( crit );
00441 }
00442 }
00443
00444
00445 filter->setCriteriaList( critList );
00446
00447
00448 KDialog::slotButtonClicked( KDialog::Ok );
00449 }
00450
00451 void FilterSetupDialog::slotActionChanged( int index )
00452 {
00453 switch( index )
00454 {
00455 case ID_COMBO_FILTER_ACTION_MOVE : txtMailbox->setEnabled( true );
00456 if( txtMailbox->text() == "" ) txtMailbox->setText( DEFAULT_FILTER_ACTION_MOVE_MAILBOX );
00457 btnMailboxWizard->setHidden( false );
00458 break;
00459 default : txtMailbox->setEnabled( false );
00460 btnMailboxWizard->setHidden( true );
00461 break;
00462 }
00463 }
00464
00465 void FilterSetupDialog::slotOpenMailBoxWizard( )
00466 {
00467 QPointer<MailBoxWizard> wizard = new MailBoxWizard( this );
00468 wizard->setWindowTitle( i18nc( "@title:window", "Mailbox Select" ) );
00469 int res = wizard->exec();
00470
00471 if( res == QDialog::Accepted )
00472 txtMailbox->setText( wizard->getPath() );
00473
00474 delete wizard;
00475
00476 }
00477
00478
00479 #include "filtersetupdialog.moc"