00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
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
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
00440
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
00518
00519
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 ] ) {
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 ) {
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;
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
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 );
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 );
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"