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.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Oct 21 19:46:29 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003