You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kshowmail/kshowmail/kcmconfigs/filtersetupdialog.cpp

452 lines
20 KiB

//
// C++ Implementation: filtersetupdialog
//
// Description:
//
//
// Author: Ulrich Weigelt <ulrich.weigelt@gmx.de>, (C) 2007
//
// Copyright: See COPYING file that comes with this distribution
//
//
#include "filtersetupdialog.h"
FilterSetupDialog::FilterSetupDialog( TQWidget* parent, FilterSetupItem* item )
: KDialogBase( parent, "FilterSetupDialog", true, TQString::null, Ok|Cancel, Ok, true )
{
//save pointer to account and view
filter = item;
//set caption
if( item != NULL )
if( item->getName() == DEFAULT_FILTER_NAME )
setCaption( i18n( "New filter" ) );
else
setCaption( i18n( "Edit filter" ) );
//create main widget and layout
TQWidget* pgMain = new TQWidget( this );
setMainWidget( pgMain );
TQVBoxLayout* layMain = new TQVBoxLayout( pgMain, 0, spacingHint() );
//create filter name widgets
TQHBoxLayout* layName = new TQHBoxLayout( layMain, spacingHint() );
TQLabel* lblName = new TQLabel( i18n( "Name:" ), pgMain, "lblName" );
layName->addWidget( lblName );
txtName = new KLineEdit( pgMain, "txtName" );
layName->addWidget( txtName );
//create group boxes and layouts for rules and action
TQGroupBox* gboxCriteria = new TQGroupBox( 0, TQt::Horizontal, i18n( "Filter Criterias" ), pgMain, "gboxCriteria" );
TQVBoxLayout* layCriteria = new TQVBoxLayout( gboxCriteria->layout(), spacingHint() );
layMain->addWidget( gboxCriteria );
TQGroupBox* gboxAction = new TQGroupBox( 0, TQt::Horizontal, i18n( "Filter Action" ), pgMain, "gboxAction" );
TQHBoxLayout* layAction = new TQHBoxLayout( gboxAction->layout(), spacingHint() );
layMain->addWidget( gboxAction );
//radio buttons to select the kind of linkage between filter criterias
TQHBoxLayout* layLinkage = new TQHBoxLayout( layCriteria, spacingHint(), "layLinkage" );
grpLinkage = new TQButtonGroup( NULL, "grpLinkage" );
TQRadioButton* btnMatchAll = new TQRadioButton( i18n( "Match all of the following" ), gboxCriteria, "btnMatchAll" );
TQRadioButton* btnMatchAny = new TQRadioButton( i18n( "Match any of the following" ), gboxCriteria, "btnMatchAny" );
grpLinkage->insert( btnMatchAll, ID_BUTTON_LINKAGE_MATCH_ALL );
grpLinkage->insert( btnMatchAny, ID_BUTTON_LINKAGE_MATCH_ANY );
layLinkage->addWidget( btnMatchAll );
layLinkage->addWidget( btnMatchAny );
switch( DEFAULT_FILTER_CRITERIA_LINKAGE )
{
case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ALL : grpLinkage->setButton( ID_BUTTON_LINKAGE_MATCH_ALL ); break;
case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ANY : grpLinkage->setButton( ID_BUTTON_LINKAGE_MATCH_ANY ); break;
default : grpLinkage->setButton( ID_BUTTON_LINKAGE_MATCH_ALL ); break;
}
//this widget holds one or more criterias (class FilterCriteriaWidget)
wdgCriteriasHolding = new TQWidget( gboxCriteria, "gboxCriteria" );
layCriteriasHolding = new TQVBoxLayout( wdgCriteriasHolding, 0, spacingHint(), "layCriteriasHolding" );
layCriteria->addWidget( wdgCriteriasHolding );
//buttons to add or remove criterias
TQHBoxLayout* layButtons = new TQHBoxLayout( layCriteria, spacingHint(), "layButtons" );
btnAddCriteria = new KPushButton( KGuiItem( i18n( "More" ), "button_more", i18n( "Add a further criteria." ) ), gboxCriteria, "btnAddCriteria" );
btnRemoveCriteria = new KPushButton( KGuiItem( i18n( "Fewer" ), "button_fewer", i18n( "Remove the last criteria." ) ), gboxCriteria, "btnRemoveCriteria" );
btnAddCriteria->setSizePolicy( TQSizePolicy::Maximum, TQSizePolicy::Fixed );
btnRemoveCriteria->setSizePolicy( TQSizePolicy::Maximum, TQSizePolicy::Fixed );
layButtons->addWidget( btnAddCriteria );
layButtons->addWidget( btnRemoveCriteria );
layButtons->addStretch();
connect( btnAddCriteria, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotAddCriteriaWidget() ) );
connect( btnRemoveCriteria, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotRemoveCriteriaWidget() ) );
//create combobox to select action
cmbAction = new KComboBox( gboxAction, "cmbAction" );
layAction->addWidget( cmbAction );
TQToolTip::add( cmbAction, i18n( "Choose the action for all mails which are filtered by this filter." ) );
connect( cmbAction, TQ_SIGNAL( activated( int ) ), this, TQ_SLOT( slotActionChanged( int ) ) );
//insert items
cmbAction->insertItem( i18n( "Show" ), ID_COMBO_FILTER_ACTION_PASS );
cmbAction->insertItem( i18n( "Delete" ), ID_COMBO_FILTER_ACTION_DELETE );
cmbAction->insertItem( i18n( "Mark" ), ID_COMBO_FILTER_ACTION_MARK );
cmbAction->insertItem( i18n( "Move" ), ID_COMBO_FILTER_ACTION_MOVE );
cmbAction->insertItem( i18n( "Spamcheck" ), ID_COMBO_FILTER_ACTION_SPAMCHECK );
cmbAction->insertItem( i18n( "Ignore" ), ID_COMBO_FILTER_ACTION_IGNORE );
//create edit line to defined the mailbox for move
txtMailbox = new KLineEdit( gboxAction );
layAction->addWidget( txtMailbox );
//create wizard button to configure mailbox
btnMailboxWizard= new KPushButton( KGuiItem( TQString::null, "wizard" ), gboxAction );
layAction->addWidget( btnMailboxWizard );
TQToolTip::add( btnMailboxWizard, i18n( "Choose the mailbox" ) );
connect( btnMailboxWizard, TQ_SIGNAL( clicked() ), this, TQ_SLOT( slotOpenMailBoxWizard() ) );
//set default action
switch( DEFAULT_FILTER_ACTION )
{
case CONFIG_VALUE_FILTER_ACTION_PASS : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_PASS ); break;
case CONFIG_VALUE_FILTER_ACTION_DELETE : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_DELETE ); break;
case CONFIG_VALUE_FILTER_ACTION_MARK : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_MARK ); break;
case CONFIG_VALUE_FILTER_ACTION_MOVE : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_MOVE ); break;
case CONFIG_VALUE_FILTER_ACTION_SPAMCHECK : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_SPAMCHECK ); break;
case CONFIG_VALUE_FILTER_ACTION_IGNORE : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_IGNORE ); break;
}
//enable or disable action widgets
slotActionChanged( cmbAction->currentItem() );
//this adds a first empty criteria widget at the dialog if the given setup item pointer is null
//(this means we want to create a new filter)
if( item == NULL )
{
slotAddCriteriaWidget();
}
//write values of the given filter into the dialog items
if( filter != NULL )
fillDialog();
}
FilterSetupDialog::~FilterSetupDialog()
{
}
void FilterSetupDialog::fillDialog( )
{
//check for valid pointer to the setup item
if( filter == NULL )
{
kdError() << "FilterSetupDialog::fillDialog: The given pointer to the filter setup item is NULL." << endl;
return;
}
//set filter name
txtName->setText( filter->getName() );
//set linkage
switch( filter->getCriteriaLinkage() )
{
case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ALL : grpLinkage->setButton( ID_BUTTON_LINKAGE_MATCH_ALL ); break;
case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ANY : grpLinkage->setButton( ID_BUTTON_LINKAGE_MATCH_ANY ); break;
default : kdError() << "FilterSetupDialog::fillDialog: The Filter Setup Item of filter " << filter->getName() << " has returned an invalid linkage value. Set default value." << endl;
switch( DEFAULT_FILTER_CRITERIA_LINKAGE )
{
case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ALL : grpLinkage->setButton( ID_BUTTON_LINKAGE_MATCH_ALL ); break;
case CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ANY : grpLinkage->setButton( ID_BUTTON_LINKAGE_MATCH_ANY ); break;
default: kdError() << "FilterSetupDialog::fillDialog: The default value DEFAULT_FILTER_CRITERIA_LINKAGE in constants.h is also invalid. Set linkage to ALL." << endl;
grpLinkage->setButton( ID_BUTTON_LINKAGE_MATCH_ALL );
break;
}
break;
}
//set criterias
FilterCriteriaList_Type criteriaList = filter->getCriteriaList();
if( !criteriaList.empty() )
{
FilterCriteriaList_Type::iterator it;
for( it = criteriaList.begin(); it != criteriaList.end(); ++it )
{
//get source and condition
int source = (*it).source;
int condition = (*it).condition;
//depend on the source we add a numeric or text criteria
switch( source )
{
case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_FROM :
case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_TO :
case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_SUBJECT :
case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_HEADER :
case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_ACCOUNT : addCriteriaWidget( source, condition, (*it).txtValue, (*it).cs ); break;
case CONFIG_VALUE_FILTER_CRITERIA_SOURCE_SIZE : addCriteriaWidget( source, condition, (*it).numValue ); break;
default : kdError() << "FilterSetupDialog::fillDialog: The Filter Setup Item of filter " << filter->getName() << " has returned an invalid criteria. Add an empty criteria." << endl;
break;
}
}
}
else
//just add a empty criteria widget
slotAddCriteriaWidget();
//set action
switch( filter->getAction() )
{
case CONFIG_VALUE_FILTER_ACTION_PASS : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_PASS ); break;
case CONFIG_VALUE_FILTER_ACTION_DELETE : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_DELETE ); break;
case CONFIG_VALUE_FILTER_ACTION_MARK : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_MARK ); break;
case CONFIG_VALUE_FILTER_ACTION_MOVE : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_MOVE ); break;
case CONFIG_VALUE_FILTER_ACTION_IGNORE : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_IGNORE ); break;
case CONFIG_VALUE_FILTER_ACTION_SPAMCHECK : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_SPAMCHECK ); break;
default : kdError() << "FilterSetupDialog:: fillDialog: The Filter Setup Item of filter " << filter->getName() << " has returned an invalid action value. Set default value." << endl;
switch( DEFAULT_FILTER_ACTION )
{
case CONFIG_VALUE_FILTER_ACTION_PASS : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_PASS ); break;
case CONFIG_VALUE_FILTER_ACTION_DELETE : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_DELETE ); break;
case CONFIG_VALUE_FILTER_ACTION_MARK : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_MARK ); break;
case CONFIG_VALUE_FILTER_ACTION_MOVE : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_MOVE ); break;
case CONFIG_VALUE_FILTER_ACTION_IGNORE : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_IGNORE ); break;
case CONFIG_VALUE_FILTER_ACTION_SPAMCHECK : cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_SPAMCHECK ); break;
default: kdError() << "FilterSetupDialog::fillDialog: The default value DEFAULT_FILTER_ACTION in constants.h is also invalid. Set action to PASS." << endl;
cmbAction->setCurrentItem( ID_COMBO_FILTER_ACTION_PASS );
break;
}
}
//set mailbox name if action is MOVE
if( filter->getAction() == CONFIG_VALUE_FILTER_ACTION_MOVE )
txtMailbox->setText( filter->getMailBox() );
//enable or disable action widgets
slotActionChanged( cmbAction->currentItem() );
}
FilterCriteriaWidget* FilterSetupDialog::slotAddCriteriaWidget( )
{
//create a new widget
FilterCriteriaWidget* crit = new FilterCriteriaWidget( wdgCriteriasHolding );
crit->setHidden( false ); //the new widgets are hidden by default
//insert it into the layout
layCriteriasHolding->addWidget( crit );
//hide remove button if necessary
const TQObjectList* critList = wdgCriteriasHolding->children();
if( critList != NULL )
{
if( critList->count() <= 2 )
btnRemoveCriteria->setEnabled( false );
else
btnRemoveCriteria->setEnabled( true );
}
return crit;
}
void FilterSetupDialog::slotRemoveCriteriaWidget( )
{
//get a list of all criteria widgets
const TQObjectList* critList = wdgCriteriasHolding->children();
//return, if the pointer to the list is invalid
if( critList == NULL )
{
kdError() << "FilterSetupDialog::slotRemoveCriteriaWidget: No object found in the criteria widget holding." << endl;;
return;
}
//return, if the holding widget doesn't contain a criteria widget
//the count of children has to be greater than 2, because the layout is the first child
//and one criteria must always be present.
if( critList->count() <= 2 ) return;
//get iterator
TQObjectListIterator it( *critList );
//get last child
TQObject* obj = it.toLast();
//remove last child
if( obj->isA( "FilterCriteriaWidget" ) )
{
((TQWidget*)obj)->setHidden( true );
layCriteriasHolding->remove( (TQWidget*)obj );
wdgCriteriasHolding->removeChild( obj );
}
else
kdError() << "FilterSetupDialog::slotRemoveCriteriaWidget: the last object of the criteria widget holding is not a criteria widget." << endl;
//hide remove button if necessary
if( critList->count() <= 2 )
btnRemoveCriteria->setEnabled( false );
else
btnRemoveCriteria->setEnabled( true );
}
void FilterSetupDialog::addCriteriaWidget( int source, int condition, uint value )
{
//check source and condition
if( source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_SIZE )
{
kdError() << "FilterSetupDialog::addCriteriaWidget: invalid source parameter." << endl;
return;
}
if( condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_EQUAL &&
condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_NOT_EQUAL &&
condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_GREATER &&
condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_GREATER_EQUAL &&
condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_LESS &&
condition != CONFIG_VALUE_FILTER_CRITERIA_COND_NUM_LESS_EQUAL )
{
kdError() << "FilterSetupDialog::addCriteriaWidget: invalid condition parameter." << endl;
return;
}
//create widget
FilterCriteriaWidget* crit = slotAddCriteriaWidget();
//set values
crit->setNumCriteria( source, condition, value );
}
void FilterSetupDialog::addCriteriaWidget( int source, int condition, TQString value, bool cs )
{
//check source and condition
if( source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_FROM &&
source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_TO &&
source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_SUBJECT &&
source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_HEADER &&
source != CONFIG_VALUE_FILTER_CRITERIA_SOURCE_ACCOUNT )
{
kdError() << "FilterSetupDialog::addCriteriaWidget: invalid source parameter." << endl;
return;
}
if( condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_CONTAINS &&
condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_NOT_CONTAINS &&
condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_EQUALS &&
condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_NOT_EQUALS &&
condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_REGEXPR &&
condition != CONFIG_VALUE_FILTER_CRITERIA_COND_TEXT_NOT_REGEXPR )
{
kdError() << "FilterSetupDialog::addCriteriaWidget: invalid condition parameter." << endl;
return;
}
//create widget
FilterCriteriaWidget* crit = slotAddCriteriaWidget();
//set values
crit->setTextCriteria( source, condition, value, cs );
}
void FilterSetupDialog::slotOk()
{
//here we write the settings back to the filter setup item
//filter name
filter->setName( txtName->text() );
//linkage
switch( grpLinkage->selectedId() )
{
case ID_BUTTON_LINKAGE_MATCH_ALL : filter->setCriteriaLinkage( CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ALL ); break;
case ID_BUTTON_LINKAGE_MATCH_ANY : filter->setCriteriaLinkage( CONFIG_VALUE_FILTER_CRITERIA_LINKAGE_MATCH_ANY ); break;
default : kdDebug() << "FilterSetupDialog::slotOk: Invalid linkage value. Set default value." << endl;
filter->setCriteriaLinkage( DEFAULT_FILTER_CRITERIA_LINKAGE ); break;
}
//action
switch( cmbAction->currentItem() )
{
case ID_COMBO_FILTER_ACTION_PASS : filter->setAction( CONFIG_VALUE_FILTER_ACTION_PASS ); break;
case ID_COMBO_FILTER_ACTION_DELETE : filter->setAction( CONFIG_VALUE_FILTER_ACTION_DELETE ); break;
case ID_COMBO_FILTER_ACTION_MARK : filter->setAction( CONFIG_VALUE_FILTER_ACTION_MARK ); break;
case ID_COMBO_FILTER_ACTION_MOVE : filter->setAction( CONFIG_VALUE_FILTER_ACTION_MOVE ); break;
case ID_COMBO_FILTER_ACTION_IGNORE : filter->setAction( CONFIG_VALUE_FILTER_ACTION_IGNORE ); break;
case ID_COMBO_FILTER_ACTION_SPAMCHECK : filter->setAction( CONFIG_VALUE_FILTER_ACTION_SPAMCHECK ); break;
default : kdDebug() << "FilterSetupDialog::slotOk: Invalid action value. Set default value." << endl;
filter->setAction( DEFAULT_FILTER_ACTION ); break;
}
//mailbox name if action is MOVE
if( cmbAction->currentItem() == ID_COMBO_FILTER_ACTION_MOVE )
filter->setMailBox( txtMailbox->text() );
//criteria widgets
//get list of all children of the criterias holding widget
const TQObjectList* children = wdgCriteriasHolding->children();
//get iterator of the list
TQObjectListIterator it( *children );
TQObject* obj; //current child object
FilterCriteriaList_Type critList; //list of criterias; will be give to the filter setup item
//iterate over the children list
while ( ( obj = it.current() ) != NULL )
{
//get next child
++it;
if( obj->isA( "FilterCriteriaWidget" ) ) //check for criteria object
{
//get the values of the criteria
FilterCriteria_Type crit = ( (FilterCriteriaWidget*)obj )->getValues();
//append the new criteria at the end of the criteria list
critList.push_back( crit );
}
}
//pass criteria list to filter setup item
filter->setCriteriaList( critList );
//call slot of super class to close the dialog
KDialogBase::slotOk();
}
void FilterSetupDialog::slotActionChanged( int index )
{
switch( index )
{
case ID_COMBO_FILTER_ACTION_MOVE : txtMailbox->setEnabled( true );
if( txtMailbox->text() == "" ) txtMailbox->setText( DEFAULT_FILTER_ACTION_MOVE_MAILBOX );
btnMailboxWizard->setHidden( false );
break;
default : txtMailbox->setEnabled( false );
btnMailboxWizard->setHidden( true );
break;
}
}
void FilterSetupDialog::slotOpenMailBoxWizard( )
{
MailBoxWizard wizard( this, "malboxwizard" );
wizard.setCaption( i18n( "Mailbox Select" ) );
int res = wizard.exec();
if( res == TQDialog::Accepted )
txtMailbox->setText( wizard.getPath() );
}
#include "filtersetupdialog.moc"