22 #include "emaileditwidget.h"
24 #include "autoqpointer_p.h"
26 #include <QtCore/QEvent>
27 #include <QtCore/QString>
28 #include <QtGui/QCheckBox>
29 #include <QtGui/QGridLayout>
30 #include <QtGui/QLabel>
31 #include <QtGui/QPushButton>
32 #include <QtGui/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 );
65 bool mIgnoreFocusOutEvent;
68 class EmailItem :
public QListWidgetItem
71 EmailItem(
const QString &text, QListWidget *parent,
bool preferred )
72 : QListWidgetItem( text, parent ), mPreferred( preferred )
77 void setPreferred(
bool preferred ) { mPreferred = preferred; format(); }
78 bool preferred()
const {
return mPreferred; }
84 f.setBold( mPreferred );
92 EmailEditWidget::EmailEditWidget( QWidget *parent )
95 QHBoxLayout *layout =
new QHBoxLayout(
this );
96 layout->setMargin( 0 );
97 layout->setSpacing( KDialog::spacingHint() );
99 mEmailEdit =
new KLineEdit;
100 new EmailAddressExtracter( mEmailEdit );
101 connect( mEmailEdit, SIGNAL(textChanged(QString)),
102 SLOT(textChanged(QString)) );
103 layout->addWidget( mEmailEdit );
105 mEditButton =
new QToolButton;
106 mEditButton->setText( QLatin1String(
"..." ) );
107 connect( mEditButton, SIGNAL(clicked()), SLOT(edit()) );
108 layout->addWidget( mEditButton );
111 EmailEditWidget::~EmailEditWidget()
115 void EmailEditWidget::setReadOnly(
bool readOnly )
117 mEmailEdit->setReadOnly( readOnly );
118 mEditButton->setEnabled( !readOnly );
121 void EmailEditWidget::loadContact(
const KABC::Addressee &contact )
123 mEmailList = contact.emails();
125 if ( !mEmailList.isEmpty() )
126 mEmailEdit->setText( mEmailList.first() );
128 mEmailEdit->setText( QString() );
131 void EmailEditWidget::storeContact( KABC::Addressee &contact )
const
133 QStringList emails( mEmailList );
136 if ( !emails.isEmpty() )
137 emails.removeFirst();
140 if ( !mEmailEdit->text().isEmpty() )
141 emails.prepend( mEmailEdit->text() );
143 contact.setEmails( emails );
146 void EmailEditWidget::edit()
151 if ( dlg->changed() ) {
152 mEmailList = dlg->emails();
153 if ( !mEmailList.isEmpty() )
154 mEmailEdit->setText( mEmailList.first() );
156 mEmailEdit->setText( QString() );
161 void EmailEditWidget::textChanged(
const QString &text )
163 if ( !mEmailList.isEmpty() )
164 mEmailList.removeFirst();
166 mEmailList.prepend( text );
170 EmailEditDialog::EmailEditDialog(
const QStringList &list, QWidget *parent )
173 setCaption( i18n(
"Edit Email Addresses" ) );
174 setButtons( KDialog::Ok | KDialog::Cancel );
175 setDefaultButton( KDialog::Cancel );
177 QWidget *page =
new QWidget(
this);
178 setMainWidget( page );
180 QGridLayout *topLayout =
new QGridLayout( page );
181 topLayout->setSpacing( spacingHint() );
182 topLayout->setMargin( 0 );
184 mEmailListBox =
new KListWidget( page );
185 mEmailListBox->setSelectionMode( QAbstractItemView::SingleSelection );
188 mEmailListBox->setMinimumHeight( mEmailListBox->sizeHint().height() + 30 );
189 connect( mEmailListBox, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
190 SLOT(selectionChanged()) );
191 connect( mEmailListBox, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
193 topLayout->addWidget( mEmailListBox, 0, 0, 5, 2 );
195 mAddButton =
new QPushButton( i18n(
"Add..." ), page );
196 connect( mAddButton, SIGNAL(clicked()), SLOT(add()) );
197 topLayout->addWidget( mAddButton, 0, 2 );
199 mEditButton =
new QPushButton( i18n(
"Edit..." ), page );
200 mEditButton->setEnabled(
false );
201 connect( mEditButton, SIGNAL(clicked()), SLOT(edit()) );
202 topLayout->addWidget( mEditButton, 1, 2 );
204 mRemoveButton =
new QPushButton( i18n(
"Remove" ), page );
205 mRemoveButton->setEnabled(
false );
206 connect( mRemoveButton, SIGNAL(clicked()), SLOT(
remove()) );
207 topLayout->addWidget( mRemoveButton, 2, 2 );
209 mStandardButton =
new QPushButton( i18n(
"Set as Standard" ), page );
210 mStandardButton->setEnabled(
false );
211 connect( mStandardButton, SIGNAL(clicked()), SLOT(standard()) );
212 topLayout->addWidget( mStandardButton, 3, 2 );
214 topLayout->setRowStretch( 4, 1 );
216 QStringList items = list;
217 if ( items.removeAll( QLatin1String(
"" ) ) > 0 )
222 QStringList::ConstIterator it;
223 bool preferred =
true;
224 for ( it = items.constBegin(); it != items.constEnd(); ++it ) {
225 new EmailItem( *it, mEmailListBox, preferred );
230 KAcceleratorManager::manage(
this );
232 setInitialSize( QSize( 400, 200 ) );
235 EmailEditDialog::~EmailEditDialog()
239 QStringList EmailEditDialog::emails()
const
243 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
244 EmailItem *item =
static_cast<EmailItem*
>( mEmailListBox->item( i ) );
245 if ( item->preferred() )
246 emails.prepend( item->text() );
248 emails.append( item->text() );
254 void EmailEditDialog::add()
258 QString email = KInputDialog::getText( i18n(
"Add Email" ), i18n(
"New Email:" ),
259 QString(), &ok,
this );
264 email = KPIMUtils::extractEmailAddress( email );
267 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
268 if ( mEmailListBox->item( i )->text() == email )
272 new EmailItem( email, mEmailListBox, (mEmailListBox->count() == 0) );
277 void EmailEditDialog::edit()
281 QListWidgetItem *item = mEmailListBox->currentItem();
283 QString email = KInputDialog::getText( i18n(
"Edit Email" ),
284 i18nc(
"@label:textbox Inputfield for an email address",
"Email:" ),
285 item->text(), &ok, this );
290 email = KPIMUtils::extractEmailAddress( email );
293 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
294 if ( mEmailListBox->item( i )->text() == email )
298 EmailItem *eitem =
static_cast<EmailItem*
>( item );
299 eitem->setText( email );
304 void EmailEditDialog::remove()
306 const QString address = mEmailListBox->currentItem()->text();
308 const QString text = i18n(
"<qt>Are you sure that you want to remove the email address <b>%1</b>?</qt>", address );
309 const QString caption = i18n(
"Confirm Remove" );
311 if ( KMessageBox::warningContinueCancel(
this, text, caption, KGuiItem( i18n(
"&Delete" ), QLatin1String(
"edit-delete" ) ) ) == KMessageBox::Continue ) {
312 EmailItem *item =
static_cast<EmailItem*
>( mEmailListBox->currentItem() );
314 const bool preferred = item->preferred();
315 mEmailListBox->takeItem( mEmailListBox->currentRow() );
317 item =
dynamic_cast<EmailItem*
>( mEmailListBox->item( 0 ) );
319 item->setPreferred(
true );
326 bool EmailEditDialog::changed()
const
331 void EmailEditDialog::standard()
333 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
334 EmailItem *item =
static_cast<EmailItem*
>( mEmailListBox->item( i ) );
335 if ( i == mEmailListBox->currentRow() )
336 item->setPreferred(
true );
338 item->setPreferred(
false );
344 void EmailEditDialog::selectionChanged()
346 int index = mEmailListBox->currentRow();
347 bool value = ( index >= 0 );
349 mRemoveButton->setEnabled( value );
350 mEditButton->setEnabled( value );
351 mStandardButton->setEnabled( value );
354 #include "emaileditwidget.moc"