7 #include "kmsearchpatternedit.h"
9 #include "kmsearchpattern.h"
10 #include "rulewidgethandlermanager.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"