summaryrefslogtreecommitdiffstats
path: root/kaddressbook/features/distributionlistngwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kaddressbook/features/distributionlistngwidget.cpp')
-rw-r--r--kaddressbook/features/distributionlistngwidget.cpp249
1 files changed, 249 insertions, 0 deletions
diff --git a/kaddressbook/features/distributionlistngwidget.cpp b/kaddressbook/features/distributionlistngwidget.cpp
new file mode 100644
index 000000000..fee8377a6
--- /dev/null
+++ b/kaddressbook/features/distributionlistngwidget.cpp
@@ -0,0 +1,249 @@
+/*
+ This file is part of KAddressBook.
+ Copyright (c) 2007 Klaralvdalens Datakonsult AB <frank@kdab.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include "distributionlistngwidget.h"
+#include "interfaces/core.h"
+#include "searchmanager.h"
+
+#include <libkdepim/distributionlist.h>
+#include <libkdepim/kvcarddrag.h>
+
+#include <kabc/vcardconverter.h>
+
+#include <kdialog.h>
+#include <kiconloader.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+
+#include <qevent.h>
+#include <qguardedptr.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qpoint.h>
+#include <qtimer.h>
+#include <qpushbutton.h>
+#include <qtooltip.h>
+
+KAB::DistributionListNg::ListBox::ListBox( QWidget* parent ) : KListBox( parent )
+{
+ setAcceptDrops( true );
+}
+
+void KAB::DistributionListNg::ListBox::dragMoveEvent( QDragMoveEvent *event )
+{
+ QListBoxItem *item = itemAt( event->pos() );
+ if ( !item ) {
+ event->ignore();
+ }
+ else {
+ event->accept( itemRect( item ) );
+ }
+}
+
+void KAB::DistributionListNg::ListBox::dragEnterEvent( QDragEnterEvent *event )
+{
+ KListBox::dragEnterEvent( event );
+}
+
+void KAB::DistributionListNg::ListBox::dropEvent( QDropEvent *event )
+{
+ QListBoxItem *item = itemAt( event->pos() );
+ if ( !item || index( item ) == 0 )
+ return;
+
+ QString vcards;
+ if ( !KVCardDrag::decode( event, vcards ) )
+ return;
+
+ KABC::VCardConverter converter;
+ emit dropped( item->text(), converter.parseVCards( vcards ) );
+}
+
+namespace KAB {
+namespace DistributionListNg {
+
+class Factory : public KAB::ExtensionFactory
+{
+ public:
+ KAB::ExtensionWidget *extension( KAB::Core *core, QWidget *parent, const char *name )
+ {
+ return new KAB::DistributionListNg::MainWidget( core, parent, name );
+ }
+
+ QString identifier() const
+ {
+ return "distribution_list_editor";
+ }
+};
+
+}
+}
+
+extern "C" {
+ void *init_libkaddrbk_distributionlistng()
+ {
+ return ( new KAB::DistributionListNg::Factory );
+ }
+}
+
+QString KAB::DistributionListNg::MainWidget::title() const
+{
+ return i18n( "Distribution List Editor NG" );
+}
+
+QString KAB::DistributionListNg::MainWidget::identifier() const
+{
+ return "distribution_list_editor_ng";
+}
+
+KAB::DistributionListNg::MainWidget::MainWidget( KAB::Core *core, QWidget *parent, const char *name ) : KAB::ExtensionWidget( core, parent, name )
+{
+ QVBoxLayout *layout = new QVBoxLayout( this );
+ layout->setSpacing( KDialog::spacingHint() );
+
+ QHBoxLayout *buttonLayout = new QHBoxLayout();
+ layout->addLayout( buttonLayout );
+
+ QLabel *label = new QLabel( this );
+ label->setText( i18n( "Distribution Lists" ) );
+ buttonLayout->addWidget( label );
+ buttonLayout->addStretch( 1 );
+
+ mAddButton = new QPushButton( this );
+ mAddButton->setIconSet( SmallIconSet( "add" ) );
+ QToolTip::add( mAddButton, i18n( "Add distribution list" ) );
+ connect( mAddButton, SIGNAL(clicked()), core, SLOT(newDistributionList()) );
+ buttonLayout->addWidget( mAddButton );
+
+ mEditButton = new QPushButton( this );
+ mEditButton->setIconSet( SmallIconSet( "edit" ) );
+ QToolTip::add( mEditButton, i18n( "Edit distribution list" ) );
+ connect( mEditButton, SIGNAL(clicked()), this, SLOT(editSelectedDistributionList()) );
+ buttonLayout->addWidget( mEditButton );
+
+ mRemoveButton = new QPushButton( this );
+ mRemoveButton->setIconSet( SmallIconSet( "remove" ) );
+ QToolTip::add( mRemoveButton, i18n( "Remove distribution list" ) );
+ connect( mRemoveButton, SIGNAL(clicked()), this, SLOT(deleteSelectedDistributionList()) );
+ buttonLayout->addWidget( mRemoveButton );
+
+ mListBox = new ListBox( this );
+ connect( mListBox, SIGNAL( contextMenuRequested( QListBoxItem*, const QPoint& ) ),
+ this, SLOT( contextMenuRequested( QListBoxItem*, const QPoint& ) ) );
+ connect( mListBox, SIGNAL( dropped( const QString &, const KABC::Addressee::List & ) ),
+ this, SLOT( contactsDropped( const QString &, const KABC::Addressee::List & ) ) );
+ connect( mListBox, SIGNAL( highlighted( int ) ),
+ this, SLOT( itemSelected( int ) ) );
+ layout->addWidget( mListBox );
+
+ connect( core, SIGNAL( contactsUpdated() ),
+ this, SLOT( updateEntries() ) );
+ connect( core->addressBook(), SIGNAL( addressBookChanged( AddressBook* ) ),
+ this, SLOT( updateEntries() ) );
+
+ // When contacts are changed, update both distr list combo and contents of displayed distr list
+ connect( core, SIGNAL( contactsUpdated() ),
+ this, SLOT( updateEntries() ) );
+
+ QTimer::singleShot( 0, this, SLOT( updateEntries() ) );
+}
+
+void KAB::DistributionListNg::MainWidget::contextMenuRequested( QListBoxItem *item, const QPoint &point )
+{
+ QGuardedPtr<KPopupMenu> menu = new KPopupMenu( this );
+ menu->insertItem( i18n( "New Distribution List..." ), core(), SLOT( newDistributionList() ) );
+ if ( item )
+ {
+ menu->insertItem( i18n( "Edit..." ), this, SLOT( editSelectedDistributionList() ) );
+ menu->insertItem( i18n( "Delete" ), this, SLOT( deleteSelectedDistributionList() ) );
+ }
+ menu->exec( point );
+ delete menu;
+}
+
+void KAB::DistributionListNg::MainWidget::editSelectedDistributionList()
+{
+ const QListBoxItem* const item = mListBox->selectedItem();
+ if ( !item )
+ return;
+ core()->editDistributionList( item->text() );
+}
+
+void KAB::DistributionListNg::MainWidget::deleteSelectedDistributionList()
+{
+ const QListBoxItem* const item = mListBox->selectedItem();
+ const QString name = item ? item->text() : QString();
+ if ( name.isNull() )
+ return;
+ const KPIM::DistributionList list = KPIM::DistributionList::findByName(
+ core()->addressBook(), name );
+ if ( list.isEmpty() )
+ return;
+ core()->deleteDistributionLists( name );
+}
+
+void KAB::DistributionListNg::MainWidget::contactsDropped( const QString &listName, const KABC::Addressee::List &addressees )
+{
+ if ( addressees.isEmpty() )
+ return;
+
+ KPIM::DistributionList list = KPIM::DistributionList::findByName(
+ core()->addressBook(), listName );
+ if ( list.isEmpty() ) // not found [should be impossible]
+ return;
+
+ for ( KABC::Addressee::List::ConstIterator it = addressees.begin(); it != addressees.end(); ++it ) {
+ list.insertEntry( *it );
+ }
+
+ core()->addressBook()->insertAddressee( list );
+ changed( list );
+}
+
+void KAB::DistributionListNg::MainWidget::changed( const KABC::Addressee& dist )
+{
+ emit modified( KABC::Addressee::List() << dist );
+}
+
+void KAB::DistributionListNg::MainWidget::updateEntries()
+{
+ const bool hadSelection = mListBox->selectedItem() != 0;
+ const QStringList newEntries = core()->distributionListNames();
+ if ( !mCurrentEntries.isEmpty() && newEntries == mCurrentEntries )
+ return;
+ mCurrentEntries = newEntries;
+ mListBox->clear();
+ mListBox->insertItem( i18n( "All Contacts" ), 0 );
+ mListBox->insertStringList( mCurrentEntries );
+ if ( !hadSelection )
+ mListBox->setSelected( 0, true );
+}
+
+void KAB::DistributionListNg::MainWidget::itemSelected( int index )
+{
+ core()->setSelectedDistributionList( index == 0 ? QString() : mListBox->item( index )->text() );
+ mEditButton->setEnabled( index > 0 );
+ mRemoveButton->setEnabled( index > 0 );
+}
+
+#include "distributionlistngwidget.moc"