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                                       int emailIndex )
00076   : QObject( 0 ), KListViewItem( parent, addr.realName(),
00077                                ( emailIndex == 0 ? addr.preferredEmail() : addr.emails()[ emailIndex ] ) )
00078 {
00079   d = new AddresseeViewItemPrivate;
00080   d->address = addr;
00081   d->category = Entry;
00082 
00083   if ( text( 0 ).stripWhiteSpace().isEmpty() )
00084     setText( 0, addr.preferredEmail() );
00085 
00086   if ( addr.photo().url().isEmpty() ) {
00087     if ( addr.photo().data().isNull() )
00088       setPixmap( 0, KGlobal::iconLoader()->loadIcon( "personal", KIcon::Small ) );
00089     else
00090       setPixmap( 0, addr.photo().data().smoothScale( 16, 16 ) );
00091   } else {
00092     setPixmap( 0, KGlobal::iconLoader()->loadIcon( addr.photo().url(), KIcon::Small ) );
00093   }
00094 }
00095 
00096 AddresseeViewItem::AddresseeViewItem( KListView *lv, const QString& name, Category cat )
00097   : QObject(0), KListViewItem( lv, name )
00098 {
00099   d = new AddresseeViewItemPrivate;
00100   d->category = cat;
00101 }
00102 
00103 AddresseeViewItem::AddresseeViewItem(  AddresseeViewItem *parent, const QString& name,
00104                                        const KABC::Addressee::List &lst )
00105   : QObject(0), KListViewItem( parent, name, i18n("<group>") )
00106 {
00107   d = new AddresseeViewItemPrivate;
00108   d->category = FilledGroup;
00109   d->addresses = lst;
00110 }
00111 
00112 AddresseeViewItem::AddresseeViewItem(  AddresseeViewItem *parent, const QString& name )
00113   : QObject(0), KListViewItem( parent, name, i18n("<group>") )
00114 {
00115   d = new AddresseeViewItemPrivate;
00116   d->category = DistList;
00117 
00118   setPixmap( 0, KGlobal::iconLoader()->loadIcon( "kdmconfig", KIcon::Small ) );
00119 }
00120 
00121 AddresseeViewItem::~AddresseeViewItem()
00122 {
00123   delete d;
00124   d = 0;
00125 }
00126 
00127 KABC::Addressee
00128 AddresseeViewItem::addressee() const
00129 {
00130   return d->address;
00131 }
00132 
00133 KABC::Addressee::List
00134 AddresseeViewItem::addresses() const
00135 {
00136   return d->addresses;
00137 }
00138 
00139 AddresseeViewItem::Category
00140 AddresseeViewItem::category() const
00141 {
00142   return d->category;
00143 }
00144 
00145 QString
00146 AddresseeViewItem::name() const
00147 {
00148   return text(0);
00149 }
00150 
00151 QString
00152 AddresseeViewItem::email() const
00153 {
00154   return text(1);
00155 }
00156 
00157 bool AddresseeViewItem::matches(const QString& txt) const
00158 {
00159     return d->address.realName().contains(txt, false) || d->address.preferredEmail().contains(txt, false);
00160 }
00161 
00162 void AddresseeViewItem::setSelected(bool selected)
00163 {
00164     if (selected == isSelected())
00165     {
00166         return;
00167     }
00168 
00169     emit addressSelected( this, selected );
00170     QListViewItem::setSelected(selected);
00171 }
00172 
00173 int
00174 AddresseeViewItem::compare( QListViewItem * i, int col, bool ascending ) const
00175 {
00176   if ( category() == Group || category() == Entry )
00177     return KListViewItem::compare( i , col, ascending );
00178 
00179   AddresseeViewItem *item = static_cast<AddresseeViewItem*>( i );
00180   int a = static_cast<int>( category() );
00181   int b = static_cast<int>( item->category() );
00182 
00183   if ( ascending )
00184     if ( a < b )
00185       return -1;
00186     else
00187       return 1;
00188   else
00189     if ( a < b )
00190       return 1;
00191     else
00192       return -1;
00193 }
00194 
00195 AddressesDialog::AddressesDialog( QWidget *widget, const char *name )
00196   : KDialogBase( widget, name, true, i18n("Address Selection"),
00197                  Ok|Cancel, Ok, true )
00198 {
00199   QVBox *page = makeVBoxMainWidget();
00200   d = new AddressesDialogPrivate;
00201   d->ui = new AddressPickerUI( page );
00202 
00203   KABC::StdAddressBook::self( true );
00204   updateAvailableAddressees();
00205   initConnections();
00206 
00207   d->ui->mAvailableView->setFocus();
00208 }
00209 
00210 AddressesDialog::~AddressesDialog()
00211 {
00212   delete d;
00213   d = 0;
00214 }
00215 
00216 AddresseeViewItem* AddressesDialog::selectedToItem()
00217 {
00218   if ( !d->toItem )
00219   {
00220     d->toItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("To"), AddresseeViewItem::To );
00221     connect(d->toItem, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00222             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00223   }
00224   return d->toItem;
00225 }
00226 
00227 AddresseeViewItem* AddressesDialog::selectedCcItem()
00228 {
00229   if ( !d->ccItem )
00230   {
00231     d->ccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("CC"), AddresseeViewItem::CC );
00232     connect(d->ccItem, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00233             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00234   }
00235   return d->ccItem;
00236 }
00237 
00238 AddresseeViewItem* AddressesDialog::selectedBccItem()
00239 {
00240   if ( !d->bccItem )
00241   {
00242     d->bccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("BCC"), AddresseeViewItem::BCC );
00243     connect(d->bccItem, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00244             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00245   }
00246   return d->bccItem;
00247 }
00248 
00249 void
00250 AddressesDialog::setSelectedTo( const QStringList& l )
00251 {
00252   QString name, email;
00253   for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
00254     KABC::Addressee addr;
00255     KABC::Addressee::parseEmailAddress( *it, name, email );
00256     addr.setNameFromString( name );
00257     addr.insertEmail( email );
00258     addAddresseeToSelected( addr, selectedToItem() );
00259   }
00260 }
00261 
00262 void
00263 AddressesDialog::setSelectedCC( const QStringList& l )
00264 {
00265   QString name, email;
00266   for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
00267     KABC::Addressee addr;
00268     KABC::Addressee::parseEmailAddress( *it, name, email );
00269     addr.setNameFromString( name );
00270     addr.insertEmail( email );
00271     addAddresseeToSelected( addr, selectedCcItem() );
00272   }
00273 }
00274 
00275 void
00276 AddressesDialog::setSelectedBCC( const QStringList& l )
00277 {
00278   QString name, email;
00279   for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
00280     KABC::Addressee addr;
00281     KABC::Addressee::parseEmailAddress( *it, name, email );
00282     addr.setNameFromString( name );
00283     addr.insertEmail( email );
00284     addAddresseeToSelected( addr, selectedBccItem() );
00285   }
00286 }
00287 
00288 void
00289 AddressesDialog::setRecentAddresses( const KABC::Addressee::List& list )
00290 {
00291   d->recentAddresses = list;
00292 
00293   updateRecentAddresses();
00294 
00295   checkForSingleAvailableGroup();
00296 }
00297 
00298 void
00299 AddressesDialog::updateRecentAddresses()
00300 {
00301   static const QString &recentGroup = KGlobal::staticQString( i18n( "Recent Addresses" ) );
00302 
00303   if ( !d->recent ) {
00304     d->recent = new AddresseeViewItem( d->ui->mAvailableView, recentGroup );
00305     connect(d->recent, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00306             this, SLOT(availableAddressSelected(AddresseeViewItem*, bool)));
00307     d->recent->setVisible( false );
00308     d->groupDict.insert( recentGroup, d->recent );
00309   }
00310 
00311   KABC::Addressee::List::ConstIterator it;
00312   for ( it = d->recentAddresses.begin(); it != d->recentAddresses.end(); ++it )
00313     addAddresseeToAvailable( *it, d->recent );
00314 
00315   if ( d->recent->childCount() > 0 ) {
00316     d->recent->setVisible( true );
00317   }
00318 }
00319 
00320 void
00321 AddressesDialog::setShowCC( bool b )
00322 {
00323   d->ui->mCCButton->setShown( b );
00324 }
00325 
00326 void
00327 AddressesDialog::setShowBCC( bool b )
00328 {
00329   d->ui->mBCCButton->setShown( b );
00330 }
00331 
00332 QStringList
00333 AddressesDialog::to() const
00334 {
00335   QStringList emails = allDistributionLists( d->toItem );
00336   KABC::Addressee::List l = toAddresses();
00337   emails += entryToString( l );
00338 
00339   return emails;
00340 }
00341 
00342 QStringList
00343 AddressesDialog::cc() const
00344 {
00345   QStringList emails = allDistributionLists( d->ccItem );
00346   KABC::Addressee::List l = ccAddresses();
00347   emails += entryToString( l );
00348 
00349   return emails;
00350 }
00351 
00352 QStringList
00353 AddressesDialog::bcc() const
00354 {
00355   QStringList emails = allDistributionLists( d->bccItem );
00356 
00357   KABC::Addressee::List l = bccAddresses();
00358   emails += entryToString( l );
00359 
00360   return emails;
00361 }
00362 
00363 KABC::Addressee::List
00364 AddressesDialog::toAddresses()  const
00365 {
00366   return allAddressee( d->toItem );
00367 }
00368 KABC::Addressee::List
00369 AddressesDialog::allToAddressesNoDuplicates()  const
00370 {
00371   KABC::Addressee::List aList = allAddressee( d->toItem );
00372   QStringList dList = toDistributionLists();
00373   KABC::DistributionListManager manager( KABC::StdAddressBook::self() );
00374   manager.load();
00375   for ( QStringList::ConstIterator it = dList.begin(); it != dList.end(); ++it ) {
00376     QValueList<KABC::DistributionList::Entry> eList = manager.list( *it )->entries();
00377     QValueList<KABC::DistributionList::Entry>::Iterator eit;
00378     if ( eList.count() > 0 )
00379       for( eit = eList.begin(); eit != eList.end(); ++eit ) {
00380         KABC::Addressee a = (*eit).addressee;
00381         bool found = false;
00382          for ( KABC::Addressee::List::iterator itr = aList.begin();
00383               itr != aList.end(); ++itr ) {
00384             KABC::Addressee ad = (*itr);
00385             if ( ad == a ) {
00386               found = true;
00387               break;
00388             }
00389         }
00390          if ( !found ) {
00391            if ( ! a.preferredEmail().isEmpty () )
00392              aList.append( a ) ;
00393          }
00394       }
00395   }
00396   return aList;
00397 }
00398 
00399 KABC::Addressee::List
00400 AddressesDialog::ccAddresses()  const
00401 {
00402   return allAddressee( d->ccItem );
00403 }
00404 
00405 KABC::Addressee::List
00406 AddressesDialog::bccAddresses()  const
00407 {
00408   return allAddressee( d->bccItem );
00409 }
00410 
00411 
00412 QStringList
00413 AddressesDialog::toDistributionLists() const
00414 {
00415   return allDistributionLists( d->toItem );
00416 }
00417 
00418 QStringList
00419 AddressesDialog::ccDistributionLists() const
00420 {
00421   return allDistributionLists( d->ccItem );
00422 }
00423 
00424 QStringList
00425 AddressesDialog::bccDistributionLists() const
00426 {
00427   return allDistributionLists( d->bccItem );
00428 }
00429 
00430 void
00431 AddressesDialog::updateAvailableAddressees()
00432 {
00433   d->ui->mAvailableView->clear();
00434   d->groupDict.clear();
00435 
00436   static const QString &personalGroup = KGlobal::staticQString( i18n( "Other Addresses" ) );
00437   d->ui->mAvailableView->setRootIsDecorated( true );
00438   d->personal = new AddresseeViewItem( d->ui->mAvailableView, personalGroup );
00439   //connect(d->personal, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00440   //        this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00441   d->personal->setVisible( false );
00442   d->groupDict.insert( personalGroup, d->personal );
00443 
00444   KABC::AddressBook *addressBook = KABC::StdAddressBook::self( true );
00445   for( KABC::AddressBook::Iterator it = addressBook->begin();
00446        it != addressBook->end(); ++it ) {
00447     addAddresseeToAvailable( *it, d->personal );
00448   }
00449 
00450   d->recent = 0;
00451   updateRecentAddresses();
00452 
00453   addDistributionLists();
00454   if ( d->personal->childCount() > 0 ) {
00455     d->personal->setVisible( true );
00456   }
00457 
00458   checkForSingleAvailableGroup();
00459 }
00460 
00461 void AddressesDialog::checkForSingleAvailableGroup()
00462 {
00463   QListViewItem* item = d->ui->mAvailableView->firstChild();
00464   QListViewItem* firstGroup = 0;
00465   int found = 0;
00466   while (item)
00467   {
00468     if (item->isVisible())
00469     {
00470       if (!firstGroup && static_cast<AddresseeViewItem*>(item)->category() != AddresseeViewItem::Entry)
00471       {
00472         firstGroup = item;
00473       }
00474       ++found;
00475     }
00476     item = item->nextSibling();
00477   }
00478 
00479   if (found == 1 && firstGroup)
00480   {
00481     firstGroup->setOpen(true);
00482   }
00483 }
00484 
00485 void
00486 AddressesDialog::availableSelectionChanged()
00487 {
00488   bool selection = !selectedAvailableAddresses.isEmpty();
00489   d->ui->mToButton->setEnabled(selection);
00490   d->ui->mCCButton->setEnabled(selection);
00491   d->ui->mBCCButton->setEnabled(selection);
00492 }
00493 
00494 void
00495 AddressesDialog::selectedSelectionChanged()
00496 {
00497   bool selection = !selectedSelectedAddresses.isEmpty();
00498   d->ui->mRemoveButton->setEnabled(selection);
00499 }
00500 
00501 void
00502 AddressesDialog::availableAddressSelected( AddresseeViewItem* item, bool selected )
00503 {
00504   if (selected)
00505   {
00506     selectedAvailableAddresses.append(item);
00507   }
00508   else
00509   {
00510     selectedAvailableAddresses.remove(item);
00511   }
00512 }
00513 
00514 void
00515 AddressesDialog::selectedAddressSelected( AddresseeViewItem* item, bool selected )
00516 {
00517   // we have to avoid that a parent and a child is selected together
00518   // because in this case we get a double object deletion ( program crashes )
00519   // when removing the selected items from list
00520   AddresseeViewItem* parent = static_cast<AddresseeViewItem*>(((QListViewItem*)item)->parent());
00521   if ( parent  && selected )
00522     parent->setSelected( false );
00523   if (selected)
00524   {
00525     selectedSelectedAddresses.append(item);
00526   }
00527   else
00528   {
00529     selectedSelectedAddresses.remove(item);
00530   }
00531   if ( selected ) {
00532     AddresseeViewItem* child = static_cast<AddresseeViewItem*>(item->firstChild());
00533     while (child) {
00534       child->setSelected( false );
00535       child = static_cast<AddresseeViewItem*>(child->nextSibling());
00536     }
00537   }
00538 }
00539 
00540 void
00541 AddressesDialog::initConnections()
00542 {
00543   connect( d->ui->mFilterEdit, SIGNAL(textChanged(const QString &)),
00544            SLOT(filterChanged(const QString &)) );
00545   connect( d->ui->mToButton, SIGNAL(clicked()),
00546            SLOT(addSelectedTo()) );
00547   connect( d->ui->mCCButton, SIGNAL(clicked()),
00548            SLOT(addSelectedCC()) );
00549   connect( d->ui->mBCCButton, SIGNAL(clicked()),
00550            SLOT(addSelectedBCC())  );
00551   connect( d->ui->mSaveAs, SIGNAL(clicked()),
00552            SLOT(saveAs())  );
00553   connect( d->ui->mRemoveButton, SIGNAL(clicked()),
00554            SLOT(removeEntry()) );
00555   connect( d->ui->mAvailableView, SIGNAL(selectionChanged()),
00556            SLOT(availableSelectionChanged())  );
00557   connect( d->ui->mAvailableView, SIGNAL(doubleClicked(QListViewItem*)),
00558            SLOT(addSelectedTo()) );
00559   connect( d->ui->mSelectedView, SIGNAL(selectionChanged()),
00560            SLOT(selectedSelectionChanged()) );
00561   connect( d->ui->mSelectedView, SIGNAL(doubleClicked(QListViewItem*)),
00562            SLOT(removeEntry()) );
00563 
00564   connect( KABC::DistributionListWatcher::self(), SIGNAL( changed() ),
00565            this, SLOT( updateAvailableAddressees() ) );
00566 
00567   connect( KABC::StdAddressBook::self(), SIGNAL( addressBookChanged(AddressBook*) ),
00568            this, SLOT( updateAvailableAddressees() ) );
00569 }
00570 
00571 void
00572 AddressesDialog::addAddresseeToAvailable( const KABC::Addressee& addr, AddresseeViewItem* defaultParent, bool useCategory )
00573 {
00574   if ( addr.preferredEmail().isEmpty() )
00575     return;
00576 
00577   if ( useCategory ) {
00578     QStringList categories = addr.categories();
00579 
00580     for ( QStringList::Iterator it = categories.begin(); it != categories.end(); ++it ) {
00581       if ( !d->groupDict[ *it ] ) {  //we don't have the category yet
00582         AddresseeViewItem* category = new AddresseeViewItem( d->ui->mAvailableView, *it );
00583         d->groupDict.insert( *it,  category );
00584       }
00585 
00586       for ( uint i = 0; i < addr.emails().count(); ++i ) {
00587         AddresseeViewItem* addressee = new AddresseeViewItem( d->groupDict[ *it ], addr, i );
00588         connect(addressee, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00589                 this, SLOT(availableAddressSelected(AddresseeViewItem*, bool)));
00590       }
00591     }
00592   }
00593 
00594   bool noCategory = false;
00595   if ( useCategory ) {
00596     if ( addr.categories().isEmpty() )
00597       noCategory = true;
00598   } else
00599     noCategory = true;
00600 
00601   if ( defaultParent && noCategory ) { // only non-categorized items here
00602     AddresseeViewItem* addressee = new AddresseeViewItem( defaultParent, addr );
00603     connect(addressee, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00604             this, SLOT(availableAddressSelected(AddresseeViewItem*, bool)));
00605   }
00606 }
00607 
00608 void
00609 AddressesDialog::addAddresseeToSelected( const KABC::Addressee& addr, AddresseeViewItem* defaultParent )
00610 {
00611   if ( addr.preferredEmail().isEmpty() )
00612     return;
00613 
00614   if ( defaultParent ) {
00615     AddresseeViewItem *myChild = static_cast<AddresseeViewItem*>( defaultParent->firstChild() );
00616     while( myChild ) {
00617       if ( myChild->addressee().preferredEmail() == addr.preferredEmail() )
00618         return;//already got it
00619       myChild = static_cast<AddresseeViewItem*>( myChild->nextSibling() );
00620     }
00621     AddresseeViewItem* addressee = new AddresseeViewItem( defaultParent, addr );
00622     connect(addressee, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00623             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00624     defaultParent->setOpen( true );
00625   }
00626 
00627   d->ui->mSaveAs->setEnabled(true);
00628 }
00629 
00630 void
00631 AddressesDialog::addAddresseesToSelected( AddresseeViewItem *parent,
00632                                           const QPtrList<AddresseeViewItem>& addresses )
00633 {
00634   Q_ASSERT( parent );
00635 
00636   QPtrListIterator<AddresseeViewItem> itr( addresses );
00637 
00638   if (itr.current())
00639   {
00640     d->ui->mSaveAs->setEnabled(true);
00641   }
00642 
00643   while ( itr.current() ) {
00644     AddresseeViewItem* address = itr.current();
00645     ++itr;
00646 
00647     if (selectedToAvailableMapping.find(address) != 0)
00648     {
00649       continue;
00650     }
00651 
00652     AddresseeViewItem* newItem = 0;
00653     if (address->category() == AddresseeViewItem::Entry)
00654     {
00655       newItem = new AddresseeViewItem( parent, address->addressee() );
00656     }
00657     else if (address->category() == AddresseeViewItem::DistList)
00658     {
00659       newItem = new AddresseeViewItem( parent, address->name() );
00660     }
00661     else
00662     {
00663       newItem = new AddresseeViewItem( parent, address->name(), allAddressee( address ) );
00664     }
00665 
00666     address->setSelected( false );
00667     address->setVisible( false );
00668     selectedToAvailableMapping.insert(address, newItem);
00669     selectedToAvailableMapping.insert(newItem, address);
00670     connect(newItem, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00671             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00672   }
00673 
00674   parent->setOpen( true );
00675 }
00676 
00677 QStringList
00678 AddressesDialog::entryToString( const KABC::Addressee::List& l ) const
00679 {
00680   QStringList entries;
00681 
00682   for( KABC::Addressee::List::ConstIterator it = l.begin(); it != l.end(); ++it ) {
00683     entries += (*it).fullEmail();
00684   }
00685   return entries;
00686 }
00687 
00688 void
00689 AddressesDialog::addSelectedTo()
00690 {
00691   if ( !d->toItem )
00692   {
00693     d->toItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("To"), AddresseeViewItem::To );
00694     connect(d->toItem, SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00695             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00696   }
00697 
00698   addAddresseesToSelected( d->toItem, selectedAvailableAddresses );
00699   selectedAvailableAddresses.clear();
00700 
00701   if ( d->toItem->childCount() > 0 )
00702     d->toItem->setVisible( true );
00703   else
00704   {
00705     delete d->toItem;
00706     d->toItem = 0;
00707   }
00708 }
00709 
00710 void
00711 AddressesDialog::addSelectedCC()
00712 {
00713   if ( !d->ccItem )
00714   {
00715     d->ccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("CC"), AddresseeViewItem::CC );
00716     connect(d->ccItem , SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00717             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00718   }
00719 
00720   addAddresseesToSelected( d->ccItem, selectedAvailableAddresses );
00721   selectedAvailableAddresses.clear();
00722 
00723   if ( d->ccItem->childCount() > 0 )
00724     d->ccItem->setVisible( true );
00725   else
00726   {
00727     delete d->ccItem;
00728     d->ccItem = 0;
00729   }
00730 }
00731 
00732 void
00733 AddressesDialog::addSelectedBCC()
00734 {
00735   if ( !d->bccItem )
00736   {
00737     d->bccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("BCC"), AddresseeViewItem::BCC );
00738     connect(d->bccItem , SIGNAL(addressSelected(AddresseeViewItem*, bool)),
00739             this, SLOT(selectedAddressSelected(AddresseeViewItem*, bool)));
00740   }
00741 
00742   addAddresseesToSelected( d->bccItem, selectedAvailableAddresses );
00743   selectedAvailableAddresses.clear();
00744 
00745   if ( d->bccItem->childCount() > 0 )
00746     d->bccItem->setVisible( true );
00747   else
00748   {
00749     delete d->bccItem;
00750     d->bccItem = 0;
00751   }
00752 }
00753 
00754 void AddressesDialog::unmapSelectedAddress(AddresseeViewItem* item)
00755 {
00756   AddresseeViewItem* correspondingItem = selectedToAvailableMapping[item];
00757   if (correspondingItem)
00758   {
00759     correspondingItem->setVisible( true );
00760     selectedToAvailableMapping.remove( item );
00761     selectedToAvailableMapping.remove( correspondingItem );
00762   }
00763 
00764   AddresseeViewItem* child = static_cast<AddresseeViewItem*>(item->firstChild());
00765   while (child)
00766   {
00767     unmapSelectedAddress(child);
00768     child = static_cast<AddresseeViewItem*>(child->nextSibling());
00769   }
00770 }
00771 
00772 void
00773 AddressesDialog::removeEntry()
00774 {
00775   QPtrList<AddresseeViewItem> lst;
00776   bool resetTo  = false;
00777   bool resetCC  = false;
00778   bool resetBCC = false;
00779 
00780   lst.setAutoDelete( false );
00781   QPtrListIterator<AddresseeViewItem> it( selectedSelectedAddresses );
00782   while ( it.current() ) {
00783     AddresseeViewItem* item = it.current();
00784     ++it;
00785     if ( d->toItem == item )
00786       resetTo = true;
00787     else if ( d->ccItem == item )
00788       resetCC = true;
00789     else if( d->bccItem == item )
00790       resetBCC = true;
00791     // we may only append parent items
00792     unmapSelectedAddress(item);
00793     lst.append( item );
00794   }
00795   selectedSelectedAddresses.clear();
00796   lst.setAutoDelete( true );
00797   lst.clear();
00798   if ( resetTo )
00799     d->toItem  = 0;
00800   else if ( d->toItem && d->toItem->childCount() == 0 )
00801   {
00802     delete d->toItem;
00803     d->toItem = 0;
00804   }
00805   if ( resetCC )
00806     d->ccItem = 0;
00807   else if ( d->ccItem && d->ccItem->childCount() == 0 )
00808   {
00809     delete d->ccItem;
00810     d->ccItem = 0;
00811   }
00812   if ( resetBCC )
00813     d->bccItem  = 0;
00814   else if ( d->bccItem && d->bccItem->childCount() == 0 )
00815   {
00816     delete d->bccItem;
00817     d->bccItem = 0;
00818   }
00819   d->ui->mSaveAs->setEnabled(d->ui->mSelectedView->firstChild() != 0);
00820 }
00821 
00822 void
00823 AddressesDialog::saveAs()
00824 {
00825   KABC::DistributionListManager manager( KABC::StdAddressBook::self( true ) );
00826   manager.load();
00827 
00828   if ( !d->ui->mSelectedView->firstChild() ) {
00829     KMessageBox::information( 0,
00830                               i18n("There are no addresses in your list. "
00831                                    "First add some addresses from your address book, "
00832                                    "then try again.") );
00833     return;
00834   }
00835 
00836   bool ok = false;
00837   QString name = KInputDialog::getText( i18n("New Distribution List"),
00838                                         i18n("Please enter name:"),
00839                                         QString::null, &ok,
00840                                         this );
00841   if ( !ok || name.isEmpty() )
00842     return;
00843 
00844   if ( manager.list( name ) ) {
00845     KMessageBox::information( 0,
00846                               i18n( "<qt>Distribution list with the given name <b>%1</b> "
00847                                     "already exists. Please select a different name.</qt>" )
00848                               .arg( name ) );
00849     return;
00850   }
00851 
00852   KABC::DistributionList *dlist = new KABC::DistributionList( &manager, name );
00853   KABC::Addressee::List addrl = allAddressee( d->ui->mSelectedView, false );
00854   for ( KABC::Addressee::List::iterator itr = addrl.begin();
00855         itr != addrl.end(); ++itr ) {
00856     dlist->insertEntry( *itr );
00857   }
00858 
00859   manager.save();
00860 }
00861 
00862 void
00863 AddressesDialog::launchAddressBook()
00864 {
00865   kapp->startServiceByDesktopName( "kaddressbook", QString() );
00866 }
00867 
00868 void
00869 AddressesDialog::filterChanged( const QString& txt )
00870 {
00871   QListViewItemIterator it( d->ui->mAvailableView );
00872   bool showAll = false;
00873 
00874   if ( txt.isEmpty() )
00875     showAll = true;
00876 
00877   while ( it.current() ) {
00878     AddresseeViewItem* item = static_cast<AddresseeViewItem*>( it.current() );
00879     ++it;
00880     if ( showAll ) {
00881       item->setVisible( true );
00882       if ( item->category() == AddresseeViewItem::Group )
00883         item->setOpen( false );//close to not have too many entries
00884       continue;
00885     }
00886     if ( item->category() == AddresseeViewItem::Entry ) {
00887       bool matches = item->matches( txt ) ;
00888       item->setVisible( matches );
00889       if ( matches && static_cast<QListViewItem*>(item)->parent() ) {
00890           static_cast<QListViewItem*>(item)->parent()->setOpen( true );//open the parents with found entries
00891       }
00892     }
00893   }
00894 }
00895 
00896 KABC::Addressee::List
00897 AddressesDialog::allAddressee( KListView* view, bool onlySelected ) const
00898 {
00899   KABC::Addressee::List lst;
00900   QListViewItemIterator it( view );
00901   while ( it.current() ) {
00902     AddresseeViewItem* item = static_cast<AddresseeViewItem*>( it.current() );
00903     if ( !onlySelected || item->isSelected() ) {
00904       if ( item->category() != AddresseeViewItem::Entry  ) {
00905         AddresseeViewItem *myChild = static_cast<AddresseeViewItem*>( item->firstChild() );
00906         while( myChild ) {
00907           lst.append( myChild->addressee() );
00908           myChild = static_cast<AddresseeViewItem*>( myChild->nextSibling() );
00909         }
00910       } else {
00911         lst.append( item->addressee() );
00912       }
00913     }
00914     ++it;
00915   }
00916 
00917   return lst;
00918 }
00919 
00920 KABC::Addressee::List
00921 AddressesDialog::allAddressee( AddresseeViewItem* parent ) const
00922 {
00923   KABC::Addressee::List lst;
00924 
00925   if ( !parent ) return lst;
00926 
00927   if ( parent->category() == AddresseeViewItem::Entry )
00928   {
00929     lst.append( parent->addressee() );
00930     return lst;
00931   }
00932 
00933   AddresseeViewItem *myChild = static_cast<AddresseeViewItem*>( parent->firstChild() );
00934   while( myChild ) {
00935     if ( myChild->category() == AddresseeViewItem::FilledGroup )
00936       lst += myChild->addresses();
00937     else if ( !myChild->addressee().isEmpty() )
00938       lst.append( myChild->addressee() );
00939     myChild = static_cast<AddresseeViewItem*>( myChild->nextSibling() );
00940   }
00941 
00942   return lst;
00943 }
00944 
00945 QStringList
00946 AddressesDialog::allDistributionLists( AddresseeViewItem* parent ) const
00947 {
00948   QStringList lists;
00949 
00950   if ( !parent )
00951     return QStringList();
00952 
00953   AddresseeViewItem *item = static_cast<AddresseeViewItem*>( parent->firstChild() );
00954   while ( item ) {
00955     if ( item->category() == AddresseeViewItem::DistList && !item->name().isEmpty() )
00956       lists.append( item->name() );
00957 
00958     item = static_cast<AddresseeViewItem*>( item->nextSibling() );
00959   }
00960 
00961   return lists;
00962 }
00963 
00964 void
00965 AddressesDialog::addDistributionLists()
00966 {
00967   KABC::DistributionListManager manager( KABC::StdAddressBook::self( true ) );
00968   manager.load();
00969 
00970   QStringList distLists = manager.listNames();
00971   if ( distLists.isEmpty() )
00972     return;
00973 
00974   AddresseeViewItem *topItem = new AddresseeViewItem( d->ui->mAvailableView,
00975                                                       i18n( "Distribution Lists" ) );
00976 
00977   QStringList::Iterator listIt;
00978   for ( listIt = distLists.begin(); listIt != distLists.end(); ++listIt ) {
00979     KABC::DistributionList* dlist = manager.list( *listIt );
00980     KABC::DistributionList::Entry::List entries = dlist->entries();
00981 
00982     AddresseeViewItem *item = new AddresseeViewItem( topItem, dlist->name() );
00983     connect( item, SIGNAL( addressSelected( AddresseeViewItem*, bool ) ),
00984              this, SLOT( availableAddressSelected( AddresseeViewItem*, bool ) ) );
00985 
00986     KABC::DistributionList::Entry::List::Iterator itemIt;
00987     for ( itemIt = entries.begin(); itemIt != entries.end(); ++itemIt )
00988       addAddresseeToAvailable( (*itemIt).addressee, item, false );
00989   }
00990 }
00991 
00992 }
00993 
00994 #include "addressesdialog.moc"
KDE Logo
This file is part of the documentation for libkdepim Library Version 3.3.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Mar 23 22:40:51 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003