-rw-r--r-- | kaddressbook/features/distributionlistwidget.cpp | 501 | ||||
-rw-r--r-- | kaddressbook/features/distributionlistwidget.h | 143 | ||||
-rw-r--r-- | kaddressbook/features/mergewidget.cpp | 374 | ||||
-rw-r--r-- | kaddressbook/features/mergewidget.h | 87 |
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 ¤t, 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 ¤t, 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 ¤t, + QWidget *parent ); + + QString selected(); + + static QString getEmail( const QStringList &emails, const QString ¤t, + 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 |