7 #include "kmsearchpatternedit.h" 9 #include "kmsearchpattern.h" 10 #include "rulewidgethandlermanager.h" 13 #include <tdelocale.h> 17 #include <tqradiobutton.h> 18 #include <tqcombobox.h> 19 #include <tqbuttongroup.h> 20 #include <tqwidgetstack.h> 31 const char *internalName;
32 const char *displayName;
33 } SpecialRuleFields[] = {
34 {
"<message>", I18N_NOOP(
"Complete Message" ) },
35 {
"<body>", I18N_NOOP(
"Body of Message" ) },
36 {
"<any header>", I18N_NOOP(
"Anywhere in Headers" ) },
37 {
"<recipients>", I18N_NOOP(
"All Recipients" ) },
38 {
"<size>", I18N_NOOP(
"Size in Bytes" ) },
39 {
"<age in days>", I18N_NOOP(
"Age in Days" ) },
40 {
"<status>", I18N_NOOP(
"Message Status" ) },
41 {
"Subject", I18N_NOOP(
"Subject" ) },
42 {
"From", I18N_NOOP(
"From" ) },
43 {
"To", I18N_NOOP(
"To" ) },
44 {
"CC", I18N_NOOP(
"CC" ) },
45 {
"Reply-To", I18N_NOOP(
"Reply To" ) },
46 {
"Organization", I18N_NOOP(
"Organization" ) }
48 static const int SpecialRuleFieldsCount =
49 sizeof( SpecialRuleFields ) /
sizeof( *SpecialRuleFields );
58 const char *name,
bool headersOnly,
60 : TQWidget( parent, name ),
64 mAbsoluteDates( absoluteDates )
66 initFieldList( headersOnly, absoluteDates );
78 TQCString currentText = srule->
field();
80 initFieldList( headersOnly, mAbsoluteDates );
83 mRuleField->insertStringList( mFilterFieldList );
84 mRuleField->setSizeLimit( mRuleField->count() );
85 mRuleField->adjustSize();
87 if (( currentText !=
"<message>") &&
88 ( currentText !=
"<body>"))
89 mRuleField->changeItem( TQString(TQString::fromAscii( currentText )), 0 );
91 mRuleField->changeItem( TQString(), 0 );
94 void KMSearchRuleWidget::initWidget()
96 TQHBoxLayout * hlay =
new TQHBoxLayout(
this, 0, KDialog::spacingHint() );
99 mRuleField =
new TQComboBox(
true,
this,
"mRuleField" );
100 mRuleField->insertStringList( mFilterFieldList );
102 mRuleField->setSizeLimit( mRuleField->count() );
103 mRuleField->adjustSize();
104 hlay->addWidget( mRuleField );
107 mFunctionStack =
new TQWidgetStack(
this,
"mFunctionStack" );
109 mFunctionStack->setSizePolicy( TQSizePolicy::Preferred,TQSizePolicy::Fixed );
111 hlay->addWidget( mFunctionStack );
113 mValueStack =
new TQWidgetStack(
this,
"mValueStack" );
114 mValueStack->setSizePolicy( TQSizePolicy::Preferred,TQSizePolicy::Fixed );
115 hlay->addWidget( mValueStack );
116 hlay->setStretchFactor( mValueStack, 10 );
118 RuleWidgetHandlerManager::instance()->createWidgets( mFunctionStack,
120 TQT_TQOBJECT(
this) );
123 setFocusProxy( mRuleField );
125 connect( mRuleField, TQT_SIGNAL( activated(
const TQString & ) ),
126 this, TQT_SLOT( slotRuleFieldChanged(
const TQString & ) ) );
127 connect( mRuleField, TQT_SIGNAL( textChanged(
const TQString & ) ),
128 this, TQT_SLOT( slotRuleFieldChanged(
const TQString & ) ) );
129 connect( mRuleField, TQT_SIGNAL( textChanged(
const TQString & ) ),
143 mRuleField->blockSignals(
true );
146 mRuleField->changeItem( TQString::fromLatin1( aRule->
field() ), 0 );
149 mRuleField->changeItem( TQString(), 0 );
152 mRuleField->setCurrentItem( i );
153 mRuleField->blockSignals(
false );
155 RuleWidgetHandlerManager::instance()->setRule( mFunctionStack, mValueStack,
162 RuleWidgetHandlerManager::instance()->function( ruleField,
164 const TQString value =
165 RuleWidgetHandlerManager::instance()->value( ruleField, mFunctionStack,
173 mRuleField->blockSignals(
true );
174 mRuleField->changeItem(
"", 0 );
175 mRuleField->setCurrentItem( 0 );
176 mRuleField->blockSignals(
false );
178 RuleWidgetHandlerManager::instance()->reset( mFunctionStack, mValueStack );
181 void KMSearchRuleWidget::slotFunctionChanged()
184 RuleWidgetHandlerManager::instance()->update( ruleField,
189 void KMSearchRuleWidget::slotValueChanged()
192 const TQString prettyValue =
193 RuleWidgetHandlerManager::instance()->prettyValue( ruleField,
201 for (
int i = 0; i < SpecialRuleFieldsCount; ++i ) {
202 if ( i18nVal == i18n( SpecialRuleFields[i].displayName ) )
203 return SpecialRuleFields[i].internalName;
205 return i18nVal.latin1();
208 int KMSearchRuleWidget::ruleFieldToId(
const TQString & i18nVal )
210 for (
int i = 0; i < SpecialRuleFieldsCount; ++i ) {
211 if ( i18nVal == i18n( SpecialRuleFields[i].displayName ) )
217 static TQString displayNameFromInternalName(
const TQString &
internal )
219 for (
int i = 0; i < SpecialRuleFieldsCount; ++i ) {
220 if (
internal == SpecialRuleFields[i].internalName )
221 return i18n(SpecialRuleFields[i].displayName);
223 return internal.latin1();
230 if ( aName.isEmpty() )
233 TQString i18n_aName = displayNameFromInternalName( aName );
235 for (
int i = 1; i < mRuleField->count(); ++i ) {
236 if ( mRuleField->text( i ) == i18n_aName )
243 void KMSearchRuleWidget::initFieldList(
bool headersOnly,
bool absoluteDates )
245 mFilterFieldList.clear();
246 mFilterFieldList.append(
"");
248 mFilterFieldList.append( i18n( SpecialRuleFields[Message].displayName ) );
249 mFilterFieldList.append( i18n( SpecialRuleFields[Body].displayName ) );
251 mFilterFieldList.append( i18n( SpecialRuleFields[AnyHeader].displayName ) );
252 mFilterFieldList.append( i18n( SpecialRuleFields[Recipients].displayName ) );
253 mFilterFieldList.append( i18n( SpecialRuleFields[Size].displayName ) );
254 if ( !absoluteDates )
255 mFilterFieldList.append( i18n( SpecialRuleFields[AgeInDays].displayName ) );
256 mFilterFieldList.append( i18n( SpecialRuleFields[Subject].displayName ) );
257 mFilterFieldList.append( i18n( SpecialRuleFields[From].displayName ) );
258 mFilterFieldList.append( i18n( SpecialRuleFields[To].displayName ) );
259 mFilterFieldList.append( i18n( SpecialRuleFields[CC].displayName ) );
260 mFilterFieldList.append( i18n( SpecialRuleFields[ReplyTo].displayName ) );
261 mFilterFieldList.append( i18n( SpecialRuleFields[Organization].displayName ) );
265 mFilterFieldList.append(
"List-Id");
266 mFilterFieldList.append(
"Resent-From");
267 mFilterFieldList.append(
"X-Loop");
268 mFilterFieldList.append(
"X-Mailing-List");
269 mFilterFieldList.append(
"X-Spam-Flag");
272 void KMSearchRuleWidget::slotRuleFieldChanged(
const TQString & field )
285 KMSearchRuleWidgetLister::KMSearchRuleWidgetLister( TQWidget *parent,
const char* name,
bool headersOnly,
bool absoluteDates )
286 : KWidgetLister( 2, FILTER_MAX_RULES, parent, name )
289 mHeadersOnly = headersOnly;
290 mAbsoluteDates = absoluteDates;
293 KMSearchRuleWidgetLister::~KMSearchRuleWidgetLister()
297 void KMSearchRuleWidgetLister::setRuleList( TQPtrList<KMSearchRule> *aList )
301 if ( mRuleList && mRuleList != aList )
302 regenerateRuleListFromWidgets();
306 if ( mWidgetList.first() )
307 mWidgetList.first()->blockSignals(
true);
309 if ( aList->count() == 0 ) {
311 mWidgetList.first()->blockSignals(
false);
315 int superfluousItems = (int)mRuleList->count() - mMaxWidgets ;
316 if ( superfluousItems > 0 ) {
317 kdDebug(5006) <<
"KMSearchRuleWidgetLister: Clipping rule list to " 318 << mMaxWidgets <<
" items!" << endl;
320 for ( ; superfluousItems ; superfluousItems-- )
321 mRuleList->removeLast();
325 setNumberOfShownWidgetsTo( TQMAX((
int)mRuleList->count(),mMinWidgets)+1 );
327 setNumberOfShownWidgetsTo( TQMAX((
int)mRuleList->count(),mMinWidgets) );
330 TQPtrListIterator<KMSearchRule> rIt( *mRuleList );
331 TQPtrListIterator<TQWidget> wIt( mWidgetList );
332 for ( rIt.toFirst(), wIt.toFirst() ;
333 rIt.current() && wIt.current() ; ++rIt, ++wIt ) {
336 for ( ; wIt.current() ; ++wIt )
339 assert( mWidgetList.first() );
340 mWidgetList.first()->blockSignals(
false);
343 void KMSearchRuleWidgetLister::setHeadersOnly(
bool headersOnly )
345 TQPtrListIterator<TQWidget> wIt( mWidgetList );
346 for ( wIt.toFirst() ; wIt.current() ; ++wIt ) {
351 void KMSearchRuleWidgetLister::reset()
354 regenerateRuleListFromWidgets();
360 TQWidget* KMSearchRuleWidgetLister::createWidget( TQWidget *parent )
365 void KMSearchRuleWidgetLister::clearWidget( TQWidget *aWidget )
371 void KMSearchRuleWidgetLister::regenerateRuleListFromWidgets()
373 if ( !mRuleList )
return;
377 TQPtrListIterator<TQWidget> it( mWidgetList );
378 for ( it.toFirst() ; it.current() ; ++it ) {
381 mRuleList->append( r );
395 : TQGroupBox( 1, Qt::Horizontal, parent, name )
397 setTitle( i18n(
"Search Criteria") );
398 initLayout( headersOnly, absoluteDates );
402 : TQGroupBox( 1, Qt::Horizontal, title, parent, name )
404 initLayout( headersOnly, absoluteDates );
407 KMSearchPatternEdit::~KMSearchPatternEdit()
411 void KMSearchPatternEdit::initLayout(
bool headersOnly,
bool absoluteDates)
414 mAllRBtn =
new TQRadioButton( i18n(
"Match a&ll of the following"),
this,
"mAllRBtn" );
415 mAnyRBtn =
new TQRadioButton( i18n(
"Match an&y of the following"),
this,
"mAnyRBtn" );
417 mAllRBtn->setChecked(
true);
418 mAnyRBtn->setChecked(
false);
420 TQButtonGroup *bg =
new TQButtonGroup(
this );
422 bg->insert( mAllRBtn, (
int)KMSearchPattern::OpAnd );
423 bg->insert( mAnyRBtn, (
int)KMSearchPattern::OpOr );
426 mRuleLister =
new KMSearchRuleWidgetLister(
this,
"swl", headersOnly, absoluteDates );
427 mRuleLister->slotClear();
430 connect( bg, TQT_SIGNAL(clicked(
int)),
431 this, TQT_SLOT(slotRadioClicked(
int)) );
435 connect( srw, TQT_SIGNAL(fieldChanged(
const TQString &)),
436 this, TQT_SLOT(slotAutoNameHack()) );
437 connect( srw, TQT_SIGNAL(contentsChanged(
const TQString &)),
438 this, TQT_SLOT(slotAutoNameHack()) );
440 kdDebug(5006) <<
"KMSearchPatternEdit: no first KMSearchRuleWidget, though slotClear() has been called!" << endl;
447 mRuleLister->setRuleList( aPattern );
452 if ( mPattern->
op() == KMSearchPattern::OpOr )
453 mAnyRBtn->setChecked(
true);
455 mAllRBtn->setChecked(
true);
463 mRuleLister->setHeadersOnly( headersOnly );
468 mRuleLister->reset();
471 mAllRBtn->setChecked(
true );
477 void KMSearchPatternEdit::slotRadioClicked(
int aIdx)
483 void KMSearchPatternEdit::slotAutoNameHack()
485 mRuleLister->regenerateRuleListFromWidgets();
489 #include "kmsearchpatternedit.moc" This class is an abstraction of a search over messages.
Function
Operators for comparison of field and contents.
static KMSearchRule * createInstance(const TQCString &field=0, Function function=FuncContains, const TQString &contents=TQString())
Create a search rule of a certain type by instantiating the appro- priate subclass depending on the f...
void reset()
Called when the widget should let go of the currently referenced filter and disable itself...
KMSearchPatternEdit(TQWidget *parent=0, const char *name=0, bool headersOnly=false, bool absoluteDates=false)
Constructor.
void setSearchPattern(KMSearchPattern *aPattern)
Set the search pattern.
TQCString field() const
Return message header field name (without the trailing ':').
void setOp(KMSearchPattern::Operator aOp)
Set the filter operator.
Incoming mail is sent through the list of mail filter rules before it is placed in the associated mai...
KMSearchPattern::Operator op() const
Get the filter operator.
void setHeadersOnly(bool headersOnly)
Set whether only header fields can be searched.
Operator
Boolean operators that connect the return values of the individual rules.
void maybeNameChanged()
This signal is emitted whenever the name of the processed search pattern may have changed...