diff options
Diffstat (limited to 'kword/mailmerge/kabc/KWMailMergeKABCConfig.cpp')
-rw-r--r-- | kword/mailmerge/kabc/KWMailMergeKABCConfig.cpp | 546 |
1 files changed, 546 insertions, 0 deletions
diff --git a/kword/mailmerge/kabc/KWMailMergeKABCConfig.cpp b/kword/mailmerge/kabc/KWMailMergeKABCConfig.cpp new file mode 100644 index 00000000..dee519c3 --- /dev/null +++ b/kword/mailmerge/kabc/KWMailMergeKABCConfig.cpp @@ -0,0 +1,546 @@ +/* + This file is part of the KDE project + Copyright (C) 2004 Dirk Schmidt <fs@dirk-schmidt.net> + + 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 <qvbox.h> +#include <qlayout.h> +#include <qlineedit.h> + +#include <kapplication.h> +#include <kdebug.h> +#include <kglobal.h> +#include <kinputdialog.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kpushbutton.h> +#include <krun.h> +#include <kabc/stdaddressbook.h> +#include <kabc/distributionlist.h> + +#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<KWMailMergeKABCConfigListItem*> ( 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<KWMailMergeKABCConfigListItem*> ( 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<KWMailMergeKABCConfigListItem*> ( 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<KWMailMergeKABCConfigListItem*> ( 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( "<qt>Distribution list with the given name <b>%1</b> " + "already exists. Please select a different name.</qt>" ) + .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<KWMailMergeKABCConfigListItem*> ( 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<KWMailMergeKABCConfigListItem*>( 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" |