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

messagelist

  • sources
  • kde-4.12
  • kdepim
  • messagelist
  • utils
configureaggregationsdialog.cpp
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * Copyright 2008 Szymon Tomasz Stefanek <pragma@kvirc.net>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  *
19  *******************************************************************************/
20 
21 #include "utils/configureaggregationsdialog.h"
22 #include "utils/configureaggregationsdialog_p.h"
23 
24 #include "utils/aggregationeditor.h"
25 #include "core/aggregation.h"
26 
27 #include "core/manager.h"
28 
29 #include <QGridLayout>
30 #include <QPushButton>
31 #include <QFrame>
32 #include <QHash>
33 
34 #include <KLocale>
35 #include <KIconLoader>
36 #include <KMessageBox>
37 #include <KFileDialog>
38 
39 namespace MessageList
40 {
41 
42 namespace Utils
43 {
44 
45 class AggregationListWidgetItem : public QListWidgetItem
46 {
47 private:
48  Core::Aggregation * mAggregation;
49 
50 public:
51  AggregationListWidgetItem( QListWidget * par, const Core::Aggregation &set )
52  : QListWidgetItem( set.name(), par )
53  {
54  mAggregation = new Core::Aggregation( set );
55  }
56  ~AggregationListWidgetItem()
57  {
58  delete mAggregation;
59  }
60 
61 public:
62  Core::Aggregation * aggregation() const
63  { return mAggregation; }
64  void forgetAggregation()
65  { mAggregation = 0; }
66 };
67 
73 class AggregationListWidget : public QListWidget
74 {
75 public:
76  AggregationListWidget( QWidget * parent )
77  : QListWidget( parent )
78  {
79  }
80 public:
81 
82  // need a larger but shorter QListWidget
83  QSize sizeHint() const
84  { return QSize( 450, 128 ); }
85 };
86 
87 } // namespace Utils
88 
89 } // namespace MessageList
90 
91 using namespace MessageList::Core;
92 using namespace MessageList::Utils;
93 
94 ConfigureAggregationsDialog::ConfigureAggregationsDialog( QWidget *parent )
95  : KDialog( parent ), d( new Private( this ) )
96 {
97  setAttribute( Qt::WA_DeleteOnClose );
98  setWindowModality( Qt::ApplicationModal ); // FIXME: Sure ?
99  setButtons( Ok | Cancel );
100  setWindowTitle( i18n( "Customize Message Aggregation Modes" ) );
101 
102  QWidget * base = new QWidget( this );
103  setMainWidget( base );
104 
105  QGridLayout * g = new QGridLayout( base );
106 
107  d->mAggregationList = new AggregationListWidget( base );
108  d->mAggregationList->setSelectionMode(QAbstractItemView::ExtendedSelection);
109  d->mAggregationList->setSortingEnabled( true );
110  g->addWidget( d->mAggregationList, 0, 0, 7, 1 );
111 
112  connect( d->mAggregationList, SIGNAL(itemClicked(QListWidgetItem*)),
113  SLOT(aggregationListItemClicked(QListWidgetItem*)));
114 
115  d->mNewAggregationButton = new QPushButton( i18n( "New Aggregation" ), base );
116  d->mNewAggregationButton->setIcon( KIcon( QLatin1String( "document-new" ) ) );
117  d->mNewAggregationButton->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) );
118  g->addWidget( d->mNewAggregationButton, 0, 1 );
119 
120  connect( d->mNewAggregationButton, SIGNAL(clicked()),
121  SLOT(newAggregationButtonClicked()) );
122 
123  d->mCloneAggregationButton = new QPushButton( i18n( "Clone Aggregation" ), base );
124  d->mCloneAggregationButton->setIcon( KIcon( QLatin1String( "edit-copy" ) ) );
125  d->mCloneAggregationButton->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) );
126  g->addWidget( d->mCloneAggregationButton, 1, 1 );
127 
128  connect( d->mCloneAggregationButton, SIGNAL(clicked()),
129  SLOT(cloneAggregationButtonClicked()) );
130 
131  QFrame * f = new QFrame( base );
132  f->setFrameStyle( QFrame::Sunken | QFrame::HLine );
133  f->setMinimumHeight( 24 );
134  g->addWidget( f, 2, 1, Qt::AlignVCenter );
135 
136  d->mExportAggregationButton = new QPushButton( i18n( "Export Aggregation..." ), base );
137  g->addWidget( d->mExportAggregationButton, 3, 1 );
138 
139  connect( d->mExportAggregationButton, SIGNAL(clicked()),
140  SLOT(exportAggregationButtonClicked()) );
141 
142  d->mImportAggregationButton = new QPushButton( i18n( "Import Aggregation..." ), base );
143  g->addWidget( d->mImportAggregationButton, 4, 1 );
144  connect( d->mImportAggregationButton, SIGNAL(clicked()),
145  SLOT(importAggregationButtonClicked()) );
146 
147 
148  f = new QFrame( base );
149  f->setFrameStyle( QFrame::Sunken | QFrame::HLine );
150  f->setMinimumHeight( 24 );
151  g->addWidget( f, 5, 1, Qt::AlignVCenter );
152 
153 
154  d->mDeleteAggregationButton = new QPushButton( i18n( "Delete Aggregation" ), base );
155  d->mDeleteAggregationButton->setIcon( KIcon( QLatin1String( "edit-delete" ) ) );
156  d->mDeleteAggregationButton->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) );
157  g->addWidget( d->mDeleteAggregationButton, 6, 1 );
158 
159  connect( d->mDeleteAggregationButton, SIGNAL(clicked()),
160  SLOT(deleteAggregationButtonClicked()) );
161 
162  d->mEditor = new AggregationEditor( base );
163  g->addWidget( d->mEditor, 8, 0, 1, 2 );
164 
165  connect( d->mEditor, SIGNAL(aggregationNameChanged()),
166  SLOT(editedAggregationNameChanged()) );
167 
168  g->setColumnStretch( 0, 1 );
169  g->setRowStretch( 7, 1 );
170 
171  connect( this, SIGNAL(okClicked()),
172  SLOT(okButtonClicked()) );
173 
174  d->fillAggregationList();
175 }
176 
177 ConfigureAggregationsDialog::~ConfigureAggregationsDialog()
178 {
179  delete d;
180 }
181 
182 void ConfigureAggregationsDialog::selectAggregation( const QString &aggregationId )
183 {
184  AggregationListWidgetItem *item = d->findAggregationItemById( aggregationId );
185  if ( item ) {
186  d->mAggregationList->setCurrentItem( item );
187  d->aggregationListItemClicked(item);
188  }
189 }
190 
191 void ConfigureAggregationsDialog::Private::okButtonClicked()
192 {
193  commitEditor();
194 
195  Manager::instance()->removeAllAggregations();
196 
197  const int c = mAggregationList->count();
198  int i = 0;
199  while ( i < c )
200  {
201  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( mAggregationList->item( i ) );
202  if ( item )
203  {
204  Manager::instance()->addAggregation( item->aggregation() );
205  item->forgetAggregation();
206  }
207  ++i;
208  }
209 
210  Manager::instance()->aggregationsConfigurationCompleted();
211 
212  q->close(); // this will delete too
213 }
214 
215 void ConfigureAggregationsDialog::Private::commitEditor()
216 {
217  Aggregation * editedAggregation = mEditor->editedAggregation();
218  if ( !editedAggregation )
219  return;
220 
221  mEditor->commit();
222 
223  AggregationListWidgetItem * editedItem = findAggregationItemByAggregation( editedAggregation );
224  if ( !editedItem )
225  return;
226  const QString goodName = uniqueNameForAggregation( editedAggregation->name(), editedAggregation );
227  editedAggregation->setName( goodName );
228  editedItem->setText( goodName );
229 }
230 
231 void ConfigureAggregationsDialog::Private::editedAggregationNameChanged()
232 {
233  Aggregation * set = mEditor->editedAggregation();
234  if ( !set )
235  return;
236 
237  AggregationListWidgetItem * it = findAggregationItemByAggregation( set );
238  if ( !it )
239  return;
240 
241  const QString goodName = uniqueNameForAggregation( set->name(), set );
242 
243  it->setText( goodName );
244 }
245 
246 void ConfigureAggregationsDialog::Private::fillAggregationList()
247 {
248  const QHash< QString, Aggregation * > & sets = Manager::instance()->aggregations();
249  QHash< QString, Aggregation * >::ConstIterator end( sets.constEnd() );
250  for( QHash< QString, Aggregation * >::ConstIterator it = sets.constBegin(); it != end; ++it )
251  (void)new AggregationListWidgetItem( mAggregationList, *( *it ) );
252 }
253 
254 void ConfigureAggregationsDialog::Private::aggregationListItemClicked(QListWidgetItem* cur)
255 {
256  commitEditor();
257  updateButton(cur);
258 }
259 
260 void ConfigureAggregationsDialog::Private::updateButton(QListWidgetItem* cur)
261 {
262  const int numberOfSelectedItem(mAggregationList->selectedItems().count());
263 
264  AggregationListWidgetItem * item = cur ? dynamic_cast< AggregationListWidgetItem * >( cur ) : 0;
265  mDeleteAggregationButton->setEnabled( item && !item->aggregation()->readOnly() && ( mAggregationList->count() > 1 ) );
266 
267  mCloneAggregationButton->setEnabled( numberOfSelectedItem == 1 );
268  mExportAggregationButton->setEnabled( numberOfSelectedItem > 0 );
269  mEditor->editAggregation( item ? item->aggregation() : 0 );
270  if ( item && !item->isSelected() )
271  item->setSelected( true ); // make sure it's true
272 }
273 
274 AggregationListWidgetItem * ConfigureAggregationsDialog::Private::findAggregationItemByName( const QString &name, Aggregation * skipAggregation )
275 {
276  const int c = mAggregationList->count();
277  int i = 0;
278  while ( i < c )
279  {
280  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( mAggregationList->item( i ) );
281  if ( item )
282  {
283  if ( item->aggregation() != skipAggregation )
284  {
285  if ( item->aggregation()->name() == name )
286  return item;
287  }
288  }
289  ++i;
290  }
291  return 0;
292 }
293 
294 AggregationListWidgetItem * ConfigureAggregationsDialog::Private::findAggregationItemById( const QString &aggregationId )
295 {
296  const int c = mAggregationList->count();
297  int i = 0;
298  while ( i < c )
299  {
300  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( mAggregationList->item( i ) );
301  if ( item )
302  {
303  if ( item->aggregation()->id() == aggregationId )
304  return item;
305  }
306  ++i;
307  }
308  return 0;
309 }
310 
311 AggregationListWidgetItem * ConfigureAggregationsDialog::Private::findAggregationItemByAggregation( Aggregation * set )
312 {
313  const int c = mAggregationList->count();
314  int i = 0;
315  while ( i < c )
316  {
317  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( mAggregationList->item( i ) );
318  if ( item )
319  {
320  if ( item->aggregation() == set )
321  return item;
322  }
323  ++i;
324  }
325  return 0;
326 }
327 
328 
329 QString ConfigureAggregationsDialog::Private::uniqueNameForAggregation( const QString& baseName, Aggregation * skipAggregation )
330 {
331  QString ret = baseName;
332  if( ret.isEmpty() )
333  ret = i18n( "Unnamed Aggregation" );
334 
335  int idx = 1;
336 
337  AggregationListWidgetItem * item = findAggregationItemByName( ret, skipAggregation );
338  while ( item )
339  {
340  idx++;
341  ret = QString::fromLatin1( "%1 %2" ).arg( baseName ).arg( idx );
342  item = findAggregationItemByName( ret, skipAggregation );
343  }
344  return ret;
345 }
346 
347 void ConfigureAggregationsDialog::Private::newAggregationButtonClicked()
348 {
349  Aggregation emptyAggregation;
350  emptyAggregation.setName( uniqueNameForAggregation( i18n( "New Aggregation" ) ) );
351  AggregationListWidgetItem * item = new AggregationListWidgetItem( mAggregationList, emptyAggregation );
352 
353  mAggregationList->setCurrentItem( item );
354  mDeleteAggregationButton->setEnabled( item && !item->aggregation()->readOnly() );
355 }
356 
357 void ConfigureAggregationsDialog::Private::cloneAggregationButtonClicked()
358 {
359  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( mAggregationList->currentItem() );
360  if ( !item )
361  return;
362  commitEditor();
363  item->setSelected(false);
364  Aggregation copyAggregation( *( item->aggregation() ) );
365  copyAggregation.setReadOnly( false );
366  copyAggregation.generateUniqueId(); // regenerate id so it becomes different
367  copyAggregation.setName( uniqueNameForAggregation( item->aggregation()->name() ) );
368  item = new AggregationListWidgetItem( mAggregationList, copyAggregation );
369 
370  mAggregationList->setCurrentItem( item );
371  aggregationListItemClicked( item );
372 }
373 
374 void ConfigureAggregationsDialog::Private::deleteAggregationButtonClicked()
375 {
376  QList<QListWidgetItem *> list = mAggregationList->selectedItems();
377  if(list.isEmpty()) {
378  return;
379  }
380 
381  mEditor->editAggregation( 0 ); // forget it
382  Q_FOREACH(QListWidgetItem * it, list) {
383  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( it );
384  if ( !item )
385  return;
386  if(!item->aggregation()->readOnly()) {
387  delete item; // this will trigger aggregationListCurrentItemChanged()
388  }
389  if ( mAggregationList->count() < 2 )
390  break; // no way: desperately try to keep at least one option set alive :)
391  }
392 
393  AggregationListWidgetItem *newItem = dynamic_cast< AggregationListWidgetItem * >(mAggregationList->currentItem());
394  updateButton(newItem);
395 }
396 
397 void ConfigureAggregationsDialog::Private::importAggregationButtonClicked()
398 {
399  const QString filename = KFileDialog::getOpenFileName(QString(),QString::fromLatin1("*"),q,i18n("Import Aggregation"));
400  if(!filename.isEmpty()) {
401  KConfig config(filename);
402 
403  if(config.hasGroup(QLatin1String("MessageListView::Aggregations"))) {
404  KConfigGroup grp( &config, QLatin1String("MessageListView::Aggregations") );
405  const int cnt = grp.readEntry("Count",0);
406  int idx = 0;
407  while ( idx < cnt )
408  {
409  const QString data = grp.readEntry( QString::fromLatin1( "Set%1" ).arg( idx ), QString() );
410  if ( !data.isEmpty() )
411  {
412  Aggregation * set = new Aggregation();
413  if ( set->loadFromString( data ) )
414  {
415  set->setReadOnly( false );
416  set->generateUniqueId(); // regenerate id so it becomes different
417  set->setName( uniqueNameForAggregation( set->name() ) );
418  (void)new AggregationListWidgetItem( mAggregationList, *set );
419  } else {
420  delete set; // b0rken
421  }
422  }
423  ++idx;
424  }
425  }
426  }
427 }
428 
429 void ConfigureAggregationsDialog::Private::exportAggregationButtonClicked()
430 {
431  QList<QListWidgetItem *> list = mAggregationList->selectedItems();
432  if(list.isEmpty()) {
433  return;
434  }
435  const QString filename = KFileDialog::getSaveFileName(QString(),QString::fromLatin1("*"),q,i18n("Export Aggregation"));
436  if(!filename.isEmpty()) {
437  KConfig config(filename);
438 
439  KConfigGroup grp( &config, QLatin1String("MessageListView::Aggregations") );
440  grp.writeEntry( "Count", list.count() );
441 
442  int idx = 0;
443  Q_FOREACH(QListWidgetItem *item, list) {
444  AggregationListWidgetItem * themeItem = static_cast< AggregationListWidgetItem * >( item );
445  grp.writeEntry( QString::fromLatin1( "Set%1" ).arg( idx ), themeItem->aggregation()->saveToString() );
446  ++idx;
447  }
448  }
449 }
450 
451 
452 #include "configureaggregationsdialog.moc"
MessageList::Core::Aggregation
A set of aggregation options that can be applied to the MessageList::Model in a single shot...
Definition: aggregation.h:43
MessageList::Utils::AggregationEditor
A widget that allows editing a single MessageList::Aggregation.
Definition: aggregationeditor.h:46
MessageList::Utils::ConfigureAggregationsDialog::Private::findAggregationItemById
AggregationListWidgetItem * findAggregationItemById(const QString &aggregationId)
Definition: configureaggregationsdialog.cpp:294
MessageList::Utils::ConfigureAggregationsDialog::Private::uniqueNameForAggregation
QString uniqueNameForAggregation(const QString &baseName, Core::Aggregation *skipAggregation=0)
Definition: configureaggregationsdialog.cpp:329
MessageList::Utils::ConfigureAggregationsDialog::Private::q
ConfigureAggregationsDialog *const q
Definition: configureaggregationsdialog_p.h:76
QWidget
MessageList::Utils::ConfigureAggregationsDialog::Private::cloneAggregationButtonClicked
void cloneAggregationButtonClicked()
Definition: configureaggregationsdialog.cpp:357
MessageList::Utils::ConfigureAggregationsDialog::Private::newAggregationButtonClicked
void newAggregationButtonClicked()
Definition: configureaggregationsdialog.cpp:347
KDialog
MessageList::Core::OptionSet::setReadOnly
void setReadOnly(bool b)
Definition: optionset.h:119
MessageList::Utils::ConfigureAggregationsDialog::Private::commitEditor
void commitEditor()
Definition: configureaggregationsdialog.cpp:215
MessageList::Core::OptionSet::name
const QString & name() const
Returns the name of this OptionSet.
Definition: optionset.h:72
MessageList::Utils::ConfigureAggregationsDialog::Private::mImportAggregationButton
QPushButton * mImportAggregationButton
Definition: configureaggregationsdialog_p.h:84
MessageList::Utils::ConfigureAggregationsDialog::Private::findAggregationItemByName
AggregationListWidgetItem * findAggregationItemByName(const QString &name, Core::Aggregation *skipAggregation=0)
Definition: configureaggregationsdialog.cpp:274
MessageList::Utils::ConfigureAggregationsDialog::Private::deleteAggregationButtonClicked
void deleteAggregationButtonClicked()
Definition: configureaggregationsdialog.cpp:374
MessageList::Utils::ConfigureAggregationsDialog::Private::okButtonClicked
void okButtonClicked()
Definition: configureaggregationsdialog.cpp:191
MessageList::Utils::ConfigureAggregationsDialog::Private::mCloneAggregationButton
QPushButton * mCloneAggregationButton
Definition: configureaggregationsdialog_p.h:81
MessageList::Core::OptionSet::generateUniqueId
void generateUniqueId()
(Re)generates a (hopefully) unique identifier for this option set.
Definition: optionset.cpp:57
MessageList::Utils::ConfigureAggregationsDialog::Private::exportAggregationButtonClicked
void exportAggregationButtonClicked()
Definition: configureaggregationsdialog.cpp:429
aggregation.h
MessageList::Core::OptionSet::loadFromString
bool loadFromString(const QString &data)
Attempts to unpack this configuration object from a string (that is likely to come out from a config ...
Definition: optionset.cpp:86
MessageList::Utils::ConfigureAggregationsDialog::selectAggregation
void selectAggregation(const QString &aggregationId)
Definition: configureaggregationsdialog.cpp:182
manager.h
aggregationeditor.h
MessageList::Utils::ConfigureAggregationsDialog::Private::editedAggregationNameChanged
void editedAggregationNameChanged()
Definition: configureaggregationsdialog.cpp:231
MessageList::Utils::ConfigureAggregationsDialog::Private::fillAggregationList
void fillAggregationList()
Definition: configureaggregationsdialog.cpp:246
MessageList::Core::OptionSet::setName
void setName(const QString &name)
Sets the name of this OptionSet.
Definition: optionset.h:80
MessageList::Utils::ConfigureAggregationsDialog::Private::mDeleteAggregationButton
QPushButton * mDeleteAggregationButton
Definition: configureaggregationsdialog_p.h:82
MessageList::Utils::ConfigureAggregationsDialog::Private
The dialog used for configuring MessageList::Aggregation sets.
Definition: configureaggregationsdialog_p.h:49
MessageList::Utils::ConfigureAggregationsDialog::Private::updateButton
void updateButton(QListWidgetItem *cur)
Definition: configureaggregationsdialog.cpp:260
configureaggregationsdialog_p.h
MessageList::Utils::ConfigureAggregationsDialog::Private::mEditor
AggregationEditor * mEditor
Definition: configureaggregationsdialog_p.h:79
configureaggregationsdialog.h
MessageList::Utils::ConfigureAggregationsDialog::~ConfigureAggregationsDialog
~ConfigureAggregationsDialog()
Definition: configureaggregationsdialog.cpp:177
MessageList::Utils::ConfigureAggregationsDialog::Private::findAggregationItemByAggregation
AggregationListWidgetItem * findAggregationItemByAggregation(Core::Aggregation *set)
Definition: configureaggregationsdialog.cpp:311
MessageList::Utils::ConfigureAggregationsDialog::Private::mAggregationList
AggregationListWidget * mAggregationList
Definition: configureaggregationsdialog_p.h:78
MessageList::Utils::ConfigureAggregationsDialog::Private::importAggregationButtonClicked
void importAggregationButtonClicked()
Definition: configureaggregationsdialog.cpp:397
MessageList::Utils::ConfigureAggregationsDialog::Private::mNewAggregationButton
QPushButton * mNewAggregationButton
Definition: configureaggregationsdialog_p.h:80
MessageList::Utils::ConfigureAggregationsDialog::Private::aggregationListItemClicked
void aggregationListItemClicked(QListWidgetItem *cur)
Definition: configureaggregationsdialog.cpp:254
MessageList::Utils::ConfigureAggregationsDialog::Private::mExportAggregationButton
QPushButton * mExportAggregationButton
Definition: configureaggregationsdialog_p.h:83
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:32 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

messagelist

Skip menu "messagelist"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

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

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