• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

mailcommon

  • sources
  • kde-4.14
  • kdepim
  • mailcommon
  • search
  • widgethandler
tagrulewidgethandler.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2013-2015 Montel Laurent <montel@kde.org>
3 
4  This program is free software; you can redistribute it and/or modify it
5  under the terms of the GNU General Public License, version 2, as
6  published by the Free Software Foundation.
7 
8  This program is distributed in the hope that it will be useful, but
9  WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11  General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License along
14  with this program; if not, write to the Free Software Foundation, Inc.,
15  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16 */
17 
18 #include "tagrulewidgethandler.h"
19 #include "search/searchpattern.h"
20 #include "widgets/regexplineedit.h"
21 using MailCommon::RegExpLineEdit;
22 
23 #include <pimcommon/widgets/minimumcombobox.h>
24 
25 #include <KDebug>
26 #include <KIcon>
27 #include <KLocale>
28 #include <KJob>
29 
30 #include <Akonadi/Tag>
31 #include <Akonadi/TagFetchJob>
32 #include <Akonadi/TagFetchScope>
33 #include <Akonadi/TagAttribute>
34 
35 #include <QLineEdit>
36 #include <QStackedWidget>
37 
38 using namespace MailCommon;
39 
40 class FillTagComboJob : public KJob
41 {
42  Q_OBJECT
43 public:
44  explicit FillTagComboJob(KComboBox *combo, QObject* parent = 0);
45  virtual void start();
46 private Q_SLOTS:
47  void onDestroyed();
48  void onTagsFetched(KJob*);
49 
50 private:
51  KComboBox *mComboBox;
52 };
53 
54 FillTagComboJob::FillTagComboJob(KComboBox* combo, QObject* parent)
55  :KJob(parent),
56  mComboBox(combo)
57 {
58  connect(combo, SIGNAL(destroyed(QObject*)), this, SLOT(onDestroyed()));
59 }
60 
61 void FillTagComboJob::onDestroyed()
62 {
63  mComboBox = 0;
64  setError(KJob::UserDefinedError);
65  kDebug() << "Combobox destroyed";
66  emitResult();
67 }
68 
69 void FillTagComboJob::start()
70 {
71  Akonadi::TagFetchJob *fetchJob = new Akonadi::TagFetchJob(this);
72  fetchJob->fetchScope().fetchAttribute<Akonadi::TagAttribute>();
73  connect(fetchJob, SIGNAL(result(KJob*)), this, SLOT(onTagsFetched(KJob*)));
74 }
75 
76 void FillTagComboJob::onTagsFetched(KJob *job)
77 {
78  if (job->error()) {
79  kWarning() << job->errorString();
80  setError(KJob::UserDefinedError);
81  emitResult();
82  }
83  if (!mComboBox) {
84  kDebug() << "combobox already destroyed";
85  emitResult();
86  return;
87  }
88  Akonadi::TagFetchJob *fetchJob = static_cast<Akonadi::TagFetchJob*>(job);
89  foreach ( const Akonadi::Tag &tag, fetchJob->tags() ) {
90  QString iconName = QLatin1String("mail-tagged");
91  Akonadi::TagAttribute *attr = tag.attribute<Akonadi::TagAttribute>();
92  if (attr) {
93  if (!attr->iconName().isEmpty()) {
94  iconName = attr->iconName();
95  }
96  }
97  mComboBox->addItem( KIcon( iconName ), tag.name(), tag.url().url() );
98  }
99  emitResult();
100 }
101 
102 
103 static const struct {
104  SearchRule::Function id;
105  const char *displayName;
106 } TagFunctions[] = {
107  { SearchRule::FuncContains, I18N_NOOP( "contains" ) },
108  { SearchRule::FuncContainsNot, I18N_NOOP( "does not contain" ) },
109  { SearchRule::FuncEquals, I18N_NOOP( "equals" ) },
110  { SearchRule::FuncNotEqual, I18N_NOOP( "does not equal" ) },
111  { SearchRule::FuncRegExp, I18N_NOOP( "matches regular expr." ) },
112  { SearchRule::FuncNotRegExp, I18N_NOOP( "does not match reg. expr." ) }
113 };
114 static const int TagFunctionCount =
115  sizeof( TagFunctions ) / sizeof( *TagFunctions );
116 
117 //---------------------------------------------------------------------------
118 
119 QWidget *TagRuleWidgetHandler::createFunctionWidget(
120  int number, QStackedWidget *functionStack, const QObject *receiver, bool isBalooSearch ) const
121 {
122  if ( number != 0 ) {
123  return 0;
124  }
125 
126  PimCommon::MinimumComboBox *funcCombo = new PimCommon::MinimumComboBox( functionStack );
127  funcCombo->setObjectName( QLatin1String("tagRuleFuncCombo") );
128  for ( int i = 0; i < TagFunctionCount; ++i ) {
129  if (isBalooSearch) {
130  if (TagFunctions[i].id == SearchRule::FuncContains || TagFunctions[i].id == SearchRule::FuncContainsNot) {
131  funcCombo->addItem( i18n( TagFunctions[i].displayName ) );
132  }
133  } else {
134  funcCombo->addItem( i18n( TagFunctions[i].displayName ) );
135  }
136  }
137  funcCombo->adjustSize();
138  QObject::connect( funcCombo, SIGNAL(activated(int)),
139  receiver, SLOT(slotFunctionChanged()) );
140  return funcCombo;
141 }
142 
143 //---------------------------------------------------------------------------
144 
145 QWidget *TagRuleWidgetHandler::createValueWidget( int number,
146  QStackedWidget *valueStack,
147  const QObject *receiver ) const
148 {
149  if ( number == 0 ) {
150  RegExpLineEdit *lineEdit = new RegExpLineEdit( valueStack );
151  lineEdit->setObjectName( QLatin1String("tagRuleRegExpLineEdit") );
152  QObject::connect( lineEdit, SIGNAL(textChanged(QString)),
153  receiver, SLOT(slotValueChanged()) );
154  QObject::connect( lineEdit, SIGNAL(returnPressed()),
155  receiver, SLOT(slotReturnPressed()) );
156  return lineEdit;
157  }
158 
159  if ( number == 1 ) {
160  PimCommon::MinimumComboBox *valueCombo = new PimCommon::MinimumComboBox( valueStack );
161  valueCombo->setObjectName( QLatin1String("tagRuleValueCombo") );
162  valueCombo->setEditable( true );
163  valueCombo->addItem( QString() ); // empty entry for user input
164 
165  FillTagComboJob *job = new FillTagComboJob( valueCombo );
166  job->start();
167 
168  valueCombo->adjustSize();
169  QObject::connect( valueCombo, SIGNAL(activated(int)),
170  receiver, SLOT(slotValueChanged()) );
171  return valueCombo;
172  }
173 
174  return 0;
175 }
176 
177 //---------------------------------------------------------------------------
178 
179 SearchRule::Function TagRuleWidgetHandler::function( const QByteArray &field,
180  const QStackedWidget *functionStack ) const
181 {
182  if ( !handlesField( field ) ) {
183  return SearchRule::FuncNone;
184  }
185 
186  const PimCommon::MinimumComboBox *funcCombo =
187  functionStack->findChild<PimCommon::MinimumComboBox*>( QLatin1String("tagRuleFuncCombo") );
188 
189  if ( funcCombo && funcCombo->currentIndex() >= 0 ) {
190  return TagFunctions[funcCombo->currentIndex()].id;
191  }
192  return SearchRule::FuncNone;
193 }
194 
195 //---------------------------------------------------------------------------
196 
197 QString TagRuleWidgetHandler::value( const QByteArray &field,
198  const QStackedWidget *functionStack,
199  const QStackedWidget *valueStack ) const
200 {
201  if ( !handlesField( field ) ) {
202  return QString();
203  }
204 
205  SearchRule::Function func = function( field, functionStack );
206  if ( func == SearchRule::FuncRegExp || func == SearchRule::FuncNotRegExp ) {
207  // Use regexp line edit
208  const RegExpLineEdit *lineEdit =
209  valueStack->findChild<RegExpLineEdit*>( QLatin1String("tagRuleRegExpLineEdit") );
210 
211  if ( lineEdit ) {
212  return lineEdit->text();
213  } else {
214  return QString();
215  }
216  }
217 
218  // Use combo box
219  const PimCommon::MinimumComboBox *tagCombo =
220  valueStack->findChild<PimCommon::MinimumComboBox*>( QLatin1String("tagRuleValueCombo") );
221 
222  if ( tagCombo ) {
223  return tagCombo->itemData(tagCombo->currentIndex()).toString();
224  } else {
225  return QString();
226  }
227 }
228 
229 //---------------------------------------------------------------------------
230 
231 QString TagRuleWidgetHandler::prettyValue( const QByteArray &field,
232  const QStackedWidget *funcStack,
233  const QStackedWidget *valueStack ) const
234 {
235  return value( field, funcStack, valueStack );
236 }
237 
238 //---------------------------------------------------------------------------
239 
240 bool TagRuleWidgetHandler::handlesField( const QByteArray &field ) const
241 {
242  return ( field == "<tag>" );
243 }
244 
245 //---------------------------------------------------------------------------
246 
247 void TagRuleWidgetHandler::reset( QStackedWidget *functionStack,
248  QStackedWidget *valueStack ) const
249 {
250  // reset the function combo box
251  PimCommon::MinimumComboBox *funcCombo =
252  functionStack->findChild<PimCommon::MinimumComboBox*>( QLatin1String("tagRuleFuncCombo") );
253 
254  if ( funcCombo ) {
255  funcCombo->blockSignals( true );
256  funcCombo->setCurrentIndex( 0 );
257  funcCombo->blockSignals( false );
258  }
259 
260  // reset the status value combo box and reg exp line edit
261  RegExpLineEdit *lineEdit =
262  valueStack->findChild<RegExpLineEdit*>( QLatin1String("tagRuleRegExpLineEdit") );
263 
264  if ( lineEdit ) {
265  lineEdit->blockSignals( true );
266  lineEdit->clear();
267  lineEdit->blockSignals( false );
268  lineEdit->showEditButton( false );
269  valueStack->setCurrentWidget( lineEdit );
270  }
271 
272  PimCommon::MinimumComboBox *tagCombo = valueStack->findChild<PimCommon::MinimumComboBox*>( QLatin1String("tagRuleValueCombo") );
273  if ( tagCombo ) {
274  tagCombo->blockSignals( true );
275  tagCombo->setCurrentIndex( 0 );
276  tagCombo->blockSignals( false );
277  }
278 }
279 
280 //---------------------------------------------------------------------------
281 
282 bool TagRuleWidgetHandler::setRule( QStackedWidget *functionStack,
283  QStackedWidget *valueStack,
284  const SearchRule::Ptr rule, bool isBalooSearch ) const
285 {
286  if ( !rule || !handlesField( rule->field() ) ) {
287  reset( functionStack, valueStack );
288  return false;
289  }
290 
291  // set the function
292  const SearchRule::Function func = rule->function();
293 
294  if (isBalooSearch ) {
295  if(func != SearchRule::FuncContains && func != SearchRule::FuncContainsNot) {
296  reset( functionStack, valueStack );
297  return false;
298  }
299  }
300 
301  int funcIndex = 0;
302  for ( ; funcIndex < TagFunctionCount; ++funcIndex ) {
303  if ( func == TagFunctions[funcIndex].id ) {
304  break;
305  }
306  }
307 
308  PimCommon::MinimumComboBox *funcCombo =
309  functionStack->findChild<PimCommon::MinimumComboBox*>( QLatin1String("tagRuleFuncCombo") );
310 
311  if ( funcCombo ) {
312  funcCombo->blockSignals( true );
313  if ( funcIndex < TagFunctionCount ) {
314  funcCombo->setCurrentIndex( funcIndex );
315  } else {
316  funcCombo->setCurrentIndex( 0 );
317  }
318  funcCombo->blockSignals( false );
319  functionStack->setCurrentWidget( funcCombo );
320  }
321 
322  // set the value
323  if ( func == SearchRule::FuncRegExp || func == SearchRule::FuncNotRegExp ) {
324  // set reg exp value
325  RegExpLineEdit *lineEdit = valueStack->findChild<RegExpLineEdit*>( QLatin1String("tagRuleRegExpLineEdit") );
326 
327  if ( lineEdit ) {
328  lineEdit->blockSignals( true );
329  lineEdit->setText( rule->contents() );
330  lineEdit->blockSignals( false );
331  lineEdit->showEditButton( true );
332  valueStack->setCurrentWidget( lineEdit );
333  }
334  } else {
335  // set combo box value
336  PimCommon::MinimumComboBox *tagCombo =
337  valueStack->findChild<PimCommon::MinimumComboBox*>( QLatin1String("tagRuleValueCombo") );
338 
339  if ( tagCombo ) {
340  tagCombo->blockSignals( true );
341  bool found = false;
342  // Existing tags numbered from 1
343  for (int i = 1; i < tagCombo->count(); i++) {
344  if (rule->contents() == tagCombo->itemData(i).toString()) {
345  tagCombo->setCurrentIndex(i);
346  found = true;
347  break;
348  }
349  }
350  if (!found) {
351  tagCombo->setCurrentIndex( 0 );
352  // Still show tag if it was deleted from MsgTagMgr
353  QLineEdit *lineEdit = tagCombo->lineEdit(); // krazy:exclude=qclasses
354  Q_ASSERT( lineEdit );
355  lineEdit->setText( rule->contents() );
356  }
357 
358  tagCombo->blockSignals( false );
359  valueStack->setCurrentWidget( tagCombo );
360  }
361  }
362  return true;
363 }
364 
365 //---------------------------------------------------------------------------
366 
367 bool TagRuleWidgetHandler::update( const QByteArray &field,
368  QStackedWidget *functionStack,
369  QStackedWidget *valueStack ) const
370 {
371  if ( !handlesField( field ) ) {
372  return false;
373  }
374 
375  // raise the correct function widget
376  functionStack->setCurrentWidget( functionStack->findChild<QWidget*>( QLatin1String("tagRuleFuncCombo") ) );
377 
378  // raise the correct value widget
379  SearchRule::Function func = function( field, functionStack );
380  if ( func == SearchRule::FuncRegExp || func == SearchRule::FuncNotRegExp ) {
381  valueStack->setCurrentWidget( valueStack->findChild<QWidget*>( QLatin1String("tagRuleRegExpLineEdit" )) );
382  } else {
383  valueStack->setCurrentWidget( valueStack->findChild<QWidget*>( QLatin1String("tagRuleValueCombo") ) );
384  }
385 
386  return true;
387 }
388 
389 #include "tagrulewidgethandler.moc"
390 
QWidget
MailCommon::TagRuleWidgetHandler::prettyValue
QString prettyValue(const QByteArray &field, const QStackedWidget *functionStack, const QStackedWidget *valueStack) const
Definition: tagrulewidgethandler.cpp:231
QByteArray
QLineEdit::setText
void setText(const QString &)
id
SearchRule::Function id
Definition: tagrulewidgethandler.cpp:104
MailCommon::SearchRule::FuncContainsNot
Definition: searchrule.h:58
MailCommon::RegExpLineEdit::setText
void setText(const QString &)
Definition: regexplineedit.cpp:102
MailCommon::RegExpLineEdit
Definition: regexplineedit.h:46
MailCommon::TagRuleWidgetHandler::reset
void reset(QStackedWidget *functionStack, QStackedWidget *valueStack) const
Definition: tagrulewidgethandler.cpp:247
displayName
const char * displayName
Definition: tagrulewidgethandler.cpp:105
MailCommon::TagRuleWidgetHandler::value
QString value(const QByteArray &field, const QStackedWidget *functionStack, const QStackedWidget *valueStack) const
Definition: tagrulewidgethandler.cpp:197
MailCommon::RegExpLineEdit::clear
void clear()
Definition: regexplineedit.cpp:92
MailCommon::SearchRule::Ptr
boost::shared_ptr< SearchRule > Ptr
Defines a pointer to a search rule.
Definition: searchrule.h:44
MailCommon::TagRuleWidgetHandler::handlesField
bool handlesField(const QByteArray &field) const
Definition: tagrulewidgethandler.cpp:240
MailCommon::SearchRule::FuncNotRegExp
Definition: searchrule.h:62
MailCommon::SearchRule::Function
Function
Describes operators for comparison of field and contents.
Definition: searchrule.h:55
MailCommon::SearchRule::FuncNotEqual
Definition: searchrule.h:60
MailCommon::TagRuleWidgetHandler::function
SearchRule::Function function(const QByteArray &field, const QStackedWidget *functionStack) const
Definition: tagrulewidgethandler.cpp:179
QStackedWidget::setCurrentWidget
void setCurrentWidget(QWidget *widget)
MailCommon::TagRuleWidgetHandler::update
bool update(const QByteArray &field, QStackedWidget *functionStack, QStackedWidget *valueStack) const
Definition: tagrulewidgethandler.cpp:367
QObject
QObject::setObjectName
void setObjectName(const QString &name)
MailCommon::SearchRule::FuncNone
Definition: searchrule.h:56
QStackedWidget
QString
MailCommon::TagRuleWidgetHandler::setRule
bool setRule(QStackedWidget *functionStack, QStackedWidget *valueStack, const SearchRule::Ptr rule, bool isBalooSearch) const
Definition: tagrulewidgethandler.cpp:282
MailCommon::SearchRule::FuncRegExp
Definition: searchrule.h:61
searchpattern.h
QObject::blockSignals
bool blockSignals(bool block)
regexplineedit.h
MailCommon::SearchRule::FuncContains
Definition: searchrule.h:57
TagFunctions
static const struct @9 TagFunctions[]
tagrulewidgethandler.h
QLatin1String
I18N_NOOP
#define I18N_NOOP(t)
Definition: searchpatternedit.cpp:46
QLineEdit
MailCommon::RegExpLineEdit::showEditButton
void showEditButton(bool)
Definition: regexplineedit.cpp:107
MailCommon::TagRuleWidgetHandler::createValueWidget
QWidget * createValueWidget(int number, QStackedWidget *valueStack, const QObject *receiver) const
Definition: tagrulewidgethandler.cpp:145
MailCommon::TagRuleWidgetHandler::createFunctionWidget
QWidget * createFunctionWidget(int number, QStackedWidget *functionStack, const QObject *receiver, bool isBalooSearch) const
Definition: tagrulewidgethandler.cpp:119
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
MailCommon::SearchRule::FuncEquals
Definition: searchrule.h:59
TagFunctionCount
static const int TagFunctionCount
Definition: tagrulewidgethandler.cpp:114
MailCommon::RegExpLineEdit::text
QString text() const
Definition: regexplineedit.cpp:97
QObject::findChild
T findChild(const QString &name) const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:31:41 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

mailcommon

Skip menu "mailcommon"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer
  • pimprint

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal