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"