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