00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "emaileditwidget.h"
00023
00024 #include "autoqpointer_p.h"
00025
00026 #include <QtCore/QEvent>
00027 #include <QtCore/QString>
00028 #include <QtGui/QCheckBox>
00029 #include <QtGui/QGridLayout>
00030 #include <QtGui/QLabel>
00031 #include <QtGui/QPushButton>
00032 #include <QtGui/QToolButton>
00033
00034 #include <kabc/addressee.h>
00035 #include <kacceleratormanager.h>
00036 #include <kinputdialog.h>
00037 #include <klineedit.h>
00038 #include <KListWidget>
00039 #include <klocale.h>
00040 #include <kmessagebox.h>
00041 #include <kpimutils/email.h>
00042
00043 class EmailAddressExtracter : public QObject
00044 {
00045 public:
00046 EmailAddressExtracter( QLineEdit *lineEdit )
00047 : QObject( lineEdit ), mLineEdit( lineEdit )
00048 {
00049 lineEdit->installEventFilter( this );
00050 }
00051
00052 virtual bool eventFilter( QObject *watched, QEvent *event )
00053 {
00054 if ( watched == mLineEdit && event->type() == QEvent::FocusOut ) {
00055 const QString fullEmailAddress = mLineEdit->text();
00056 const QString extractedEmailAddress = KPIMUtils::extractEmailAddress( fullEmailAddress );
00057 mLineEdit->setText( extractedEmailAddress );
00058 }
00059
00060 return QObject::eventFilter( watched, event );
00061 }
00062
00063 private:
00064 QLineEdit *mLineEdit;
00065 bool mIgnoreFocusOutEvent;
00066 };
00067
00068 class EmailItem : public QListWidgetItem
00069 {
00070 public:
00071 EmailItem( const QString &text, QListWidget *parent, bool preferred )
00072 : QListWidgetItem( text, parent ), mPreferred( preferred )
00073 {
00074 format();
00075 }
00076
00077 void setPreferred( bool preferred ) { mPreferred = preferred; format(); }
00078 bool preferred() const { return mPreferred; }
00079
00080 private:
00081 void format()
00082 {
00083 QFont f = font();
00084 f.setBold( mPreferred );
00085 setFont( f );
00086 }
00087
00088 private:
00089 bool mPreferred;
00090 };
00091
00092 EmailEditWidget::EmailEditWidget( QWidget *parent )
00093 : QWidget( parent )
00094 {
00095 QHBoxLayout *layout = new QHBoxLayout( this );
00096 layout->setMargin( 0 );
00097 layout->setSpacing( KDialog::spacingHint() );
00098
00099 mEmailEdit = new KLineEdit;
00100 new EmailAddressExtracter( mEmailEdit );
00101 connect( mEmailEdit, SIGNAL( textChanged( const QString& ) ),
00102 SLOT( textChanged( const QString& ) ) );
00103 layout->addWidget( mEmailEdit );
00104
00105 mEditButton = new QToolButton;
00106 mEditButton->setText( QLatin1String( "..." ) );
00107 connect( mEditButton, SIGNAL( clicked() ), SLOT( edit() ) );
00108 layout->addWidget( mEditButton );
00109 }
00110
00111 EmailEditWidget::~EmailEditWidget()
00112 {
00113 }
00114
00115 void EmailEditWidget::setReadOnly( bool readOnly )
00116 {
00117 mEmailEdit->setReadOnly( readOnly );
00118 mEditButton->setEnabled( !readOnly );
00119 }
00120
00121 void EmailEditWidget::loadContact( const KABC::Addressee &contact )
00122 {
00123 mEmailList = contact.emails();
00124
00125 if ( !mEmailList.isEmpty() )
00126 mEmailEdit->setText( mEmailList.first() );
00127 else
00128 mEmailEdit->setText( QString() );
00129 }
00130
00131 void EmailEditWidget::storeContact( KABC::Addressee &contact ) const
00132 {
00133 QStringList emails( mEmailList );
00134
00135
00136 if ( !emails.isEmpty() )
00137 emails.removeFirst();
00138
00139
00140 if ( !mEmailEdit->text().isEmpty() )
00141 emails.prepend( mEmailEdit->text() );
00142
00143 contact.setEmails( emails );
00144 }
00145
00146 void EmailEditWidget::edit()
00147 {
00148 AutoQPointer<EmailEditDialog> dlg = new EmailEditDialog( mEmailList, this );
00149
00150 if ( dlg->exec() ) {
00151 if ( dlg->changed() ) {
00152 mEmailList = dlg->emails();
00153 if ( !mEmailList.isEmpty() )
00154 mEmailEdit->setText( mEmailList.first() );
00155 else
00156 mEmailEdit->setText( QString() );
00157 }
00158 }
00159 }
00160
00161 void EmailEditWidget::textChanged( const QString &text )
00162 {
00163 if ( !mEmailList.isEmpty() )
00164 mEmailList.removeFirst();
00165
00166 mEmailList.prepend( text );
00167 }
00168
00169
00170 EmailEditDialog::EmailEditDialog( const QStringList &list, QWidget *parent )
00171 : KDialog( parent )
00172 {
00173 setCaption( i18n( "Edit Email Addresses" ) );
00174 setButtons( KDialog::Ok | KDialog::Cancel );
00175 setDefaultButton( KDialog::Cancel );
00176
00177 QWidget *page = new QWidget( this);
00178 setMainWidget( page );
00179
00180 QGridLayout *topLayout = new QGridLayout( page );
00181 topLayout->setSpacing( spacingHint() );
00182 topLayout->setMargin( 0 );
00183
00184 mEmailListBox = new KListWidget( page );
00185 mEmailListBox->setSelectionMode( QAbstractItemView::SingleSelection );
00186
00187
00188 mEmailListBox->setMinimumHeight( mEmailListBox->sizeHint().height() + 30 );
00189 connect( mEmailListBox, SIGNAL( currentItemChanged( QListWidgetItem *, QListWidgetItem * ) ),
00190 SLOT( selectionChanged() ) );
00191 connect( mEmailListBox, SIGNAL( itemDoubleClicked( QListWidgetItem * ) ),
00192 SLOT( edit() ) );
00193 topLayout->addWidget( mEmailListBox, 0, 0, 5, 2 );
00194
00195 mAddButton = new QPushButton( i18n( "Add..." ), page );
00196 connect( mAddButton, SIGNAL( clicked() ), SLOT( add() ) );
00197 topLayout->addWidget( mAddButton, 0, 2 );
00198
00199 mEditButton = new QPushButton( i18n( "Edit..." ), page );
00200 mEditButton->setEnabled( false );
00201 connect( mEditButton, SIGNAL( clicked() ), SLOT( edit() ) );
00202 topLayout->addWidget( mEditButton, 1, 2 );
00203
00204 mRemoveButton = new QPushButton( i18n( "Remove" ), page );
00205 mRemoveButton->setEnabled( false );
00206 connect( mRemoveButton, SIGNAL( clicked() ), SLOT( remove() ) );
00207 topLayout->addWidget( mRemoveButton, 2, 2 );
00208
00209 mStandardButton = new QPushButton( i18n( "Set Standard" ), page );
00210 mStandardButton->setEnabled( false );
00211 connect( mStandardButton, SIGNAL( clicked() ), SLOT( standard() ) );
00212 topLayout->addWidget( mStandardButton, 3, 2 );
00213
00214 topLayout->setRowStretch( 4, 1 );
00215
00216 QStringList items = list;
00217 if ( items.removeAll( QLatin1String( "" ) ) > 0 )
00218 mChanged = true;
00219 else
00220 mChanged = false;
00221
00222 QStringList::ConstIterator it;
00223 bool preferred = true;
00224 for ( it = items.constBegin(); it != items.constEnd(); ++it ) {
00225 new EmailItem( *it, mEmailListBox, preferred );
00226 preferred = false;
00227 }
00228
00229
00230 KAcceleratorManager::manage( this );
00231
00232 setInitialSize( QSize( 400, 200 ) );
00233 }
00234
00235 EmailEditDialog::~EmailEditDialog()
00236 {
00237 }
00238
00239 QStringList EmailEditDialog::emails() const
00240 {
00241 QStringList emails;
00242
00243 for ( int i = 0; i < mEmailListBox->count(); ++i ) {
00244 EmailItem *item = static_cast<EmailItem*>( mEmailListBox->item( i ) );
00245 if ( item->preferred() )
00246 emails.prepend( item->text() );
00247 else
00248 emails.append( item->text() );
00249 }
00250
00251 return emails;
00252 }
00253
00254 void EmailEditDialog::add()
00255 {
00256 bool ok = false;
00257
00258 QString email = KInputDialog::getText( i18n( "Add Email" ), i18n( "New Email:" ),
00259 QString(), &ok, this );
00260
00261 if ( !ok )
00262 return;
00263
00264 email = KPIMUtils::extractEmailAddress( email );
00265
00266
00267 for ( int i = 0; i < mEmailListBox->count(); ++i ) {
00268 if ( mEmailListBox->item( i )->text() == email )
00269 return;
00270 }
00271
00272 new EmailItem( email, mEmailListBox, (mEmailListBox->count() == 0) );
00273
00274 mChanged = true;
00275 }
00276
00277 void EmailEditDialog::edit()
00278 {
00279 bool ok = false;
00280
00281 QListWidgetItem *item = mEmailListBox->currentItem();
00282
00283 QString email = KInputDialog::getText( i18n( "Edit Email" ),
00284 i18nc( "@label:textbox Inputfield for an email address", "Email:" ),
00285 item->text(), &ok, this );
00286
00287 if ( !ok )
00288 return;
00289
00290 email = KPIMUtils::extractEmailAddress( email );
00291
00292
00293 for ( int i = 0; i < mEmailListBox->count(); ++i ) {
00294 if ( mEmailListBox->item( i )->text() == email )
00295 return;
00296 }
00297
00298 EmailItem *eitem = static_cast<EmailItem*>( item );
00299 eitem->setText( email );
00300
00301 mChanged = true;
00302 }
00303
00304 void EmailEditDialog::remove()
00305 {
00306 const QString address = mEmailListBox->currentItem()->text();
00307
00308 const QString text = i18n( "<qt>Are you sure that you want to remove the email address <b>%1</b>?</qt>", address );
00309 const QString caption = i18n( "Confirm Remove" );
00310
00311 if ( KMessageBox::warningContinueCancel( this, text, caption, KGuiItem( i18n( "&Delete" ), QLatin1String( "edit-delete" ) ) ) == KMessageBox::Continue ) {
00312 EmailItem *item = static_cast<EmailItem*>( mEmailListBox->currentItem() );
00313
00314 const bool preferred = item->preferred();
00315 mEmailListBox->takeItem( mEmailListBox->currentRow() );
00316 if ( preferred ) {
00317 item = dynamic_cast<EmailItem*>( mEmailListBox->item( 0 ) );
00318 if ( item )
00319 item->setPreferred( true );
00320 }
00321
00322 mChanged = true;
00323 }
00324 }
00325
00326 bool EmailEditDialog::changed() const
00327 {
00328 return mChanged;
00329 }
00330
00331 void EmailEditDialog::standard()
00332 {
00333 for ( int i = 0; i < mEmailListBox->count(); ++i ) {
00334 EmailItem *item = static_cast<EmailItem*>( mEmailListBox->item( i ) );
00335 if ( i == mEmailListBox->currentRow() )
00336 item->setPreferred( true );
00337 else
00338 item->setPreferred( false );
00339 }
00340
00341 mChanged = true;
00342 }
00343
00344 void EmailEditDialog::selectionChanged()
00345 {
00346 int index = mEmailListBox->currentRow();
00347 bool value = ( index >= 0 );
00348
00349 mRemoveButton->setEnabled( value );
00350 mEditButton->setEnabled( value );
00351 mStandardButton->setEnabled( value );
00352 }
00353
00354 #include "emaileditwidget.moc"