summaryrefslogtreecommitdiffabout
path: root/kaddressbook/features
Side-by-side diff
Diffstat (limited to 'kaddressbook/features') (more/less context) (ignore whitespace changes)
-rw-r--r--kaddressbook/features/distributionlistwidget.cpp501
-rw-r--r--kaddressbook/features/distributionlistwidget.h143
-rw-r--r--kaddressbook/features/mergewidget.cpp374
-rw-r--r--kaddressbook/features/mergewidget.h87
4 files changed, 1105 insertions, 0 deletions
diff --git a/kaddressbook/features/distributionlistwidget.cpp b/kaddressbook/features/distributionlistwidget.cpp
new file mode 100644
index 0000000..bfcb121
--- a/dev/null
+++ b/kaddressbook/features/distributionlistwidget.cpp
@@ -0,0 +1,501 @@
+/*
+ This file is part of KAddressBook.
+ Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
+
+ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 <qbuttongroup.h>
+#include <qcombobox.h>
+#include <qlabel.h>
+#include <qlayout.h>
+#include <qlistview.h>
+#include <qpushbutton.h>
+#include <qradiobutton.h>
+
+#ifndef KAB_EMBEDDED
+#include <kaccelmanager.h>
+#endif //KAB_EMBEDDED
+
+
+#include <kdebug.h>
+#include <klineeditdlg.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+
+#include <kabc/addressbook.h>
+#include <kabc/addresseedialog.h>
+#include <kabc/distributionlist.h>
+#include <kabc/vcardconverter.h>
+
+#ifndef KAB_EMBEDDED
+#include <libkdepim/kvcarddrag.h>
+#endif //KAB_EMBEDDED
+
+#include "kabcore.h"
+
+#include "distributionlistwidget.h"
+
+#ifndef KAB_EMBEDDED
+
+class DistributionListFactory : public ExtensionFactory
+{
+ public:
+ ExtensionWidget *extension( KABCore *core, QWidget *parent, const char *name )
+ {
+ return new DistributionListWidget( core, parent, name );
+ }
+
+ QString identifier() const
+ {
+ return "distribution_list_editor";
+ }
+};
+
+extern "C" {
+ void *init_libkaddrbk_distributionlist()
+ {
+ return ( new DistributionListFactory );
+ }
+}
+#endif //KAB_EMBEDDED
+
+class ContactItem : public QListViewItem
+{
+ public:
+ ContactItem( DistributionListView *parent, const KABC::Addressee &addressee,
+ const QString &email = QString::null ) :
+ QListViewItem( parent ),
+ mAddressee( addressee ),
+ mEmail( email )
+ {
+ setText( 0, addressee.realName() );
+ if( email.isEmpty() ) {
+ setText( 1, addressee.preferredEmail() );
+ setText( 2, i18n( "Yes" ) );
+ } else {
+ setText( 1, email );
+ setText( 2, i18n( "No" ) );
+ }
+ }
+
+ KABC::Addressee addressee() const
+ {
+ return mAddressee;
+ }
+
+ QString email() const
+ {
+ return mEmail;
+ }
+
+ protected:
+ bool acceptDrop( const QMimeSource* )
+ {
+ return true;
+ }
+
+ private:
+ KABC::Addressee mAddressee;
+ QString mEmail;
+};
+
+DistributionListWidget::DistributionListWidget( KABCore *core, QWidget *parent,
+ const char *name )
+ : ExtensionWidget( core, parent, name ), mManager( 0 )
+{
+ QGridLayout *topLayout = new QGridLayout( this, 3, 4, KDialog::marginHint(),
+ KDialog::spacingHint() );
+
+ if (KGlobal::getOrientation() == KGlobal::Portrait)
+ {
+ mCreateListButton = new QPushButton( i18n( "New List" ), this );
+ mEditListButton = new QPushButton( i18n( "Ren List" ), this );
+ mRemoveListButton = new QPushButton( i18n( "Del List" ), this );
+ mAddContactButton = new QPushButton( i18n( "Add Cont." ), this );
+ mChangeEmailButton = new QPushButton( i18n( "Chge Email" ), this );
+ mRemoveContactButton = new QPushButton( i18n( "Del Cont." ), this );
+ }
+ else
+ {
+ mCreateListButton = new QPushButton( i18n( "New List..." ), this );
+ mEditListButton = new QPushButton( i18n( "Rename List..." ), this );
+ mRemoveListButton = new QPushButton( i18n( "Remove List" ), this );
+ mAddContactButton = new QPushButton( i18n( "Add Contact" ), this );
+ mChangeEmailButton = new QPushButton( i18n( "Change Email..." ), this );
+ mRemoveContactButton = new QPushButton( i18n( "Remove Contact" ), this );
+ }
+ mNameCombo = new QComboBox( this );
+ topLayout->addWidget( mNameCombo, 0, 0 );
+ connect( mNameCombo, SIGNAL( activated( int ) ), SLOT( updateContactView() ) );
+
+ topLayout->addWidget( mCreateListButton, 0, 1 );
+ connect( mCreateListButton, SIGNAL( clicked() ), SLOT( createList() ) );
+
+ topLayout->addWidget( mEditListButton, 0, 2 );
+ connect( mEditListButton, SIGNAL( clicked() ), SLOT( editList() ) );
+
+ topLayout->addWidget( mRemoveListButton, 0, 3 );
+ connect( mRemoveListButton, SIGNAL( clicked() ), SLOT( removeList() ) );
+
+ mContactView = new DistributionListView( this );
+ mContactView->addColumn( i18n( "Name" ) );
+ mContactView->addColumn( i18n( "Email" ) );
+ mContactView->addColumn( i18n( "Use Preferred" ) );
+ mContactView->setEnabled( false );
+ mContactView->setAllColumnsShowFocus( true );
+ mContactView->setMinimumHeight( 30 );
+
+ topLayout->addMultiCellWidget( mContactView, 1, 1, 0, 3 );
+ connect( mContactView, SIGNAL( selectionChanged() ),
+ SLOT( selectionContactViewChanged() ) );
+ connect( mContactView, SIGNAL( dropped( QDropEvent*, QListViewItem* ) ),
+ SLOT( dropped( QDropEvent*, QListViewItem* ) ) );
+
+ mAddContactButton->setEnabled( false );
+ topLayout->addWidget( mAddContactButton, 2, 0 );
+ connect( mAddContactButton, SIGNAL( clicked() ), SLOT( addContact() ) );
+
+ topLayout->addWidget( mChangeEmailButton, 2, 2 );
+ connect( mChangeEmailButton, SIGNAL( clicked() ), SLOT( changeEmail() ) );
+
+ topLayout->addWidget( mRemoveContactButton, 2, 3 );
+ connect( mRemoveContactButton, SIGNAL( clicked() ), SLOT( removeContact() ) );
+
+ mManager = new KABC::DistributionListManager( core->addressBook() );
+ mManager->load();
+
+ updateNameCombo();
+
+#ifdef KAB_EMBEDDED
+// if (KGlobal::getOrientation() == KGlobal::Portrait)
+// parent->setMaximumSize( KGlobal::getDesktopWidth() , 150);
+#endif //KAB_EMBEDDED
+
+#ifndef KAB_EMBEDDED
+ KAcceleratorManager::manage( this );
+#endif //KAB_EMBEDDED
+}
+
+DistributionListWidget::~DistributionListWidget()
+{
+ delete mManager;
+}
+
+void DistributionListWidget::save()
+{
+qDebug("DistributionListWidget::save");
+ mManager->save();
+}
+
+void DistributionListWidget::selectionContactViewChanged()
+{
+ ContactItem *contactItem =
+ static_cast<ContactItem *>( mContactView->selectedItem() );
+ bool state = contactItem;
+
+ mChangeEmailButton->setEnabled( state );
+ mRemoveContactButton->setEnabled( state );
+}
+
+void DistributionListWidget::createList()
+{
+ KLineEditDlg dlg( i18n( "Please enter name:" ), QString::null, this );
+#ifdef KAB_EMBEDDED
+ dlg.setFixedSize(200, 50);
+#endif //KAB_EMBEDDED
+ dlg.setCaption( i18n( "New Distribution List" ) );
+ if ( !dlg.exec() )
+ return;
+
+ new KABC::DistributionList( mManager, dlg.text() );
+
+ mNameCombo->clear();
+ mNameCombo->insertStringList( mManager->listNames() );
+ mNameCombo->setCurrentItem( mNameCombo->count() - 1 );
+
+ updateContactView();
+
+ changed();
+}
+
+void DistributionListWidget::editList()
+{
+ QString oldName = mNameCombo->currentText();
+
+ KLineEditDlg dlg( i18n( "Please change name:" ), oldName, this );
+#ifdef KAB_EMBEDDED
+ dlg.setFixedSize(200, 50);
+#endif //KAB_EMBEDDED
+ dlg.setCaption( i18n("Distribution List") );
+ if ( !dlg.exec() )
+ return;
+
+ KABC::DistributionList *list = mManager->list( oldName );
+ list->setName( dlg.text() );
+
+ mNameCombo->clear();
+ mNameCombo->insertStringList( mManager->listNames() );
+ mNameCombo->setCurrentItem( mNameCombo->count() - 1 );
+
+ updateContactView();
+
+ changed();
+}
+
+void DistributionListWidget::removeList()
+{
+ int result = KMessageBox::warningContinueCancel( this,
+ i18n( "<qt>Delete distribution list <b>%1</b>?</qt>" ) .arg( mNameCombo->currentText() ),
+ QString::null, i18n( "Delete" ) );
+
+ if ( result != KMessageBox::Continue )
+ return;
+
+ delete mManager->list( mNameCombo->currentText() );
+ mNameCombo->removeItem( mNameCombo->currentItem() );
+
+ updateContactView();
+
+ changed();
+}
+
+void DistributionListWidget::addContact()
+{
+ KABC::DistributionList *list = mManager->list( mNameCombo->currentText() );
+ if ( !list )
+ return;
+
+ KABC::Addressee::List addrList = selectedContacts();
+ KABC::Addressee::List::Iterator it;
+ for ( it = addrList.begin(); it != addrList.end(); ++it )
+ list->insertEntry( *it );
+
+ updateContactView();
+
+ changed();
+}
+
+void DistributionListWidget::removeContact()
+{
+ KABC::DistributionList *list = mManager->list( mNameCombo->currentText() );
+ if ( !list )
+ return;
+
+ ContactItem *contactItem =
+ static_cast<ContactItem *>( mContactView->selectedItem() );
+ if ( !contactItem )
+ return;
+
+ list->removeEntry( contactItem->addressee(), contactItem->email() );
+ delete contactItem;
+
+ changed();
+}
+
+void DistributionListWidget::changeEmail()
+{
+ KABC::DistributionList *list = mManager->list( mNameCombo->currentText() );
+ if ( !list )
+ return;
+
+ ContactItem *contactItem =
+ static_cast<ContactItem *>( mContactView->selectedItem() );
+ if ( !contactItem )
+ return;
+
+ QString email = EmailSelector::getEmail( contactItem->addressee().emails(),
+ contactItem->email(), this );
+ list->removeEntry( contactItem->addressee(), contactItem->email() );
+ list->insertEntry( contactItem->addressee(), email );
+
+ updateContactView();
+
+ changed();
+}
+
+void DistributionListWidget::updateContactView()
+{
+ mContactView->clear();
+
+ KABC::DistributionList *list = mManager->list( mNameCombo->currentText() );
+ if ( !list ) {
+ mEditListButton->setEnabled( false );
+ mRemoveListButton->setEnabled( false );
+ mChangeEmailButton->setEnabled( false );
+ mRemoveContactButton->setEnabled( false );
+ mContactView->setEnabled( false );
+ return;
+ } else {
+ mEditListButton->setEnabled( true );
+ mRemoveListButton->setEnabled( true );
+ mContactView->setEnabled( true );
+ }
+
+ KABC::DistributionList::Entry::List entries = list->entries();
+ KABC::DistributionList::Entry::List::ConstIterator it;
+ for( it = entries.begin(); it != entries.end(); ++it )
+ new ContactItem( mContactView, (*it).addressee, (*it).email );
+
+ ContactItem *contactItem =
+ static_cast<ContactItem *>( mContactView->selectedItem() );
+ bool state = contactItem;
+
+ mChangeEmailButton->setEnabled( state );
+ mRemoveContactButton->setEnabled( state );
+}
+
+void DistributionListWidget::updateNameCombo()
+{
+ mNameCombo->insertStringList( mManager->listNames() );
+
+ updateContactView();
+}
+
+void DistributionListWidget::dropEvent( QDropEvent *e )
+{
+ KABC::DistributionList *distributionList = mManager->list( mNameCombo->currentText() );
+ if ( !distributionList )
+ return;
+
+ QString vcards;
+#ifndef KAB_EMBEDDED
+ if ( KVCardDrag::decode( e, vcards ) ) {
+#endif //KAB_EMBEDDED
+ QStringList list = QStringList::split( "\r\n\r\n", vcards );
+ QStringList::Iterator it;
+ KABC::VCardConverter converter;
+ for ( it = list.begin(); it != list.end(); ++it ) {
+ KABC::Addressee addr;
+ if ( converter.vCardToAddressee( (*it).stripWhiteSpace(), addr ) )
+ distributionList->insertEntry( addr );
+ }
+
+ changed();
+ updateContactView();
+#ifndef KAB_EMBEDDED
+ }
+#endif //KAB_EMBEDDED
+}
+
+void DistributionListWidget::contactsSelectionChanged()
+{
+ mAddContactButton->setEnabled( contactsSelected() && mNameCombo->count() > 0 );
+}
+
+QString DistributionListWidget::title() const
+{
+ return i18n( "Distribution List Editor" );
+}
+
+QString DistributionListWidget::identifier() const
+{
+ return "distribution_list_editor";
+}
+
+void DistributionListWidget::dropped( QDropEvent *e, QListViewItem* )
+{
+ dropEvent( e );
+}
+
+void DistributionListWidget::changed()
+{
+ save();
+}
+
+
+DistributionListView::DistributionListView( QWidget *parent, const char* name )
+ : KListView( parent, name )
+{
+ setDragEnabled( true );
+ setAcceptDrops( true );
+ setAllColumnsShowFocus( true );
+}
+
+void DistributionListView::dragEnterEvent( QDragEnterEvent* e )
+{
+#ifndef KAB_EMBEDDED
+ bool canDecode = QTextDrag::canDecode( e );
+ e->accept( canDecode );
+#endif //KAB_EMBEDDED
+}
+
+void DistributionListView::viewportDragMoveEvent( QDragMoveEvent *e )
+{
+#ifndef KAB_EMBEDDED
+ bool canDecode = QTextDrag::canDecode( e );
+ e->accept( canDecode );
+#endif //KAB_EMBEDDED
+}
+
+void DistributionListView::viewportDropEvent( QDropEvent *e )
+{
+ emit dropped( e, 0 );
+}
+
+void DistributionListView::dropEvent( QDropEvent *e )
+{
+ emit dropped( e, 0 );
+}
+
+
+EmailSelector::EmailSelector( const QStringList &emails,
+ const QString &current, QWidget *parent )
+ : KDialogBase( KDialogBase::Plain, i18n("Select Email Address"), Ok, Ok,
+ parent )
+{
+ QFrame *topFrame = plainPage();
+ QBoxLayout *topLayout = new QVBoxLayout( topFrame );
+
+ mButtonGroup = new QButtonGroup( 1, Horizontal, i18n("Email Addresses"),
+ topFrame );
+ topLayout->addWidget( mButtonGroup );
+
+ QStringList::ConstIterator it;
+ for( it = emails.begin(); it != emails.end(); ++it ) {
+ QRadioButton *button = new QRadioButton( *it, mButtonGroup );
+ if ( (*it) == current ) {
+ button->setDown( true );
+ }
+ }
+}
+
+QString EmailSelector::selected()
+{
+ QButton *button = mButtonGroup->selected();
+ if ( button )
+ return button->text();
+
+ return QString::null;
+}
+
+QString EmailSelector::getEmail( const QStringList &emails,
+ const QString &current, QWidget *parent )
+{
+ EmailSelector dlg( emails, current, parent );
+ dlg.exec();
+
+ return dlg.selected();
+}
+
+
+#ifndef KAB_EMBEDDED
+#include "distributionlistwidget.moc"
+#endif //KAB_EMBEDDED
diff --git a/kaddressbook/features/distributionlistwidget.h b/kaddressbook/features/distributionlistwidget.h
new file mode 100644
index 0000000..82bac3d
--- a/dev/null
+++ b/kaddressbook/features/distributionlistwidget.h
@@ -0,0 +1,143 @@
+/*
+ This file is part of KAddressBook.
+ Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
+
+ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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.
+*/
+
+#ifndef DISTRIBUTIONLISTWIDGET_H
+#define DISTRIBUTIONLISTWIDGET_H
+
+#include <kdialogbase.h>
+#include <klistview.h>
+
+#include "extensionwidget.h"
+
+class QButtonGroup;
+class QComboBox;
+class QLabel;
+class QListView;
+
+class DistributionListView;
+class KABCore;
+
+namespace KABC {
+class AddressBook;
+class DistributionListManager;
+}
+
+class DistributionListWidget : public ExtensionWidget
+{
+ Q_OBJECT
+
+ public:
+ DistributionListWidget( KABCore*, QWidget *parent, const char *name = 0 );
+ virtual ~DistributionListWidget();
+
+ void contactsSelectionChanged();
+
+ QString title() const;
+ QString identifier() const;
+
+ public slots:
+ void save();
+ void dropped( QDropEvent*, QListViewItem* );
+
+ private slots:
+ void createList();
+ void editList();
+ void removeList();
+ void addContact();
+ void removeContact();
+ void changeEmail();
+ void updateNameCombo();
+ void updateContactView();
+ void selectionContactViewChanged();
+ void changed();
+
+ protected:
+ void dropEvent( QDropEvent* );
+
+ private:
+ QComboBox *mNameCombo;
+ QLabel *mListLabel;
+ DistributionListView *mContactView;
+
+ KABC::DistributionListManager *mManager;
+ QPushButton *mCreateListButton;
+ QPushButton *mEditListButton;
+ QPushButton *mRemoveListButton;
+ QPushButton *mChangeEmailButton;
+ QPushButton *mAddContactButton;
+ QPushButton *mRemoveContactButton;
+};
+
+/**
+ @short Helper class
+*/
+class DistributionListView : public KListView
+{
+ Q_OBJECT
+
+ public:
+ DistributionListView( QWidget *parent, const char* name = 0 );
+
+ protected:
+ void dragEnterEvent( QDragEnterEvent *e );
+ void dropEvent( QDropEvent *e );
+ void viewportDragMoveEvent( QDragMoveEvent *e );
+ void viewportDropEvent( QDropEvent *e );
+};
+
+/**
+ @short Helper class
+*/
+class EmailSelector : public KDialogBase
+{
+ public:
+ EmailSelector( const QStringList &emails, const QString &current,
+ QWidget *parent );
+
+ QString selected();
+
+ static QString getEmail( const QStringList &emails, const QString &current,
+ QWidget *parent );
+
+ private:
+ QButtonGroup *mButtonGroup;
+};
+
+
+#ifdef KAB_EMBEDDED
+class DistributionListFactory : public ExtensionFactory
+{
+ public:
+ ExtensionWidget *extension( KABCore *core, QWidget *parent, const char *name )
+ {
+ return new DistributionListWidget( core, parent, name );
+ }
+
+ QString identifier() const
+ {
+ return "distribution_list_editor";
+ }
+};
+#endif //KAB_EMBEDDED
+
+#endif
diff --git a/kaddressbook/features/mergewidget.cpp b/kaddressbook/features/mergewidget.cpp
new file mode 100644
index 0000000..2476e42
--- a/dev/null
+++ b/kaddressbook/features/mergewidget.cpp
@@ -0,0 +1,374 @@
+/*
+ This file is part of KAddressBook.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+
+ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 <qlayout.h>
+#include <qpushbutton.h>
+
+#ifndef KAB_EMBEDDED
+#include <kaccelmanager.h>
+#endif //KAB_EMBEDDED
+
+#include <kdebug.h>
+#include <klistview.h>
+#include <klocale.h>
+#include <kglobal.h>
+#include <kmessagebox.h>
+
+#include <kabc/addressbook.h>
+
+#include "kabcore.h"
+
+#include "mergewidget.h"
+
+#ifndef KAB_EMBEDDED
+class MergeFactory : public ExtensionFactory
+{
+ public:
+ ExtensionWidget *extension( KABCore *core, QWidget *parent, const char *name )
+ {
+ return new MergeWidget( core, parent, name );
+ }
+
+ QString identifier() const
+ {
+ return "merge";
+ }
+};
+
+extern "C" {
+ void *init_libkaddrbk_merge()
+ {
+ return ( new MergeFactory );
+ }
+}
+#endif //KAB_EMBEDDED
+
+class ContactItem : public QListViewItem
+{
+ public:
+ ContactItem( KListView *parent, const KABC::Addressee &addressee )
+ : QListViewItem( parent ), mAddressee( addressee )
+ {
+ KABC::Field::List fieldList = KABC::Field::defaultFields();
+ KABC::Field::List::ConstIterator it;
+
+ int i = 0;
+ for ( it = fieldList.begin(); it != fieldList.end(); ++it )
+ setText( i++, (*it)->value( mAddressee ) );
+ }
+
+ KABC::Addressee addressee() const
+ {
+ return mAddressee;
+ }
+
+ private:
+ KABC::Addressee mAddressee;
+};
+
+MergeWidget::MergeWidget( KABCore *core, QWidget *parent, const char *name )
+ : ExtensionWidget( core, parent, name ), mBlockUpdate( false )
+{
+#ifdef KAB_EMBEDDED
+ if (KGlobal::getOrientation() == KGlobal::Portrait)
+ parent->setMaximumSize( KGlobal::getDesktopWidth() , 180);
+#endif //KAB_EMBEDDED
+
+ QGridLayout *topLayout = new QGridLayout( this, 3, 2, KDialog::marginHint(),
+ KDialog::spacingHint() );
+
+ mContactView = new KListView( this );
+ KABC::Field::List fieldList = KABC::Field::defaultFields();
+ KABC::Field::List::ConstIterator it;
+
+ for ( it = fieldList.begin(); it != fieldList.end(); ++it )
+ mContactView->addColumn( (*it)->label() );
+
+ mContactView->setEnabled( false );
+ mContactView->setAllColumnsShowFocus( true );
+ topLayout->addMultiCellWidget( mContactView, 0, 2, 0, 0 );
+
+ connect( mContactView, SIGNAL( selectionChanged() ),
+ SLOT( selectionContactViewChanged() ) );
+
+ mMergeAndRemoveButton = new QPushButton( i18n( "Merge and Remove" ), this );
+ mMergeAndRemoveButton->setEnabled( false );
+ topLayout->addWidget( mMergeAndRemoveButton, 0, 1 );
+ connect( mMergeAndRemoveButton, SIGNAL( clicked() ), SLOT( mergeAndRemove() ) );
+
+ mMergeButton = new QPushButton( i18n( "Merge" ), this );
+ mMergeButton->setEnabled( false );
+ topLayout->addWidget( mMergeButton, 1, 1 );
+ connect( mMergeButton, SIGNAL( clicked() ), SLOT( merge() ) );
+
+#ifndef KAB_EMBEDDED
+ KAcceleratorManager::manage( this );
+#endif //KAB_EMBEDDED
+}
+
+MergeWidget::~MergeWidget()
+{
+}
+
+void MergeWidget::selectionContactViewChanged()
+{
+#ifndef KAB_EMBEDDED
+ ContactItem *contactItem =
+ dynamic_cast<ContactItem*>( mContactView->selectedItem() );
+#else //KAB_EMBEDDED
+ ContactItem *contactItem =(ContactItem*)( mContactView->selectedItem() );
+#endif //KAB_EMBEDDED
+
+ bool state = (contactItem != 0);
+
+ mMergeAndRemoveButton->setEnabled( state );
+ mMergeButton->setEnabled( state );
+}
+
+void MergeWidget::contactsSelectionChanged()
+{
+ if ( mBlockUpdate )
+ return;
+
+ if ( !contactsSelected() ) {
+ mContactView->setEnabled( false );
+ mContactView->clear();
+ mMergeAndRemoveButton->setEnabled( false );
+ mMergeButton->setEnabled( false );
+ } else {
+ KABC::Addressee::List list = selectedContacts();
+ if ( list.count() > 1 ) {
+ mContactView->setEnabled( false );
+ mContactView->clear();
+ mMergeAndRemoveButton->setEnabled( false );
+ mMergeButton->setEnabled( false );
+ return;
+ } else {
+ mContactView->setEnabled( true );
+ mMasterAddressee = list[ 0 ];
+ updateView();
+ }
+ }
+}
+
+void MergeWidget::updateView()
+{
+ mContactView->clear();
+
+ KABC::AddressBook::Iterator it;
+ KABC::AddressBook *ab = core()->addressBook();
+ if ( !ab )
+ return;
+
+ for ( it = ab->begin(); it != ab->end(); ++it )
+ if ( (*it).uid() != mMasterAddressee.uid() )
+ new ContactItem( mContactView, *it );
+}
+
+QString MergeWidget::title() const
+{
+ return i18n( "Merge Contacts Editor" );
+}
+
+QString MergeWidget::identifier() const
+{
+ return "merge";
+}
+
+void MergeWidget::mergeAndRemove()
+{
+#ifndef KAB_EMBEDDED
+ ContactItem *item = dynamic_cast<ContactItem*>( mContactView->currentItem() );
+#else //KAB_EMBEDDED
+ ContactItem *item = (ContactItem*)( mContactView->currentItem() );
+#endif //KAB_EMBEDDED
+ if ( !item )
+ return;
+
+ QString oldUID = item->addressee().uid();
+
+ doMerge( item->addressee() );
+
+ KABC::Addressee::List retval;
+ retval << mMasterAddressee;
+ emit modified( retval );
+
+ mBlockUpdate = true;
+ core()->deleteContacts( oldUID );
+ core()->setContactSelected( mMasterAddressee.uid() );
+ mBlockUpdate = false;
+
+ updateView();
+}
+
+void MergeWidget::merge()
+{
+#ifndef KAB_EMBEDDED
+ ContactItem *item = dynamic_cast<ContactItem*>( mContactView->currentItem() );
+#else //KAB_EMBEDDED
+ ContactItem *item = (ContactItem*)( mContactView->currentItem() );
+#endif //KAB_EMBEDDED
+ if ( !item )
+ return;
+
+ doMerge( item->addressee() );
+
+ KABC::Addressee::List retval;
+ retval << mMasterAddressee;
+ emit modified( retval );
+
+ mBlockUpdate = true;
+ core()->setContactSelected( mMasterAddressee.uid() );
+ mBlockUpdate = false;
+
+ updateView();
+}
+
+void MergeWidget::doMerge( const KABC::Addressee &addr )
+{
+ // ADR + LABEL
+ KABC::Address::List addresses = addr.addresses();
+ KABC::Address::List masterAddresses = mMasterAddressee.addresses();
+ KABC::Address::List::Iterator addrIt ;
+ for ( addrIt = addresses.begin(); addrIt != addresses.end(); ++addrIt ) {
+ if ( !masterAddresses.contains( *addrIt ) )
+ mMasterAddressee.insertAddress( *addrIt );
+ }
+
+ if ( mMasterAddressee.birthday().isNull() && !addr.birthday().isNull() )
+ mMasterAddressee.setBirthday( addr.birthday() );
+
+
+ // CATEGORIES
+ QStringList::Iterator it;
+ QStringList categories = addr.categories();
+ QStringList masterCategories = mMasterAddressee.categories();
+ QStringList newCategories( masterCategories );
+ for ( it = categories.begin(); it != categories.end(); ++it )
+ if ( !masterCategories.contains( *it ) )
+ newCategories.append( *it );
+ mMasterAddressee.setCategories( newCategories );
+
+ // CLASS
+ if ( !mMasterAddressee.secrecy().isValid() && addr.secrecy().isValid() )
+ mMasterAddressee.setSecrecy( addr.secrecy() );
+
+ // EMAIL
+ QStringList emails = addr.emails();
+ QStringList masterEmails = mMasterAddressee.emails();
+ for ( it = emails.begin(); it != emails.end(); ++it )
+ if ( !masterEmails.contains( *it ) )
+ mMasterAddressee.insertEmail( *it, false );
+
+ // FN
+ if ( mMasterAddressee.formattedName().isEmpty() && !addr.formattedName().isEmpty() )
+ mMasterAddressee.setFormattedName( addr.formattedName() );
+
+ // GEO
+ if ( !mMasterAddressee.geo().isValid() && addr.geo().isValid() )
+ mMasterAddressee.setGeo( addr.geo() );
+
+/*
+ // KEY
+ // LOGO
+*/
+
+ // MAILER
+ if ( mMasterAddressee.mailer().isEmpty() && !addr.mailer().isEmpty() )
+ mMasterAddressee.setMailer( addr.mailer() );
+
+ // N
+ if ( mMasterAddressee.assembledName().isEmpty() && !addr.assembledName().isEmpty() )
+ mMasterAddressee.setNameFromString( addr.assembledName() );
+
+ // NICKNAME
+ if ( mMasterAddressee.nickName().isEmpty() && !addr.nickName().isEmpty() )
+ mMasterAddressee.setNickName( addr.nickName() );
+
+ // NOTE
+ if ( mMasterAddressee.note().isEmpty() && !addr.note().isEmpty() )
+ mMasterAddressee.setNote( addr.note() );
+
+ // ORG
+ if ( mMasterAddressee.organization().isEmpty() && !addr.organization().isEmpty() )
+ mMasterAddressee.setOrganization( addr.organization() );
+
+/*
+ // PHOTO
+*/
+
+ // PROID
+ if ( mMasterAddressee.productId().isEmpty() && !addr.productId().isEmpty() )
+ mMasterAddressee.setProductId( addr.productId() );
+
+ // REV
+ if ( mMasterAddressee.revision().isNull() && !addr.revision().isNull() )
+ mMasterAddressee.setRevision( addr.revision() );
+
+ // ROLE
+ if ( mMasterAddressee.role().isEmpty() && !addr.role().isEmpty() )
+ mMasterAddressee.setRole( addr.role() );
+
+ // SORT-STRING
+ if ( mMasterAddressee.sortString().isEmpty() && !addr.sortString().isEmpty() )
+ mMasterAddressee.setSortString( addr.sortString() );
+
+/*
+ // SOUND
+*/
+
+ // TEL
+ KABC::PhoneNumber::List phones = addr.phoneNumbers();
+ KABC::PhoneNumber::List masterPhones = mMasterAddressee.phoneNumbers();
+ KABC::PhoneNumber::List::ConstIterator phoneIt;
+ for ( phoneIt = phones.begin(); phoneIt != phones.end(); ++phoneIt )
+ if ( !masterPhones.contains( *it ) )
+ mMasterAddressee.insertPhoneNumber( *it );
+
+ // TITLE
+ if ( mMasterAddressee.title().isEmpty() && !addr.title().isEmpty() )
+ mMasterAddressee.setTitle( addr.title() );
+
+ // TZ
+ if ( !mMasterAddressee.timeZone().isValid() && addr.timeZone().isValid() )
+ mMasterAddressee.setTimeZone( addr.timeZone() );
+
+ // UID // ignore UID
+
+ // URL
+ if ( mMasterAddressee.url().isEmpty() && !addr.url().isEmpty() )
+ mMasterAddressee.setUrl( addr.url() );
+
+ // X-
+ QStringList customs = addr.customs();
+ QStringList masterCustoms = mMasterAddressee.customs();
+ QStringList newCustoms( masterCustoms );
+ for ( it = customs.begin(); it != customs.end(); ++it )
+ if ( !masterCustoms.contains( *it ) )
+ newCustoms.append( *it );
+ mMasterAddressee.setCustoms( newCustoms );
+}
+
+#ifndef KAB_EMBEDDED
+#include "mergewidget.moc"
+#endif //KAB_EMBEDDED
diff --git a/kaddressbook/features/mergewidget.h b/kaddressbook/features/mergewidget.h
new file mode 100644
index 0000000..1063c80
--- a/dev/null
+++ b/kaddressbook/features/mergewidget.h
@@ -0,0 +1,87 @@
+/*
+ This file is part of KAddressBook.
+ Copyright (c) 2003 Tobias Koenig <tokoe@kde.org>
+
+ 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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.
+*/
+
+#ifndef MERGEWIDGET_H
+#define MERGEWIDGET_H
+
+#include <kdialogbase.h>
+#include <klistview.h>
+
+#include "extensionwidget.h"
+
+class QListView;
+
+class KABCore;
+
+namespace KABC {
+class AddressBook;
+}
+
+class MergeWidget : public ExtensionWidget
+{
+ Q_OBJECT
+
+ public:
+ MergeWidget( KABCore*, QWidget *parent, const char *name = 0 );
+ virtual ~MergeWidget();
+
+ void contactsSelectionChanged();
+
+ QString title() const;
+ QString identifier() const;
+
+ private slots:
+ void mergeAndRemove();
+ void merge();
+
+ void selectionContactViewChanged();
+
+ private:
+ void updateView();
+ void doMerge( const KABC::Addressee &addr );
+
+ KListView *mContactView;
+ QPushButton *mMergeAndRemoveButton;
+ QPushButton *mMergeButton;
+
+ KABC::Addressee mMasterAddressee;
+ bool mBlockUpdate;
+};
+
+#ifdef KAB_EMBEDDED
+class MergeFactory : public ExtensionFactory
+{
+ public:
+ ExtensionWidget *extension( KABCore *core, QWidget *parent, const char *name )
+ {
+ return new MergeWidget( core, parent, name );
+ }
+
+ QString identifier() const
+ {
+ return "merge";
+ }
+};
+#endif //KAB_EMBEDDED
+
+#endif