|
|
|
// -*- mode: C++; c-file-style: "gnu" -*-
|
|
|
|
// kmfilterrulesedit.h
|
|
|
|
// Author: Marc Mutz <Marc@Mutz.com>
|
|
|
|
// This code is under GPL
|
|
|
|
|
|
|
|
#ifndef KMFILTERRULESEDIT_H
|
|
|
|
#define KMFILTERRULESEDIT_H
|
|
|
|
|
|
|
|
#include "kwidgetlister.h"
|
|
|
|
|
|
|
|
#include <tqgroupbox.h>
|
|
|
|
#include <tqstringlist.h>
|
|
|
|
|
|
|
|
class KMSearchRule;
|
|
|
|
class KMSearchPattern;
|
|
|
|
|
|
|
|
template <typename T> class TQPtrList;
|
|
|
|
class TQString;
|
|
|
|
class TQComboBox;
|
|
|
|
class TQLineEdit;
|
|
|
|
class TQRadioButton;
|
|
|
|
class TQWidgetStack;
|
|
|
|
class TQLabel;
|
|
|
|
class KMSearchPatternEdit;
|
|
|
|
|
|
|
|
/** A widget to edit a single KMSearchRule.
|
|
|
|
It consists of an editable TQComboBox for the field,
|
|
|
|
a read-only TQComboBox for the function and
|
|
|
|
a TQLineEdit for the content or the pattern (in case of regexps).
|
|
|
|
It manages the i18n itself, so field name should be in it's english form.
|
|
|
|
|
|
|
|
To use, you essentially give it the reference to a KMSearchRule and
|
|
|
|
it does the rest. It will never delete the rule itself, as it assumes
|
|
|
|
that something outside of it manages this.
|
|
|
|
|
|
|
|
@short A widget to edit a single KMSearchRule.
|
|
|
|
@author Marc Mutz <Marc@Mutz.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
class KMSearchRuleWidget : public TQWidget
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
TQ_OBJECT
|
|
|
|
public:
|
|
|
|
/** Constructor. You can give a KMSearchRule as parameter, which will
|
|
|
|
be used to initialize the widget. */
|
|
|
|
KMSearchRuleWidget( TQWidget* tqparent=0, KMSearchRule* aRule=0, const char* name=0, bool headersOnly = false, bool absoluteDates = false );
|
|
|
|
|
|
|
|
enum { Message, Body, AnyHeader, Recipients, Size, AgeInDays, tqStatus,
|
|
|
|
Subject, From, To, CC, ReplyTo, Organization };
|
|
|
|
|
|
|
|
/** Set whether only header fields can be searched. If @p is true only
|
|
|
|
header fields can be searched otherwise \<message\> and \<body\> searches
|
|
|
|
are available also. */
|
|
|
|
void setHeadersOnly( bool headersOnly );
|
|
|
|
/** Set the rule. The rule is accepted regardless of the return
|
|
|
|
value of KMSearchRule::isEmpty. This widget makes a shallow
|
|
|
|
copy of @p aRule and operates directly on it. If @p aRule is
|
|
|
|
0, resets itself, taks user input, but does essentially
|
|
|
|
nothing. If you pass 0, you should probably disable it. */
|
|
|
|
void setRule( KMSearchRule* aRule );
|
|
|
|
/** Return a reference to the currently-worked-on KMSearchRule. */
|
|
|
|
KMSearchRule* rule() const;
|
|
|
|
/** Resets the rule currently worked on and updates the widget
|
|
|
|
accordingly. */
|
|
|
|
void reset();
|
|
|
|
static int ruleFieldToId( const TQString & i18nVal );
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
void slotFunctionChanged();
|
|
|
|
void slotValueChanged();
|
|
|
|
|
|
|
|
signals:
|
|
|
|
/** This signal is emitted whenever the user alters the field. The
|
|
|
|
pseudo-headers <...> are returned in their i18n form, but stored
|
|
|
|
in their english form in the rule. */
|
|
|
|
void fieldChanged( const TQString & );
|
|
|
|
|
|
|
|
/** This signal is emitted whenever the user alters the
|
|
|
|
contents/value of the rule. */
|
|
|
|
void contentsChanged( const TQString & );
|
|
|
|
|
|
|
|
protected:
|
|
|
|
/** Used internally to translate i18n-ized pseudo-headers back to
|
|
|
|
english. */
|
|
|
|
static TQCString ruleFieldToEnglish(const TQString & i18nVal);
|
|
|
|
/** Used internally to find the corresponding index into the field
|
|
|
|
ComboBox. Returns the index if found or -1 if the search failed, */
|
|
|
|
int indexOfRuleField( const TQCString & aName ) const;
|
|
|
|
|
|
|
|
protected slots:
|
|
|
|
void slotRuleFieldChanged( const TQString & );
|
|
|
|
|
|
|
|
private:
|
|
|
|
void initWidget();
|
|
|
|
void initFieldList( bool headersOnly, bool absoluteDates );
|
|
|
|
|
|
|
|
TQStringList mFilterFieldList;
|
|
|
|
TQComboBox *mRuleField;
|
|
|
|
TQWidgetStack *mFunctionStack;
|
|
|
|
TQWidgetStack *mValueStack;
|
|
|
|
bool mAbsoluteDates;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
class KMSearchRuleWidgetLister : public KWidgetLister
|
|
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
TQ_OBJECT
|
|
|
|
|
|
|
|
friend class ::KMSearchPatternEdit;
|
|
|
|
|
|
|
|
public:
|
|
|
|
KMSearchRuleWidgetLister( TQWidget *tqparent=0, const char* name=0, bool headersOnly = false, bool absoluteDates = false );
|
|
|
|
|
|
|
|
virtual ~KMSearchRuleWidgetLister();
|
|
|
|
|
|
|
|
void setRuleList( TQPtrList<KMSearchRule> * aList );
|
|
|
|
void setHeadersOnly( bool headersOnly );
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
void reset();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual void clearWidget( TQWidget *aWidget );
|
|
|
|
virtual TQWidget* createWidget( TQWidget *tqparent );
|
|
|
|
|
|
|
|
private:
|
|
|
|
void regenerateRuleListFromWidgets();
|
|
|
|
TQPtrList<KMSearchRule> *mRuleList;
|
|
|
|
bool mHeadersOnly;
|
|
|
|
bool mAbsoluteDates;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/** This widget is intended to be used in the filter configuration as
|
|
|
|
well as in the message search dialogs. It consists of a frame,
|
|
|
|
inside which there are placed two radio buttons entitled "Match
|
|
|
|
{all,any} of the following", followed by a vertical stack of
|
|
|
|
KMSearchRuleWidgets (initially two) and two buttons to add and
|
|
|
|
remove, resp., additional KMSearchWidget 's.
|
|
|
|
|
|
|
|
To set the widget according to a given KMSearchPattern, use
|
|
|
|
setSearchPattern; to initialize it (e.g. for a new, virgin
|
|
|
|
rule), use setSearchPattern with a 0 argument. The widget
|
|
|
|
operates directly on a shallow(!) copy of the search rule. So
|
|
|
|
while you actually don't really need searchPattern, because
|
|
|
|
you can always store a pointer to the current pattern yourself,
|
|
|
|
you must not modify the currently-worked-on pattern yourself while
|
|
|
|
this widget holds a reference to it. The only exceptions are:
|
|
|
|
|
|
|
|
@li If you edit a derived class, you can change aspects of the
|
|
|
|
class that don't interfere with the KMSearchPattern part. An
|
|
|
|
example is KMFilter, whose actions you can still edit while
|
|
|
|
the KMSearchPattern part of it is being acted upon by this
|
|
|
|
widget.
|
|
|
|
|
|
|
|
@li You can change the name of the pattern, but only using (this
|
|
|
|
widget's) setName. You cannot change the pattern's name
|
|
|
|
directly, although this widget in itself doesn't let the user
|
|
|
|
change it. This is because it auto-names the pattern to
|
|
|
|
"<$field>:$contents" iff the pattern begins with "<".
|
|
|
|
|
|
|
|
@short A widget which allows editing a set of KMSearchRule's.
|
|
|
|
@author Marc Mutz <Marc@Mutz.com>
|
|
|
|
*/
|
|
|
|
|
|
|
|
class KMSearchPatternEdit : public TQGroupBox {
|
|
|
|
Q_OBJECT
|
|
|
|
TQ_OBJECT
|
|
|
|
public:
|
|
|
|
/** Constructor. The tqparent and name parameters are passed to the underlying
|
|
|
|
TQGroupBox, as usual. */
|
|
|
|
KMSearchPatternEdit(TQWidget *tqparent=0, const char *name=0, bool headersOnly = false, bool absoluteDates = false);
|
|
|
|
/** Constructor. This one allows you to set a title different from
|
|
|
|
i18n("Search Criteria"). */
|
|
|
|
KMSearchPatternEdit(const TQString & title, TQWidget *tqparent=0, const char *name=0, bool headersOnly = false, bool absoluteDates = false);
|
|
|
|
~KMSearchPatternEdit();
|
|
|
|
|
|
|
|
/** Set the search pattern. Rules are inserted regardless of the
|
|
|
|
return value of each rules' KMSearchRule::isEmpty. This
|
|
|
|
widget makes a shallow copy of @p aPattern and operates directly
|
|
|
|
on it. */
|
|
|
|
void setSearchPattern( KMSearchPattern* aPattern );
|
|
|
|
/** Set whether only header fields can be searched. If @p is true only
|
|
|
|
header fields can be searched otherwise \<message\> and \<body\> searches
|
|
|
|
are available also. */
|
|
|
|
void setHeadersOnly( bool headersOnly );
|
|
|
|
|
|
|
|
/** Updates the search pattern according to the current widget values */
|
|
|
|
void updateSearchPattern() { mRuleLister->regenerateRuleListFromWidgets(); }
|
|
|
|
|
|
|
|
public slots:
|
|
|
|
/** Called when the widget should let go of the currently referenced
|
|
|
|
filter and disable itself. */
|
|
|
|
void reset();
|
|
|
|
|
|
|
|
signals:
|
|
|
|
/** This signal is emitted whenever the name of the processed
|
|
|
|
search pattern may have changed. */
|
|
|
|
void maybeNameChanged();
|
|
|
|
|
|
|
|
private slots:
|
|
|
|
void slotRadioClicked(int aIdx);
|
|
|
|
void slotAutoNameHack();
|
|
|
|
|
|
|
|
private:
|
|
|
|
void initLayout( bool headersOnly, bool absoluteDates );
|
|
|
|
|
|
|
|
KMSearchPattern *mPattern;
|
|
|
|
TQRadioButton *mAllRBtn, *mAnyRBtn;
|
|
|
|
KMSearchRuleWidgetLister *mRuleLister;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|