22 #include "addresseditwidget.h"
24 #include "autoqpointer_p.h"
26 #include <QtCore/QEvent>
27 #include <QtCore/QList>
28 #include <QtGui/QApplication>
29 #include <QtGui/QBoxLayout>
30 #include <QtGui/QButtonGroup>
31 #include <QtGui/QCheckBox>
32 #include <QtGui/QFrame>
33 #include <QtGui/QGridLayout>
34 #include <QtGui/QGroupBox>
35 #include <QtGui/QKeyEvent>
36 #include <QtGui/QLabel>
37 #include <QtGui/QPushButton>
39 #include <kacceleratormanager.h>
40 #include <kcombobox.h>
43 #include <kinputdialog.h>
44 #include <klineedit.h>
46 #include <kmessagebox.h>
47 #include <kseparator.h>
48 #include <ktextedit.h>
52 struct LocaleAwareLessThan : std::binary_function<QString,QString,bool> {
53 bool operator()(
const QString &s1,
const QString &s2 )
const
55 return QString::localeAwareCompare( s1, s2 ) < 0 ;
59 class TabPressEater :
public QObject
62 TabPressEater( QObject *parent )
65 setObjectName( QLatin1String(
"TabPressEater" ) );
69 bool eventFilter( QObject*, QEvent *event )
71 if ( event->type() == QEvent::KeyPress ) {
72 QKeyEvent *keyEvent = (QKeyEvent*)event;
73 if ( keyEvent->key() == Qt::Key_Tab ) {
74 QApplication::sendEvent( parent(), event );
89 class AddressTypeDialog :
public KDialog
92 AddressTypeDialog( KABC::Address::Type type, QWidget *parent );
95 KABC::Address::Type type()
const;
100 KABC::Address::TypeList mTypeList;
105 : KComboBox( parent )
107 connect(
this, SIGNAL(activated(
int)), SLOT(selected(
int)) );
116 mAddresses = addresses;
122 const int index = mAddresses.indexOf( address );
124 setCurrentIndex( index );
129 if ( currentIndex() != -1 && currentIndex() < mAddresses.count() )
130 return mAddresses.at( currentIndex() );
132 return KABC::Address();
135 void AddressSelectionWidget::selected(
int index )
137 Q_ASSERT( index != -1 && index < mAddresses.count() );
141 void AddressSelectionWidget::updateView()
144 for (
int i = 0; i < mAddresses.count(); ++i )
145 addItem( KABC::Address::typeLabel( mAddresses.at( i ).type() ) );
151 : KComboBox( parent ),
152 mType( KABC::Address::Home ),
155 for (
int i = 0; i < KABC::Address::typeList().count(); ++i )
156 mTypeList.append( KABC::Address::typeList().at( i ) );
157 mTypeList.append( -1 );
161 connect(
this, SIGNAL(activated(
int)),
162 this, SLOT(selected(
int)) );
171 if ( !mTypeList.contains( (
int)type ) ) {
173 mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), (
int)
type );
185 void AddressTypeCombo::update()
187 bool blocked = signalsBlocked();
188 blockSignals(
true );
191 for (
int i = 0; i < mTypeList.count(); ++i ) {
192 if ( mTypeList.at( i ) == -1 )
193 addItem( i18nc(
"@item:inlistbox Category of contact info field",
"Other..." ) );
195 addItem( KABC::Address::typeLabel( KABC::Address::Type( mTypeList.at( i ) ) ) );
198 setCurrentIndex( mLastSelected = mTypeList.indexOf( mType ) );
200 blockSignals( blocked );
203 void AddressTypeCombo::selected(
int pos )
205 if ( mTypeList.at( pos ) == -1 )
208 mType = KABC::Address::Type( mTypeList.at( pos ) );
213 void AddressTypeCombo::otherSelected()
218 if ( !mTypeList.contains( mType ) )
219 mTypeList.insert( mTypeList.at( mTypeList.count() - 1 ), mType );
221 setType( KABC::Address::Type( mTypeList.at( mLastSelected ) ) );
228 AddressEditWidget::AddressEditWidget( QWidget *parent )
229 : QWidget( parent ), mReadOnly( false )
231 QGridLayout *layout =
new QGridLayout(
this );
232 layout->setSpacing( KDialog::spacingHint() );
233 layout->setMargin( 0 );
236 connect( mAddressSelectionWidget, SIGNAL(selectionChanged(KABC::Address)),
237 SLOT(updateAddressView()) );
238 layout->addWidget( mAddressSelectionWidget, 0, 0, 1, 3 );
240 mAddressView =
new QLabel(
this );
241 mAddressView->setFrameStyle( QFrame::Panel | QFrame::Sunken );
242 mAddressView->setMinimumHeight( 20 );
243 mAddressView->setAlignment( Qt::AlignTop );
244 mAddressView->setTextFormat( Qt::PlainText );
245 mAddressView->setTextInteractionFlags( Qt::TextSelectableByKeyboard | Qt::TextSelectableByMouse );
246 layout->addWidget( mAddressView, 1, 0, 1, 3 );
248 mCreateButton =
new QPushButton( i18nc(
"street/postal",
"New..." ),
this );
249 connect( mCreateButton, SIGNAL(clicked()),
this, SLOT(createAddress()) );
250 mEditButton =
new QPushButton( i18nc(
"street/postal",
"Edit..." ),
this );
251 connect( mEditButton, SIGNAL(clicked()),
this, SLOT(editAddress()) );
252 mDeleteButton =
new QPushButton( i18nc(
"street/postal",
"Delete" ),
this );
253 connect( mDeleteButton, SIGNAL(clicked()),
this, SLOT(deleteAddress()) );
255 layout->addWidget( mCreateButton, 2, 0 );
256 layout->addWidget( mEditButton, 2, 1 );
257 layout->addWidget( mDeleteButton, 2, 2 );
262 AddressEditWidget::~AddressEditWidget()
266 void AddressEditWidget::setReadOnly(
bool readOnly )
268 mReadOnly = readOnly;
272 void AddressEditWidget::updateName(
const QString &name )
278 void AddressEditWidget::createAddress()
281 if ( dialog->exec() ) {
282 const KABC::Address address = dialog->address();
283 fixPreferredAddress( address );
284 mAddressList.append( address );
293 void AddressEditWidget::editAddress()
297 if ( dialog->exec() ) {
298 const KABC::Address address = dialog->address();
299 fixPreferredAddress( address );
300 mAddressList[ mAddressSelectionWidget->currentIndex() ] = address;
308 void AddressEditWidget::deleteAddress()
310 const int result = KMessageBox::questionYesNo(
this, i18n(
"Do you really want to delete this address?" ) );
312 if ( result != KMessageBox::Yes )
315 mAddressList.removeAt( mAddressSelectionWidget->currentIndex() );
321 void AddressEditWidget::fixPreferredAddress(
const KABC::Address &preferredAddress )
325 if ( preferredAddress.type() & KABC::Address::Pref ) {
326 for (
int i = 0; i < mAddressList.count(); ++i ) {
327 KABC::Address &address = mAddressList[ i ];
328 address.setType( address.type() & ~KABC::Address::Pref );
333 void AddressEditWidget::updateAddressView()
335 const KABC::Address address = mAddressSelectionWidget->
currentAddress();
337 if ( address.isEmpty() )
338 mAddressView->setText( QString() );
340 mAddressView->setText( address.formattedAddress( mName ) );
343 void AddressEditWidget::updateButtons()
345 mCreateButton->setEnabled( !mReadOnly );
346 mEditButton->setEnabled( !mReadOnly && (mAddressList.count() > 0) );
347 mDeleteButton->setEnabled( !mReadOnly && (mAddressList.count() > 0) );
350 void AddressEditWidget::loadContact(
const KABC::Addressee &contact )
352 mName = contact.realName();
353 mAddressList = contact.addresses();
358 for (
int i = 0; i < mAddressList.count(); ++i ) {
359 if ( mAddressList.at( i ).type() & KABC::Address::Pref ) {
369 void AddressEditWidget::storeContact( KABC::Addressee &contact )
const
372 const KABC::Address::List oldAddresses = contact.addresses();
373 for (
int i = 0; i < oldAddresses.count(); ++i )
374 contact.removeAddress( oldAddresses.at( i ) );
377 for (
int i = 0; i < mAddressList.count(); ++i ) {
378 const KABC::Address address( mAddressList.at( i ) );
379 if ( !address.isEmpty() )
380 contact.insertAddress( address );
385 AddressEditDialog::AddressEditDialog( QWidget *parent )
388 setCaption( i18nc(
"street/postal",
"Edit Address" ) );
389 setButtons( Ok | Cancel );
390 setDefaultButton( Ok );
391 showButtonSeparator(
true );
393 QWidget *page =
new QWidget(
this );
394 setMainWidget( page );
396 QGridLayout *topLayout =
new QGridLayout( page );
397 topLayout->setSpacing( spacingHint() );
398 topLayout->setMargin( 0 );
401 topLayout->addWidget( mTypeCombo, 0, 0, 1, 2 );
403 QLabel *label =
new QLabel( i18nc(
"<streetLabel>:",
"%1:", KABC::Address::streetLabel() ), page );
404 label->setAlignment( Qt::AlignTop | Qt::AlignLeft );
405 topLayout->addWidget( label, 1, 0 );
406 mStreetTextEdit =
new KTextEdit( page );
407 mStreetTextEdit->setAcceptRichText(
false );
408 label->setBuddy( mStreetTextEdit );
409 topLayout->addWidget( mStreetTextEdit, 1, 1 );
411 TabPressEater *eater =
new TabPressEater(
this );
412 mStreetTextEdit->installEventFilter( eater );
414 label =
new QLabel( i18nc(
"<postOfficeBoxLabel>:",
"%1:", KABC::Address::postOfficeBoxLabel() ), page );
415 topLayout->addWidget( label, 2 , 0 );
416 mPOBoxEdit =
new KLineEdit( page );
417 label->setBuddy( mPOBoxEdit );
418 topLayout->addWidget( mPOBoxEdit, 2, 1 );
420 label =
new QLabel( i18nc(
"<localityLabel>:",
"%1:", KABC::Address::localityLabel() ), page );
421 topLayout->addWidget( label, 3, 0 );
422 mLocalityEdit =
new KLineEdit( page );
423 label->setBuddy( mLocalityEdit );
424 topLayout->addWidget( mLocalityEdit, 3, 1 );
426 label =
new QLabel( i18nc(
"<regionLabel>:",
"%1:", KABC::Address::regionLabel() ), page );
427 topLayout->addWidget( label, 4, 0 );
428 mRegionEdit =
new KLineEdit( page );
429 label->setBuddy( mRegionEdit );
430 topLayout->addWidget( mRegionEdit, 4, 1 );
432 label =
new QLabel( i18nc(
"<postalCodeLabel>:",
"%1:", KABC::Address::postalCodeLabel() ), page );
433 topLayout->addWidget( label, 5, 0 );
434 mPostalCodeEdit =
new KLineEdit( page );
435 label->setBuddy( mPostalCodeEdit );
436 topLayout->addWidget( mPostalCodeEdit, 5, 1 );
438 label =
new QLabel( i18nc(
"<countryLabel>:",
"%1:", KABC::Address::countryLabel() ), page );
439 topLayout->addWidget( label, 6, 0 );
440 mCountryCombo =
new KComboBox( page );
441 mCountryCombo->setEditable(
true );
442 mCountryCombo->setDuplicatesEnabled(
false );
444 QPushButton *labelButton =
new QPushButton( i18n(
"Edit Label..." ), page );
445 topLayout->addWidget( labelButton, 7, 0, 1, 2 );
446 connect( labelButton, SIGNAL(clicked()), SLOT(editLabel()) );
449 label->setBuddy( mCountryCombo );
450 topLayout->addWidget( mCountryCombo, 6, 1 );
452 mPreferredCheckBox =
new QCheckBox( i18nc(
"street/postal",
"This is the preferred address" ), page );
453 topLayout->addWidget( mPreferredCheckBox, 8, 0, 1, 2 );
455 KSeparator *sep =
new KSeparator( Qt::Horizontal, page );
456 topLayout->addWidget( sep, 9, 0, 1, 2 );
458 KHBox *buttonBox =
new KHBox( page );
459 buttonBox->setSpacing( spacingHint() );
460 topLayout->addWidget( buttonBox, 10, 0, 1, 2 );
462 KAcceleratorManager::manage(
this );
465 AddressEditDialog::~AddressEditDialog()
469 void AddressEditDialog::editLabel()
472 QString result = KInputDialog::getMultiLineText( KABC::Address::labelLabel(),
473 KABC::Address::labelLabel(),
479 void AddressEditDialog::setAddress(
const KABC::Address &address )
483 mTypeCombo->
setType( mAddress.type() );
484 mStreetTextEdit->setPlainText( mAddress.street() );
485 mRegionEdit->setText( mAddress.region() );
486 mLocalityEdit->setText( mAddress.locality() );
487 mPostalCodeEdit->setText( mAddress.postalCode() );
488 mPOBoxEdit->setText( mAddress.postOfficeBox() );
489 mLabel = mAddress.label();
490 mPreferredCheckBox->setChecked( mAddress.type() & KABC::Address::Pref );
492 if ( mAddress.isEmpty() )
493 mCountryCombo->setItemText( mCountryCombo->currentIndex(),
494 KGlobal::locale()->countryCodeToName( KGlobal::locale()->country() ) );
496 mCountryCombo->setItemText( mCountryCombo->currentIndex(), mAddress.country() );
498 mStreetTextEdit->setFocus();
501 KABC::Address AddressEditDialog::address()
const
503 KABC::Address address( mAddress );
505 address.setType( mTypeCombo->
type() );
506 address.setLocality( mLocalityEdit->text() );
507 address.setRegion( mRegionEdit->text() );
508 address.setPostalCode( mPostalCodeEdit->text() );
509 address.setCountry( mCountryCombo->currentText() );
510 address.setPostOfficeBox( mPOBoxEdit->text() );
511 address.setStreet( mStreetTextEdit->toPlainText() );
512 address.setLabel( mLabel );
514 if ( mPreferredCheckBox->isChecked() ) {
515 address.setType( address.type() | KABC::Address::Pref );
517 address.setType( address.type() & ~(KABC::Address::Pref) );
522 void AddressEditDialog::fillCountryCombo()
524 QStringList countries;
526 foreach (
const QString &cc, KGlobal::locale()->allCountriesList() )
527 countries.append( KGlobal::locale()->countryCodeToName( cc ) );
529 qSort( countries.begin(), countries.end(), LocaleAwareLessThan() );
531 mCountryCombo->addItems( countries );
532 mCountryCombo->setAutoCompletion(
true );
533 mCountryCombo->completionObject()->setItems( countries );
534 mCountryCombo->completionObject()->setIgnoreCase(
true );
536 const QString currentCountry = KGlobal::locale()->countryCodeToName( KGlobal::locale()->country() );
537 mCountryCombo->setCurrentIndex( mCountryCombo->findText( currentCountry ) );
541 AddressTypeDialog::AddressTypeDialog( KABC::Address::Type type, QWidget *parent )
544 setCaption( i18nc(
"street/postal",
"Edit Address Type" ) );
545 setButtons( Ok | Cancel );
546 setDefaultButton( Ok );
548 QWidget *page =
new QWidget(
this);
549 setMainWidget( page );
550 QVBoxLayout *layout =
new QVBoxLayout( page );
551 layout->setSpacing( KDialog::spacingHint() );
552 layout->setMargin( 0 );
554 QGroupBox *box =
new QGroupBox( i18nc(
"street/postal",
"Address Types" ), page );
555 layout->addWidget( box );
556 mGroup =
new QButtonGroup( box );
557 mGroup->setExclusive (
false );
559 QGridLayout *buttonLayout =
new QGridLayout( box );
561 mTypeList = KABC::Address::typeList();
562 mTypeList.removeAll( KABC::Address::Pref );
564 KABC::Address::TypeList::ConstIterator it;
567 for ( it = mTypeList.constBegin(); it != mTypeList.constEnd(); ++it, ++i ) {
568 QCheckBox *cb =
new QCheckBox( KABC::Address::typeLabel( *it ), box );
569 cb->setChecked( type & mTypeList[ i ] );
570 buttonLayout->addWidget( cb, row, i%3 );
574 mGroup->addButton( cb );
578 AddressTypeDialog::~AddressTypeDialog()
582 KABC::Address::Type AddressTypeDialog::type()
const
584 KABC::Address::Type type;
585 for (
int i = 0; i < mGroup->buttons().count(); ++i ) {
586 QCheckBox *box =
dynamic_cast<QCheckBox*
>( mGroup->buttons().at( i ) );
587 if ( box && box->isChecked() )
588 type |= mTypeList[ i ];
594 #include "addresseditwidget.moc"