22#include "emaileditwidget.h"
24#include "autoqpointer_p.h"
26#include <QtCore/QEvent>
27#include <QtCore/QString>
32#include <kabc/addressee.h>
33#include <kacceleratormanager.h>
34#include <kinputdialog.h>
37#include <klocalizedstring.h>
38#include <kmessagebox.h>
39#include <kpimutils/email.h>
41class EmailAddressExtracter :
public QObject
44 EmailAddressExtracter(KLineEdit *lineEdit)
48 lineEdit->installEventFilter(
this);
51 virtual bool eventFilter(QObject *watched, QEvent *event)
53 if (watched == mLineEdit && event->type() == QEvent::FocusOut) {
54 const QString fullEmailAddress = mLineEdit->text();
55 const QString extractedEmailAddress = KPIMUtils::extractEmailAddress(fullEmailAddress);
56 mLineEdit->setText(extractedEmailAddress);
59 return QObject::eventFilter(watched, event);
66class EmailItem :
public QListWidgetItem
69 EmailItem(
const QString &text, QListWidget *parent,
bool preferred)
70 : QListWidgetItem(text, parent)
71 , mPreferred(preferred)
76 void setEmail(
const KABC::Email &email)
81 KABC::Email email()
const
86 void setPreferred(
bool preferred)
88 mPreferred = preferred;
91 bool preferred()
const
100 f.setBold(mPreferred);
109EmailEditWidget::EmailEditWidget(QWidget *parent)
112 QHBoxLayout *layout =
new QHBoxLayout(
this);
113 layout->setMargin(0);
114 layout->setSpacing(KDialog::spacingHint());
116 mEmailEdit =
new KLineEdit;
117 mEmailEdit->setTrapReturnKey(
true);
118 mEmailEdit->setObjectName(QLatin1String(
"emailedit"));
119 new EmailAddressExtracter(mEmailEdit);
120 connect(mEmailEdit, SIGNAL(textChanged(QString)),
121 SLOT(textChanged(QString)));
122 layout->addWidget(mEmailEdit);
124 mEditButton =
new QToolButton;
125 mEditButton->setObjectName(QLatin1String(
"editbutton"));
126 mEditButton->setText(QLatin1String(
"..."));
127 connect(mEditButton, SIGNAL(clicked()), SLOT(edit()));
128 layout->addWidget(mEditButton);
129 setFocusProxy(mEditButton);
130 setFocusPolicy(Qt::StrongFocus);
133EmailEditWidget::~EmailEditWidget()
137void EmailEditWidget::setReadOnly(
bool readOnly)
139 mEmailEdit->setReadOnly(readOnly);
140 mEditButton->setEnabled(!readOnly);
143void EmailEditWidget::loadContact(
const KABC::Addressee &contact)
145 mList = contact.emailList();
147 if (mList.isEmpty()) {
148 mEmailEdit->setText(QString());
150 mEmailEdit->setText(mList.first().mail());
154void EmailEditWidget::storeContact(KABC::Addressee &contact)
const
156 contact.setEmailList(mList);
159void EmailEditWidget::edit()
161 AutoQPointer<EmailEditDialog> dlg =
new EmailEditDialog(
this);
162 dlg->setEmailList(mList);
164 if (dlg->changed()) {
165 mList = dlg->emailList();
166 if (!mList.isEmpty()) {
167 mEmailEdit->setText(mList.first().mail());
169 mEmailEdit->setText(QString());
175void EmailEditWidget::textChanged(
const QString &text)
177 if (mList.isEmpty()) {
178 mList.append(KABC::Email(text));
180 mList.first().setEmail(text);
184EmailEditDialog::EmailEditDialog(QWidget *parent)
187 setCaption(i18n(
"Edit Email Addresses"));
188 setButtons(KDialog::Ok | KDialog::Cancel);
189 setDefaultButton(KDialog::Cancel);
191 QWidget *page =
new QWidget(
this);
194 QGridLayout *topLayout =
new QGridLayout(page);
195 topLayout->setSpacing(spacingHint());
196 topLayout->setMargin(0);
198 mEmailListBox =
new KListWidget(page);
199 mEmailListBox->setObjectName(QLatin1String(
"emailListBox"));
200 mEmailListBox->setSelectionMode(QAbstractItemView::SingleSelection);
203 mEmailListBox->setMinimumHeight(mEmailListBox->sizeHint().height() + 30);
204 connect(mEmailListBox, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
205 SLOT(selectionChanged()));
206 connect(mEmailListBox, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
208 topLayout->addWidget(mEmailListBox, 0, 0, 5, 2);
210 mAddButton =
new QPushButton(i18n(
"Add..."), page);
211 mAddButton->setObjectName(QLatin1String(
"add"));
212 connect(mAddButton, SIGNAL(clicked()), SLOT(add()));
213 topLayout->addWidget(mAddButton, 0, 2);
215 mEditButton =
new QPushButton(i18n(
"Edit..."), page);
216 mEditButton->setObjectName(QLatin1String(
"edit"));
217 mEditButton->setEnabled(
false);
218 connect(mEditButton, SIGNAL(clicked()), SLOT(edit()));
219 topLayout->addWidget(mEditButton, 1, 2);
221 mRemoveButton =
new QPushButton(i18n(
"Remove"), page);
222 mRemoveButton->setObjectName(QLatin1String(
"remove"));
223 mRemoveButton->setEnabled(
false);
224 connect(mRemoveButton, SIGNAL(clicked()), SLOT(remove()));
225 topLayout->addWidget(mRemoveButton, 2, 2);
227 mStandardButton =
new QPushButton(i18n(
"Set as Standard"), page);
228 mStandardButton->setObjectName(QLatin1String(
"standard"));
229 mStandardButton->setEnabled(
false);
230 connect(mStandardButton, SIGNAL(clicked()), SLOT(standard()));
231 topLayout->addWidget(mStandardButton, 3, 2);
233 topLayout->setRowStretch(4, 1);
236 KAcceleratorManager::manage(
this);
241EmailEditDialog::~EmailEditDialog()
246void EmailEditDialog::readConfig()
248 KConfigGroup group(KGlobal::config(),
"EmailEditDialog");
249 const QSize sizeDialog = group.readEntry(
"Size", QSize(400, 200));
250 if (sizeDialog.isValid()) {
255void EmailEditDialog::writeConfig()
257 KConfigGroup group(KGlobal::config(),
"EmailEditDialog");
258 group.writeEntry(
"Size", size());
261KABC::Email::List EmailEditDialog::emailList()
const
263 KABC::Email::List lst;
265 for (
int i = 0; i < mEmailListBox->count(); ++i) {
266 EmailItem *item =
static_cast<EmailItem *
>(mEmailListBox->item(i));
267 KABC::Email email = item->email();
268 email.setEmail(item->text());
269 if (item->preferred()) {
281void EmailEditDialog::add()
285 QString email = KInputDialog::getText(i18n(
"Add Email"), i18n(
"New Email:"),
286 QString(), &ok,
this);
292 email = KPIMUtils::extractEmailAddress(email.toLower());
295 for (
int i = 0; i < mEmailListBox->count(); ++i) {
296 if (mEmailListBox->item(i)->text() == email) {
301 new EmailItem(email, mEmailListBox, (mEmailListBox->count() == 0));
306void EmailEditDialog::edit()
310 QListWidgetItem *item = mEmailListBox->currentItem();
312 QString email = KInputDialog::getText(i18n(
"Edit Email"),
313 i18nc(
"@label:textbox Inputfield for an email address",
"Email:"),
314 item->text(), &ok,
this);
320 email = KPIMUtils::extractEmailAddress(email.toLower());
323 for (
int i = 0; i < mEmailListBox->count(); ++i) {
324 if (mEmailListBox->item(i)->text() == email) {
329 EmailItem *eitem =
static_cast<EmailItem *
>(item);
330 eitem->setText(email);
335void EmailEditDialog::remove()
337 const QString address = mEmailListBox->currentItem()->text();
339 const QString text = i18n(
"<qt>Are you sure that you want to remove the email address <b>%1</b>?</qt>", address);
340 const QString caption = i18n(
"Confirm Remove");
342 if (KMessageBox::warningContinueCancel(
this, text, caption, KGuiItem(i18n(
"&Delete"), QLatin1String(
"edit-delete"))) == KMessageBox::Continue) {
343 EmailItem *item =
static_cast<EmailItem *
>(mEmailListBox->currentItem());
345 const bool preferred = item->preferred();
346 mEmailListBox->takeItem(mEmailListBox->currentRow());
348 item =
dynamic_cast<EmailItem *
>(mEmailListBox->item(0));
350 item->setPreferred(
true);
358bool EmailEditDialog::changed()
const
363void EmailEditDialog::setEmailList(
const KABC::Email::List &list)
366 bool preferred =
true;
367 Q_FOREACH(
const KABC::Email &email, list) {
368 if (!emails.contains(email.mail())) {
369 EmailItem *emailItem =
new EmailItem(email.mail(), mEmailListBox, preferred);
370 emailItem->setEmail(email);
371 emails << email.mail();
377void EmailEditDialog::standard()
379 for (
int i = 0; i < mEmailListBox->count(); ++i) {
380 EmailItem *item =
static_cast<EmailItem *
>(mEmailListBox->item(i));
381 if (i == mEmailListBox->currentRow()) {
382 item->setPreferred(
true);
384 item->setPreferred(
false);
391void EmailEditDialog::selectionChanged()
393 const int index = mEmailListBox->currentRow();
394 const bool value = (index >= 0);
396 mRemoveButton->setEnabled(value);
397 mEditButton->setEnabled(value);
398 mStandardButton->setEnabled(value);