You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
547 lines
18 KiB
547 lines
18 KiB
15 years ago
|
/*
|
||
|
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"
|