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

akonadi

  • sources
  • kde-4.12
  • kdepimlibs
  • 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 AddressSelectionWidget::AddressSelectionWidget( QWidget *parent )
105  : KComboBox( parent )
106 {
107  connect( this, SIGNAL(activated(int)), SLOT(selected(int)) );
108 }
109 
110 AddressSelectionWidget::~AddressSelectionWidget()
111 {
112 }
113 
114 void AddressSelectionWidget::setAddresses( const KABC::Address::List &addresses )
115 {
116  mAddresses = addresses;
117  updateView();
118 }
119 
120 void AddressSelectionWidget::setCurrentAddress( const KABC::Address &address )
121 {
122  const int index = mAddresses.indexOf( address );
123  if ( index != -1 ) {
124  setCurrentIndex( index );
125  }
126 }
127 
128 KABC::Address AddressSelectionWidget::currentAddress() const
129 {
130  if ( currentIndex() != -1 && currentIndex() < mAddresses.count() ) {
131  return mAddresses.at( currentIndex() );
132  } else {
133  return KABC::Address();
134  }
135 }
136 
137 void AddressSelectionWidget::selected( int index )
138 {
139  Q_ASSERT( index != -1 && index < mAddresses.count() );
140  emit selectionChanged( mAddresses.at( index ) );
141 }
142 
143 void AddressSelectionWidget::updateView()
144 {
145  clear();
146  for ( int i = 0; i < mAddresses.count(); ++i ) {
147  addItem( KABC::Address::typeLabel( mAddresses.at( i ).type() ) );
148  }
149 }
150 
151 AddressTypeCombo::AddressTypeCombo( QWidget *parent )
152  : KComboBox( parent ),
153  mType( KABC::Address::Home ),
154  mLastSelected( 0 )
155 {
156  for ( int i = 0; i < KABC::Address::typeList().count(); ++i ) {
157  mTypeList.append( KABC::Address::typeList().at( i ) );
158  }
159  mTypeList.append( -1 ); // Others...
160 
161  update();
162 
163  connect( this, SIGNAL(activated(int)),
164  this, SLOT(selected(int)) );
165 }
166 
167 AddressTypeCombo::~AddressTypeCombo()
168 {
169 }
170 
171 void AddressTypeCombo::setType( KABC::Address::Type type )
172 {
173  if ( !mTypeList.contains( (int)type ) ) {
174  // insert at the end, but before the 'Others...' entry
175  mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), (int)type );
176  }
177 
178  mType = type;
179  update();
180 }
181 
182 KABC::Address::Type AddressTypeCombo::type() const
183 {
184  return mType;
185 }
186 
187 void AddressTypeCombo::update()
188 {
189  bool blocked = signalsBlocked();
190  blockSignals( true );
191 
192  clear();
193  for ( int i = 0; i < mTypeList.count(); ++i ) {
194  if ( mTypeList.at( i ) == -1 ) { // "Other..." entry
195  addItem( i18nc( "@item:inlistbox Category of contact info field", "Other..." ) );
196  } else {
197  addItem( KABC::Address::typeLabel( KABC::Address::Type( mTypeList.at( i ) ) ) );
198  }
199  }
200 
201  setCurrentIndex( mLastSelected = mTypeList.indexOf( mType ) );
202 
203  blockSignals( blocked );
204 }
205 
206 void AddressTypeCombo::selected( int pos )
207 {
208  if ( mTypeList.at( pos ) == -1 ) {
209  otherSelected();
210  } else {
211  mType = KABC::Address::Type( mTypeList.at( pos ) );
212  mLastSelected = pos;
213  }
214 }
215 
216 void AddressTypeCombo::otherSelected()
217 {
218  AutoQPointer<AddressTypeDialog> dlg = new AddressTypeDialog( mType, this );
219  if ( dlg->exec() ) {
220  mType = dlg->type();
221  if ( !mTypeList.contains( mType ) ) {
222  mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), mType );
223  }
224  } else {
225  setType( KABC::Address::Type( mTypeList.at( mLastSelected ) ) );
226  }
227 
228  update();
229 }
230 
231 AddressEditWidget::AddressEditWidget( QWidget *parent )
232  : QWidget( parent ), mReadOnly( false )
233 {
234  QGridLayout *layout = new QGridLayout;
235  layout->setSpacing( KDialog::spacingHint() );
236  layout->setMargin( 0 );
237 
238  QHBoxLayout *hboxLayout = new QHBoxLayout;
239  QLabel *label = new QLabel( i18nc( "@label:listbox type of address", "Address type:" ), this );
240  hboxLayout->addWidget( label );
241 
242  mAddressSelectionWidget = new AddressSelectionWidget( this );
243  connect( mAddressSelectionWidget, SIGNAL(selectionChanged(KABC::Address)),
244  SLOT(updateAddressView()) );
245  label->setBuddy( mAddressSelectionWidget );
246  hboxLayout->addWidget( mAddressSelectionWidget, 1 );
247  layout->addLayout( hboxLayout, 0, 0, 1, 3 );
248 
249  mAddressView = new QLabel( this );
250  mAddressView->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
251  mAddressView->setMinimumHeight( 20 );
252  mAddressView->setAlignment( Qt::AlignTop );
253  mAddressView->setTextFormat( Qt::PlainText );
254  mAddressView->setTextInteractionFlags( Qt::TextSelectableByKeyboard | Qt::TextSelectableByMouse );
255  layout->addWidget( mAddressView, 1, 0, 1, 3 );
256 
257  mCreateButton = new QPushButton( i18nc( "@action:button street/postal", "New..." ), this );
258  connect( mCreateButton, SIGNAL(clicked()), this, SLOT(createAddress()) );
259  mEditButton = new QPushButton( i18nc( "@action:button street/postal", "Edit..." ), this );
260  connect( mEditButton, SIGNAL(clicked()), this, SLOT(editAddress()) );
261  mDeleteButton = new QPushButton( i18nc( "@action:button street/postal", "Delete" ), this );
262  connect( mDeleteButton, SIGNAL(clicked()), this, SLOT(deleteAddress()) );
263 
264  layout->addWidget( mCreateButton, 2, 0 );
265  layout->addWidget( mEditButton, 2, 1 );
266  layout->addWidget( mDeleteButton, 2, 2 );
267  setLayout(layout);
268  updateButtons();
269 }
270 
271 AddressEditWidget::~AddressEditWidget()
272 {
273 }
274 
275 void AddressEditWidget::setReadOnly( bool readOnly )
276 {
277  if (mReadOnly != readOnly) {
278  mReadOnly = readOnly;
279  updateButtons();
280  }
281 }
282 
283 void AddressEditWidget::updateName( const QString &name )
284 {
285  if (mName != name) {
286  mName = name;
287  updateAddressView();
288  }
289 }
290 
291 void AddressEditWidget::createAddress()
292 {
293  AutoQPointer<AddressEditDialog> dialog = new AddressEditDialog( this );
294  if ( dialog->exec() ) {
295  const KABC::Address address = dialog->address();
296  fixPreferredAddress( address );
297  mAddressList.append( address );
298  mAddressSelectionWidget->setAddresses( mAddressList );
299  mAddressSelectionWidget->setCurrentAddress( address );
300 
301  updateAddressView();
302  updateButtons();
303  }
304 }
305 
306 void AddressEditWidget::editAddress()
307 {
308  AutoQPointer<AddressEditDialog> dialog = new AddressEditDialog( this );
309  dialog->setAddress( mAddressSelectionWidget->currentAddress() );
310  if ( dialog->exec() ) {
311  const KABC::Address address = dialog->address();
312  fixPreferredAddress( address );
313  mAddressList[ mAddressSelectionWidget->currentIndex() ] = address;
314  mAddressSelectionWidget->setAddresses( mAddressList );
315  mAddressSelectionWidget->setCurrentAddress( address );
316 
317  updateAddressView();
318  }
319 }
320 
321 void AddressEditWidget::deleteAddress()
322 {
323  const int result = KMessageBox::questionYesNo( this, i18n( "Do you really want to delete this address?" ) );
324 
325  if ( result != KMessageBox::Yes ) {
326  return;
327  }
328 
329  mAddressList.removeAt( mAddressSelectionWidget->currentIndex() );
330  mAddressSelectionWidget->setAddresses( mAddressList );
331  updateAddressView();
332  updateButtons();
333 }
334 
335 void AddressEditWidget::fixPreferredAddress( const KABC::Address &preferredAddress )
336 {
337  // as the preferred address is mutual exclusive, we have to
338  // remove the flag from all other addresses
339  if ( preferredAddress.type() & KABC::Address::Pref ) {
340  for ( int i = 0; i < mAddressList.count(); ++i ) {
341  KABC::Address &address = mAddressList[ i ];
342  address.setType( address.type() & ~KABC::Address::Pref );
343  }
344  }
345 }
346 
347 void AddressEditWidget::updateAddressView()
348 {
349  const KABC::Address address = mAddressSelectionWidget->currentAddress();
350 
351  if ( address.isEmpty() ) {
352  mAddressView->setText( QString() );
353  } else {
354  mAddressView->setText( address.formattedAddress( mName ) );
355  }
356 }
357 
358 void AddressEditWidget::updateButtons()
359 {
360  mCreateButton->setEnabled( !mReadOnly );
361  mEditButton->setEnabled( !mReadOnly && ( mAddressList.count() > 0 ) );
362  mDeleteButton->setEnabled( !mReadOnly && ( mAddressList.count() > 0 ) );
363 }
364 
365 void AddressEditWidget::loadContact( const KABC::Addressee &contact )
366 {
367  mName = contact.realName();
368  mAddressList = contact.addresses();
369 
370  mAddressSelectionWidget->setAddresses( mAddressList );
371 
372  // set the preferred address as the visible one
373  for ( int i = 0; i < mAddressList.count(); ++i ) {
374  if ( mAddressList.at( i ).type() & KABC::Address::Pref ) {
375  mAddressSelectionWidget->setCurrentAddress( mAddressList.at( i ) );
376  break;
377  }
378  }
379 
380  updateAddressView();
381  updateButtons();
382 }
383 
384 void AddressEditWidget::storeContact( KABC::Addressee &contact ) const
385 {
386  // delete all previous addresses
387  const KABC::Address::List oldAddresses = contact.addresses();
388  for ( int i = 0; i < oldAddresses.count(); ++i ) {
389  contact.removeAddress( oldAddresses.at( i ) );
390  }
391 
392  // insert the new ones
393  for ( int i = 0; i < mAddressList.count(); ++i ) {
394  const KABC::Address address( mAddressList.at( i ) );
395  if ( !address.isEmpty() ) {
396  contact.insertAddress( address );
397  }
398  }
399 }
400 
401 AddressEditDialog::AddressEditDialog( QWidget *parent )
402  : KDialog(parent)
403 {
404  setCaption( i18nc( "street/postal", "Edit Address" ) );
405  setButtons( Ok | Cancel );
406  setDefaultButton( Ok );
407  showButtonSeparator( true );
408 
409  QWidget *page = new QWidget( this );
410  setMainWidget( page );
411 
412  QGridLayout *topLayout = new QGridLayout( page );
413  topLayout->setSpacing( spacingHint() );
414  topLayout->setMargin( 0 );
415 
416  QLabel *label = new QLabel( i18nc( "@label:listbox type of address", "Address type:" ), this );
417  topLayout->addWidget( label, 0, 0 );
418 
419  mTypeCombo = new AddressTypeCombo( page );
420  label->setBuddy( mTypeCombo );
421  topLayout->addWidget( mTypeCombo, 0, 1 );
422 
423  label = new QLabel( i18nc( "<streetLabel>:", "%1:", KABC::Address::streetLabel() ), page );
424  label->setAlignment( Qt::AlignTop | Qt::AlignLeft );
425  topLayout->addWidget( label, 1, 0 );
426  mStreetTextEdit = new KTextEdit( page );
427  mStreetTextEdit->setAcceptRichText( false );
428  label->setBuddy( mStreetTextEdit );
429  topLayout->addWidget( mStreetTextEdit, 1, 1 );
430 
431  TabPressEater *eater = new TabPressEater( this );
432  mStreetTextEdit->installEventFilter( eater );
433 
434  label = new QLabel( i18nc( "<postOfficeBoxLabel>:", "%1:", KABC::Address::postOfficeBoxLabel() ), page );
435  topLayout->addWidget( label, 2 , 0 );
436  mPOBoxEdit = new KLineEdit( page );
437  label->setBuddy( mPOBoxEdit );
438  topLayout->addWidget( mPOBoxEdit, 2, 1 );
439 
440  label = new QLabel( i18nc( "<localityLabel>:", "%1:", KABC::Address::localityLabel() ), page );
441  topLayout->addWidget( label, 3, 0 );
442  mLocalityEdit = new KLineEdit( page );
443  label->setBuddy( mLocalityEdit );
444  topLayout->addWidget( mLocalityEdit, 3, 1 );
445 
446  label = new QLabel( i18nc( "<regionLabel>:", "%1:", KABC::Address::regionLabel() ), page );
447  topLayout->addWidget( label, 4, 0 );
448  mRegionEdit = new KLineEdit( page );
449  label->setBuddy( mRegionEdit );
450  topLayout->addWidget( mRegionEdit, 4, 1 );
451 
452  label = new QLabel( i18nc( "<postalCodeLabel>:", "%1:", KABC::Address::postalCodeLabel() ), page );
453  topLayout->addWidget( label, 5, 0 );
454  mPostalCodeEdit = new KLineEdit( page );
455  label->setBuddy( mPostalCodeEdit );
456  topLayout->addWidget( mPostalCodeEdit, 5, 1 );
457 
458  label = new QLabel( i18nc( "<countryLabel>:", "%1:", KABC::Address::countryLabel() ), page );
459  topLayout->addWidget( label, 6, 0 );
460  mCountryCombo = new KComboBox( page );
461  mCountryCombo->setEditable( true );
462  mCountryCombo->setDuplicatesEnabled( false );
463 
464  QPushButton *labelButton = new QPushButton( i18n( "Edit Label..." ), page );
465  topLayout->addWidget( labelButton, 7, 0, 1, 2 );
466  connect( labelButton, SIGNAL(clicked()), SLOT(editLabel()) );
467 
468  fillCountryCombo();
469  label->setBuddy( mCountryCombo );
470  topLayout->addWidget( mCountryCombo, 6, 1 );
471 
472  mPreferredCheckBox = new QCheckBox( i18nc( "street/postal", "This is the preferred address" ), page );
473  topLayout->addWidget( mPreferredCheckBox, 8, 0, 1, 2 );
474 
475  KHBox *buttonBox = new KHBox( page );
476  buttonBox->setSpacing( spacingHint() );
477  topLayout->addWidget( buttonBox, 9, 0, 1, 2 );
478 
479  KAcceleratorManager::manage( this );
480 }
481 
482 AddressEditDialog::~AddressEditDialog()
483 {
484 }
485 
486 void AddressEditDialog::editLabel()
487 {
488  bool ok = false;
489  QString result = KInputDialog::getMultiLineText( KABC::Address::labelLabel(),
490  KABC::Address::labelLabel(),
491  mLabel, &ok, this );
492  if ( ok ) {
493  mLabel = result;
494  }
495 }
496 
497 void AddressEditDialog::setAddress( const KABC::Address &address )
498 {
499  mAddress = address;
500 
501  mTypeCombo->setType( mAddress.type() );
502  mStreetTextEdit->setPlainText( mAddress.street() );
503  mRegionEdit->setText( mAddress.region() );
504  mLocalityEdit->setText( mAddress.locality() );
505  mPostalCodeEdit->setText( mAddress.postalCode() );
506  mPOBoxEdit->setText( mAddress.postOfficeBox() );
507  mLabel = mAddress.label();
508  mPreferredCheckBox->setChecked( mAddress.type() & KABC::Address::Pref );
509 
510  if ( mAddress.isEmpty() ) {
511  mCountryCombo->setItemText( mCountryCombo->currentIndex(),
512  KGlobal::locale()->countryCodeToName( KGlobal::locale()->country() ) );
513  } else {
514  mCountryCombo->setItemText( mCountryCombo->currentIndex(), mAddress.country() );
515  }
516 
517  mStreetTextEdit->setFocus();
518 }
519 
520 KABC::Address AddressEditDialog::address() const
521 {
522  KABC::Address address( mAddress );
523 
524  address.setType( mTypeCombo->type() );
525  address.setLocality( mLocalityEdit->text() );
526  address.setRegion( mRegionEdit->text() );
527  address.setPostalCode( mPostalCodeEdit->text() );
528  address.setCountry( mCountryCombo->currentText() );
529  address.setPostOfficeBox( mPOBoxEdit->text() );
530  address.setStreet( mStreetTextEdit->toPlainText() );
531  address.setLabel( mLabel );
532 
533  if ( mPreferredCheckBox->isChecked() ) {
534  address.setType( address.type() | KABC::Address::Pref );
535  } else {
536  address.setType( address.type() & ~( KABC::Address::Pref ) );
537  }
538 
539  return address;
540 }
541 
542 void AddressEditDialog::fillCountryCombo()
543 {
544  QStringList countries;
545 
546  foreach ( const QString &cc, KGlobal::locale()->allCountriesList() ) {
547  countries.append( KGlobal::locale()->countryCodeToName( cc ) );
548  }
549 
550  qSort( countries.begin(), countries.end(), LocaleAwareLessThan() );
551 
552  mCountryCombo->addItems( countries );
553  mCountryCombo->setAutoCompletion( true );
554  mCountryCombo->completionObject()->setItems( countries );
555  mCountryCombo->completionObject()->setIgnoreCase( true );
556 
557  const QString currentCountry = KGlobal::locale()->countryCodeToName( KGlobal::locale()->country() );
558  mCountryCombo->setCurrentIndex( mCountryCombo->findText( currentCountry ) );
559 }
560 
561 AddressTypeDialog::AddressTypeDialog( KABC::Address::Type type, QWidget *parent )
562  : KDialog( parent)
563 {
564  setCaption( i18nc( "street/postal", "Edit Address Type" ) );
565  setButtons( Ok | Cancel );
566  setDefaultButton( Ok );
567 
568  QWidget *page = new QWidget( this );
569  setMainWidget( page );
570  QVBoxLayout *layout = new QVBoxLayout( page );
571  layout->setSpacing( KDialog::spacingHint() );
572  layout->setMargin( 0 );
573 
574  QGroupBox *box = new QGroupBox( i18nc( "street/postal", "Address Types" ), page );
575  layout->addWidget( box );
576  mGroup = new QButtonGroup( box );
577  mGroup->setExclusive ( false );
578 
579  QGridLayout *buttonLayout = new QGridLayout( box );
580 
581  mTypeList = KABC::Address::typeList();
582  mTypeList.removeAll( KABC::Address::Pref );
583 
584  KABC::Address::TypeList::ConstIterator it;
585  int i = 0;
586  int row = 0;
587  for ( it = mTypeList.constBegin(); it != mTypeList.constEnd(); ++it, ++i ) {
588  QCheckBox *cb = new QCheckBox( KABC::Address::typeLabel( *it ), box );
589  cb->setChecked( type & mTypeList[ i ] );
590  buttonLayout->addWidget( cb, row, i%3 );
591 
592  if ( i % 3 == 2 ) {
593  ++row;
594  }
595  mGroup->addButton( cb );
596  }
597 }
598 
599 AddressTypeDialog::~AddressTypeDialog()
600 {
601 }
602 
603 KABC::Address::Type AddressTypeDialog::type() const
604 {
605  KABC::Address::Type type;
606  for ( int i = 0; i < mGroup->buttons().count(); ++i ) {
607  QCheckBox *box = dynamic_cast<QCheckBox*>( mGroup->buttons().at( i ) );
608  if ( box && box->isChecked() ) {
609  type |= mTypeList[ i ];
610  }
611  }
612 
613  return type;
614 }
615 
AddressTypeCombo::setType
void setType(KABC::Address::Type type)
Sets the type that shall be selected in the combobox.
Definition: addresseditwidget.cpp:171
AddressSelectionWidget::AddressSelectionWidget
AddressSelectionWidget(QWidget *parent=0)
Creates a new address selection widget.
Definition: addresseditwidget.cpp:104
AddressTypeCombo::AddressTypeCombo
AddressTypeCombo(QWidget *parent=0)
Creates a new address type combo.
Definition: addresseditwidget.cpp:151
AddressSelectionWidget::~AddressSelectionWidget
virtual ~AddressSelectionWidget()
Destroys the address selection widget.
Definition: addresseditwidget.cpp:110
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:167
AutoQPointer
A QPointer which when destructed, deletes the object it points to.
Definition: autoqpointer_p.h:34
AddressTypeCombo::type
KABC::Address::Type type() const
Returns the type that is currently selected.
Definition: addresseditwidget.cpp:182
AddressSelectionWidget::setCurrentAddress
void setCurrentAddress(const KABC::Address &address)
Sets the current address.
Definition: addresseditwidget.cpp:120
AddressSelectionWidget::setAddresses
void setAddresses(const KABC::Address::List &addresses)
Sets the list of addresses that can be chosen from.
Definition: addresseditwidget.cpp:114
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:128
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:00:26 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akonadi

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

kdepimlibs API Reference

Skip menu "kdepimlibs API Reference"
  • akonadi
  •   contact
  •   kmime
  •   socialutils
  • kabc
  • kalarmcal
  • kblog
  • kcal
  • kcalcore
  • kcalutils
  • kholidays
  • kimap
  • kldap
  • kmbox
  • kmime
  • kpimidentities
  • kpimtextedit
  • kresources
  • ktnef
  • kxmlrpcclient
  • microblog

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