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.
 
 
 

485 lines
12 KiB

#include <kabc/stdaddressbook.h>
#include <kabc/distributionlist.h>
#include <kpushbutton.h>
#include <klineedit.h>
#include <klocale.h>
#include <kbusyptr.h>
#include <kdebug.h>
#include <qlayout.h>
#include <qvbox.h>
#include <qwidget.h>
#include <qdict.h>
#include "kmkernel.h"
#include "recentaddresses.h"
#include "kmaddrbook.h"
#include "addressesdialog.h"
#include "addresspicker.h"
namespace KMail {
// private start :
struct AddresseeViewItemPrivate {
KABC::Addressee address;
AddresseeViewItem::Category category;
};
struct AddressesDialogPrivate {
AddressesDialogPrivate() : ui(0), toItem(0), ccItem(0), bccItem(0)
{}
AddressPickerUI *ui;
AddresseeViewItem *personal;
AddresseeViewItem *recent;
AddresseeViewItem *toItem;
AddresseeViewItem *ccItem;
AddresseeViewItem *bccItem;
QDict<AddresseeViewItem> groupDict;
};
// privates end
AddresseeViewItem::AddresseeViewItem( AddresseeViewItem *parent, const KABC::Addressee& addr )
: KListViewItem( parent, addr.realName(), addr.preferredEmail() )
{
d = new AddresseeViewItemPrivate;
d->address = addr;
d->category = Entry;
}
AddresseeViewItem::AddresseeViewItem( KListView *lv, const QString& name, Category cat )
: KListViewItem( lv, name )
{
d = new AddresseeViewItemPrivate;
d->category = cat;
}
AddresseeViewItem::~AddresseeViewItem()
{
delete d;
d = 0;
}
KABC::Addressee
AddresseeViewItem::addressee() const
{
return d->address;
}
AddresseeViewItem::Category
AddresseeViewItem::category() const
{
return d->category;
}
QString
AddresseeViewItem::name() const
{
return text(0);
}
QString
AddresseeViewItem::email() const
{
return text(1);
}
int
AddresseeViewItem::compare( QListViewItem * i, int col, bool ascending ) const
{
if ( category() == Group || category() == Entry )
return KListViewItem::compare( i , col, ascending );
AddresseeViewItem *item = static_cast<AddresseeViewItem*>( i );
int a = static_cast<int>( category() );
int b = static_cast<int>( item->category() );
if ( ascending )
if ( a < b )
return -1;
else
return 1;
else
if ( a < b )
return 1;
else
return -1;
}
QString AddressesDialog::personalGroup = i18n("Personal Address Book");
QString AddressesDialog::recentGroup = i18n("Recent Addresses");
AddressesDialog::AddressesDialog( QWidget *widget, const char *name )
: KDialogBase( widget, name, true, i18n("Address selection"),
Ok|Cancel, Ok, true )
{
QVBox *page = makeVBoxMainWidget();
d = new AddressesDialogPrivate;
d->ui = new AddressPickerUI( page );
initGUI();
initConnections();
}
AddressesDialog::~AddressesDialog()
{
}
void
AddressesDialog::setSelectedTo( const QStringList& l )
{
QString name, email;
for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
KABC::Addressee addr;
KABC::Addressee::parseEmailAddress( *it, name, email );
addr.setNameFromString( name );
addr.insertEmail( email );
if ( !d->toItem )
d->toItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("To"), AddresseeViewItem::To );
addAddresseeToSelected( addr, d->toItem );
}
}
void
AddressesDialog::setSelectedCC( const QStringList& l )
{
QString name, email;
for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
KABC::Addressee addr;
KABC::Addressee::parseEmailAddress( *it, name, email );
addr.setNameFromString( name );
addr.insertEmail( email );
if ( !d->ccItem )
d->ccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("CC"), AddresseeViewItem::CC );
addAddresseeToSelected( addr, d->ccItem );
}
}
void
AddressesDialog::setSelectedBCC( const QStringList& l )
{
QString name, email;
for ( QStringList::ConstIterator it = l.begin(); it != l.end(); ++it ) {
KABC::Addressee addr;
KABC::Addressee::parseEmailAddress( *it, name, email );
addr.setNameFromString( name );
addr.insertEmail( email );
if ( !d->bccItem )
d->bccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("BCC"), AddresseeViewItem::BCC );
addAddresseeToSelected( addr, d->bccItem );
}
}
QStringList
AddressesDialog::to() const
{
KABC::Addressee::List l = toAddresses();
return entryToString( l );
}
QStringList
AddressesDialog::cc() const
{
KABC::Addressee::List l = ccAddresses();
return entryToString( l );
}
QStringList
AddressesDialog::bcc() const
{
KABC::Addressee::List l = bccAddresses();
return entryToString( l );
}
KABC::Addressee::List
AddressesDialog::toAddresses() const
{
return allAddressee( d->toItem );
}
KABC::Addressee::List
AddressesDialog::ccAddresses() const
{
return allAddressee( d->ccItem );
}
KABC::Addressee::List
AddressesDialog::bccAddresses() const
{
return allAddressee( d->bccItem );
}
void
AddressesDialog::initGUI()
{
kernel->kbp()->busy();
d->ui->mAvailableView->setRootIsDecorated( true );
d->personal = new AddresseeViewItem( d->ui->mAvailableView, personalGroup );
d->recent = new AddresseeViewItem( d->ui->mAvailableView, recentGroup );
d->groupDict.insert( personalGroup, d->personal );
d->groupDict.insert( recentGroup, d->recent );
KABC::AddressBook *addressBook = KABC::StdAddressBook::self();
for( KABC::AddressBook::Iterator it = addressBook->begin();
it != addressBook->end(); ++it ) {
addAddresseeToAvailable( *it, d->personal );
}
for( KABC::Addressee::List::ConstIterator it = RecentAddresses::self()->kabcAddresses().begin();
it != RecentAddresses::self()->kabcAddresses().end(); ++it ) {
addAddresseeToAvailable( *it, d->recent );
}
kernel->kbp()->idle();
}
void
AddressesDialog::initConnections()
{
QObject::connect( d->ui->mDeleteButton, SIGNAL(pressed()),
SLOT(deleteEntry()) );
QObject::connect( d->ui->mNewButton, SIGNAL(pressed()),
SLOT(newEntry()) );
QObject::connect( d->ui->mEditButton, SIGNAL(pressed()),
SLOT(editEntry()) );
QObject::connect( d->ui->mClearButton, SIGNAL(pressed()),
SLOT(cleanEdit()) );
QObject::connect( d->ui->mFilterEdit, SIGNAL(textChanged(const QString &)),
SLOT(filterChanged(const QString &)) );
QObject::connect( d->ui->mToButton, SIGNAL(pressed()),
SLOT(addSelectedTo()) );
QObject::connect( d->ui->mCCButton, SIGNAL(pressed()),
SLOT(addSelectedCC()) );
QObject::connect( d->ui->mBCCButton, SIGNAL(pressed()),
SLOT(addSelectedBCC()) );
QObject::connect( d->ui->mSaveAs, SIGNAL(pressed()),
SLOT(saveAs()) );
QObject::connect( d->ui->mRemoveButton, SIGNAL(pressed()),
SLOT(removeEntry()) );
}
void
AddressesDialog::addAddresseeToAvailable( const KABC::Addressee& addr, AddresseeViewItem* defaultParent )
{
if ( addr.preferredEmail().isEmpty() )
return;
QStringList categories = addr.categories();
for ( QStringList::Iterator it = categories.begin(); it != categories.end(); ++it ) {
if ( d->groupDict[ *it ] ) {
new AddresseeViewItem( d->groupDict[ *it ], addr );
} else {
d->groupDict.insert( *it, new AddresseeViewItem( d->ui->mAvailableView, *it ) );
}
}
if ( defaultParent ) {
new AddresseeViewItem( defaultParent, addr );
}
}
void
AddressesDialog::addAddresseeToSelected( const KABC::Addressee& addr, AddresseeViewItem* defaultParent )
{
if ( addr.preferredEmail().isEmpty() )
return;
if ( defaultParent ) {
AddresseeViewItem *myChild = static_cast<AddresseeViewItem*>( defaultParent->firstChild() );
while( myChild ) {
if ( myChild->addressee().preferredEmail() == addr.preferredEmail() )
return;//already got it
myChild = static_cast<AddresseeViewItem*>( myChild->nextSibling() );
}
new AddresseeViewItem( defaultParent, addr );
}
}
QStringList
AddressesDialog::entryToString( const KABC::Addressee::List& l ) const
{
QStringList entries;
for( KABC::Addressee::List::ConstIterator it = l.begin(); it != l.end(); ++it ) {
entries += (*it).fullEmail();
}
return entries;
}
void
AddressesDialog::addSelectedTo()
{
KABC::Addressee::List lst = selectedAddressee( d->ui->mAvailableView );
if ( !d->toItem )
d->toItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("To"), AddresseeViewItem::To );
for( KABC::Addressee::List::Iterator it = lst.begin(); it != lst.end(); ++it ) {
addAddresseeToSelected( *it, d->toItem );
}
}
void
AddressesDialog::addSelectedCC()
{
KABC::Addressee::List lst = selectedAddressee( d->ui->mAvailableView );
if ( !d->ccItem )
d->ccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("CC"), AddresseeViewItem::CC );
for( KABC::Addressee::List::Iterator it = lst.begin(); it != lst.end(); ++it ) {
addAddresseeToSelected( *it, d->ccItem );
}
}
void
AddressesDialog::addSelectedBCC()
{
KABC::Addressee::List lst = selectedAddressee( d->ui->mAvailableView );
if ( !d->bccItem )
d->bccItem = new AddresseeViewItem( d->ui->mSelectedView, i18n("BCC"), AddresseeViewItem::BCC );
for( KABC::Addressee::List::Iterator it = lst.begin(); it != lst.end(); ++it ) {
addAddresseeToSelected( *it, d->bccItem );
}
}
void
AddressesDialog::removeEntry()
{
QPtrList<AddresseeViewItem> lst;
bool resetTo = false;
bool resetCC = false;
bool resetBCC = false;
lst.setAutoDelete( false );
QListViewItemIterator it( d->ui->mSelectedView );
while ( it.current() ) {
AddresseeViewItem* item = static_cast<AddresseeViewItem*>( it.current() );
++it;
if ( item->isSelected() ) {
if ( d->toItem == item )
resetTo = true;
else if ( d->ccItem == item )
resetCC = true;
else if( d->bccItem == item )
resetBCC = true;
lst.append( item );
}
}
lst.setAutoDelete( true );
lst.clear();
if ( resetTo )
d->toItem = 0;
if ( resetCC )
d->ccItem = 0;
if ( resetBCC )
d->bccItem = 0;
}
void
AddressesDialog::saveAs()
{
}
void
AddressesDialog::editEntry()
{
AddresseeViewItem *item = static_cast<AddresseeViewItem*>( d->ui->mAvailableView->currentItem() );
if ( item )
KMAddrBookExternal::openEmail( item->addressee().fullEmail() ,this );
}
void
AddressesDialog::newEntry()
{
KMAddrBookExternal::addNewAddressee( this );
}
void
AddressesDialog::deleteEntry()
{
}
void
AddressesDialog::cleanEdit()
{
d->ui->mFilterEdit->clear();
}
void
AddressesDialog::filterChanged( const QString& txt )
{
QListViewItemIterator it( d->ui->mAvailableView );
bool showAll = false;
if ( txt.isEmpty() )
showAll = true;
while ( it.current() ) {
AddresseeViewItem* item = static_cast<AddresseeViewItem*>( it.current() );
++it;
if ( showAll ) {
item->setVisible( true );
continue;
}
if ( item->category() == AddresseeViewItem::Entry ) {
QString name = item->addressee().fullEmail();
if ( !name.contains(txt) )
item->setVisible( false );
else
item->setVisible( true );
}
}
}
KABC::Addressee::List
AddressesDialog::selectedAddressee( KListView* view ) const
{
KABC::Addressee::List lst;
QListViewItemIterator it( view );
while ( it.current() ) {
AddresseeViewItem* item = static_cast<AddresseeViewItem*>( it.current() );
++it;
if ( item->isSelected() ) {
if ( item->category() == AddresseeViewItem::Group ) {
AddresseeViewItem *myChild = static_cast<AddresseeViewItem*>( item->firstChild() );
while( myChild ) {
lst.append( myChild->addressee() );
myChild = static_cast<AddresseeViewItem*>( myChild->nextSibling() );
}
} else {
lst.append( item->addressee() );
}
}
}
return lst;
}
KABC::Addressee::List
AddressesDialog::allAddressee( AddresseeViewItem* parent ) const
{
KABC::Addressee::List lst;
if ( !parent ) return KABC::Addressee::List();
AddresseeViewItem *myChild = static_cast<AddresseeViewItem*>( parent->firstChild() );
while( myChild ) {
lst.append( myChild->addressee() );
myChild = static_cast<AddresseeViewItem*>( myChild->nextSibling() );
}
return lst;
}
}//end namespace KMail
#include "addressesdialog.moc"