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 : 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 ] ) {
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() ) {
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;
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 );
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 );
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"