• Skip to content
  • Skip to link menu
KDE 4.4 API Reference
  • KDE API Reference
  • KDE-PIM Libraries
  • Sitemap
  • Contact Us
 

akonadi/contact

emaileditwidget.cpp

00001 /*
00002     This file is part of Akonadi Contact.
00003 
00004     Copyright (c) 2009 Tobias Koenig <tokoe@kde.org>
00005 
00006     This library is free software; you can redistribute it and/or modify it
00007     under the terms of the GNU Library General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or (at your
00009     option) any later version.
00010 
00011     This library is distributed in the hope that it will be useful, but WITHOUT
00012     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00013     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
00014     License for more details.
00015 
00016     You should have received a copy of the GNU Library General Public License
00017     along with this library; see the file COPYING.LIB.  If not, write to the
00018     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
00019     02110-1301, USA.
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   // the preferred address is always the first one, remove it...
00118   if ( !emails.isEmpty() )
00119     emails.removeFirst();
00120 
00121   // ... and prepend the one from the line edit
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   // Make sure there is room for the scrollbar
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   // set default state
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   // check if item already available, ignore if so...
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   // check if item already available, ignore if so...
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 ); // An item is selected
00329 
00330   mRemoveButton->setEnabled( value );
00331   mEditButton->setEnabled( value );
00332   mStandardButton->setEnabled( value );
00333 }
00334 
00335 #include "emaileditwidget.moc"

akonadi/contact

Skip menu "akonadi/contact"
  • Main Page
  • Alphabetical List
  • Class List
  • File List
  • Class Members

KDE-PIM Libraries

Skip menu "KDE-PIM Libraries"
  • akonadi
  •   contact
  •   kmime
  • kabc
  • kblog
  • kcal
  • kholidays
  • kimap
  • kioslave
  •   imap4
  •   mbox
  •   nntp
  • kldap
  • kmime
  • kontactinterface
  • kpimidentities
  • kpimtextedit
  •   richtextbuilders
  • kpimutils
  • kresources
  • ktnef
  • kxmlrpcclient
  • mailtransport
  • microblog
  • qgpgme
  • syndication
  •   atom
  •   rdf
  •   rss2
Generated for KDE-PIM Libraries by doxygen 1.6.2-20100208
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal