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

messagelist

  • sources
  • kde-4.14
  • 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 <KLocalizedString>
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  if (Manager::instance()) {
194  commitEditor();
195 
196  Manager::instance()->removeAllAggregations();
197 
198  const int c = mAggregationList->count();
199  int i = 0;
200  while ( i < c )
201  {
202  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( mAggregationList->item( i ) );
203  if ( item )
204  {
205  Manager::instance()->addAggregation( item->aggregation() );
206  item->forgetAggregation();
207  }
208  ++i;
209  }
210 
211  Manager::instance()->aggregationsConfigurationCompleted();
212  }
213 
214  q->close(); // this will delete too
215 }
216 
217 void ConfigureAggregationsDialog::Private::commitEditor()
218 {
219  Aggregation * editedAggregation = mEditor->editedAggregation();
220  if ( !editedAggregation )
221  return;
222 
223  mEditor->commit();
224 
225  AggregationListWidgetItem * editedItem = findAggregationItemByAggregation( editedAggregation );
226  if ( !editedItem )
227  return;
228  const QString goodName = uniqueNameForAggregation( editedAggregation->name(), editedAggregation );
229  editedAggregation->setName( goodName );
230  editedItem->setText( goodName );
231 }
232 
233 void ConfigureAggregationsDialog::Private::editedAggregationNameChanged()
234 {
235  Aggregation * set = mEditor->editedAggregation();
236  if ( !set )
237  return;
238 
239  AggregationListWidgetItem * it = findAggregationItemByAggregation( set );
240  if ( !it )
241  return;
242 
243  const QString goodName = uniqueNameForAggregation( set->name(), set );
244 
245  it->setText( goodName );
246 }
247 
248 void ConfigureAggregationsDialog::Private::fillAggregationList()
249 {
250  if (!Manager::instance())
251  return;
252  const QHash< QString, Aggregation * > & sets = Manager::instance()->aggregations();
253  QHash< QString, Aggregation * >::ConstIterator end( sets.constEnd() );
254  for( QHash< QString, Aggregation * >::ConstIterator it = sets.constBegin(); it != end; ++it )
255  (void)new AggregationListWidgetItem( mAggregationList, *( *it ) );
256 }
257 
258 void ConfigureAggregationsDialog::Private::aggregationListItemClicked(QListWidgetItem* cur)
259 {
260  commitEditor();
261  updateButton(cur);
262 }
263 
264 void ConfigureAggregationsDialog::Private::updateButton(QListWidgetItem* cur)
265 {
266  const int numberOfSelectedItem(mAggregationList->selectedItems().count());
267 
268  AggregationListWidgetItem * item = cur ? dynamic_cast< AggregationListWidgetItem * >( cur ) : 0;
269  mDeleteAggregationButton->setEnabled( item && !item->aggregation()->readOnly() && ( mAggregationList->count() > 1 ) );
270 
271  mCloneAggregationButton->setEnabled( numberOfSelectedItem == 1 );
272  mExportAggregationButton->setEnabled( numberOfSelectedItem > 0 );
273  mEditor->editAggregation( item ? item->aggregation() : 0 );
274  if ( item && !item->isSelected() )
275  item->setSelected( true ); // make sure it's true
276 }
277 
278 AggregationListWidgetItem * ConfigureAggregationsDialog::Private::findAggregationItemByName( const QString &name, Aggregation * skipAggregation )
279 {
280  const int c = mAggregationList->count();
281  int i = 0;
282  while ( i < c )
283  {
284  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( mAggregationList->item( i ) );
285  if ( item )
286  {
287  if ( item->aggregation() != skipAggregation )
288  {
289  if ( item->aggregation()->name() == name )
290  return item;
291  }
292  }
293  ++i;
294  }
295  return 0;
296 }
297 
298 AggregationListWidgetItem * ConfigureAggregationsDialog::Private::findAggregationItemById( const QString &aggregationId )
299 {
300  const int c = mAggregationList->count();
301  int i = 0;
302  while ( i < c )
303  {
304  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( mAggregationList->item( i ) );
305  if ( item )
306  {
307  if ( item->aggregation()->id() == aggregationId )
308  return item;
309  }
310  ++i;
311  }
312  return 0;
313 }
314 
315 AggregationListWidgetItem * ConfigureAggregationsDialog::Private::findAggregationItemByAggregation( Aggregation * set )
316 {
317  const int c = mAggregationList->count();
318  int i = 0;
319  while ( i < c )
320  {
321  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( mAggregationList->item( i ) );
322  if ( item )
323  {
324  if ( item->aggregation() == set )
325  return item;
326  }
327  ++i;
328  }
329  return 0;
330 }
331 
332 
333 QString ConfigureAggregationsDialog::Private::uniqueNameForAggregation( const QString& baseName, Aggregation * skipAggregation )
334 {
335  QString ret = baseName;
336  if( ret.isEmpty() )
337  ret = i18n( "Unnamed Aggregation" );
338 
339  int idx = 1;
340 
341  AggregationListWidgetItem * item = findAggregationItemByName( ret, skipAggregation );
342  while ( item )
343  {
344  idx++;
345  ret = QString::fromLatin1( "%1 %2" ).arg( baseName ).arg( idx );
346  item = findAggregationItemByName( ret, skipAggregation );
347  }
348  return ret;
349 }
350 
351 void ConfigureAggregationsDialog::Private::newAggregationButtonClicked()
352 {
353  Aggregation emptyAggregation;
354  emptyAggregation.setName( uniqueNameForAggregation( i18n( "New Aggregation" ) ) );
355  AggregationListWidgetItem * item = new AggregationListWidgetItem( mAggregationList, emptyAggregation );
356 
357  mAggregationList->setCurrentItem( item );
358  mDeleteAggregationButton->setEnabled( item && !item->aggregation()->readOnly() );
359 }
360 
361 void ConfigureAggregationsDialog::Private::cloneAggregationButtonClicked()
362 {
363  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( mAggregationList->currentItem() );
364  if ( !item )
365  return;
366  commitEditor();
367  item->setSelected(false);
368  Aggregation copyAggregation( *( item->aggregation() ) );
369  copyAggregation.setReadOnly( false );
370  copyAggregation.generateUniqueId(); // regenerate id so it becomes different
371  copyAggregation.setName( uniqueNameForAggregation( item->aggregation()->name() ) );
372  item = new AggregationListWidgetItem( mAggregationList, copyAggregation );
373 
374  mAggregationList->setCurrentItem( item );
375  aggregationListItemClicked( item );
376 }
377 
378 void ConfigureAggregationsDialog::Private::deleteAggregationButtonClicked()
379 {
380  QList<QListWidgetItem *> list = mAggregationList->selectedItems();
381  if(list.isEmpty()) {
382  return;
383  }
384 
385  mEditor->editAggregation( 0 ); // forget it
386  Q_FOREACH(QListWidgetItem * it, list) {
387  AggregationListWidgetItem * item = dynamic_cast< AggregationListWidgetItem * >( it );
388  if ( !item )
389  return;
390  if(!item->aggregation()->readOnly()) {
391  delete item; // this will trigger aggregationListCurrentItemChanged()
392  }
393  if ( mAggregationList->count() < 2 )
394  break; // no way: desperately try to keep at least one option set alive :)
395  }
396 
397  AggregationListWidgetItem *newItem = dynamic_cast< AggregationListWidgetItem * >(mAggregationList->currentItem());
398  updateButton(newItem);
399 }
400 
401 void ConfigureAggregationsDialog::Private::importAggregationButtonClicked()
402 {
403  const QString filename = KFileDialog::getOpenFileName(QString(),QString::fromLatin1("*"),q,i18n("Import Aggregation"));
404  if(!filename.isEmpty()) {
405  KConfig config(filename);
406 
407  if(config.hasGroup(QLatin1String("MessageListView::Aggregations"))) {
408  KConfigGroup grp( &config, QLatin1String("MessageListView::Aggregations") );
409  const int cnt = grp.readEntry("Count",0);
410  int idx = 0;
411  while ( idx < cnt )
412  {
413  const QString data = grp.readEntry( QString::fromLatin1( "Set%1" ).arg( idx ), QString() );
414  if ( !data.isEmpty() )
415  {
416  Aggregation * set = new Aggregation();
417  if ( set->loadFromString( data ) )
418  {
419  set->setReadOnly( false );
420  set->generateUniqueId(); // regenerate id so it becomes different
421  set->setName( uniqueNameForAggregation( set->name() ) );
422  (void)new AggregationListWidgetItem( mAggregationList, *set );
423  } else {
424  delete set; // b0rken
425  }
426  }
427  ++idx;
428  }
429  }
430  }
431 }
432 
433 void ConfigureAggregationsDialog::Private::exportAggregationButtonClicked()
434 {
435  QList<QListWidgetItem *> list = mAggregationList->selectedItems();
436  if(list.isEmpty()) {
437  return;
438  }
439  const QString filename = KFileDialog::getSaveFileName(QString(),QString::fromLatin1("*"),q,i18n("Export Aggregation"), KFileDialog::ConfirmOverwrite);
440  if(!filename.isEmpty()) {
441  KConfig config(filename);
442 
443  KConfigGroup grp( &config, QLatin1String("MessageListView::Aggregations") );
444  grp.writeEntry( "Count", list.count() );
445 
446  int idx = 0;
447  Q_FOREACH(QListWidgetItem *item, list) {
448  AggregationListWidgetItem * themeItem = static_cast< AggregationListWidgetItem * >( item );
449  grp.writeEntry( QString::fromLatin1( "Set%1" ).arg( idx ), themeItem->aggregation()->saveToString() );
450  ++idx;
451  }
452  }
453 }
454 
455 
456 #include "moc_configureaggregationsdialog.cpp"
QWidget
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
QGridLayout::addWidget
void addWidget(QWidget *widget, int row, int column, QFlags< Qt::AlignmentFlag > alignment)
MessageList::Utils::ConfigureAggregationsDialog::Private::findAggregationItemById
AggregationListWidgetItem * findAggregationItemById(const QString &aggregationId)
Definition: configureaggregationsdialog.cpp:298
MessageList::Utils::ConfigureAggregationsDialog::Private::uniqueNameForAggregation
QString uniqueNameForAggregation(const QString &baseName, Core::Aggregation *skipAggregation=0)
Definition: configureaggregationsdialog.cpp:333
MessageList::Utils::ConfigureAggregationsDialog::Private::q
ConfigureAggregationsDialog *const q
Definition: configureaggregationsdialog_p.h:76
QListWidgetItem
MessageList::Utils::ConfigureAggregationsDialog::Private::cloneAggregationButtonClicked
void cloneAggregationButtonClicked()
Definition: configureaggregationsdialog.cpp:361
MessageList::Utils::ConfigureAggregationsDialog::Private::newAggregationButtonClicked
void newAggregationButtonClicked()
Definition: configureaggregationsdialog.cpp:351
QGridLayout
KDialog
QFrame::setFrameStyle
void setFrameStyle(int style)
QListWidget
MessageList::Core::OptionSet::setReadOnly
void setReadOnly(bool b)
Definition: optionset.h:119
QAbstractButton::setIcon
void setIcon(const QIcon &icon)
MessageList::Utils::ConfigureAggregationsDialog::Private::commitEditor
void commitEditor()
Definition: configureaggregationsdialog.cpp:217
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
QList::count
int count(const T &value) const
MessageList::Utils::ConfigureAggregationsDialog::Private::findAggregationItemByName
AggregationListWidgetItem * findAggregationItemByName(const QString &name, Core::Aggregation *skipAggregation=0)
Definition: configureaggregationsdialog.cpp:278
QGridLayout::setRowStretch
void setRowStretch(int row, int stretch)
QHash::constEnd
const_iterator constEnd() const
QHash
MessageList::Utils::ConfigureAggregationsDialog::Private::deleteAggregationButtonClicked
void deleteAggregationButtonClicked()
Definition: configureaggregationsdialog.cpp:378
QAbstractButton::setIconSize
void setIconSize(const QSize &size)
QList::isEmpty
bool isEmpty() const
MessageList::Utils::ConfigureAggregationsDialog::Private::okButtonClicked
void okButtonClicked()
Definition: configureaggregationsdialog.cpp:191
QString::isEmpty
bool isEmpty() const
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:433
QString
aggregation.h
QList
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:233
MessageList::Utils::ConfigureAggregationsDialog::Private::fillAggregationList
void fillAggregationList()
Definition: configureaggregationsdialog.cpp:248
MessageList::Core::OptionSet::setName
void setName(const QString &name)
Sets the name of this OptionSet.
Definition: optionset.h:80
QSize
QFrame
QWidget::sizeHint
sizeHint
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
QHash::constBegin
const_iterator constBegin() const
MessageList::Utils::ConfigureAggregationsDialog::Private::updateButton
void updateButton(QListWidgetItem *cur)
Definition: configureaggregationsdialog.cpp:264
configureaggregationsdialog_p.h
MessageList::Utils::ConfigureAggregationsDialog::Private::mEditor
AggregationEditor * mEditor
Definition: configureaggregationsdialog_p.h:79
QLatin1String
QGridLayout::setColumnStretch
void setColumnStretch(int column, int stretch)
configureaggregationsdialog.h
MessageList::Utils::ConfigureAggregationsDialog::~ConfigureAggregationsDialog
~ConfigureAggregationsDialog()
Definition: configureaggregationsdialog.cpp:177
QWidget::setMinimumHeight
void setMinimumHeight(int minh)
QString::fromLatin1
QString fromLatin1(const char *str, int size)
MessageList::Utils::ConfigureAggregationsDialog::Private::findAggregationItemByAggregation
AggregationListWidgetItem * findAggregationItemByAggregation(Core::Aggregation *set)
Definition: configureaggregationsdialog.cpp:315
MessageList::Utils::ConfigureAggregationsDialog::Private::mAggregationList
AggregationListWidget * mAggregationList
Definition: configureaggregationsdialog_p.h:78
QPushButton
MessageList::Utils::ConfigureAggregationsDialog::Private::importAggregationButtonClicked
void importAggregationButtonClicked()
Definition: configureaggregationsdialog.cpp:401
MessageList::Utils::ConfigureAggregationsDialog::Private::mNewAggregationButton
QPushButton * mNewAggregationButton
Definition: configureaggregationsdialog_p.h:80
MessageList::Utils::ConfigureAggregationsDialog::Private::aggregationListItemClicked
void aggregationListItemClicked(QListWidgetItem *cur)
Definition: configureaggregationsdialog.cpp:258
MessageList::Utils::ConfigureAggregationsDialog::Private::mExportAggregationButton
QPushButton * mExportAggregationButton
Definition: configureaggregationsdialog_p.h:83
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
QListWidgetItem::setSelected
void setSelected(bool select)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:32:01 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
  • 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