summaryrefslogtreecommitdiffstats
path: root/libtdepim/addresseeselector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libtdepim/addresseeselector.cpp')
-rw-r--r--libtdepim/addresseeselector.cpp581
1 files changed, 581 insertions, 0 deletions
diff --git a/libtdepim/addresseeselector.cpp b/libtdepim/addresseeselector.cpp
new file mode 100644
index 000000000..792d57625
--- /dev/null
+++ b/libtdepim/addresseeselector.cpp
@@ -0,0 +1,581 @@
+/*
+ This file is part of libtdepim.
+
+ Copyright (c) 2004 Tobias Koenig <tokoe@kde.org>
+
+ 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 <tqheader.h>
+#include <tqlabel.h>
+#include <tqlayout.h>
+#include <tqsignalmapper.h>
+#include <tqtoolbutton.h>
+
+#include <kabc/stdaddressbook.h>
+#include <kcombobox.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klineedit.h>
+#include <klistview.h>
+#include <klocale.h>
+
+#include "addresseeselector.h"
+
+using namespace KPIM;
+
+class AddresseeSelector::AddressBookManager
+{
+ public:
+ TQStringList titles() const;
+
+ void addResource( KABC::Resource* );
+ void addAddressBook( const TQString &title, SelectionItem::List &list );
+
+ void clear();
+ bool contains( uint index, const SelectionItem& );
+
+ private:
+ struct AddressBookEntry {
+ TQString title;
+ SelectionItem::List list;
+ };
+
+ TQValueList<KABC::Resource*> mResources;
+ TQValueList<AddressBookEntry> mAddressBooks;
+};
+
+TQStringList AddresseeSelector::AddressBookManager::titles() const
+{
+ TQStringList titles;
+
+ // we've always an 'all' entry
+ titles.append( i18n( "All" ) );
+
+ TQValueList<KABC::Resource*>::ConstIterator resIt;
+ for ( resIt = mResources.begin(); resIt != mResources.end(); ++resIt )
+ titles.append( (*resIt)->resourceName() );
+
+ TQValueList<AddressBookEntry>::ConstIterator abIt;
+ for ( abIt = mAddressBooks.begin(); abIt != mAddressBooks.end(); ++abIt )
+ titles.append( (*abIt).title );
+
+ return titles;
+}
+
+void AddresseeSelector::AddressBookManager::addResource( KABC::Resource *resource )
+{
+ if ( mResources.find( resource ) == mResources.end() )
+ mResources.append( resource );
+}
+
+void AddresseeSelector::AddressBookManager::addAddressBook( const TQString &title,
+ SelectionItem::List &list )
+{
+ AddressBookEntry entry;
+ entry.title = title;
+ entry.list = list;
+
+
+ // TODO: check for duplicates
+ mAddressBooks.append( entry );
+}
+
+void AddresseeSelector::AddressBookManager::clear()
+{
+ mResources.clear();
+ mAddressBooks.clear();
+}
+
+bool AddresseeSelector::AddressBookManager::contains( uint index, const SelectionItem &item )
+{
+ if ( index == 0 ) // the 'all' entry
+ return true;
+
+ if ( mResources.count() > 0 ) {
+ if ( index <= mResources.count() ) {
+ index--;
+ if ( item.addressee().resource() == mResources[ index ] )
+ return true;
+ else
+ return false;
+ }
+ }
+
+ index = index - mResources.count();
+
+ if ( mAddressBooks.count() > 0 ) {
+ if ( index <= mAddressBooks.count() ) {
+ index--;
+ AddressBookEntry entry = mAddressBooks[ index ];
+ SelectionItem::List::ConstIterator it;
+ for ( it = entry.list.begin(); it != entry.list.end(); ++it )
+ if ( (*it).addressee() == item.addressee() )
+ return true;
+
+ return false;
+ }
+ }
+
+ return false;
+}
+
+
+SelectionItem::SelectionItem( const KABC::Addressee &addressee, uint index )
+ : mAddressee( addressee ), mDistributionList( 0 ), mIndex( index )
+{
+ mField.fill( false, 10 );
+}
+
+SelectionItem::SelectionItem( KABC::DistributionList *list, uint index )
+ : mDistributionList( list ), mIndex( index )
+{
+ mField.fill( false, 10 );
+}
+
+SelectionItem::SelectionItem()
+ : mDistributionList( 0 ), mIndex( 0 )
+{
+ mField.fill( false, 10 );
+}
+
+void SelectionItem::addToField( int index )
+{
+ mField.setBit( index );
+}
+
+void SelectionItem::removeFromField( int index )
+{
+ mField.clearBit( index );
+}
+
+bool SelectionItem::isInField( int index )
+{
+ return mField.testBit( index );
+}
+
+KABC::Addressee SelectionItem::addressee() const
+{
+ return mAddressee;
+}
+
+KABC::DistributionList* SelectionItem::distributionList() const
+{
+ return mDistributionList;
+}
+
+uint SelectionItem::index() const
+{
+ return mIndex;
+}
+
+
+class SelectionViewItem : public TQListViewItem
+{
+ public:
+ SelectionViewItem( TQListView *parent, Selection *selection,
+ SelectionItem *item )
+ : TQListViewItem( parent, "" ), mSelection( selection ), mItem( item )
+ {
+ if ( mItem->distributionList() == 0 )
+ mIcon = mSelection->itemIcon( mItem->addressee(), mItem->index() );
+ else
+ mIcon = mSelection->distributionListIcon( mItem->distributionList() );
+ }
+
+ TQString text( int column ) const
+ {
+ if ( column == 0 ) {
+ if ( mItem->distributionList() == 0 )
+ return mSelection->itemText( mItem->addressee(), mItem->index() );
+ else
+ return mSelection->distributionListText( mItem->distributionList() );
+ } else
+ return TQString();
+ }
+
+ const TQPixmap* pixmap( int column ) const
+ {
+ if ( column == 0 ) {
+ return &mIcon;
+ } else
+ return 0;
+ }
+
+ SelectionItem* item() const { return mItem; }
+
+ private:
+ Selection *mSelection;
+ SelectionItem *mItem;
+ TQPixmap mIcon;
+};
+
+AddresseeSelector::AddresseeSelector( Selection *selection, TQWidget *parent, const char *name )
+ : TQWidget( parent, name ), mSelection( selection ), mManager( 0 )
+{
+ mMoveMapper = new TQSignalMapper( TQT_TQOBJECT(this) );
+ mRemoveMapper = new TQSignalMapper( TQT_TQOBJECT(this) );
+
+ mAddressBookManager = new AddressBookManager();
+
+ initGUI();
+
+ init();
+
+ mSelection->setSelector( this );
+}
+
+AddresseeSelector::~AddresseeSelector()
+{
+ delete mManager;
+ mManager = 0;
+
+ delete mAddressBookManager;
+ mAddressBookManager = 0;
+}
+
+void AddresseeSelector::init()
+{
+ connect( KABC::StdAddressBook::self( true ), TQT_SIGNAL( addressBookChanged( AddressBook* ) ),
+ this, TQT_SLOT( reloadAddressBook() ) );
+ connect( mAddresseeFilter, TQT_SIGNAL( textChanged( const TQString& ) ),
+ this, TQT_SLOT( updateAddresseeView() ) );
+ connect( mAddressBookCombo, TQT_SIGNAL( activated( int ) ),
+ this, TQT_SLOT( updateAddresseeView() ) );
+
+ connect( mMoveMapper, TQT_SIGNAL( mapped( int ) ),
+ this, TQT_SLOT( move( int ) ) );
+ connect( mRemoveMapper, TQT_SIGNAL( mapped( int ) ),
+ this, TQT_SLOT( remove( int ) ) );
+
+ reloadAddressBook();
+}
+
+void AddresseeSelector::initGUI()
+{
+ TQGridLayout *tqlayout = new TQGridLayout( this, 2, 3, KDialog::marginHint(), KDialog::spacingHint() );
+ TQGridLayout *topLayout = new TQGridLayout( this, 2, 2, KDialog::marginHint() );
+
+ TQLabel *label = new TQLabel( i18n( "Address book:" ), this );
+ mAddressBookCombo = new KComboBox( false, this );
+
+ topLayout->addWidget( label, 0, 0 );
+ topLayout->addWidget( mAddressBookCombo, 0, 1 );
+
+ label = new TQLabel( i18n( "Search:" ), this );
+ mAddresseeFilter = new KLineEdit( this );
+
+ topLayout->addWidget( label, 1, 0 );
+ topLayout->addWidget( mAddresseeFilter, 1, 1 );
+
+ topLayout->setColStretch( 1, 1 );
+
+ tqlayout->addMultiCellLayout( topLayout, 0, 0, 0, 2 );
+
+ int row = 1;
+
+ TQIconSet moveSet = KGlobal::iconLoader()->loadIconSet( "next", KIcon::Small );
+ TQIconSet removeSet = KGlobal::iconLoader()->loadIconSet( "previous", KIcon::Small );
+
+ uint count = mSelection->fieldCount();
+ for ( uint i = 0; i < count; ++i, ++row ) {
+ KListView *listView = new KListView( this );
+ listView->addColumn( mSelection->fieldTitle( i ) );
+ listView->setFullWidth( true );
+ mSelectionViews.append( listView );
+
+ connect( listView, TQT_SIGNAL( doubleClicked( TQListViewItem*, const TQPoint&, int ) ),
+ mRemoveMapper, TQT_SLOT( map() ) );
+ mRemoveMapper->setMapping( TQT_TQOBJECT(listView), i );
+
+ TQVBoxLayout *buttonLayout = new TQVBoxLayout( this );
+ buttonLayout->tqsetAlignment( TQt::AlignBottom );
+ tqlayout->addLayout( buttonLayout, row, 1 );
+
+ // move button
+ TQToolButton *moveButton = new TQToolButton( this );
+ moveButton->setIconSet( moveSet );
+ moveButton->setFixedSize( 30, 30 );
+
+ connect( moveButton, TQT_SIGNAL( clicked() ),
+ mMoveMapper, TQT_SLOT( map() ) );
+ mMoveMapper->setMapping( TQT_TQOBJECT(moveButton), i );
+
+ // remove button
+ TQToolButton *removeButton = new TQToolButton( this );
+ removeButton->setIconSet( removeSet );
+ removeButton->setFixedSize( 30, 30 );
+
+ connect( removeButton, TQT_SIGNAL( clicked() ),
+ mRemoveMapper, TQT_SLOT( map() ) );
+ mRemoveMapper->setMapping( TQT_TQOBJECT(removeButton), i );
+
+ buttonLayout->addWidget( moveButton );
+ buttonLayout->addWidget( removeButton );
+
+ tqlayout->addWidget( listView, row, 2 );
+ }
+
+ mAddresseeView = new KListView( this );
+ mAddresseeView->addColumn( "" );
+ mAddresseeView->header()->hide();
+ mAddresseeView->setFullWidth( true );
+
+ tqlayout->addMultiCellWidget( mAddresseeView, 1, row, 0, 0 );
+}
+
+void AddresseeSelector::finish()
+{
+ SelectionItem::List::Iterator it;
+
+ for ( uint field = 0; field < mSelection->fieldCount(); ++field ) {
+ for ( it = mSelectionItems.begin(); it != mSelectionItems.end(); ++it ) {
+ if ( (*it).isInField( field ) ) {
+ if ( (*it).distributionList() == 0 )
+ mSelection->addSelectedAddressees( field, (*it).addressee(), (*it).index() );
+ else
+ mSelection->addSelectedDistributionList( field, (*it).distributionList() );
+ }
+ }
+ }
+}
+
+void AddresseeSelector::updateAddresseeView()
+{
+ mAddresseeView->clear();
+
+ int addressBookIndex = mAddressBookCombo->currentItem();
+
+ SelectionItem::List::Iterator it;
+ for ( it = mSelectionItems.begin(); it != mSelectionItems.end(); ++it ) {
+ if ( mAddressBookManager->contains( addressBookIndex, *it ) ) {
+ if ( (*it).distributionList() == 0 ) {
+ if ( mAddresseeFilter->text().isEmpty() ||
+ mSelection->itemMatches( (*it).addressee(), (*it).index(),
+ mAddresseeFilter->text() ) )
+ new SelectionViewItem( mAddresseeView, mSelection, &(*it) );
+ } else {
+ if ( mAddresseeFilter->text().isEmpty() ||
+ mSelection->distributionListMatches( (*it).distributionList(),
+ mAddresseeFilter->text() ) )
+ new SelectionViewItem( mAddresseeView, mSelection, &(*it) );
+ }
+ }
+ }
+
+ updateSelectionViews();
+}
+
+void AddresseeSelector::move( int index )
+{
+ SelectionViewItem *item = dynamic_cast<SelectionViewItem*>( mAddresseeView->selectedItem() );
+ if ( item ) {
+ item->item()->addToField( index );
+ updateSelectionView( index );
+ }
+}
+
+void AddresseeSelector::remove( int index )
+{
+ KListView *view = mSelectionViews[ index ];
+
+ SelectionViewItem *item = dynamic_cast<SelectionViewItem*>( view->selectedItem() );
+ if ( item ) {
+ item->item()->removeFromField( index );
+ updateSelectionView( index );
+ }
+}
+
+void AddresseeSelector::setItemSelected( uint fieldIndex, const KABC::Addressee &addr, uint itemIndex )
+{
+ bool found = false;
+
+ SelectionItem::List::Iterator it;
+ for ( it = mSelectionItems.begin(); it != mSelectionItems.end(); ++it ) {
+ if ( (*it).addressee() == addr && (*it).index() == itemIndex ) {
+ (*it).addToField( fieldIndex );
+ found = true;
+ }
+ }
+
+ if ( !found ) {
+ SelectionItem item( addr, itemIndex );
+ item.addToField( fieldIndex );
+
+ mSelectionItems.append( item );
+ }
+
+ updateSelectionView( fieldIndex );
+}
+
+void AddresseeSelector::setItemSelected( uint fieldIndex, const KABC::Addressee &addr,
+ uint itemIndex, const TQString &text )
+{
+ bool found = false;
+
+ SelectionItem::List::Iterator it;
+ for ( it = mSelectionItems.begin(); it != mSelectionItems.end(); ++it ) {
+ if ( mSelection->itemEquals( (*it).addressee(), (*it).index(), text ) ) {
+ (*it).addToField( fieldIndex );
+ found = true;
+ }
+ }
+
+ if ( !found ) {
+ SelectionItem item( addr, itemIndex );
+ item.addToField( fieldIndex );
+
+ mSelectionItems.append( item );
+ }
+
+ updateSelectionView( fieldIndex );
+}
+
+void AddresseeSelector::updateSelectionView( int index )
+{
+ KListView *view = mSelectionViews[ index ];
+ view->clear();
+
+ SelectionItem::List::Iterator it;
+ for ( it = mSelectionItems.begin(); it != mSelectionItems.end(); ++it ) {
+ if ( (*it).isInField( index ) )
+ new SelectionViewItem( view, mSelection, &(*it) );
+ }
+}
+
+void AddresseeSelector::updateSelectionViews()
+{
+ for ( uint i = 0; i < mSelection->fieldCount(); ++i )
+ updateSelectionView( i );
+}
+
+void AddresseeSelector::reloadAddressBook()
+{
+ // load contacts
+ KABC::Addressee::List list = KABC::StdAddressBook::self( true )->allAddressees();
+ KABC::Addressee::List::Iterator it;
+
+ SelectionItem::List selectedItems;
+
+ SelectionItem::List::Iterator itemIt;
+ for ( itemIt = mSelectionItems.begin(); itemIt != mSelectionItems.end(); ++itemIt ) {
+ bool isSelected = false;
+ for ( uint i = 0; i < mSelection->fieldCount(); ++i ) {
+ if ( (*itemIt).isInField( i ) ) {
+ isSelected = true;
+ break;
+ }
+ }
+
+ // we don't save distribution lists, since this leads to crashes
+ if ( isSelected && (*itemIt).distributionList() == 0 ) {
+ selectedItems.append( *itemIt );
+ }
+ }
+
+ mSelectionItems.clear();
+ mSelectionItems = selectedItems;
+
+ for ( it = list.begin(); it != list.end(); ++it ) {
+ uint itemCount = mSelection->itemCount( *it );
+ for ( uint index = 0; index < itemCount; ++index ) {
+ bool available = false;
+ for ( itemIt = mSelectionItems.begin(); itemIt != mSelectionItems.end(); ++itemIt ) {
+ if ( (*itemIt).addressee() == (*it) && (*itemIt).index() == index ) {
+ available = true;
+ break;
+ }
+ }
+
+ if ( !available ) {
+ SelectionItem item( *it, index );
+ mSelectionItems.append( item );
+ }
+ }
+ }
+
+ // load distribution lists
+ delete mManager;
+ mManager = new KABC::DistributionListManager( KABC::StdAddressBook::self( true ) );
+
+ mManager->load();
+
+ TQStringList lists = mManager->listNames();
+
+ TQStringList::Iterator listIt;
+ for ( listIt = lists.begin(); listIt != lists.end(); ++listIt ) {
+ KABC::DistributionList *list = mManager->list( *listIt );
+ SelectionItem item( list, 0 );
+ mSelectionItems.append( item );
+ }
+
+ mAddressBookManager->clear();
+
+ // update address book combo
+ mAddressBookCombo->clear();
+
+ TQPtrList<KABC::Resource> resources = KABC::StdAddressBook::self( true )->resources();
+ TQPtrListIterator<KABC::Resource> resIt( resources );
+ while ( resIt.current() ) {
+ if ( resIt.current()->isActive() )
+ mAddressBookManager->addResource( resIt );
+
+ ++resIt;
+ }
+
+ for ( uint i = 0; i < mSelection->addressBookCount(); ++i ) {
+ SelectionItem::List itemList;
+
+ KABC::Addressee::List addrList = mSelection->addressBookContent( i );
+ for ( it = addrList.begin(); it != addrList.end(); ++it ) {
+ uint itemCount = mSelection->itemCount( *it );
+ for ( uint index = 0; index < itemCount; ++index ) {
+ SelectionItem item( *it, index );
+ mSelectionItems.append( item );
+ itemList.append( item );
+ }
+ }
+
+ mAddressBookManager->addAddressBook( mSelection->addressBookTitle( i ),
+ itemList );
+ }
+
+ mAddressBookCombo->insertStringList( mAddressBookManager->titles() );
+
+ updateAddresseeView();
+}
+
+
+AddresseeSelectorDialog::AddresseeSelectorDialog( Selection *selection,
+ TQWidget *parent, const char *name )
+ : KDialogBase( Plain, "", Ok | Cancel, Ok, parent, name, true )
+{
+ TQFrame *frame = plainPage();
+ TQVBoxLayout *tqlayout = new TQVBoxLayout( frame );
+ mSelector = new KPIM::AddresseeSelector( selection, frame );
+ tqlayout->addWidget( mSelector );
+
+ resize( 500, 490 );
+}
+
+void AddresseeSelectorDialog::accept()
+{
+ mSelector->finish();
+ TQDialog::accept();
+}
+
+#include "addresseeselector.moc"