libkdepim Library API Documentation

addressesdialog.cpp

00001 /*  -*- mode: C++; c-file-style: "gnu" -*-
00002  *
00003  *  This file is part of libkdepim.
00004  *  Copyright (c) 2003 Zack Rusin <zack@kde.org>
00005  *  Copyright (c) 2003 Aaron J. Seigo <aseigo@kde.org>
00006  *
00007  *  This library is free software; you can redistribute it and/or
00008  *  modify it under the terms of the GNU Library General Public
00009  *  License as published by the Free Software Foundation; either
00010  *  version 2 of the License, or (at your option) any later version.
00011  *
00012  *  This library is distributed in the hope that it will be useful,
00013  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015  *  Library General Public License for more details.
00016  *
00017  *  You should have received a copy of the GNU Library General Public License
00018  *  along with this library; see the file COPYING.LIB.  If not, write to
00019  *  the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00020  *  Boston, MA 02111-1307, USA.
00021  *
00022  */
00023 #include <kabc/stdaddressbook.h>
00024 #include <kabc/distributionlist.h>
00025 #include <kapplication.h>
00026 #include <kdebug.h>
00027 #include <kglobal.h>
00028 #include <kiconloader.h>
00029 #include <kinputdialog.h>
00030 #include <klineedit.h>
00031 #include <klocale.h>
00032 #include <kmessagebox.h>
00033 #include <kprocess.h>
00034 #include <kpushbutton.h>
00035 #include <krun.h>
00036 #include <kstandarddirs.h>
00037 
00038 #include <qdict.h>
00039 #include <qlayout.h>
00040 #include <qvbox.h>
00041 #include <qwidget.h>
00042 
00043 #include "addressesdialog.h"
00044 #include "addresspicker.h"
00045 
00046 namespace KPIM {
00047 
00048 // private start :
00049 struct AddresseeViewItem::AddresseeViewItemPrivate {
00050   KABC::Addressee               address;
00051   AddresseeViewItem::Category   category;
00052   KABC::Addressee::List         addresses;
00053 };
00054 
00055 struct AddressesDialog::AddressesDialogPrivate {
00056   AddressesDialogPrivate() : ui(0), personal(0), recent(0), toItem(0), ccItem(0), bccItem(0)
00057   {}
00058 
00059   AddressPickerUI             *ui;
00060 
00061   AddresseeViewItem           *personal;
00062   AddresseeViewItem           *recent;
00063 
00064   AddresseeViewItem           *toItem;
00065   AddresseeViewItem           *ccItem;
00066   AddresseeViewItem           *bccItem;
00067 
00068   QDict<AddresseeViewItem>     groupDict;
00069 
00070   KABC::Addressee::List       recentAddresses;
00071 };
00072 // privates end
00073 
00074 AddresseeViewItem::AddresseeViewItem( AddresseeViewItem *parent, const KABC::Addressee& addr )
00075   : QObject(0), KListViewItem( parent, addr.realName(), addr.preferredEmail() )
00076 {
00077   d = new AddresseeViewItemPrivate;
00078   d->address = addr;
00079   d->category = Entry;
00080 
00081   if ( text(0).stripWhiteSpace().isEmpty() )
00082     setText( 0, addr.preferredEmail() );
00083 
00084   setPixmap( 0, KGlobal::iconLoader()->loadIcon( "personal", KIcon::Small ) );
00085 }
00086 
00087 AddresseeViewItem::AddresseeViewItem( KListView *lv, const QString& name, Category cat )
00088   : QObject(0), KListViewItem( lv, name )
00089 {
00090   d = new AddresseeViewItemPrivate;
00091   d->category = cat;
00092 }
00093 
00094 AddresseeViewItem::AddresseeViewItem(  AddresseeViewItem *parent, const QString& name,
00095                                        const KABC::Addressee::List &lst )
00096   : QObject(0), KListViewItem( parent, name, i18n("<group>") )
00097 {
00098   d = new AddresseeViewItemPrivate;
00099   d->category = FilledGroup;
00100   d->addresses = lst;
00101 }
00102 
00103 AddresseeViewItem::AddresseeViewItem(  AddresseeViewItem *parent, const QString& name )
00104   : QObject(0), KListViewItem( parent, name, i18n("<group>") )
00105 {
00106   d = new AddresseeViewItemPrivate;
00107   d->category = DistList;
00108 
00109   setPixmap( 0, KGlobal::iconLoader()->loadIcon( "kdmconfig", KIcon::Small ) );
00110 }
00111 
00112 AddresseeViewItem::~AddresseeViewItem()
00113 {
00114   delete d;
00115   d = 0;
00116 }
00117 
00118 KABC::Addressee
00119 AddresseeViewItem::addressee() const
00120 {
00121   return d->address;
00122 }
00123 
00124 KABC::Addressee::List
00125 AddresseeViewItem::addresses() const
00126 {
00127   return d->addresses;
00128 }
00129 
00130 AddresseeViewItem::Category
00131 AddresseeViewItem::category() const
00132 {
00133   return d->category;
00134 }
00135 
00136 QString
00137 AddresseeViewItem::name() const
00138 {
00139   return text(0);
00140 }
00141 
00142 QString
00143 AddresseeViewItem::email() const
00144 {
00145   return text(1);
00146 }
00147 
00148 bool AddresseeViewItem::matches(const QString& txt) const
00149 {
00150     return d->address.realName().contains(txt) || d->address.preferredEmail().contains(txt);
00151 }
00152 
00153 void AddresseeViewItem::setSelected(bool selected)
00154 {
00155     if (selected == isSelected())
00156     {
00157         return;
00158     }
00159 
00160     emit addressSelected( this, selected );
00161     QListViewItem::setSelected(selected);
00162 }
00163 
00164 int
00165 AddresseeViewItem::compare( QListViewItem * i, int col, bool ascending ) const
00166 {
00167   if ( category() == Group || category() == Entry )
00168     return KListViewItem::compare( i , col, ascending );
00169 
00170   AddresseeViewItem *item = static_cast<AddresseeViewItem*>( i );
00171   int a = static_cast<int>( category() );
00172   int b = static_cast<int>( item->category() );
00173 
00174   if ( ascending )
00175     if ( a < b )
00176       return -1;
00177     else
00178       return 1;
00179   else
00180     if ( a < b )
00181       return 1;
00182     else
00183       return -1;
00184 }
00185 
00186 AddressesDialog::AddressesDialog( QWidget *widget, const char *name )
00187   : KDialogBase( widget, name, true, i18n("Address Selection"),
00188                  Ok|Cancel, Ok, true )
00189 {
00190   QVBox *page = makeVBoxMainWidget();
00191   d = new AddressesDialogPrivate;
00192   d->ui = new AddressPickerUI( page );
00193 
00194   updateAvailableAddressees();
00195   initConnections();
00196 }
00197 
00198 AddressesDialog::~AddressesDialog()
00199 {
00200   delete d;
00201   d = 0;
00202 }
00203 
00204 AddresseeViewItem* AddressesDialog::selectedToItem()
00205 {
00206   if ( !d->toItem )
00207   {
00208     d->toItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("To"), AddresseeViewItem::To );
00209     connect(d->toItem, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00210             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00211   }
00212   return d->toItem;
00213 }
00214 
00215 AddresseeViewItem* AddressesDialog::selectedCcItem()
00216 {
00217   if ( !d->ccItem )
00218   {
00219     d->ccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("CC"), AddresseeViewItem::CC );
00220     connect(d->ccItem, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00221             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00222   }
00223   return d->ccItem;
00224 }
00225 
00226 AddresseeViewItem* AddressesDialog::selectedBccItem()
00227 {
00228   if ( !d->bccItem )
00229   {
00230     d->bccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("BCC"), AddresseeViewItem::BCC );
00231     connect(d->bccItem, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00232             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00233   }
00234   return d->bccItem;
00235 }
00236 
00237 void
00238 AddressesDialog::setSelectedTo( const QStringList& l )
00239 {
00240   QString name, email;
00241   for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
00242     KABC::Addressee addr;
00243     KABC::Addressee::parseEmailAddress( *it, name, email );
00244     addr.setNameFromString( name );
00245     addr.insertEmail( email );
00246     addAddresseeToSelected( addr, selectedToItem() );
00247   }
00248 }
00249 
00250 void
00251 AddressesDialog::setSelectedCC( const QStringList& l )
00252 {
00253   QString name, email;
00254   for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
00255     KABC::Addressee addr;
00256     KABC::Addressee::parseEmailAddress( *it, name, email );
00257     addr.setNameFromString( name );
00258     addr.insertEmail( email );
00259     addAddresseeToSelected( addr, selectedCcItem() );
00260   }
00261 }
00262 
00263 void
00264 AddressesDialog::setSelectedBCC( const QStringList& l )
00265 {
00266   QString name, email;
00267   for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
00268     KABC::Addressee addr;
00269     KABC::Addressee::parseEmailAddress( *it, name, email );
00270     addr.setNameFromString( name );
00271     addr.insertEmail( email );
00272     addAddresseeToSelected( addr, selectedBccItem() );
00273   }
00274 }
00275 
00276 void
00277 AddressesDialog::setRecentAddresses( const KABC::Addressee::List& list )
00278 {
00279   d->recentAddresses = list;
00280 
00281   updateRecentAddresses();
00282 
00283   checkForSingleAvailableGroup();
00284 }
00285 
00286 void
00287 AddressesDialog::updateRecentAddresses()
00288 {
00289   static const QString &recentGroup = KGlobal::staticQString( i18n( "Recent Addresses" ) );
00290 
00291   if ( !d->recent ) {
00292     d->recent = new AddresseeViewItem( d->ui->mAvailableView, recentGroup );
00293     connect(d->recent, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00294             this, SLOT(availableAddressSelected(AddresseeViewItem*, bool)));
00295     d->recent->setVisible( false );
00296     d->groupDict.insert( recentGroup, d->recent );
00297   }
00298 
00299   KABC::Addressee::List::ConstIterator it;
00300   for ( it = d->recentAddresses.begin(); it != d->recentAddresses.end(); ++it )
00301     addAddresseeToAvailable( *it, d->recent );
00302 
00303   if ( d->recent->childCount() > 0 ) {
00304     d->recent->setVisible( true );
00305   }
00306 }
00307 
00308 void
00309 AddressesDialog::setShowCC( bool b )
00310 {
00311   d->ui->mCCButton->setShown( b );
00312 }
00313 
00314 void
00315 AddressesDialog::setShowBCC( bool b )
00316 {
00317   d->ui->mBCCButton->setShown( b );
00318 }
00319 
00320 QStringList
00321 AddressesDialog::to() const
00322 {
00323   QStringList emails = allDistributionLists( d->toItem );
00324   KABC::Addressee::List l = toAddresses();
00325   emails += entryToString( l );
00326 
00327   return emails;
00328 }
00329 
00330 QStringList
00331 AddressesDialog::cc() const
00332 {
00333   QStringList emails = allDistributionLists( d->ccItem );
00334   KABC::Addressee::List l = ccAddresses();
00335   emails += entryToString( l );
00336 
00337   return emails;
00338 }
00339 
00340 QStringList
00341 AddressesDialog::bcc() const
00342 {
00343   QStringList emails = allDistributionLists( d->bccItem );
00344 
00345   KABC::Addressee::List l = bccAddresses();
00346   emails += entryToString( l );
00347 
00348   return emails;
00349 }
00350 
00351 KABC::Addressee::List
00352 AddressesDialog::toAddresses()  const
00353 {
00354   return allAddressee( d->toItem );
00355 }
00356 
00357 KABC::Addressee::List
00358 AddressesDialog::ccAddresses()  const
00359 {
00360   return allAddressee( d->ccItem );
00361 }
00362 
00363 KABC::Addressee::List
00364 AddressesDialog::bccAddresses()  const
00365 {
00366   return allAddressee( d->bccItem );
00367 }
00368 
00369 void
00370 AddressesDialog::updateAvailableAddressees()
00371 {
00372   d->ui->mAvailableView->clear();
00373   d->groupDict.clear();
00374 
00375   static const QString &personalGroup = KGlobal::staticQString( i18n( "Other Addresses" ) );
00376   d->ui->mAvailableView->setRootIsDecorated( true );
00377   d->personal = new AddresseeViewItem( d->ui->mAvailableView, personalGroup );
00378   connect(d->personal, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00379             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00380   d->personal->setVisible( false );
00381   d->groupDict.insert( personalGroup, d->personal );
00382 
00383   KABC::AddressBook *addressBook = KABC::StdAddressBook::self();
00384   for( KABC::AddressBook::Iterator it = addressBook->begin();
00385        it != addressBook->end(); ++it ) {
00386     addAddresseeToAvailable( *it, d->personal );
00387   }
00388 
00389   d->recent = 0;
00390   updateRecentAddresses();
00391 
00392   addDistributionLists();
00393   if ( d->personal->childCount() > 0 ) {
00394     d->personal->setVisible( true );
00395   }
00396 
00397   checkForSingleAvailableGroup();
00398 }
00399 
00400 void AddressesDialog::checkForSingleAvailableGroup()
00401 {
00402   QListViewItem* item = d->ui->mAvailableView->firstChild();
00403   QListViewItem* firstGroup = 0;
00404   int found = 0;
00405   while (item)
00406   {
00407     if (item->isVisible())
00408     {
00409       if (!firstGroup && static_cast<AddresseeViewItem*>(item)->category() != AddresseeViewItem::Entry)
00410       {
00411         firstGroup = item;
00412       }
00413       ++found;
00414     }
00415     item = item->nextSibling();
00416   }
00417 
00418   if (found == 1 && firstGroup)
00419   {
00420     firstGroup->setOpen(true);
00421   }
00422 }
00423 
00424 void
00425 AddressesDialog::availableSelectionChanged()
00426 {
00427   bool selection = !selectedAvailableAddresses.isEmpty();
00428   d->ui->mToButton->setEnabled(selection);
00429   d->ui->mCCButton->setEnabled(selection);
00430   d->ui->mBCCButton->setEnabled(selection);
00431 }
00432 
00433 void
00434 AddressesDialog::selectedSelectionChanged()
00435 {
00436   bool selection = !selectedSelectedAddresses.isEmpty();
00437   d->ui->mRemoveButton->setEnabled(selection);
00438 }
00439 
00440 void
00441 AddressesDialog::availableAddressSelected( AddresseeViewItem* item, bool selected )
00442 {
00443   if (selected)
00444   {
00445     selectedAvailableAddresses.append(item);
00446   }
00447   else
00448   {
00449     selectedAvailableAddresses.remove(item);
00450   }
00451 }
00452 
00453 void
00454 AddressesDialog::selectedAddressSelected( AddresseeViewItem* item, bool selected )
00455 {
00456   if (selected)
00457   {
00458     selectedSelectedAddresses.append(item);
00459   }
00460   else
00461   {
00462     selectedSelectedAddresses.remove(item);
00463   }
00464 }
00465 
00466 void
00467 AddressesDialog::initConnections()
00468 {
00469   connect( d->ui->mFilterEdit, SIGNAL(textChanged(const QString &)),
00470            SLOT(filterChanged(const QString &)) );
00471   connect( d->ui->mToButton, SIGNAL(clicked()),
00472            SLOT(addSelectedTo()) );
00473   connect( d->ui->mCCButton, SIGNAL(clicked()),
00474            SLOT(addSelectedCC()) );
00475   connect( d->ui->mBCCButton, SIGNAL(clicked()),
00476            SLOT(addSelectedBCC())  );
00477   connect( d->ui->mSaveAs, SIGNAL(clicked()),
00478            SLOT(saveAs())  );
00479   connect( d->ui->mAddressBook, SIGNAL(clicked()),
00480            SLOT(launchAddressBook())  );
00481   connect( d->ui->mRemoveButton, SIGNAL(clicked()),
00482            SLOT(removeEntry()) );
00483   connect( d->ui->mAvailableView, SIGNAL(selectionChanged()),
00484            SLOT(availableSelectionChanged())  );
00485   connect( d->ui->mAvailableView, SIGNAL(doubleClicked(QListViewItem*)),
00486            SLOT(addSelectedTo()) );
00487   connect( d->ui->mSelectedView, SIGNAL(selectionChanged()),
00488            SLOT(selectedSelectionChanged()) );
00489   connect( d->ui->mSelectedView, SIGNAL(doubleClicked(QListViewItem*)),
00490            SLOT(removeEntry()) );
00491 
00492   connect( KABC::DistributionListWatcher::self(), SIGNAL( changed() ),
00493            this, SLOT( updateAvailableAddressees() ) );
00494 
00495   connect( KABC::StdAddressBook::self(), SIGNAL( addressBookChanged(AddressBook*) ),
00496            this, SLOT( updateAvailableAddressees() ) );
00497 }
00498 
00499 void
00500 AddressesDialog::addAddresseeToAvailable( const KABC::Addressee& addr, AddresseeViewItem* defaultParent )
00501 {
00502   if ( addr.preferredEmail().isEmpty() )
00503     return;
00504 
00505   QStringList categories = addr.categories();
00506 
00507   for ( QStringList::Iterator it = categories.begin(); it != categories.end(); ++it ) {
00508     if ( !d->groupDict[ *it ] ) {  //we don't have the category yet
00509       AddresseeViewItem* category = new AddresseeViewItem( d->ui->mAvailableView, *it );
00510       d->groupDict.insert( *it,  category );
00511     }
00512     AddresseeViewItem* addressee = new AddresseeViewItem( d->groupDict[ *it ], addr );
00513     connect(addressee, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00514             this, SLOT(availableAddressSelected(AddresseeViewItem*, bool)));
00515   }
00516 
00517   if ( defaultParent && categories.isEmpty() ) { // only non-categorized items here
00518     AddresseeViewItem* addressee = new AddresseeViewItem( defaultParent, addr );
00519     connect(addressee, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00520             this, SLOT(availableAddressSelected(AddresseeViewItem*, bool)));
00521   }
00522 }
00523 
00524 void
00525 AddressesDialog::addAddresseeToSelected( const KABC::Addressee& addr, AddresseeViewItem* defaultParent )
00526 {
00527   if ( addr.preferredEmail().isEmpty() )
00528     return;
00529 
00530   if ( defaultParent ) {
00531     AddresseeViewItem *myChild = static_cast<AddresseeViewItem*>( defaultParent->firstChild() );
00532     while( myChild ) {
00533       if ( myChild->addressee().preferredEmail() == addr.preferredEmail() )
00534         return;//already got it
00535       myChild = static_cast<AddresseeViewItem*>( myChild->nextSibling() );
00536     }
00537     AddresseeViewItem* addressee = new AddresseeViewItem( defaultParent, addr );
00538     connect(addressee, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00539             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00540     defaultParent->setOpen( true );
00541   }
00542 
00543   d->ui->mSaveAs->setEnabled(true);
00544 }
00545 
00546 void
00547 AddressesDialog::addAddresseesToSelected( AddresseeViewItem *parent,
00548                                           const QPtrList<AddresseeViewItem>& addresses )
00549 {
00550   Q_ASSERT( parent );
00551 
00552   QPtrListIterator<AddresseeViewItem> itr( addresses );
00553 
00554   if (itr.current())
00555   {
00556     d->ui->mSaveAs->setEnabled(true);
00557   }
00558 
00559   while ( itr.current() ) {
00560     AddresseeViewItem* address = itr.current();
00561     ++itr;
00562 
00563     if (selectedToAvailableMapping.find(address) != 0)
00564     {
00565       continue;
00566     }
00567 
00568     AddresseeViewItem* newItem = 0;
00569     if (address->category() == AddresseeViewItem::Entry)
00570     {
00571       newItem = new AddresseeViewItem( parent, address->addressee() );
00572     }
00573     else if (address->category() == AddresseeViewItem::DistList)
00574     {
00575       newItem = new AddresseeViewItem( parent, address->name() );
00576     }
00577     else
00578     {
00579       newItem = new AddresseeViewItem( parent, address->name(), allAddressee( address ) );
00580     }
00581 
00582     address->setSelected( false );
00583     address->setVisible( false );
00584     selectedToAvailableMapping.insert(address, newItem);
00585     selectedToAvailableMapping.insert(newItem, address);
00586     connect(newItem, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00587             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00588   }
00589 
00590   parent->setOpen( true );
00591 }
00592 
00593 QStringList
00594 AddressesDialog::entryToString( const KABC::Addressee::List& l ) const
00595 {
00596   QStringList entries;
00597 
00598   for( KABC::Addressee::List::ConstIterator it = l.begin(); it != l.end(); ++it ) {
00599     entries += (*it).fullEmail();
00600   }
00601   return entries;
00602 }
00603 
00604 void
00605 AddressesDialog::addSelectedTo()
00606 {
00607   if ( !d->toItem )
00608   {
00609     d->toItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("To"), AddresseeViewItem::To );
00610     connect(d->toItem, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00611             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00612   }
00613 
00614   addAddresseesToSelected( d->toItem, selectedAvailableAddresses );
00615   selectedAvailableAddresses.clear();
00616 
00617   if ( d->toItem->childCount() > 0 )
00618     d->toItem->setVisible( true );
00619   else
00620   {
00621     delete d->toItem;
00622     d->toItem = 0;
00623   }
00624 }
00625 
00626 void
00627 AddressesDialog::addSelectedCC()
00628 {
00629   if ( !d->ccItem )
00630   {
00631     d->ccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("CC"), AddresseeViewItem::CC );
00632     connect(d->ccItem , SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00633             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00634   }
00635 
00636   addAddresseesToSelected( d->ccItem, selectedAvailableAddresses );
00637   selectedAvailableAddresses.clear();
00638 
00639   if ( d->ccItem->childCount() > 0 )
00640     d->ccItem->setVisible( true );
00641   else
00642   {
00643     delete d->ccItem;
00644     d->ccItem = 0;
00645   }
00646 }
00647 
00648 void
00649 AddressesDialog::addSelectedBCC()
00650 {
00651   if ( !d->bccItem )
00652   {
00653     d->bccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("BCC"), AddresseeViewItem::BCC );
00654     connect(d->bccItem , SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00655             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00656   }
00657 
00658   addAddresseesToSelected( d->bccItem, selectedAvailableAddresses );
00659   selectedAvailableAddresses.clear();
00660 
00661   if ( d->bccItem->childCount() > 0 )
00662     d->bccItem->setVisible( true );
00663   else
00664   {
00665     delete d->bccItem;
00666     d->bccItem = 0;
00667   }
00668 }
00669 
00670 void AddressesDialog::unmapSelectedAddress(AddresseeViewItem* item)
00671 {
00672   AddresseeViewItem* correspondingItem = selectedToAvailableMapping[item];
00673   if (correspondingItem)
00674   {
00675     correspondingItem->setVisible( true );
00676     selectedToAvailableMapping.remove( item );
00677     selectedToAvailableMapping.remove( correspondingItem );
00678   }
00679 
00680   AddresseeViewItem* child = static_cast<AddresseeViewItem*>(item->firstChild());
00681   while (child)
00682   {
00683     unmapSelectedAddress(child);
00684     child = static_cast<AddresseeViewItem*>(child->nextSibling());
00685   }
00686 }
00687 
00688 void
00689 AddressesDialog::removeEntry()
00690 {
00691   QPtrList<AddresseeViewItem> lst;
00692   bool resetTo  = false;
00693   bool resetCC  = false;
00694   bool resetBCC = false;
00695 
00696   lst.setAutoDelete( false );
00697 
00698   QPtrListIterator<AddresseeViewItem> it( selectedSelectedAddresses );
00699   while ( it.current() ) {
00700     AddresseeViewItem* item = it.current();
00701     ++it;
00702     if ( d->toItem == item )
00703       resetTo = true;
00704     else if ( d->ccItem == item )
00705       resetCC = true;
00706     else if( d->bccItem == item )
00707       resetBCC = true;
00708 
00709     unmapSelectedAddress(item);
00710     lst.append( item );
00711   }
00712   selectedSelectedAddresses.clear();
00713 
00714   lst.setAutoDelete( true );
00715   lst.clear();
00716   if ( resetTo )
00717     d->toItem  = 0;
00718   else if ( d->toItem && d->toItem->childCount() == 0 )
00719   {
00720     delete d->toItem;
00721     d->toItem = 0;
00722   }
00723 
00724   if ( resetCC )
00725     d->ccItem = 0;
00726   else if ( d->ccItem && d->ccItem->childCount() == 0 )
00727   {
00728     delete d->ccItem;
00729     d->ccItem = 0;
00730   }
00731 
00732   if ( resetBCC )
00733     d->bccItem  = 0;
00734   else if ( d->bccItem && d->bccItem->childCount() == 0 )
00735   {
00736     delete d->bccItem;
00737     d->bccItem = 0;
00738   }
00739 
00740   d->ui->mSaveAs->setEnabled(d->ui->mSelectedView->firstChild() != 0);
00741 }
00742 
00743 void
00744 AddressesDialog::saveAs()
00745 {
00746   KABC::DistributionListManager manager( KABC::StdAddressBook::self() );
00747   manager.load();
00748 
00749   if ( !d->ui->mSelectedView->firstChild() ) {
00750     KMessageBox::information( 0,
00751                               i18n("There are no addresses in your list. "
00752                                    "First add some addresses from your address book, "
00753                                    "then try again.") );
00754     return;
00755   }
00756 
00757   bool ok = false;
00758   QString name = KInputDialog::getText( i18n("New Distribution List"),
00759                                         i18n("Please enter name:"),
00760                                         QString::null, &ok,
00761                                         this );
00762   if ( !ok || name.isEmpty() )
00763     return;
00764 
00765   if ( manager.list( name ) ) {
00766     KMessageBox::information( 0,
00767                               i18n( "<qt>Distribution list with the given name <b>%1</b> "
00768                                     "already exists. Please select a different name.</qt>" )
00769                               .arg( name ) );
00770     return;
00771   }
00772 
00773   KABC::DistributionList *dlist = new KABC::DistributionList( &manager, name );
00774   KABC::Addressee::List addrl = allAddressee( d->ui->mSelectedView, false );
00775   for ( KABC::Addressee::List::iterator itr = addrl.begin();
00776         itr != addrl.end(); ++itr ) {
00777     dlist->insertEntry( *itr );
00778   }
00779 
00780   manager.save();
00781 }
00782 
00783 void
00784 AddressesDialog::launchAddressBook()
00785 {
00786   kapp->startServiceByDesktopName( "kaddressbook", QString() );
00787 }
00788 
00789 void
00790 AddressesDialog::filterChanged( const QString& txt )
00791 {
00792   QListViewItemIterator it( d->ui->mAvailableView );
00793   bool showAll = false;
00794 
00795   if ( txt.isEmpty() )
00796     showAll = true;
00797 
00798   while ( it.current() ) {
00799     AddresseeViewItem* item = static_cast<AddresseeViewItem*>( it.current() );
00800     ++it;
00801     if ( showAll ) {
00802       item->setVisible( true );
00803       if ( item->category() == AddresseeViewItem::Group )
00804         item->setOpen( false );//close to not have too many entries
00805       continue;
00806     }
00807     if ( item->category() == AddresseeViewItem::Entry ) {
00808       bool matches = item->matches( txt ) ;
00809       item->setVisible( matches );
00810       if ( matches && static_cast<QListViewItem*>(item)->parent() ) {
00811           static_cast<QListViewItem*>(item)->parent()->setOpen( true );//open the parents with found entries
00812       }
00813     }
00814   }
00815 }
00816 
00817 KABC::Addressee::List
00818 AddressesDialog::allAddressee( KListView* view, bool onlySelected ) const
00819 {
00820   KABC::Addressee::List lst;
00821   QListViewItemIterator it( view );
00822   while ( it.current() ) {
00823     AddresseeViewItem* item = static_cast<AddresseeViewItem*>( it.current() );
00824     if ( !onlySelected || item->isSelected() ) {
00825       if ( item->category() != AddresseeViewItem::Entry  ) {
00826         AddresseeViewItem *myChild = static_cast<AddresseeViewItem*>( item->firstChild() );
00827         while( myChild ) {
00828           lst.append( myChild->addressee() );
00829           myChild = static_cast<AddresseeViewItem*>( myChild->nextSibling() );
00830         }
00831       } else {
00832         lst.append( item->addressee() );
00833       }
00834     }
00835     ++it;
00836   }
00837 
00838   return lst;
00839 }
00840 
00841 KABC::Addressee::List
00842 AddressesDialog::allAddressee( AddresseeViewItem* parent ) const
00843 {
00844   KABC::Addressee::List lst;
00845 
00846   if ( !parent ) return KABC::Addressee::List();
00847 
00848   if ( parent->category() == AddresseeViewItem::Entry )
00849   {
00850       lst.append( parent->addressee() );
00851       return lst;
00852   }
00853 
00854   AddresseeViewItem *myChild = static_cast<AddresseeViewItem*>( parent->firstChild() );
00855   while( myChild ) {
00856     if ( myChild->category() == AddresseeViewItem::FilledGroup )
00857       lst += myChild->addresses();
00858     else
00859       lst.append( myChild->addressee() );
00860     myChild = static_cast<AddresseeViewItem*>( myChild->nextSibling() );
00861   }
00862 
00863   return lst;
00864 }
00865 
00866 QStringList
00867 AddressesDialog::allDistributionLists( AddresseeViewItem* parent ) const
00868 {
00869   QStringList lists;
00870 
00871   if ( !parent )
00872     return QStringList();
00873 
00874   AddresseeViewItem *item = static_cast<AddresseeViewItem*>( parent->firstChild() );
00875   while ( item ) {
00876     if ( item->category() == AddresseeViewItem::DistList && !item->name().isEmpty() )
00877       lists.append( item->name() );
00878 
00879     item = static_cast<AddresseeViewItem*>( item->nextSibling() );
00880   }
00881 
00882   return lists;
00883 }
00884 
00885 void
00886 AddressesDialog::addDistributionLists()
00887 {
00888   KABC::DistributionListManager manager( KABC::StdAddressBook::self() );
00889   manager.load();
00890 
00891   QStringList distLists = manager.listNames();
00892   if ( distLists.isEmpty() )
00893     return;
00894 
00895   AddresseeViewItem *topItem = new AddresseeViewItem( d->ui->mAvailableView, 
00896                                                       i18n( "Distribution Lists" ) );
00897 
00898   QStringList::Iterator listIt;
00899   for ( listIt = distLists.begin(); listIt != distLists.end(); ++listIt ) {
00900     KABC::DistributionList* dlist = manager.list( *listIt );
00901     KABC::DistributionList::Entry::List entries = dlist->entries();
00902 
00903     AddresseeViewItem *item = new AddresseeViewItem( topItem, dlist->name() );
00904     connect( item, SIGNAL( addressSelected( AddresseeViewItem*, bool ) ),
00905              this, SLOT( availableAddressSelected( AddresseeViewItem*, bool ) ) );
00906 
00907     KABC::DistributionList::Entry::List::Iterator itemIt;
00908     for ( itemIt = entries.begin(); itemIt != entries.end(); ++itemIt )
00909       addAddresseeToAvailable( (*itemIt).addressee, item );
00910   }
00911 }
00912 
00913 }
00914 
00915 #include "addressesdialog.moc"
KDE Logo
This file is part of the documentation for libkdepim Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat May 1 11:36:31 2004 by doxygen 1.2.15 written by Dimitri van Heesch, © 1997-2003