22 #include "emaileditwidget.h" 24 #include "autoqpointer_p.h" 26 #include <QtCore/QEvent> 27 #include <QtCore/QString> 28 #include <QGridLayout> 29 #include <QPushButton> 30 #include <QToolButton> 32 #include <kabc/addressee.h> 33 #include <kacceleratormanager.h> 34 #include <kinputdialog.h> 35 #include <klineedit.h> 36 #include <KListWidget> 37 #include <klocalizedstring.h> 38 #include <kmessagebox.h> 39 #include <kpimutils/email.h> 41 class 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);
66 class EmailItem :
public QListWidgetItem
69 EmailItem(
const QString &text, QListWidget *parent,
bool preferred)
70 : QListWidgetItem(text, parent)
71 , mPreferred(preferred)
76 void setPreferred(
bool preferred)
78 mPreferred = preferred;
81 bool preferred()
const 90 f.setBold(mPreferred);
98 EmailEditWidget::EmailEditWidget(QWidget *parent)
101 QHBoxLayout *layout =
new QHBoxLayout(
this);
102 layout->setMargin(0);
103 layout->setSpacing(KDialog::spacingHint());
105 mEmailEdit =
new KLineEdit;
106 new EmailAddressExtracter(mEmailEdit);
107 connect(mEmailEdit, SIGNAL(textChanged(QString)),
108 SLOT(textChanged(QString)));
109 layout->addWidget(mEmailEdit);
111 mEditButton =
new QToolButton;
112 mEditButton->setText(QLatin1String(
"..."));
113 connect(mEditButton, SIGNAL(clicked()), SLOT(edit()));
114 layout->addWidget(mEditButton);
115 setFocusProxy(mEditButton);
116 setFocusPolicy(Qt::StrongFocus);
119 EmailEditWidget::~EmailEditWidget()
123 void EmailEditWidget::setReadOnly(
bool readOnly)
125 mEmailEdit->setReadOnly(readOnly);
126 mEditButton->setEnabled(!readOnly);
129 void EmailEditWidget::loadContact(
const KABC::Addressee &contact)
131 mEmailList = contact.emails();
133 if (!mEmailList.isEmpty()) {
134 mEmailEdit->setText(mEmailList.first());
136 mEmailEdit->setText(QString());
140 void EmailEditWidget::storeContact(KABC::Addressee &contact)
const 142 QStringList emails(mEmailList);
145 if (!emails.isEmpty()) {
146 emails.removeFirst();
150 if (!mEmailEdit->text().isEmpty()) {
151 emails.prepend(mEmailEdit->text().toLower());
154 contact.setEmails(emails);
157 void EmailEditWidget::edit()
162 if (dlg->changed()) {
163 mEmailList = dlg->emails();
164 if (!mEmailList.isEmpty()) {
165 mEmailEdit->setText(mEmailList.first());
167 mEmailEdit->setText(QString());
173 void EmailEditWidget::textChanged(
const QString &text)
175 if (!mEmailList.isEmpty()) {
176 mEmailList.removeFirst();
179 mEmailList.prepend(text);
182 EmailEditDialog::EmailEditDialog(
const QStringList &list, QWidget *parent)
185 setCaption(i18n(
"Edit Email Addresses"));
186 setButtons(KDialog::Ok | KDialog::Cancel);
187 setDefaultButton(KDialog::Cancel);
189 QWidget *page =
new QWidget(
this);
192 QGridLayout *topLayout =
new QGridLayout(page);
193 topLayout->setSpacing(spacingHint());
194 topLayout->setMargin(0);
196 mEmailListBox =
new KListWidget(page);
197 mEmailListBox->setSelectionMode(QAbstractItemView::SingleSelection);
200 mEmailListBox->setMinimumHeight(mEmailListBox->sizeHint().height() + 30);
201 connect(mEmailListBox, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
202 SLOT(selectionChanged()));
203 connect(mEmailListBox, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
205 topLayout->addWidget(mEmailListBox, 0, 0, 5, 2);
207 mAddButton =
new QPushButton(i18n(
"Add..."), page);
208 connect(mAddButton, SIGNAL(clicked()), SLOT(add()));
209 topLayout->addWidget(mAddButton, 0, 2);
211 mEditButton =
new QPushButton(i18n(
"Edit..."), page);
212 mEditButton->setEnabled(
false);
213 connect(mEditButton, SIGNAL(clicked()), SLOT(edit()));
214 topLayout->addWidget(mEditButton, 1, 2);
216 mRemoveButton =
new QPushButton(i18n(
"Remove"), page);
217 mRemoveButton->setEnabled(
false);
218 connect(mRemoveButton, SIGNAL(clicked()), SLOT(
remove()));
219 topLayout->addWidget(mRemoveButton, 2, 2);
221 mStandardButton =
new QPushButton(i18n(
"Set as Standard"), page);
222 mStandardButton->setEnabled(
false);
223 connect(mStandardButton, SIGNAL(clicked()), SLOT(standard()));
224 topLayout->addWidget(mStandardButton, 3, 2);
226 topLayout->setRowStretch(4, 1);
228 QStringList items = list;
229 if (items.removeAll(QLatin1String(
"")) > 0) {
235 QStringList::ConstIterator it;
236 bool preferred =
true;
237 QStringList::ConstIterator end(items.constEnd());
238 for (it = items.constBegin(); it != end; ++it) {
239 new EmailItem(*it, mEmailListBox, preferred);
244 KAcceleratorManager::manage(
this);
249 EmailEditDialog::~EmailEditDialog()
254 void EmailEditDialog::readConfig()
256 KConfigGroup group(KGlobal::config(),
"EmailEditDialog");
257 const QSize sizeDialog = group.readEntry(
"Size", QSize(400, 200));
258 if (sizeDialog.isValid()) {
263 void EmailEditDialog::writeConfig()
265 KConfigGroup group(KGlobal::config(),
"EmailEditDialog");
266 group.writeEntry(
"Size", size());
269 QStringList EmailEditDialog::emails()
const 273 for (
int i = 0; i < mEmailListBox->count(); ++i) {
274 EmailItem *item =
static_cast<EmailItem *
>(mEmailListBox->item(i));
275 if (item->preferred()) {
276 emails.prepend(item->text());
278 emails.append(item->text());
285 void EmailEditDialog::add()
289 QString email = KInputDialog::getText(i18n(
"Add Email"), i18n(
"New Email:"),
290 QString(), &ok,
this);
296 email = KPIMUtils::extractEmailAddress(email.toLower());
299 for (
int i = 0; i < mEmailListBox->count(); ++i) {
300 if (mEmailListBox->item(i)->text() == email) {
305 new EmailItem(email, mEmailListBox, (mEmailListBox->count() == 0));
310 void EmailEditDialog::edit()
314 QListWidgetItem *item = mEmailListBox->currentItem();
316 QString email = KInputDialog::getText(i18n(
"Edit Email"),
317 i18nc(
"@label:textbox Inputfield for an email address",
"Email:"),
318 item->text(), &ok,
this);
324 email = KPIMUtils::extractEmailAddress(email.toLower());
327 for (
int i = 0; i < mEmailListBox->count(); ++i) {
328 if (mEmailListBox->item(i)->text() == email) {
333 EmailItem *eitem =
static_cast<EmailItem *
>(item);
334 eitem->setText(email);
339 void EmailEditDialog::remove()
341 const QString address = mEmailListBox->currentItem()->text();
343 const QString text = i18n(
"<qt>Are you sure that you want to remove the email address <b>%1</b>?</qt>", address);
344 const QString caption = i18n(
"Confirm Remove");
346 if (KMessageBox::warningContinueCancel(
this, text, caption, KGuiItem(i18n(
"&Delete"), QLatin1String(
"edit-delete"))) == KMessageBox::Continue) {
347 EmailItem *item =
static_cast<EmailItem *
>(mEmailListBox->currentItem());
349 const bool preferred = item->preferred();
350 mEmailListBox->takeItem(mEmailListBox->currentRow());
352 item =
dynamic_cast<EmailItem *
>(mEmailListBox->item(0));
354 item->setPreferred(
true);
362 bool EmailEditDialog::changed()
const 367 void EmailEditDialog::standard()
369 for (
int i = 0; i < mEmailListBox->count(); ++i) {
370 EmailItem *item =
static_cast<EmailItem *
>(mEmailListBox->item(i));
371 if (i == mEmailListBox->currentRow()) {
372 item->setPreferred(
true);
374 item->setPreferred(
false);
381 void EmailEditDialog::selectionChanged()
383 int index = mEmailListBox->currentRow();
384 bool value = (index >= 0);
386 mRemoveButton->setEnabled(value);
387 mEditButton->setEnabled(value);
388 mStandardButton->setEnabled(value);
A QPointer which when destructed, deletes the object it points to.