kaddressbook Library API Documentation

distributionlistwidget.cpp

00001 /*
00002     This file is part of KAddressBook.
00003     Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
00004 
00005     This program is free software; you can redistribute it and/or modify
00006     it under the terms of the GNU General Public License as published by
00007     the Free Software Foundation; either version 2 of the License, or
00008     (at your option) any later version.
00009 
00010     This program is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013     GNU General Public License for more details.
00014 
00015     You should have received a copy of the GNU General Public License
00016     along with this program; if not, write to the Free Software
00017     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
00018     As a special exception, permission is given to link this program
00019     with any edition of Qt, and distribute the resulting executable,
00020     without including the source code for Qt in the source distribution.
00021 */
00022 
00023 #include <qbuttongroup.h>
00024 #include <qcombobox.h>
00025 #include <qlabel.h>
00026 #include <qlayout.h>
00027 #include <qlistview.h>
00028 #include <qpushbutton.h>
00029 #include <qradiobutton.h>
00030 
00031 #include <kaccelmanager.h>
00032 #include <kdebug.h>
00033 #include <kinputdialog.h>
00034 #include <klocale.h>
00035 #include <kmessagebox.h>
00036 
00037 #include <kabc/addresseedialog.h>
00038 #include <kabc/distributionlist.h>
00039 #include <kabc/stdaddressbook.h>
00040 #include <kabc/vcardconverter.h>
00041 #include <libkdepim/kvcarddrag.h>
00042 
00043 #include "core.h"
00044 
00045 #include "distributionlistwidget.h"
00046 
00047 class DistributionListFactory : public KAB::ExtensionFactory
00048 {
00049   public:
00050     KAB::ExtensionWidget *extension( KAB::Core *core, QWidget *parent, const char *name )
00051     {
00052       return new DistributionListWidget( core, parent, name );
00053     }
00054 
00055     QString identifier() const
00056     {
00057       return "distribution_list_editor";
00058     }
00059 };
00060 
00061 extern "C" {
00062   void *init_libkaddrbk_distributionlist()
00063   {
00064     return ( new DistributionListFactory );
00065   }
00066 }
00067 
00068 class ContactItem : public QListViewItem
00069 {
00070   public:
00071     ContactItem( DistributionListView *parent, const KABC::Addressee &addressee,
00072                const QString &email = QString::null ) :
00073       QListViewItem( parent ),
00074       mAddressee( addressee ),
00075       mEmail( email )
00076     {
00077       setText( 0, addressee.realName() );
00078       if( email.isEmpty() ) {
00079         setText( 1, addressee.preferredEmail() );
00080         setText( 2, i18n( "Yes" ) );
00081       } else {
00082         setText( 1, email );
00083         setText( 2, i18n( "No" ) );
00084       }
00085     }
00086 
00087     KABC::Addressee addressee() const
00088     {
00089       return mAddressee;
00090     }
00091 
00092     QString email() const
00093     {
00094       return mEmail;
00095     }
00096 
00097   protected:
00098     bool acceptDrop( const QMimeSource* )
00099     {
00100       return true;
00101     }
00102 
00103   private:
00104     KABC::Addressee mAddressee;
00105     QString mEmail;
00106 };
00107 
00108 DistributionListWidget::DistributionListWidget( KAB::Core *core, QWidget *parent,
00109                                                 const char *name )
00110   : KAB::ExtensionWidget( core, parent, name ), mManager( 0 )
00111 {
00112   QGridLayout *topLayout = new QGridLayout( this, 3, 4, KDialog::marginHint(),
00113                                             KDialog::spacingHint() );
00114 
00115   mNameCombo = new QComboBox( this );
00116   topLayout->addWidget( mNameCombo, 0, 0 );
00117   connect( mNameCombo, SIGNAL( activated( int ) ), SLOT( updateContactView() ) );
00118 
00119   mCreateListButton = new QPushButton( i18n( "New List..." ), this );
00120   topLayout->addWidget( mCreateListButton, 0, 1 );
00121   connect( mCreateListButton, SIGNAL( clicked() ), SLOT( createList() ) );
00122 
00123   mEditListButton = new QPushButton( i18n( "Rename List..." ), this );
00124   topLayout->addWidget( mEditListButton, 0, 2 );
00125   connect( mEditListButton, SIGNAL( clicked() ), SLOT( editList() ) );
00126 
00127   mRemoveListButton = new QPushButton( i18n( "Remove List" ), this );
00128   topLayout->addWidget( mRemoveListButton, 0, 3 );
00129   connect( mRemoveListButton, SIGNAL( clicked() ), SLOT( removeList() ) );
00130 
00131   mContactView = new DistributionListView( this );
00132   mContactView->addColumn( i18n( "Name" ) );
00133   mContactView->addColumn( i18n( "Email" ) );
00134   mContactView->addColumn( i18n( "Use Preferred" ) );
00135   mContactView->setEnabled( false );
00136   mContactView->setAllColumnsShowFocus( true );
00137   mContactView->setFullWidth( true );
00138   topLayout->addMultiCellWidget( mContactView, 1, 1, 0, 3 );
00139   connect( mContactView, SIGNAL( selectionChanged() ),
00140            SLOT( selectionContactViewChanged() ) );
00141   connect( mContactView, SIGNAL( dropped( QDropEvent*, QListViewItem* ) ),
00142            SLOT( dropped( QDropEvent*, QListViewItem* ) ) );
00143 
00144   mAddContactButton = new QPushButton( i18n( "Add Contact" ), this );
00145   mAddContactButton->setEnabled( false );
00146   topLayout->addWidget( mAddContactButton, 2, 0 );
00147   connect( mAddContactButton, SIGNAL( clicked() ), SLOT( addContact() ) );
00148 
00149   mChangeEmailButton = new QPushButton( i18n( "Change Email..." ), this );
00150   topLayout->addWidget( mChangeEmailButton, 2, 2 );
00151   connect( mChangeEmailButton, SIGNAL( clicked() ), SLOT( changeEmail() ) );
00152 
00153   mRemoveContactButton = new QPushButton( i18n( "Remove Contact" ), this );
00154   topLayout->addWidget( mRemoveContactButton, 2, 3 );
00155   connect( mRemoveContactButton, SIGNAL( clicked() ), SLOT( removeContact() ) );
00156 
00157   mManager = new KABC::DistributionListManager( core->addressBook() );
00158 
00159   connect( KABC::DistributionListWatcher::self(), SIGNAL( changed() ),
00160            this, SLOT( updateNameCombo() ) );
00161   connect( core->addressBook(), SIGNAL( addressBookChanged( AddressBook* ) ),
00162            this, SLOT( updateNameCombo() ) );
00163 
00164   updateNameCombo();
00165 
00166   KAcceleratorManager::manage( this );
00167 }
00168 
00169 DistributionListWidget::~DistributionListWidget()
00170 {
00171   delete mManager;
00172 }
00173 
00174 void DistributionListWidget::save()
00175 {
00176   mManager->save();
00177 }
00178 
00179 void DistributionListWidget::selectionContactViewChanged()
00180 {
00181   ContactItem *contactItem =
00182                   static_cast<ContactItem *>( mContactView->selectedItem() );
00183   bool state = contactItem;
00184 
00185   mChangeEmailButton->setEnabled( state );
00186   mRemoveContactButton->setEnabled( state );
00187 }
00188 
00189 void DistributionListWidget::createList()
00190 {
00191   QString newName = KInputDialog::getText( i18n( "New Distribution List" ),
00192                                            i18n( "Please enter name:" ),
00193                                            QString::null, 0, this );
00194 
00195   if ( newName.isEmpty() ) return;
00196 
00197   if ( mManager->listNames().contains( newName ) ) {
00198     KMessageBox::sorry( this, i18n( "The name already exists" ) );
00199     return;
00200   }
00201   new KABC::DistributionList( mManager, newName );
00202 
00203   mNameCombo->clear();
00204   mNameCombo->insertStringList( mManager->listNames() );
00205   mNameCombo->setCurrentItem( mNameCombo->count() - 1 );
00206 
00207   updateContactView();
00208 
00209   changed();
00210 }
00211 
00212 void DistributionListWidget::editList()
00213 {
00214   QString oldName = mNameCombo->currentText();
00215 
00216   QString newName = KInputDialog::getText( i18n( "New Distribution List" ),
00217                                            i18n( "Please enter name:" ),
00218                                            oldName, 0, this );
00219 
00220   if ( newName.isEmpty() ) return;
00221 
00222   if ( mManager->listNames().contains( newName ) ) {
00223     KMessageBox::sorry( this, i18n( "The name already exists" ) );
00224     return;
00225   }
00226   KABC::DistributionList *list = mManager->list( oldName );
00227   list->setName( newName );
00228 
00229   mNameCombo->clear();
00230   mNameCombo->insertStringList( mManager->listNames() );
00231   mNameCombo->setCurrentItem( mNameCombo->count() - 1 );
00232 
00233   updateContactView();
00234 
00235   changed();
00236 }
00237 
00238 void DistributionListWidget::removeList()
00239 {
00240   int result = KMessageBox::warningContinueCancel( this,
00241       i18n( "<qt>Delete distribution list <b>%1</b>?</qt>" ) .arg( mNameCombo->currentText() ),
00242       QString::null, i18n( "Delete" ) );
00243 
00244   if ( result != KMessageBox::Continue )
00245     return;
00246 
00247   mManager->remove( mManager->list( mNameCombo->currentText() ) );
00248   mNameCombo->removeItem( mNameCombo->currentItem() );
00249 
00250   updateContactView();
00251 
00252   changed();
00253 }
00254 
00255 void DistributionListWidget::addContact()
00256 {
00257   KABC::DistributionList *list = mManager->list( mNameCombo->currentText() );
00258   if ( !list )
00259     return;
00260 
00261   KABC::Addressee::List addrList = selectedContacts();
00262   KABC::Addressee::List::Iterator it;
00263   for ( it = addrList.begin(); it != addrList.end(); ++it )
00264     list->insertEntry( *it );
00265 
00266   updateContactView();
00267 
00268   changed();
00269 }
00270 
00271 void DistributionListWidget::removeContact()
00272 {
00273   KABC::DistributionList *list = mManager->list( mNameCombo->currentText() );
00274   if ( !list )
00275     return;
00276 
00277   ContactItem *contactItem =
00278                     static_cast<ContactItem *>( mContactView->selectedItem() );
00279   if ( !contactItem )
00280     return;
00281 
00282   list->removeEntry( contactItem->addressee(), contactItem->email() );
00283   delete contactItem;
00284 
00285   changed();
00286 }
00287 
00288 void DistributionListWidget::changeEmail()
00289 {
00290   KABC::DistributionList *list = mManager->list( mNameCombo->currentText() );
00291   if ( !list )
00292     return;
00293 
00294   ContactItem *contactItem =
00295                     static_cast<ContactItem *>( mContactView->selectedItem() );
00296   if ( !contactItem )
00297     return;
00298 
00299   QString email = EmailSelector::getEmail( contactItem->addressee().emails(),
00300                                            contactItem->email(), this );
00301   list->removeEntry( contactItem->addressee(), contactItem->email() );
00302   list->insertEntry( contactItem->addressee(), email );
00303 
00304   updateContactView();
00305 
00306   changed();
00307 }
00308 
00309 void DistributionListWidget::updateContactView()
00310 {
00311   mContactView->clear();
00312 
00313   KABC::DistributionList *list = mManager->list( mNameCombo->currentText() );
00314   if ( !list ) {
00315     mEditListButton->setEnabled( false );
00316     mRemoveListButton->setEnabled( false );
00317     mChangeEmailButton->setEnabled( false );
00318     mRemoveContactButton->setEnabled( false );
00319     mContactView->setEnabled( false );
00320     return;
00321   } else {
00322     mEditListButton->setEnabled( true );
00323     mRemoveListButton->setEnabled( true );
00324     mContactView->setEnabled( true );
00325   }
00326 
00327   KABC::DistributionList::Entry::List entries = list->entries();
00328   KABC::DistributionList::Entry::List::ConstIterator it;
00329   for( it = entries.begin(); it != entries.end(); ++it )
00330     new ContactItem( mContactView, (*it).addressee, (*it).email );
00331 
00332   ContactItem *contactItem =
00333                     static_cast<ContactItem *>( mContactView->selectedItem() );
00334   bool state = contactItem;
00335 
00336   mChangeEmailButton->setEnabled( state );
00337   mRemoveContactButton->setEnabled( state );
00338 }
00339 
00340 void DistributionListWidget::updateNameCombo()
00341 {
00342   mManager->load();
00343 
00344   int pos = mNameCombo->currentItem();
00345   mNameCombo->clear();
00346   mNameCombo->insertStringList( mManager->listNames() );
00347   mNameCombo->setCurrentItem( pos );
00348 
00349   updateContactView();
00350 }
00351 
00352 void DistributionListWidget::dropEvent( QDropEvent *e )
00353 {
00354   KABC::DistributionList *distributionList = mManager->list( mNameCombo->currentText() );
00355   if ( !distributionList )
00356     return;
00357 
00358   QString vcards;
00359   if ( KVCardDrag::decode( e, vcards ) ) {
00360     KABC::VCardConverter converter;
00361     KABC::Addressee::List list = converter.parseVCards( vcards );
00362     KABC::Addressee::List::Iterator it;
00363     for ( it = list.begin(); it != list.end(); ++it )
00364       distributionList->insertEntry( *it );
00365 
00366     changed();
00367     updateContactView();
00368   }
00369 }
00370 
00371 void DistributionListWidget::contactsSelectionChanged()
00372 {
00373   mAddContactButton->setEnabled( contactsSelected() && mNameCombo->count() > 0 );
00374 }
00375 
00376 QString DistributionListWidget::title() const
00377 {
00378   return i18n( "Distribution List Editor" );
00379 }
00380 
00381 QString DistributionListWidget::identifier() const
00382 {
00383   return "distribution_list_editor";
00384 }
00385 
00386 void DistributionListWidget::dropped( QDropEvent *e, QListViewItem* )
00387 {
00388   dropEvent( e );
00389 }
00390 
00391 void DistributionListWidget::changed()
00392 {
00393   save();
00394 }
00395 
00396 
00397 DistributionListView::DistributionListView( QWidget *parent, const char* name )
00398   : KListView( parent, name )
00399 {
00400   setDragEnabled( true );
00401   setAcceptDrops( true );
00402   setAllColumnsShowFocus( true );
00403 }
00404 
00405 void DistributionListView::dragEnterEvent( QDragEnterEvent* e )
00406 {
00407   bool canDecode = QTextDrag::canDecode( e );
00408   e->accept( canDecode );
00409 }
00410 
00411 void DistributionListView::viewportDragMoveEvent( QDragMoveEvent *e )
00412 {
00413   bool canDecode = QTextDrag::canDecode( e );
00414   e->accept( canDecode );
00415 }
00416 
00417 void DistributionListView::viewportDropEvent( QDropEvent *e )
00418 {
00419   emit dropped( e, 0 );
00420 }
00421 
00422 void DistributionListView::dropEvent( QDropEvent *e )
00423 {
00424   emit dropped( e, 0 );
00425 }
00426 
00427 
00428 EmailSelector::EmailSelector( const QStringList &emails,
00429                               const QString &current, QWidget *parent )
00430   : KDialogBase( KDialogBase::Plain, i18n("Select Email Address"), Ok, Ok,
00431                parent )
00432 {
00433   QFrame *topFrame = plainPage();
00434   QBoxLayout *topLayout = new QVBoxLayout( topFrame );
00435 
00436   mButtonGroup = new QButtonGroup( 1, Horizontal, i18n("Email Addresses"),
00437                                    topFrame );
00438   topLayout->addWidget( mButtonGroup );
00439 
00440   QStringList::ConstIterator it;
00441   for( it = emails.begin(); it != emails.end(); ++it ) {
00442     QRadioButton *button = new QRadioButton( *it, mButtonGroup );
00443     if ( (*it) == current ) {
00444       button->setDown( true );
00445     }
00446   }
00447 }
00448 
00449 QString EmailSelector::selected()
00450 {
00451   QButton *button = mButtonGroup->selected();
00452   if ( button )
00453     return button->text();
00454 
00455   return QString::null;
00456 }
00457 
00458 QString EmailSelector::getEmail( const QStringList &emails,
00459                                  const QString &current, QWidget *parent )
00460 {
00461   EmailSelector dlg( emails, current, parent );
00462   dlg.exec();
00463 
00464   return dlg.selected();
00465 }
00466 
00467 
00468 #include "distributionlistwidget.moc"
KDE Logo
This file is part of the documentation for kaddressbook Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:38:51 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003