• Skip to content
  • Skip to link menu
  • KDE API Reference
  • kdepimlibs-4.11.3 API Reference
  • KDE Home
  • Contact Us
 

akonadi/contact

  • akonadi
  • contact
  • editor
addresseditwidget.cpp
1 /*
2  This file is part of Akonadi Contact.
3 
4  Copyright (c) 2009 Tobias Koenig <tokoe@kde.org>
5 
6  This library is free software; you can redistribute it and/or modify it
7  under the terms of the GNU Library General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or (at your
9  option) any later version.
10 
11  This library is distributed in the hope that it will be useful, but WITHOUT
12  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
14  License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to the
18  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19  02110-1301, USA.
20 */
21 
22 #include "addresseditwidget.h"
23 
24 #include "autoqpointer_p.h"
25 
26 #include <QtCore/QEvent>
27 #include <QtCore/QList>
28 #include <QApplication>
29 #include <QButtonGroup>
30 #include <QCheckBox>
31 #include <QFrame>
32 #include <QGridLayout>
33 #include <QGroupBox>
34 #include <QKeyEvent>
35 #include <QLabel>
36 #include <QPushButton>
37 
38 #include <kacceleratormanager.h>
39 #include <kcombobox.h>
40 #include <kdebug.h>
41 #include <khbox.h>
42 #include <kinputdialog.h>
43 #include <klineedit.h>
44 #include <klocale.h>
45 #include <klocalizedstring.h>
46 #include <kglobal.h>
47 #include <kmessagebox.h>
48 #include <kseparator.h>
49 #include <ktextedit.h>
50 
51 #include <functional>
52 
53 struct LocaleAwareLessThan : std::binary_function<QString,QString,bool> {
54  bool operator()( const QString &s1, const QString &s2 ) const
55  {
56  return QString::localeAwareCompare( s1, s2 ) < 0 ;
57  }
58 };
59 
60 class TabPressEater : public QObject
61 {
62  public:
63  TabPressEater( QObject *parent )
64  : QObject( parent )
65  {
66  setObjectName( QLatin1String( "TabPressEater" ) );
67  }
68 
69  protected:
70  bool eventFilter( QObject*, QEvent *event )
71  {
72  if ( event->type() == QEvent::KeyPress ) {
73  QKeyEvent *keyEvent = (QKeyEvent*)event;
74  if ( keyEvent->key() == Qt::Key_Tab ) {
75  QApplication::sendEvent( parent(), event );
76  return true;
77  } else
78  return false;
79  } else {
80  return false;
81  }
82  }
83 };
84 
90 class AddressTypeDialog : public KDialog
91 {
92  public:
93  AddressTypeDialog( KABC::Address::Type type, QWidget *parent );
94  ~AddressTypeDialog();
95 
96  KABC::Address::Type type() const;
97 
98  private:
99  QButtonGroup *mGroup;
100 
101  KABC::Address::TypeList mTypeList;
102 };
103 
104 
105 AddressSelectionWidget::AddressSelectionWidget( QWidget *parent )
106  : KComboBox( parent )
107 {
108  connect( this, SIGNAL(activated(int)), SLOT(selected(int)) );
109 }
110 
111 AddressSelectionWidget::~AddressSelectionWidget()
112 {
113 }
114 
115 void AddressSelectionWidget::setAddresses( const KABC::Address::List &addresses )
116 {
117  mAddresses = addresses;
118  updateView();
119 }
120 
121 void AddressSelectionWidget::setCurrentAddress( const KABC::Address &address )
122 {
123  const int index = mAddresses.indexOf( address );
124  if ( index != -1 ) {
125  setCurrentIndex( index );
126  }
127 }
128 
129 KABC::Address AddressSelectionWidget::currentAddress() const
130 {
131  if ( currentIndex() != -1 && currentIndex() < mAddresses.count() ) {
132  return mAddresses.at( currentIndex() );
133  } else {
134  return KABC::Address();
135  }
136 }
137 
138 void AddressSelectionWidget::selected( int index )
139 {
140  Q_ASSERT( index != -1 && index < mAddresses.count() );
141  emit selectionChanged( mAddresses.at( index ) );
142 }
143 
144 void AddressSelectionWidget::updateView()
145 {
146  clear();
147  for ( int i = 0; i < mAddresses.count(); ++i ) {
148  addItem( KABC::Address::typeLabel( mAddresses.at( i ).type() ) );
149  }
150 }
151 
152 
153 
154 AddressTypeCombo::AddressTypeCombo( QWidget *parent )
155  : KComboBox( parent ),
156  mType( KABC::Address::Home ),
157  mLastSelected( 0 )
158 {
159  for ( int i = 0; i < KABC::Address::typeList().count(); ++i ) {
160  mTypeList.append( KABC::Address::typeList().at( i ) );
161  }
162  mTypeList.append( -1 ); // Others...
163 
164  update();
165 
166  connect( this, SIGNAL(activated(int)),
167  this, SLOT(selected(int)) );
168 }
169 
170 AddressTypeCombo::~AddressTypeCombo()
171 {
172 }
173 
174 void AddressTypeCombo::setType( KABC::Address::Type type )
175 {
176  if ( !mTypeList.contains( (int)type ) ) {
177  // insert at the end, but before the 'Others...' entry
178  mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), (int)type );
179  }
180 
181  mType = type;
182  update();
183 }
184 
185 KABC::Address::Type AddressTypeCombo::type() const
186 {
187  return mType;
188 }
189 
190 void AddressTypeCombo::update()
191 {
192  bool blocked = signalsBlocked();
193  blockSignals( true );
194 
195  clear();
196  for ( int i = 0; i < mTypeList.count(); ++i ) {
197  if ( mTypeList.at( i ) == -1 ) { // "Other..." entry
198  addItem( i18nc( "@item:inlistbox Category of contact info field", "Other..." ) );
199  } else {
200  addItem( KABC::Address::typeLabel( KABC::Address::Type( mTypeList.at( i ) ) ) );
201  }
202  }
203 
204  setCurrentIndex( mLastSelected = mTypeList.indexOf( mType ) );
205 
206  blockSignals( blocked );
207 }
208 
209 void AddressTypeCombo::selected( int pos )
210 {
211  if ( mTypeList.at( pos ) == -1 ) {
212  otherSelected();
213  } else {
214  mType = KABC::Address::Type( mTypeList.at( pos ) );
215  mLastSelected = pos;
216  }
217 }
218 
219 void AddressTypeCombo::otherSelected()
220 {
221  AutoQPointer<AddressTypeDialog> dlg = new AddressTypeDialog( mType, this );
222  if ( dlg->exec() ) {
223  mType = dlg->type();
224  if ( !mTypeList.contains( mType ) ) {
225  mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), mType );
226  }
227  } else {
228  setType( KABC::Address::Type( mTypeList.at( mLastSelected ) ) );
229  }
230 
231  update();
232 }
233 
234 
235 AddressEditWidget::AddressEditWidget( QWidget *parent )
236  : QWidget( parent ), mReadOnly( false )
237 {
238  QGridLayout *layout = new QGridLayout( this );
239  layout->setSpacing( KDialog::spacingHint() );
240  layout->setMargin( 0 );
241 
242  mAddressSelectionWidget = new AddressSelectionWidget( this );
243  connect( mAddressSelectionWidget, SIGNAL(selectionChanged(KABC::Address)),
244  SLOT(updateAddressView()) );
245  layout->addWidget( mAddressSelectionWidget, 0, 0, 1, 3 );
246 
247  mAddressView = new QLabel( this );
248  mAddressView->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
249  mAddressView->setMinimumHeight( 20 );
250  mAddressView->setAlignment( Qt::AlignTop );
251  mAddressView->setTextFormat( Qt::PlainText );
252  mAddressView->setTextInteractionFlags( Qt::TextSelectableByKeyboard | Qt::TextSelectableByMouse );
253  layout->addWidget( mAddressView, 1, 0, 1, 3 );
254 
255  mCreateButton = new QPushButton( i18nc( "street/postal", "New..." ), this );
256  connect( mCreateButton, SIGNAL(clicked()), this, SLOT(createAddress()) );
257  mEditButton = new QPushButton( i18nc( "street/postal", "Edit..." ), this );
258  connect( mEditButton, SIGNAL(clicked()), this, SLOT(editAddress()) );
259  mDeleteButton = new QPushButton( i18nc( "street/postal", "Delete" ), this );
260  connect( mDeleteButton, SIGNAL(clicked()), this, SLOT(deleteAddress()) );
261 
262  layout->addWidget( mCreateButton, 2, 0 );
263  layout->addWidget( mEditButton, 2, 1 );
264  layout->addWidget( mDeleteButton, 2, 2 );
265 
266  updateButtons();
267 }
268 
269 AddressEditWidget::~AddressEditWidget()
270 {
271 }
272 
273 void AddressEditWidget::setReadOnly( bool readOnly )
274 {
275  mReadOnly = readOnly;
276  updateButtons();
277 }
278 
279 void AddressEditWidget::updateName( const QString &name )
280 {
281  mName = name;
282  updateAddressView();
283 }
284 
285 void AddressEditWidget::createAddress()
286 {
287  AutoQPointer<AddressEditDialog> dialog = new AddressEditDialog( this );
288  if ( dialog->exec() ) {
289  const KABC::Address address = dialog->address();
290  fixPreferredAddress( address );
291  mAddressList.append( address );
292  mAddressSelectionWidget->setAddresses( mAddressList );
293  mAddressSelectionWidget->setCurrentAddress( address );
294 
295  updateAddressView();
296  updateButtons();
297  }
298 }
299 
300 void AddressEditWidget::editAddress()
301 {
302  AutoQPointer<AddressEditDialog> dialog = new AddressEditDialog( this );
303  dialog->setAddress( mAddressSelectionWidget->currentAddress() );
304  if ( dialog->exec() ) {
305  const KABC::Address address = dialog->address();
306  fixPreferredAddress( address );
307  mAddressList[ mAddressSelectionWidget->currentIndex() ] = address;
308  mAddressSelectionWidget->setAddresses( mAddressList );
309  mAddressSelectionWidget->setCurrentAddress( address );
310 
311  updateAddressView();
312  }
313 }
314 
315 void AddressEditWidget::deleteAddress()
316 {
317  const int result = KMessageBox::questionYesNo( this, i18n( "Do you really want to delete this address?" ) );
318 
319  if ( result != KMessageBox::Yes ) {
320  return;
321  }
322 
323  mAddressList.removeAt( mAddressSelectionWidget->currentIndex() );
324  mAddressSelectionWidget->setAddresses( mAddressList );
325  updateAddressView();
326  updateButtons();
327 }
328 
329 void AddressEditWidget::fixPreferredAddress( const KABC::Address &preferredAddress )
330 {
331  // as the preferred address is mutual exclusive, we have to
332  // remove the flag from all other addresses
333  if ( preferredAddress.type() & KABC::Address::Pref ) {
334  for ( int i = 0; i < mAddressList.count(); ++i ) {
335  KABC::Address &address = mAddressList[ i ];
336  address.setType( address.type() & ~KABC::Address::Pref );
337  }
338  }
339 }
340 
341 void AddressEditWidget::updateAddressView()
342 {
343  const KABC::Address address = mAddressSelectionWidget->currentAddress();
344 
345  if ( address.isEmpty() ) {
346  mAddressView->setText( QString() );
347  } else {
348  mAddressView->setText( address.formattedAddress( mName ) );
349  }
350 }
351 
352 void AddressEditWidget::updateButtons()
353 {
354  mCreateButton->setEnabled( !mReadOnly );
355  mEditButton->setEnabled( !mReadOnly && ( mAddressList.count() > 0 ) );
356  mDeleteButton->setEnabled( !mReadOnly && ( mAddressList.count() > 0 ) );
357 }
358 
359 void AddressEditWidget::loadContact( const KABC::Addressee &contact )
360 {
361  mName = contact.realName();
362  mAddressList = contact.addresses();
363 
364  mAddressSelectionWidget->setAddresses( mAddressList );
365 
366  // set the preferred address as the visible one
367  for ( int i = 0; i < mAddressList.count(); ++i ) {
368  if ( mAddressList.at( i ).type() & KABC::Address::Pref ) {
369  mAddressSelectionWidget->setCurrentAddress( mAddressList.at( i ) );
370  break;
371  }
372  }
373 
374  updateAddressView();
375  updateButtons();
376 }
377 
378 void AddressEditWidget::storeContact( KABC::Addressee &contact ) const
379 {
380  // delete all previous addresses
381  const KABC::Address::List oldAddresses = contact.addresses();
382  for ( int i = 0; i < oldAddresses.count(); ++i ) {
383  contact.removeAddress( oldAddresses.at( i ) );
384  }
385 
386  // insert the new ones
387  for ( int i = 0; i < mAddressList.count(); ++i ) {
388  const KABC::Address address( mAddressList.at( i ) );
389  if ( !address.isEmpty() ) {
390  contact.insertAddress( address );
391  }
392  }
393 }
394 
395 
396 AddressEditDialog::AddressEditDialog( QWidget *parent )
397  : KDialog(parent)
398 {
399  setCaption( i18nc( "street/postal", "Edit Address" ) );
400  setButtons( Ok | Cancel );
401  setDefaultButton( Ok );
402  showButtonSeparator( true );
403 
404  QWidget *page = new QWidget( this );
405  setMainWidget( page );
406 
407  QGridLayout *topLayout = new QGridLayout( page );
408  topLayout->setSpacing( spacingHint() );
409  topLayout->setMargin( 0 );
410 
411  mTypeCombo = new AddressTypeCombo( page );
412  topLayout->addWidget( mTypeCombo, 0, 0, 1, 2 );
413 
414  QLabel *label = new QLabel( i18nc( "<streetLabel>:", "%1:", KABC::Address::streetLabel() ), page );
415  label->setAlignment( Qt::AlignTop | Qt::AlignLeft );
416  topLayout->addWidget( label, 1, 0 );
417  mStreetTextEdit = new KTextEdit( page );
418  mStreetTextEdit->setAcceptRichText( false );
419  label->setBuddy( mStreetTextEdit );
420  topLayout->addWidget( mStreetTextEdit, 1, 1 );
421 
422  TabPressEater *eater = new TabPressEater( this );
423  mStreetTextEdit->installEventFilter( eater );
424 
425  label = new QLabel( i18nc( "<postOfficeBoxLabel>:", "%1:", KABC::Address::postOfficeBoxLabel() ), page );
426  topLayout->addWidget( label, 2 , 0 );
427  mPOBoxEdit = new KLineEdit( page );
428  label->setBuddy( mPOBoxEdit );
429  topLayout->addWidget( mPOBoxEdit, 2, 1 );
430 
431  label = new QLabel( i18nc( "<localityLabel>:", "%1:", KABC::Address::localityLabel() ), page );
432  topLayout->addWidget( label, 3, 0 );
433  mLocalityEdit = new KLineEdit( page );
434  label->setBuddy( mLocalityEdit );
435  topLayout->addWidget( mLocalityEdit, 3, 1 );
436 
437  label = new QLabel( i18nc( "<regionLabel>:", "%1:", KABC::Address::regionLabel() ), page );
438  topLayout->addWidget( label, 4, 0 );
439  mRegionEdit = new KLineEdit( page );
440  label->setBuddy( mRegionEdit );
441  topLayout->addWidget( mRegionEdit, 4, 1 );
442 
443  label = new QLabel( i18nc( "<postalCodeLabel>:", "%1:", KABC::Address::postalCodeLabel() ), page );
444  topLayout->addWidget( label, 5, 0 );
445  mPostalCodeEdit = new KLineEdit( page );
446  label->setBuddy( mPostalCodeEdit );
447  topLayout->addWidget( mPostalCodeEdit, 5, 1 );
448 
449  label = new QLabel( i18nc( "<countryLabel>:", "%1:", KABC::Address::countryLabel() ), page );
450  topLayout->addWidget( label, 6, 0 );
451  mCountryCombo = new KComboBox( page );
452  mCountryCombo->setEditable( true );
453  mCountryCombo->setDuplicatesEnabled( false );
454 
455  QPushButton *labelButton = new QPushButton( i18n( "Edit Label..." ), page );
456  topLayout->addWidget( labelButton, 7, 0, 1, 2 );
457  connect( labelButton, SIGNAL(clicked()), SLOT(editLabel()) );
458 
459  fillCountryCombo();
460  label->setBuddy( mCountryCombo );
461  topLayout->addWidget( mCountryCombo, 6, 1 );
462 
463  mPreferredCheckBox = new QCheckBox( i18nc( "street/postal", "This is the preferred address" ), page );
464  topLayout->addWidget( mPreferredCheckBox, 8, 0, 1, 2 );
465 
466  KHBox *buttonBox = new KHBox( page );
467  buttonBox->setSpacing( spacingHint() );
468  topLayout->addWidget( buttonBox, 9, 0, 1, 2 );
469 
470  KAcceleratorManager::manage( this );
471 }
472 
473 AddressEditDialog::~AddressEditDialog()
474 {
475 }
476 
477 void AddressEditDialog::editLabel()
478 {
479  bool ok = false;
480  QString result = KInputDialog::getMultiLineText( KABC::Address::labelLabel(),
481  KABC::Address::labelLabel(),
482  mLabel, &ok, this );
483  if ( ok ) {
484  mLabel = result;
485  }
486 }
487 
488 void AddressEditDialog::setAddress( const KABC::Address &address )
489 {
490  mAddress = address;
491 
492  mTypeCombo->setType( mAddress.type() );
493  mStreetTextEdit->setPlainText( mAddress.street() );
494  mRegionEdit->setText( mAddress.region() );
495  mLocalityEdit->setText( mAddress.locality() );
496  mPostalCodeEdit->setText( mAddress.postalCode() );
497  mPOBoxEdit->setText( mAddress.postOfficeBox() );
498  mLabel = mAddress.label();
499  mPreferredCheckBox->setChecked( mAddress.type() & KABC::Address::Pref );
500 
501  if ( mAddress.isEmpty() ) {
502  mCountryCombo->setItemText( mCountryCombo->currentIndex(),
503  KGlobal::locale()->countryCodeToName( KGlobal::locale()->country() ) );
504  } else {
505  mCountryCombo->setItemText( mCountryCombo->currentIndex(), mAddress.country() );
506  }
507 
508  mStreetTextEdit->setFocus();
509 }
510 
511 KABC::Address AddressEditDialog::address() const
512 {
513  KABC::Address address( mAddress );
514 
515  address.setType( mTypeCombo->type() );
516  address.setLocality( mLocalityEdit->text() );
517  address.setRegion( mRegionEdit->text() );
518  address.setPostalCode( mPostalCodeEdit->text() );
519  address.setCountry( mCountryCombo->currentText() );
520  address.setPostOfficeBox( mPOBoxEdit->text() );
521  address.setStreet( mStreetTextEdit->toPlainText() );
522  address.setLabel( mLabel );
523 
524  if ( mPreferredCheckBox->isChecked() ) {
525  address.setType( address.type() | KABC::Address::Pref );
526  } else {
527  address.setType( address.type() & ~( KABC::Address::Pref ) );
528  }
529 
530  return address;
531 }
532 
533 void AddressEditDialog::fillCountryCombo()
534 {
535  QStringList countries;
536 
537  foreach ( const QString &cc, KGlobal::locale()->allCountriesList() ) {
538  countries.append( KGlobal::locale()->countryCodeToName( cc ) );
539  }
540 
541  qSort( countries.begin(), countries.end(), LocaleAwareLessThan() );
542 
543  mCountryCombo->addItems( countries );
544  mCountryCombo->setAutoCompletion( true );
545  mCountryCombo->completionObject()->setItems( countries );
546  mCountryCombo->completionObject()->setIgnoreCase( true );
547 
548  const QString currentCountry = KGlobal::locale()->countryCodeToName( KGlobal::locale()->country() );
549  mCountryCombo->setCurrentIndex( mCountryCombo->findText( currentCountry ) );
550 }
551 
552 
553 AddressTypeDialog::AddressTypeDialog( KABC::Address::Type type, QWidget *parent )
554  : KDialog( parent)
555 {
556  setCaption( i18nc( "street/postal", "Edit Address Type" ) );
557  setButtons( Ok | Cancel );
558  setDefaultButton( Ok );
559 
560  QWidget *page = new QWidget( this );
561  setMainWidget( page );
562  QVBoxLayout *layout = new QVBoxLayout( page );
563  layout->setSpacing( KDialog::spacingHint() );
564  layout->setMargin( 0 );
565 
566  QGroupBox *box = new QGroupBox( i18nc( "street/postal", "Address Types" ), page );
567  layout->addWidget( box );
568  mGroup = new QButtonGroup( box );
569  mGroup->setExclusive ( false );
570 
571  QGridLayout *buttonLayout = new QGridLayout( box );
572 
573  mTypeList = KABC::Address::typeList();
574  mTypeList.removeAll( KABC::Address::Pref );
575 
576  KABC::Address::TypeList::ConstIterator it;
577  int i = 0;
578  int row = 0;
579  for ( it = mTypeList.constBegin(); it != mTypeList.constEnd(); ++it, ++i ) {
580  QCheckBox *cb = new QCheckBox( KABC::Address::typeLabel( *it ), box );
581  cb->setChecked( type & mTypeList[ i ] );
582  buttonLayout->addWidget( cb, row, i%3 );
583 
584  if ( i % 3 == 2 ) {
585  ++row;
586  }
587  mGroup->addButton( cb );
588  }
589 }
590 
591 AddressTypeDialog::~AddressTypeDialog()
592 {
593 }
594 
595 KABC::Address::Type AddressTypeDialog::type() const
596 {
597  KABC::Address::Type type;
598  for ( int i = 0; i < mGroup->buttons().count(); ++i ) {
599  QCheckBox *box = dynamic_cast<QCheckBox*>( mGroup->buttons().at( i ) );
600  if ( box && box->isChecked() ) {
601  type |= mTypeList[ i ];
602  }
603  }
604 
605  return type;
606 }
607 
AddressTypeCombo::setType
void setType(KABC::Address::Type type)
Sets the type that shall be selected in the combobox.
Definition: addresseditwidget.cpp:174
AddressSelectionWidget::AddressSelectionWidget
AddressSelectionWidget(QWidget *parent=0)
Creates a new address selection widget.
Definition: addresseditwidget.cpp:105
AddressTypeCombo::AddressTypeCombo
AddressTypeCombo(QWidget *parent=0)
Creates a new address type combo.
Definition: addresseditwidget.cpp:154
AddressSelectionWidget::~AddressSelectionWidget
virtual ~AddressSelectionWidget()
Destroys the address selection widget.
Definition: addresseditwidget.cpp:111
AddressSelectionWidget::selectionChanged
void selectionChanged(const KABC::Address &address)
This signal is emitted whenever the selection of the address has changed.
AddressTypeCombo::~AddressTypeCombo
~AddressTypeCombo()
Destroys the address type combo.
Definition: addresseditwidget.cpp:170
AutoQPointer
A QPointer which when destructed, deletes the object it points to.
Definition: autoqpointer_p.h:35
AddressTypeCombo::type
KABC::Address::Type type() const
Returns the type that is currently selected.
Definition: addresseditwidget.cpp:185
AddressSelectionWidget::setCurrentAddress
void setCurrentAddress(const KABC::Address &address)
Sets the current address.
Definition: addresseditwidget.cpp:121
AddressSelectionWidget::setAddresses
void setAddresses(const KABC::Address::List &addresses)
Sets the list of addresses that can be chosen from.
Definition: addresseditwidget.cpp:115
AddressSelectionWidget
A widget that shows a list of addresses for selection.
Definition: addresseditwidget.h:41
AddressEditDialog
Dialog for editing address details.
Definition: addresseditwidget.h:180
AddressSelectionWidget::currentAddress
KABC::Address currentAddress() const
Returns the current selected address.
Definition: addresseditwidget.cpp:129
This file is part of the KDE documentation.
Documentation copyright © 1996-2013 The KDE developers.
Generated on Tue Nov 26 2013 09:03:47 by doxygen 1.8.5 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akonadi/contact

Skip menu "akonadi/contact"
  • Main Page
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • Related Pages

kdepimlibs-4.11.3 API Reference

Skip menu "kdepimlibs-4.11.3 API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmbox
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
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