22#include "addresseditwidget.h"
24#include "autoqpointer_p.h"
26#include <QtCore/QEvent>
27#include <QtCore/QList>
28#include <QApplication>
29#include <QButtonGroup>
38#include <kacceleratormanager.h>
42#include <kinputdialog.h>
45#include <klocalizedstring.h>
47#include <kmessagebox.h>
48#include <kseparator.h>
53struct LocaleAwareLessThan : std::binary_function<QString, QString, bool> {
54 bool operator()(
const QString &s1,
const QString &s2)
const
56 return QString::localeAwareCompare(s1, s2) < 0 ;
60class TabPressEater :
public QObject
63 TabPressEater(QObject *parent)
66 setObjectName(QLatin1String(
"TabPressEater"));
70 bool eventFilter(QObject *, QEvent *event)
72 if (event->type() == QEvent::KeyPress) {
73 QKeyEvent *keyEvent = (QKeyEvent *)event;
74 if (keyEvent->key() == Qt::Key_Tab) {
75 QApplication::sendEvent(parent(), event);
91class AddressTypeDialog :
public KDialog
94 AddressTypeDialog(KABC::Address::Type type, QWidget *parent);
97 KABC::Address::Type type()
const;
100 QButtonGroup *mGroup;
102 KABC::Address::TypeList mTypeList;
108 connect(
this, SIGNAL(activated(
int)), SLOT(selected(
int)));
117 mAddresses = addresses;
123 const int index = mAddresses.indexOf(address);
125 setCurrentIndex(index);
131 if (currentIndex() != -1 && currentIndex() < mAddresses.count()) {
132 return mAddresses.at(currentIndex());
134 return KABC::Address();
138void AddressSelectionWidget::selected(
int index)
140 Q_ASSERT(index != -1 && index < mAddresses.count());
144void AddressSelectionWidget::updateView()
147 for (
int i = 0; i < mAddresses.count(); ++i) {
148 addItem(KABC::Address::typeLabel(mAddresses.at(i).type()));
154 , mType(KABC::Address::Home)
157 for (
int i = 0; i < KABC::Address::typeList().count(); ++i) {
158 mTypeList.append(KABC::Address::typeList().at(i));
160 mTypeList.append(-1);
164 connect(
this, SIGNAL(activated(
int)),
165 this, SLOT(selected(
int)));
174 if (!mTypeList.contains((
int)
type)) {
176 mTypeList.insert(mTypeList.at(mTypeList.count() - 1), (
int)
type);
188void AddressTypeCombo::update()
190 bool blocked = signalsBlocked();
194 for (
int i = 0; i < mTypeList.count(); ++i) {
195 if (mTypeList.at(i) == -1) {
196 addItem(i18nc(
"@item:inlistbox Category of contact info field",
"Other..."));
198 addItem(KABC::Address::typeLabel(KABC::Address::Type(mTypeList.at(i))));
202 setCurrentIndex(mLastSelected = mTypeList.indexOf(mType));
204 blockSignals(blocked);
207void AddressTypeCombo::selected(
int pos)
209 if (mTypeList.at(pos) == -1) {
212 mType = KABC::Address::Type(mTypeList.at(pos));
217void AddressTypeCombo::otherSelected()
222 if (!mTypeList.contains(mType)) {
223 mTypeList.insert(mTypeList.at(mTypeList.count() - 1), mType);
226 setType(KABC::Address::Type(mTypeList.at(mLastSelected)));
232AddressEditWidget::AddressEditWidget(QWidget *parent)
236 QGridLayout *layout =
new QGridLayout;
237 layout->setSpacing(KDialog::spacingHint());
238 layout->setMargin(0);
240 QHBoxLayout *hboxLayout =
new QHBoxLayout;
241 QLabel *label =
new QLabel(i18nc(
"@label:listbox type of address",
"Address type:"),
this);
242 hboxLayout->addWidget(label);
245 connect(mAddressSelectionWidget, SIGNAL(selectionChanged(KABC::Address)),
246 SLOT(updateAddressView()));
247 label->setBuddy(mAddressSelectionWidget);
248 hboxLayout->addWidget(mAddressSelectionWidget, 1);
249 layout->addLayout(hboxLayout, 0, 0, 1, 3);
251 mAddressView =
new QLabel(
this);
252 mAddressView->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
253 mAddressView->setMinimumHeight(20);
254 mAddressView->setAlignment(Qt::AlignTop);
255 mAddressView->setTextFormat(Qt::PlainText);
256 mAddressView->setTextInteractionFlags(Qt::TextSelectableByKeyboard | Qt::TextSelectableByMouse);
257 layout->addWidget(mAddressView, 1, 0, 1, 3);
259 mCreateButton =
new QPushButton(i18nc(
"@action:button street/postal",
"New..."),
this);
260 connect(mCreateButton, SIGNAL(clicked()),
this, SLOT(createAddress()));
261 mEditButton =
new QPushButton(i18nc(
"@action:button street/postal",
"Edit..."),
this);
262 connect(mEditButton, SIGNAL(clicked()),
this, SLOT(editAddress()));
263 mDeleteButton =
new QPushButton(i18nc(
"@action:button street/postal",
"Delete"),
this);
264 connect(mDeleteButton, SIGNAL(clicked()),
this, SLOT(deleteAddress()));
266 layout->addWidget(mCreateButton, 2, 0);
267 layout->addWidget(mEditButton, 2, 1);
268 layout->addWidget(mDeleteButton, 2, 2);
273AddressEditWidget::~AddressEditWidget()
277void AddressEditWidget::setReadOnly(
bool readOnly)
279 if (mReadOnly != readOnly) {
280 mReadOnly = readOnly;
285void AddressEditWidget::updateName(
const QString &name)
293void AddressEditWidget::createAddress()
296 if (dialog->exec()) {
297 const KABC::Address address = dialog->address();
298 fixPreferredAddress(address);
299 mAddressList.append(address);
308void AddressEditWidget::editAddress()
312 if (dialog->exec()) {
313 const KABC::Address address = dialog->address();
314 fixPreferredAddress(address);
315 mAddressList[mAddressSelectionWidget->currentIndex()] = address;
323void AddressEditWidget::deleteAddress()
325 const int result = KMessageBox::questionYesNo(
this, i18n(
"Do you really want to delete this address?"));
327 if (result != KMessageBox::Yes) {
331 mAddressList.removeAt(mAddressSelectionWidget->currentIndex());
337void AddressEditWidget::fixPreferredAddress(
const KABC::Address &preferredAddress)
341 if (preferredAddress.type() &KABC::Address::Pref) {
342 for (
int i = 0; i < mAddressList.count(); ++i) {
343 KABC::Address &address = mAddressList[i];
344 address.setType(address.type() &~KABC::Address::Pref);
349void AddressEditWidget::updateAddressView()
351 const KABC::Address address = mAddressSelectionWidget->
currentAddress();
353 if (address.isEmpty()) {
354 mAddressView->setText(QString());
356 mAddressView->setText(address.formattedAddress(mName));
360void AddressEditWidget::updateButtons()
362 mCreateButton->setEnabled(!mReadOnly);
363 mEditButton->setEnabled(!mReadOnly && (mAddressList.count() > 0));
364 mDeleteButton->setEnabled(!mReadOnly && (mAddressList.count() > 0));
367void AddressEditWidget::loadContact(
const KABC::Addressee &contact)
369 mName = contact.realName();
370 mAddressList = contact.addresses();
375 for (
int i = 0; i < mAddressList.count(); ++i) {
376 if (mAddressList.at(i).type() &KABC::Address::Pref) {
386void AddressEditWidget::storeContact(KABC::Addressee &contact)
const
389 const KABC::Address::List oldAddresses = contact.addresses();
390 for (
int i = 0; i < oldAddresses.count(); ++i) {
391 contact.removeAddress(oldAddresses.at(i));
395 for (
int i = 0; i < mAddressList.count(); ++i) {
396 const KABC::Address address(mAddressList.at(i));
397 if (!address.isEmpty()) {
398 contact.insertAddress(address);
403AddressEditDialog::AddressEditDialog(QWidget *parent)
406 setCaption(i18nc(
"street/postal",
"Edit Address"));
407 setButtons(Ok | Cancel);
408 setDefaultButton(Ok);
409 showButtonSeparator(
true);
411 QWidget *page =
new QWidget(
this);
414 QGridLayout *topLayout =
new QGridLayout(page);
415 topLayout->setSpacing(spacingHint());
416 topLayout->setMargin(0);
418 QLabel *label =
new QLabel(i18nc(
"@label:listbox type of address",
"Address type:"),
this);
419 topLayout->addWidget(label, 0, 0);
422 label->setBuddy(mTypeCombo);
423 topLayout->addWidget(mTypeCombo, 0, 1);
425 label =
new QLabel(i18nc(
"<streetLabel>:",
"%1:", KABC::Address::streetLabel()), page);
426 label->setAlignment(Qt::AlignTop | Qt::AlignLeft);
427 topLayout->addWidget(label, 1, 0);
428 mStreetTextEdit =
new KTextEdit(page);
429 mStreetTextEdit->setAcceptRichText(
false);
430 label->setBuddy(mStreetTextEdit);
431 topLayout->addWidget(mStreetTextEdit, 1, 1);
433 TabPressEater *eater =
new TabPressEater(
this);
434 mStreetTextEdit->installEventFilter(eater);
436 label =
new QLabel(i18nc(
"<postOfficeBoxLabel>:",
"%1:", KABC::Address::postOfficeBoxLabel()), page);
437 topLayout->addWidget(label, 2 , 0);
438 mPOBoxEdit =
new KLineEdit(page);
439 mPOBoxEdit->setTrapReturnKey(
true);
440 label->setBuddy(mPOBoxEdit);
441 topLayout->addWidget(mPOBoxEdit, 2, 1);
443 label =
new QLabel(i18nc(
"<localityLabel>:",
"%1:", KABC::Address::localityLabel()), page);
444 topLayout->addWidget(label, 3, 0);
445 mLocalityEdit =
new KLineEdit(page);
446 mLocalityEdit->setTrapReturnKey(
true);
447 label->setBuddy(mLocalityEdit);
448 topLayout->addWidget(mLocalityEdit, 3, 1);
450 label =
new QLabel(i18nc(
"<regionLabel>:",
"%1:", KABC::Address::regionLabel()), page);
451 topLayout->addWidget(label, 4, 0);
452 mRegionEdit =
new KLineEdit(page);
453 mRegionEdit->setTrapReturnKey(
true);
454 label->setBuddy(mRegionEdit);
455 topLayout->addWidget(mRegionEdit, 4, 1);
457 label =
new QLabel(i18nc(
"<postalCodeLabel>:",
"%1:", KABC::Address::postalCodeLabel()), page);
458 topLayout->addWidget(label, 5, 0);
459 mPostalCodeEdit =
new KLineEdit(page);
460 mPostalCodeEdit->setTrapReturnKey(
true);
461 label->setBuddy(mPostalCodeEdit);
462 topLayout->addWidget(mPostalCodeEdit, 5, 1);
464 label =
new QLabel(i18nc(
"<countryLabel>:",
"%1:", KABC::Address::countryLabel()), page);
465 topLayout->addWidget(label, 6, 0);
466 mCountryCombo =
new KComboBox(page);
467 mCountryCombo->setEditable(
true);
468 mCountryCombo->setDuplicatesEnabled(
false);
470 QPushButton *labelButton =
new QPushButton(i18n(
"Edit Label..."), page);
471 topLayout->addWidget(labelButton, 7, 0, 1, 2);
472 connect(labelButton, SIGNAL(clicked()), SLOT(editLabel()));
475 label->setBuddy(mCountryCombo);
476 topLayout->addWidget(mCountryCombo, 6, 1);
478 mPreferredCheckBox =
new QCheckBox(i18nc(
"street/postal",
"This is the preferred address"), page);
479 topLayout->addWidget(mPreferredCheckBox, 8, 0, 1, 2);
481 KHBox *buttonBox =
new KHBox(page);
482 buttonBox->setSpacing(spacingHint());
483 topLayout->addWidget(buttonBox, 9, 0, 1, 2);
485 KAcceleratorManager::manage(
this);
488AddressEditDialog::~AddressEditDialog()
492void AddressEditDialog::editLabel()
495 QString result = KInputDialog::getMultiLineText(KABC::Address::labelLabel(),
496 KABC::Address::labelLabel(),
503void AddressEditDialog::setAddress(
const KABC::Address &address)
507 mTypeCombo->
setType(mAddress.type());
508 mStreetTextEdit->setPlainText(mAddress.street());
509 mRegionEdit->setText(mAddress.region());
510 mLocalityEdit->setText(mAddress.locality());
511 mPostalCodeEdit->setText(mAddress.postalCode());
512 mPOBoxEdit->setText(mAddress.postOfficeBox());
513 mLabel = mAddress.label();
514 mPreferredCheckBox->setChecked(mAddress.type() &KABC::Address::Pref);
516 if (mAddress.isEmpty()) {
517 mCountryCombo->setItemText(mCountryCombo->currentIndex(),
518 KGlobal::locale()->countryCodeToName(KGlobal::locale()->country()));
520 mCountryCombo->setItemText(mCountryCombo->currentIndex(), mAddress.country());
523 mStreetTextEdit->setFocus();
526KABC::Address AddressEditDialog::address()
const
528 KABC::Address address(mAddress);
530 address.setType(mTypeCombo->
type());
531 address.setLocality(mLocalityEdit->text());
532 address.setRegion(mRegionEdit->text());
533 address.setPostalCode(mPostalCodeEdit->text());
534 address.setCountry(mCountryCombo->currentText());
535 address.setPostOfficeBox(mPOBoxEdit->text());
536 address.setStreet(mStreetTextEdit->toPlainText());
537 address.setLabel(mLabel);
539 if (mPreferredCheckBox->isChecked()) {
540 address.setType(address.type() | KABC::Address::Pref);
542 address.setType(address.type() &~(KABC::Address::Pref));
548void AddressEditDialog::fillCountryCombo()
550 QStringList countries;
552 foreach (
const QString &cc, KGlobal::locale()->allCountriesList()) {
553 countries.append(KGlobal::locale()->countryCodeToName(cc));
556 qSort(countries.begin(), countries.end(), LocaleAwareLessThan());
558 mCountryCombo->addItems(countries);
559 mCountryCombo->setAutoCompletion(
true);
560 mCountryCombo->completionObject()->setItems(countries);
561 mCountryCombo->completionObject()->setIgnoreCase(
true);
563 const QString currentCountry = KGlobal::locale()->countryCodeToName(KGlobal::locale()->country());
564 mCountryCombo->setCurrentIndex(mCountryCombo->findText(currentCountry));
567AddressTypeDialog::AddressTypeDialog(KABC::Address::Type type, QWidget *parent)
570 setCaption(i18nc(
"street/postal",
"Edit Address Type"));
571 setButtons(Ok | Cancel);
572 setDefaultButton(Ok);
574 QWidget *page =
new QWidget(
this);
576 QVBoxLayout *layout =
new QVBoxLayout(page);
577 layout->setSpacing(KDialog::spacingHint());
578 layout->setMargin(0);
580 QGroupBox *box =
new QGroupBox(i18nc(
"street/postal",
"Address Types"), page);
581 layout->addWidget(box);
582 mGroup =
new QButtonGroup(box);
583 mGroup->setExclusive(
false);
585 QGridLayout *buttonLayout =
new QGridLayout(box);
587 mTypeList = KABC::Address::typeList();
588 mTypeList.removeAll(KABC::Address::Pref);
590 KABC::Address::TypeList::ConstIterator it;
593 for (it = mTypeList.constBegin(); it != mTypeList.constEnd(); ++it, ++i) {
594 QCheckBox *cb =
new QCheckBox(KABC::Address::typeLabel(*it), box);
595 cb->setChecked(
type &mTypeList[i]);
596 buttonLayout->addWidget(cb, row, i % 3);
601 mGroup->addButton(cb);
605AddressTypeDialog::~AddressTypeDialog()
609KABC::Address::Type AddressTypeDialog::type()
const
611 KABC::Address::Type type;
612 for (
int i = 0; i < mGroup->buttons().count(); ++i) {
613 QCheckBox *box =
dynamic_cast<QCheckBox *
>(mGroup->buttons().at(i));
614 if (box && box->isChecked()) {
615 type |= mTypeList[i];
Dialog for editing address details.
KABC::Address::Type type() const
Returns the type that is currently selected.
AddressTypeCombo(QWidget *parent=0)
Creates a new address type combo.
void setType(KABC::Address::Type type)
Sets the type that shall be selected in the combobox.
~AddressTypeCombo()
Destroys the address type combo.
A QPointer which when destructed, deletes the object it points to.