22 #include "emaileditwidget.h"
24 #include "autoqpointer_p.h"
26 #include <QtCore/QEvent>
27 #include <QtCore/QString>
29 #include <QGridLayout>
31 #include <QPushButton>
32 #include <QToolButton>
34 #include <kabc/addressee.h>
35 #include <kacceleratormanager.h>
36 #include <kinputdialog.h>
37 #include <klineedit.h>
38 #include <KListWidget>
40 #include <kmessagebox.h>
41 #include <kpimutils/email.h>
43 class EmailAddressExtracter :
public QObject
46 EmailAddressExtracter( KLineEdit *lineEdit )
47 : QObject( lineEdit ), mLineEdit( lineEdit )
49 lineEdit->installEventFilter(
this );
52 virtual bool eventFilter( QObject *watched, QEvent *event )
54 if ( watched == mLineEdit && event->type() == QEvent::FocusOut ) {
55 const QString fullEmailAddress = mLineEdit->text();
56 const QString extractedEmailAddress = KPIMUtils::extractEmailAddress( fullEmailAddress );
57 mLineEdit->setText( extractedEmailAddress );
60 return QObject::eventFilter( watched, event );
67 class EmailItem :
public QListWidgetItem
70 EmailItem(
const QString &text, QListWidget *parent,
bool preferred )
71 : QListWidgetItem( text, parent ), mPreferred( preferred )
76 void setPreferred(
bool preferred ) { mPreferred = preferred; format(); }
77 bool preferred()
const {
return mPreferred; }
83 f.setBold( mPreferred );
91 EmailEditWidget::EmailEditWidget( QWidget *parent )
94 QHBoxLayout *layout =
new QHBoxLayout(
this );
95 layout->setMargin( 0 );
96 layout->setSpacing( KDialog::spacingHint() );
98 mEmailEdit =
new KLineEdit;
99 new EmailAddressExtracter( mEmailEdit );
100 connect( mEmailEdit, SIGNAL(textChanged(QString)),
101 SLOT(textChanged(QString)) );
102 layout->addWidget( mEmailEdit );
104 mEditButton =
new QToolButton;
105 mEditButton->setText( QLatin1String(
"..." ) );
106 connect( mEditButton, SIGNAL(clicked()), SLOT(edit()) );
107 layout->addWidget( mEditButton );
110 EmailEditWidget::~EmailEditWidget()
114 void EmailEditWidget::setReadOnly(
bool readOnly )
116 mEmailEdit->setReadOnly( readOnly );
117 mEditButton->setEnabled( !readOnly );
120 void EmailEditWidget::loadContact(
const KABC::Addressee &contact )
122 mEmailList = contact.emails();
124 if ( !mEmailList.isEmpty() ) {
125 mEmailEdit->setText( mEmailList.first() );
127 mEmailEdit->setText( QString() );
131 void EmailEditWidget::storeContact( KABC::Addressee &contact )
const
133 QStringList emails( mEmailList );
136 if ( !emails.isEmpty() ) {
137 emails.removeFirst();
141 if ( !mEmailEdit->text().isEmpty() ) {
142 emails.prepend( mEmailEdit->text().toLower() );
145 contact.setEmails( emails );
148 void EmailEditWidget::edit()
153 if ( dlg->changed() ) {
154 mEmailList = dlg->emails();
155 if ( !mEmailList.isEmpty() ) {
156 mEmailEdit->setText( mEmailList.first() );
158 mEmailEdit->setText( QString() );
164 void EmailEditWidget::textChanged(
const QString &text )
166 if ( !mEmailList.isEmpty() ) {
167 mEmailList.removeFirst();
170 mEmailList.prepend( text );
174 EmailEditDialog::EmailEditDialog(
const QStringList &list, QWidget *parent )
177 setCaption( i18n(
"Edit Email Addresses" ) );
178 setButtons( KDialog::Ok | KDialog::Cancel );
179 setDefaultButton( KDialog::Cancel );
181 QWidget *page =
new QWidget(
this );
182 setMainWidget( page );
184 QGridLayout *topLayout =
new QGridLayout( page );
185 topLayout->setSpacing( spacingHint() );
186 topLayout->setMargin( 0 );
188 mEmailListBox =
new KListWidget( page );
189 mEmailListBox->setSelectionMode( QAbstractItemView::SingleSelection );
192 mEmailListBox->setMinimumHeight( mEmailListBox->sizeHint().height() + 30 );
193 connect( mEmailListBox, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
194 SLOT(selectionChanged()) );
195 connect( mEmailListBox, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
197 topLayout->addWidget( mEmailListBox, 0, 0, 5, 2 );
199 mAddButton =
new QPushButton( i18n(
"Add..." ), page );
200 connect( mAddButton, SIGNAL(clicked()), SLOT(add()) );
201 topLayout->addWidget( mAddButton, 0, 2 );
203 mEditButton =
new QPushButton( i18n(
"Edit..." ), page );
204 mEditButton->setEnabled(
false );
205 connect( mEditButton, SIGNAL(clicked()), SLOT(edit()) );
206 topLayout->addWidget( mEditButton, 1, 2 );
208 mRemoveButton =
new QPushButton( i18n(
"Remove" ), page );
209 mRemoveButton->setEnabled(
false );
210 connect( mRemoveButton, SIGNAL(clicked()), SLOT(
remove()) );
211 topLayout->addWidget( mRemoveButton, 2, 2 );
213 mStandardButton =
new QPushButton( i18n(
"Set as Standard" ), page );
214 mStandardButton->setEnabled(
false );
215 connect( mStandardButton, SIGNAL(clicked()), SLOT(standard()) );
216 topLayout->addWidget( mStandardButton, 3, 2 );
218 topLayout->setRowStretch( 4, 1 );
220 QStringList items = list;
221 if ( items.removeAll( QLatin1String(
"" ) ) > 0 ) {
227 QStringList::ConstIterator it;
228 bool preferred =
true;
229 for ( it = items.constBegin(); it != items.constEnd(); ++it ) {
230 new EmailItem( *it, mEmailListBox, preferred );
235 KAcceleratorManager::manage(
this );
237 setInitialSize( QSize( 400, 200 ) );
240 EmailEditDialog::~EmailEditDialog()
244 QStringList EmailEditDialog::emails()
const
248 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
249 EmailItem *item =
static_cast<EmailItem*
>( mEmailListBox->item( i ) );
250 if ( item->preferred() ) {
251 emails.prepend( item->text() );
253 emails.append( item->text() );
260 void EmailEditDialog::add()
264 QString email = KInputDialog::getText( i18n(
"Add Email" ), i18n(
"New Email:" ),
265 QString(), &ok,
this );
271 email = KPIMUtils::extractEmailAddress( email.toLower() );
274 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
275 if ( mEmailListBox->item( i )->text() == email ) {
280 new EmailItem( email, mEmailListBox, ( mEmailListBox->count() == 0 ) );
285 void EmailEditDialog::edit()
289 QListWidgetItem *item = mEmailListBox->currentItem();
291 QString email = KInputDialog::getText( i18n(
"Edit Email" ),
292 i18nc(
"@label:textbox Inputfield for an email address",
"Email:" ),
293 item->text(), &ok, this );
299 email = KPIMUtils::extractEmailAddress( email.toLower() );
302 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
303 if ( mEmailListBox->item( i )->text() == email ) {
308 EmailItem *eitem =
static_cast<EmailItem*
>( item );
309 eitem->setText( email );
314 void EmailEditDialog::remove()
316 const QString address = mEmailListBox->currentItem()->text();
318 const QString text = i18n(
"<qt>Are you sure that you want to remove the email address <b>%1</b>?</qt>", address );
319 const QString caption = i18n(
"Confirm Remove" );
321 if ( KMessageBox::warningContinueCancel(
this, text, caption, KGuiItem( i18n(
"&Delete" ), QLatin1String(
"edit-delete" ) ) ) == KMessageBox::Continue ) {
322 EmailItem *item =
static_cast<EmailItem*
>( mEmailListBox->currentItem() );
324 const bool preferred = item->preferred();
325 mEmailListBox->takeItem( mEmailListBox->currentRow() );
327 item =
dynamic_cast<EmailItem*
>( mEmailListBox->item( 0 ) );
329 item->setPreferred(
true );
337 bool EmailEditDialog::changed()
const
342 void EmailEditDialog::standard()
344 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
345 EmailItem *item =
static_cast<EmailItem*
>( mEmailListBox->item( i ) );
346 if ( i == mEmailListBox->currentRow() ) {
347 item->setPreferred(
true );
349 item->setPreferred(
false );
356 void EmailEditDialog::selectionChanged()
358 int index = mEmailListBox->currentRow();
359 bool value = ( index >= 0 );
361 mRemoveButton->setEnabled( value );
362 mEditButton->setEnabled( value );
363 mStandardButton->setEnabled( value );