1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
|
// -*- 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* parent=0, KMSearchRule* aRule=0, const char* name=0, bool headersOnly = false, bool absoluteDates = false );
enum { Message, Body, AnyHeader, Recipients, Size, AgeInDays, Status,
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 *parent=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 *parent );
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 parent and name parameters are passed to the underlying
TQGroupBox, as usual. */
KMSearchPatternEdit(TQWidget *parent=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 *parent=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
|