22 #include "emaileditwidget.h"
24 #include "autoqpointer_p.h"
26 #include <QtCore/QEvent>
27 #include <QtCore/QString>
28 #include <QGridLayout>
30 #include <QPushButton>
31 #include <QToolButton>
33 #include <kabc/addressee.h>
34 #include <kacceleratormanager.h>
35 #include <kinputdialog.h>
36 #include <klineedit.h>
37 #include <KListWidget>
38 #include <klocalizedstring.h>
39 #include <kmessagebox.h>
40 #include <kpimutils/email.h>
42 class EmailAddressExtracter :
public QObject
45 EmailAddressExtracter( KLineEdit *lineEdit )
46 : QObject( lineEdit ), mLineEdit( 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 ), mPreferred( preferred )
75 void setPreferred(
bool preferred ) { mPreferred = preferred; format(); }
76 bool preferred()
const {
return mPreferred; }
82 f.setBold( mPreferred );
90 EmailEditWidget::EmailEditWidget( QWidget *parent )
93 QHBoxLayout *layout =
new QHBoxLayout(
this );
94 layout->setMargin( 0 );
95 layout->setSpacing( KDialog::spacingHint() );
97 mEmailEdit =
new KLineEdit;
98 new EmailAddressExtracter( mEmailEdit );
99 connect( mEmailEdit, SIGNAL(textChanged(QString)),
100 SLOT(textChanged(QString)) );
101 layout->addWidget( mEmailEdit );
103 mEditButton =
new QToolButton;
104 mEditButton->setText( QLatin1String(
"..." ) );
105 connect( mEditButton, SIGNAL(clicked()), SLOT(edit()) );
106 layout->addWidget( mEditButton );
109 EmailEditWidget::~EmailEditWidget()
113 void EmailEditWidget::setReadOnly(
bool readOnly )
115 mEmailEdit->setReadOnly( readOnly );
116 mEditButton->setEnabled( !readOnly );
119 void EmailEditWidget::loadContact(
const KABC::Addressee &contact )
121 mEmailList = contact.emails();
123 if ( !mEmailList.isEmpty() ) {
124 mEmailEdit->setText( mEmailList.first() );
126 mEmailEdit->setText( QString() );
130 void EmailEditWidget::storeContact( KABC::Addressee &contact )
const
132 QStringList emails( mEmailList );
135 if ( !emails.isEmpty() ) {
136 emails.removeFirst();
140 if ( !mEmailEdit->text().isEmpty() ) {
141 emails.prepend( mEmailEdit->text().toLower() );
144 contact.setEmails( emails );
147 void EmailEditWidget::edit()
152 if ( dlg->changed() ) {
153 mEmailList = dlg->emails();
154 if ( !mEmailList.isEmpty() ) {
155 mEmailEdit->setText( mEmailList.first() );
157 mEmailEdit->setText( QString() );
163 void EmailEditWidget::textChanged(
const QString &text )
165 if ( !mEmailList.isEmpty() ) {
166 mEmailList.removeFirst();
169 mEmailList.prepend( text );
173 EmailEditDialog::EmailEditDialog(
const QStringList &list, QWidget *parent )
176 setCaption( i18n(
"Edit Email Addresses" ) );
177 setButtons( KDialog::Ok | KDialog::Cancel );
178 setDefaultButton( KDialog::Cancel );
180 QWidget *page =
new QWidget(
this );
181 setMainWidget( page );
183 QGridLayout *topLayout =
new QGridLayout( page );
184 topLayout->setSpacing( spacingHint() );
185 topLayout->setMargin( 0 );
187 mEmailListBox =
new KListWidget( page );
188 mEmailListBox->setSelectionMode( QAbstractItemView::SingleSelection );
191 mEmailListBox->setMinimumHeight( mEmailListBox->sizeHint().height() + 30 );
192 connect( mEmailListBox, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)),
193 SLOT(selectionChanged()) );
194 connect( mEmailListBox, SIGNAL(itemDoubleClicked(QListWidgetItem*)),
196 topLayout->addWidget( mEmailListBox, 0, 0, 5, 2 );
198 mAddButton =
new QPushButton( i18n(
"Add..." ), page );
199 connect( mAddButton, SIGNAL(clicked()), SLOT(add()) );
200 topLayout->addWidget( mAddButton, 0, 2 );
202 mEditButton =
new QPushButton( i18n(
"Edit..." ), page );
203 mEditButton->setEnabled(
false );
204 connect( mEditButton, SIGNAL(clicked()), SLOT(edit()) );
205 topLayout->addWidget( mEditButton, 1, 2 );
207 mRemoveButton =
new QPushButton( i18n(
"Remove" ), page );
208 mRemoveButton->setEnabled(
false );
209 connect( mRemoveButton, SIGNAL(clicked()), SLOT(
remove()) );
210 topLayout->addWidget( mRemoveButton, 2, 2 );
212 mStandardButton =
new QPushButton( i18n(
"Set as Standard" ), page );
213 mStandardButton->setEnabled(
false );
214 connect( mStandardButton, SIGNAL(clicked()), SLOT(standard()) );
215 topLayout->addWidget( mStandardButton, 3, 2 );
217 topLayout->setRowStretch( 4, 1 );
219 QStringList items = list;
220 if ( items.removeAll( QLatin1String(
"" ) ) > 0 ) {
226 QStringList::ConstIterator it;
227 bool preferred =
true;
228 for ( it = items.constBegin(); it != items.constEnd(); ++it ) {
229 new EmailItem( *it, mEmailListBox, preferred );
234 KAcceleratorManager::manage(
this );
239 EmailEditDialog::~EmailEditDialog()
244 void EmailEditDialog::readConfig()
246 KConfigGroup group( KGlobal::config(),
"EmailEditDialog" );
247 const QSize sizeDialog = group.readEntry(
"Size", QSize(400,200) );
248 if ( sizeDialog.isValid() ) {
249 resize( sizeDialog );
253 void EmailEditDialog::writeConfig()
255 KConfigGroup group( KGlobal::config(),
"EmailEditDialog" );
256 group.writeEntry(
"Size", size() );
259 QStringList EmailEditDialog::emails()
const
263 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
264 EmailItem *item =
static_cast<EmailItem*
>( mEmailListBox->item( i ) );
265 if ( item->preferred() ) {
266 emails.prepend( item->text() );
268 emails.append( item->text() );
275 void EmailEditDialog::add()
279 QString email = KInputDialog::getText( i18n(
"Add Email" ), i18n(
"New Email:" ),
280 QString(), &ok,
this );
286 email = KPIMUtils::extractEmailAddress( email.toLower() );
289 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
290 if ( mEmailListBox->item( i )->text() == email ) {
295 new EmailItem( email, mEmailListBox, ( mEmailListBox->count() == 0 ) );
300 void EmailEditDialog::edit()
304 QListWidgetItem *item = mEmailListBox->currentItem();
306 QString email = KInputDialog::getText( i18n(
"Edit Email" ),
307 i18nc(
"@label:textbox Inputfield for an email address",
"Email:" ),
308 item->text(), &ok, this );
314 email = KPIMUtils::extractEmailAddress( email.toLower() );
317 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
318 if ( mEmailListBox->item( i )->text() == email ) {
323 EmailItem *eitem =
static_cast<EmailItem*
>( item );
324 eitem->setText( email );
329 void EmailEditDialog::remove()
331 const QString address = mEmailListBox->currentItem()->text();
333 const QString text = i18n(
"<qt>Are you sure that you want to remove the email address <b>%1</b>?</qt>", address );
334 const QString caption = i18n(
"Confirm Remove" );
336 if ( KMessageBox::warningContinueCancel(
this, text, caption, KGuiItem( i18n(
"&Delete" ), QLatin1String(
"edit-delete" ) ) ) == KMessageBox::Continue ) {
337 EmailItem *item =
static_cast<EmailItem*
>( mEmailListBox->currentItem() );
339 const bool preferred = item->preferred();
340 mEmailListBox->takeItem( mEmailListBox->currentRow() );
342 item =
dynamic_cast<EmailItem*
>( mEmailListBox->item( 0 ) );
344 item->setPreferred(
true );
352 bool EmailEditDialog::changed()
const
357 void EmailEditDialog::standard()
359 for (
int i = 0; i < mEmailListBox->count(); ++i ) {
360 EmailItem *item =
static_cast<EmailItem*
>( mEmailListBox->item( i ) );
361 if ( i == mEmailListBox->currentRow() ) {
362 item->setPreferred(
true );
364 item->setPreferred(
false );
371 void EmailEditDialog::selectionChanged()
373 int index = mEmailListBox->currentRow();
374 bool value = ( index >= 0 );
376 mRemoveButton->setEnabled( value );
377 mEditButton->setEnabled( value );
378 mStandardButton->setEnabled( value );
A QPointer which when destructed, deletes the object it points to.