/* This file is part of the KDE project Copyright (C) 2004 Dirk Schmidt This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "addresspicker.h" #include "KWMailMergeKABC.h" #include "KWMailMergeKABCConfig.h" KWMailMergeKABCConfig::KWMailMergeKABCConfig( QWidget *parent, KWMailMergeKABC *db_) :KDialogBase( Plain, i18n( "Mail Merge - Editor" ), Ok | Cancel, Ok, parent, "", true) { _db = db_; (new QVBoxLayout(plainPage()))->setAutoAdd(true); setMainWidget( _ui=new AddressPickerUI( plainPage() ) ); updateAvailable(); initSelectedAddressees(); initSelectedLists(); initSlotSignalConnections(); } KWMailMergeKABCConfig::~KWMailMergeKABCConfig() { ; } void KWMailMergeKABCConfig::acceptSelection() { _db->clear(); QListViewItem* top = _ui->mSelectedView->firstChild(); while(top) { kdDebug() << "acceptSelection(): " << top->text(0) << endl; if( top->text(0) == i18n("Distribution Lists") ) { QListViewItem* item = top->firstChild(); while(item) { kdDebug() << "acceptSelection(): " << item->text(0) << endl; _db->addList( item->text(0) ); item = item->nextSibling(); } } else if( top->text(0) == i18n("Single Entries") ) { QListViewItem* item = top->firstChild(); while(item) { kdDebug() << "acceptSelection(): " << item->text(0) << endl; _db->addEntry( item->text(-1) ); item = item->nextSibling(); } } top = top->nextSibling(); } } void KWMailMergeKABCConfig::addSelectedContacts() { QListViewItemIterator it( _ui->mAvailableView, QListViewItemIterator::Selected ); QListViewItem* selected = _ui->mSelectedView->findItem( i18n("Single Entries"), 0, Qt::ExactMatch ); QListViewItem* selectedLists = _ui->mSelectedView->findItem( i18n("Distribution Lists"), 0, Qt::ExactMatch ); while ( it.current() ) { if( it.current()->depth() > 0 ) { QString uid = it.current()->text( -1 ); kdDebug() << "addSelectedContacts(): uid :" << uid << endl; if( !uid.isEmpty() ) { KWMailMergeKABCConfigListItem *item = static_cast ( it.current() ); if( selected ) { selected->insertItem( item ); selected->setOpen( true ); destroyAvailableClones( uid ); } } else if( it.current()->parent()->text(0) == i18n("Distribution Lists") ) { if( selectedLists ) { selectedLists->insertItem( it.current() ); selectedLists->setOpen( true ); } } } ++it; } _ui->mSelectedView->selectAll( false ); } void KWMailMergeKABCConfig::destroyAvailableClones( const QString& uid ) { if( uid.isEmpty() ) return; QListViewItemIterator it( _ui->mAvailableView ); while ( it.current() ) { if( it.current()->depth() > 0) { if( it.current()->text(-1)== uid ) { delete it.current(); } } ++it; } } void KWMailMergeKABCConfig::filterChanged( const QString& txt ) { kdDebug() << "KWMailMergeKABCConfig::filterChanged( " << txt << " )" << endl; bool showAll = txt.isEmpty(); QListViewItem* category = _ui->mAvailableView->firstChild(); while(category) { if( category->text(0)!=i18n("Distribution Lists") ) { QListViewItem* item = category->firstChild(); while(item) { if(showAll) { item->setVisible( true ); } else { item->setVisible( item->text(0).contains( txt, false ) ); } item = item->nextSibling(); } category->setOpen( !showAll ); } else { category->setVisible( showAll ); } category = category->nextSibling(); } } void KWMailMergeKABCConfig::initSelectedAddressees() { QStringList records = _db->singleRecords(); QListViewItem* category = _ui->mAvailableView->firstChild(); QListViewItem* selected = _ui->mSelectedView->findItem( i18n("Single Entries"), 0, Qt::ExactMatch ); while ( category && (records.count()>0) ) { if( category->text(0) != i18n("Distribution Lists") ) { KWMailMergeKABCConfigListItem* item = static_cast ( category->firstChild() ); while( item && (records.count()>0) ) { // Need some temporary item, because after selected->insertItem( item ) // the item->nextSibling() is not the one we want. KWMailMergeKABCConfigListItem* nextItem = static_cast ( item->nextSibling() ); for( QStringList::Iterator itRecords = records.begin(); itRecords != records.end(); ++itRecords ) { QString uid = *itRecords; if( item->text(-1) == uid ) { selected->insertItem( item ); // downsize records to speed up iterations itRecords = records.remove( itRecords ); --itRecords; destroyAvailableClones( uid ); } } item = nextItem; } } category = category->nextSibling(); } } void KWMailMergeKABCConfig::initSelectedLists() { QStringList lists = _db->lists(); kdDebug() << "::initSelectedLists()" << lists.join(",") << endl; QListViewItem* l = _ui->mAvailableView->findItem( i18n("Distribution Lists"), 0, Qt::ExactMatch ); QListViewItem* selected = _ui->mSelectedView->findItem( i18n("Distribution Lists"), 0, Qt::ExactMatch ); QListViewItem* item = ( l->firstChild() ); while( item && (lists.count()>0) ) { QListViewItem* nextItem = item->nextSibling(); for( QStringList::Iterator itLists = lists.begin(); itLists != lists.end(); ++itLists ) { QString id = *itLists; if( item->text(0) == id ) { selected->insertItem( item ); itLists = lists.remove( itLists ); --itLists; } } item = nextItem; } } void KWMailMergeKABCConfig::initSlotSignalConnections() { connect( this, SIGNAL( okClicked() ), SLOT( acceptSelection() ) ); connect( _ui->mAddButton, SIGNAL( clicked() ), SLOT( addSelectedContacts() ) ); connect( _ui->mAddressBook, SIGNAL( clicked() ), SLOT( launchAddressbook() ) ); connect( _ui->mAvailableView, SIGNAL( doubleClicked( QListViewItem *, const QPoint &, int ) ), SLOT( addSelectedContacts() ) ); connect( _ui->mFilterEdit, SIGNAL( textChanged(const QString &) ), SLOT( filterChanged(const QString &) ) ); connect( _ui->mRemoveButton, SIGNAL( clicked() ), SLOT( removeSelectedContacts() ) ); connect( _ui->mSaveList, SIGNAL( clicked() ), SLOT( saveDistributionList() ) ); connect( _ui->mSelectedView, SIGNAL( doubleClicked( QListViewItem *, const QPoint &, int ) ), SLOT( removeSelectedContacts() ) ); } void KWMailMergeKABCConfig::launchAddressbook() const { kapp->startServiceByDesktopName( "kaddressbook", QString() ); } void KWMailMergeKABCConfig::removeContact( QListViewItem* item ) { QStringList& categories = _usedCategories; QListViewItem* availableLists = _ui->mAvailableView->findItem( i18n("Distribution Lists"), 0, Qt::ExactMatch ); if( item->depth() > 0 ) { if( !item->text( -1 ).isEmpty() ) // remove selected single entry here { KWMailMergeKABCConfigListItem* rightItem = static_cast ( item ); QStringList entryCategories = rightItem->addressee().categories(); for ( QStringList::Iterator itEntryCat = entryCategories.begin(); itEntryCat != entryCategories.end(); ++itEntryCat ) { int i = categories.findIndex(*itEntryCat); if( i == -1 ) { QListViewItem* category = new QListViewItem( _ui->mAvailableView, *itEntryCat ); categories.append( *itEntryCat ); KWMailMergeKABCConfigListItem* leftItem = new KWMailMergeKABCConfigListItem( category, rightItem->addressee() ); } else { KWMailMergeKABCConfigListItem* leftItem = new KWMailMergeKABCConfigListItem( _ui->mAvailableView->findItem( *itEntryCat, 0, Qt::ExactMatch), rightItem->addressee() ); } } if( entryCategories.isEmpty() ) { QString noCat = i18n("no category"); KWMailMergeKABCConfigListItem* leftItem = new KWMailMergeKABCConfigListItem( _ui->mAvailableView->findItem( noCat, 0, Qt::ExactMatch), rightItem->addressee() ); } delete item; } else if( item->parent()->text(0) == i18n("Distribution Lists") ) // remove a list { if( availableLists ) availableLists->insertItem( item ); } } } void KWMailMergeKABCConfig::removeSelectedContacts() { QListViewItemIterator it( _ui->mSelectedView, QListViewItemIterator::Selected ); while( it.current() ) { kdDebug() << "removeSelectedContacts(): text: " << it.current()->text(-1) << endl; removeContact( it.current() ); ++it; } _ui->mAvailableView->selectAll( false ); } void KWMailMergeKABCConfig::saveDistributionList() { KABC::DistributionListManager dlm( KABC::StdAddressBook::self() ); dlm.load(); bool ok = false; QString listName = KInputDialog::getText( i18n("New Distribution List"), i18n("Please enter name:"), QString::null, &ok, this ); if ( !ok || listName.isEmpty() ) return; if ( dlm.list( listName ) ) { KMessageBox::information( 0, i18n( "Distribution list with the given name %1 " "already exists. Please select a different name." ) .arg( listName ) ); return; } KABC::DistributionList *distList = new KABC::DistributionList( &dlm, listName ); QListViewItem* newListItem = new QListViewItem( _ui->mSelectedView->findItem( i18n("Distribution Lists"),0 , Qt::ExactMatch), listName ); QListViewItem* category = _ui->mSelectedView->firstChild(); while(category) { if( category->text(0)==i18n("Single Entries") ) { KWMailMergeKABCConfigListItem* item = static_cast ( category->firstChild() ); while(item) { distList->insertEntry( item->addressee() ); KABC::Addressee addr = item->addressee(); QString formattedName = addr.formattedName(); QListViewItem* newItem = new QListViewItem( newListItem, item->addressee().formattedName() ); newItem->setEnabled( false ); item = static_cast( item->nextSibling() ); } QListViewItemIterator it ( category->firstChild() ); while( it.current() ) { removeContact( it.current() ); ++it; } } category = category->nextSibling(); } dlm.save(); newListItem->setOpen( true ); } void KWMailMergeKABCConfig::updateAvailable() { _ui->mAvailableView->clear(); _ui->mAvailableView->setRootIsDecorated( true ); // // First append the addressees. // QListViewItem* noCategory = new QListViewItem( _ui->mAvailableView, i18n("no category") ); QStringList& categories = _usedCategories ; categories.clear(); KABC::AddressBook *addressBook = KABC::StdAddressBook::self(); for( KABC::AddressBook::Iterator itAddr = addressBook->begin(); itAddr != addressBook->end(); ++itAddr ) { QStringList entryCategories = itAddr->categories(); for ( QStringList::Iterator itCat = entryCategories.begin(); itCat != entryCategories.end(); ++itCat ) { int i = categories.findIndex(*itCat); // Create category, if not yet in listview and append item to it. if( i == -1 ) { QListViewItem* category = new QListViewItem( _ui->mAvailableView, *itCat ); categories.append( *itCat ); KWMailMergeKABCConfigListItem* item = new KWMailMergeKABCConfigListItem( category, *itAddr ); } // Append item to existing category in listview. else { KWMailMergeKABCConfigListItem* item = new KWMailMergeKABCConfigListItem( _ui->mAvailableView->findItem( *itCat, 0, Qt::ExactMatch), *itAddr ); } } // If Addressee does not belong to any category, append it to "no category". if( entryCategories.isEmpty() ) { KWMailMergeKABCConfigListItem* item = new KWMailMergeKABCConfigListItem( noCategory, *itAddr ); } } // // Now append the distribution lists // KABC::DistributionListManager dlm ( addressBook ); dlm.load(); QStringList distributionLists = dlm.listNames(); QListViewItem* distributionListsItem = new QListViewItem( _ui->mAvailableView, i18n("Distribution Lists") ); QStringList::Iterator itDistributionLists; for( itDistributionLists = distributionLists.begin(); itDistributionLists != distributionLists.end(); ++itDistributionLists ) { KABC::DistributionList* list = dlm.list( *itDistributionLists ); KABC::DistributionList::Entry::List entries = list->entries(); QListViewItem* listItem = new QListViewItem( distributionListsItem, *itDistributionLists ); KABC::DistributionList::Entry::List::Iterator itList; for ( itList = entries.begin(); itList != entries.end(); ++itList ) { // Create a normal QListViewItem and disable it, because this is not a // distribution-list-editor. KAddressbook should be used instead. QListViewItem* item = new QListViewItem( listItem, (*itList).addressee.formattedName() ); item->setEnabled( false ); } } } KWMailMergeKABCConfigListItem::KWMailMergeKABCConfigListItem( QListView *parent, const KABC::Addressee& addressEntry ) : QListViewItem( parent ) { setText( 0, addressEntry.formattedName() ); _addressEntry = addressEntry; } KWMailMergeKABCConfigListItem::KWMailMergeKABCConfigListItem( QListViewItem *parent, const KABC::Addressee& addressEntry ) : QListViewItem( parent ) { setText( 0, addressEntry.formattedName() ); _addressEntry = addressEntry; } KWMailMergeKABCConfigListItem::~KWMailMergeKABCConfigListItem() {} KABC::Addressee KWMailMergeKABCConfigListItem::addressee() const { return _addressEntry; } QString KWMailMergeKABCConfigListItem::text( int column ) const { if( column == -1 ) { return _addressEntry.uid(); } else { return QListViewItem::text( column ); } } #include "KWMailMergeKABCConfig.moc"