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 Wed Jul 28 23:57:46 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003