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.
250 lines
7.8 KiB
250 lines
7.8 KiB
/* |
|
This file is part of KMail. |
|
|
|
Copyright (c) 2005 Cornelius Schumacher <schumacher@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 "distributionlistdialog.h" |
|
|
|
#include <akonadi/collectiondialog.h> |
|
#include <akonadi/contact/contactgroupsearchjob.h> |
|
#include <akonadi/contact/contactsearchjob.h> |
|
#include <akonadi/itemcreatejob.h> |
|
#include <kpimutils/email.h> |
|
|
|
#include <KLocale> |
|
#include <KDebug> |
|
#include <KLineEdit> |
|
#include <KMessageBox> |
|
#include <KInputDialog> |
|
|
|
#include <QLabel> |
|
#include <QTreeWidget> |
|
#include <QTreeWidgetItem> |
|
#include <QVBoxLayout> |
|
#include <QHBoxLayout> |
|
#include "distributionlistdialog.moc" |
|
|
|
class DistributionListItem : public QTreeWidgetItem |
|
{ |
|
public: |
|
DistributionListItem( QTreeWidget *tree ) |
|
: QTreeWidgetItem( tree ) |
|
{ |
|
setFlags( flags() | Qt::ItemIsUserCheckable ); |
|
} |
|
|
|
void setAddressee( const KABC::Addressee &a, const QString &email ) |
|
{ |
|
mIsTransient = false; |
|
init( a, email ); |
|
} |
|
|
|
void setTransientAddressee( const KABC::Addressee &a, const QString &email ) |
|
{ |
|
mIsTransient = true; |
|
init( a, email ); |
|
} |
|
|
|
void init( const KABC::Addressee &a, const QString &email ) |
|
{ |
|
mAddressee = a; |
|
mEmail = email; |
|
setText( 0, mAddressee.realName() ); |
|
setText( 1, mEmail ); |
|
} |
|
|
|
KABC::Addressee addressee() const |
|
{ |
|
return mAddressee; |
|
} |
|
|
|
QString email() const |
|
{ |
|
return mEmail; |
|
} |
|
|
|
bool isTransient() const |
|
{ |
|
return mIsTransient; |
|
} |
|
|
|
private: |
|
KABC::Addressee mAddressee; |
|
QString mEmail; |
|
bool mIsTransient; |
|
}; |
|
|
|
|
|
DistributionListDialog::DistributionListDialog( QWidget *parent ) |
|
: KDialog( parent ) |
|
{ |
|
QFrame *topFrame = new QFrame( this ); |
|
setMainWidget( topFrame ); |
|
setCaption( i18nc("@title:window", "Save Distribution List") ); |
|
setButtons( User1 | Cancel ); |
|
setDefaultButton( User1 ); |
|
setModal( false ); |
|
setButtonText( User1, i18nc("@action:button","Save List") ); |
|
|
|
QBoxLayout *topLayout = new QVBoxLayout( topFrame ); |
|
topLayout->setSpacing( spacingHint() ); |
|
|
|
QBoxLayout *titleLayout = new QHBoxLayout(); |
|
titleLayout->setSpacing( spacingHint() ); |
|
topLayout->addItem( titleLayout ); |
|
|
|
QLabel *label = new QLabel( |
|
i18nc("@label:textbox Name of the distribution list.", "&Name:"), topFrame ); |
|
titleLayout->addWidget( label ); |
|
|
|
mTitleEdit = new KLineEdit( topFrame ); |
|
titleLayout->addWidget( mTitleEdit ); |
|
mTitleEdit->setFocus(); |
|
mTitleEdit->setClearButtonShown( true ); |
|
label->setBuddy( mTitleEdit ); |
|
|
|
mRecipientsList = new QTreeWidget( topFrame ); |
|
mRecipientsList->setHeaderLabels( |
|
QStringList() << i18nc( "@title:column Name of the recipient","Name" ) |
|
<< i18nc( "@title:column Email of the recipient", "Email" ) |
|
); |
|
mRecipientsList->setRootIsDecorated( false ); |
|
topLayout->addWidget( mRecipientsList ); |
|
connect( this, SIGNAL( user1Clicked() ), |
|
this, SLOT( slotUser1() ) ); |
|
} |
|
|
|
void DistributionListDialog::setRecipients( const Recipient::List &recipients ) |
|
{ |
|
Recipient::List::ConstIterator it; |
|
for( it = recipients.constBegin(); it != recipients.constEnd(); ++it ) { |
|
QStringList emails = KPIMUtils::splitAddressList( (*it).email() ); |
|
QStringList::ConstIterator it2; |
|
for( it2 = emails.constBegin(); it2 != emails.constEnd(); ++it2 ) { |
|
QString name; |
|
QString email; |
|
KABC::Addressee::parseEmailAddress( *it2, name, email ); |
|
if ( !email.isEmpty() ) { |
|
DistributionListItem *item = new DistributionListItem( mRecipientsList ); |
|
|
|
Akonadi::ContactSearchJob *job = new Akonadi::ContactSearchJob(); |
|
job->setQuery( Akonadi::ContactSearchJob::Email, email ); |
|
job->exec(); |
|
|
|
const KABC::Addressee::List contacts = job->contacts(); |
|
if ( contacts.isEmpty() ) { |
|
KABC::Addressee contact; |
|
contact.setNameFromString( name ); |
|
contact.insertEmail( email ); |
|
item->setTransientAddressee( contact, email ); |
|
item->setCheckState( 0, Qt::Checked ); |
|
} else { |
|
bool isFirst = true; |
|
foreach ( const KABC::Addressee &contact, contacts ) { |
|
item->setAddressee( contact, email ); |
|
if ( isFirst ) { |
|
item->setCheckState( 0, Qt::Checked ); |
|
isFirst = false; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
void DistributionListDialog::slotUser1() |
|
{ |
|
bool isEmpty = true; |
|
|
|
for (int i = 0; i < mRecipientsList->topLevelItemCount(); ++i) { |
|
DistributionListItem *item = static_cast<DistributionListItem *>( |
|
mRecipientsList->topLevelItem( i )); |
|
if ( item && item->checkState( 0 ) == Qt::Checked ) { |
|
isEmpty = false; |
|
break; |
|
} |
|
} |
|
|
|
if ( isEmpty ) { |
|
KMessageBox::information( this, |
|
i18nc("@info", "There are no recipients in your list. " |
|
"First select some recipients, " |
|
"then try again.") ); |
|
return; |
|
} |
|
|
|
QString name = mTitleEdit->text(); |
|
|
|
if ( name.isEmpty() ) { |
|
bool ok = false; |
|
name = KInputDialog::getText( i18nc("@title:window","New Distribution List"), |
|
i18nc("@label:textbox","Please enter name:"), QString(), &ok, this ); |
|
if ( !ok || name.isEmpty() ) |
|
return; |
|
} |
|
|
|
Akonadi::ContactGroupSearchJob *job = new Akonadi::ContactGroupSearchJob(); |
|
job->setQuery( Akonadi::ContactGroupSearchJob::Name, name ); |
|
job->exec(); |
|
|
|
if ( !job->contactGroups().isEmpty() ) { |
|
KMessageBox::information( this, |
|
i18nc( "@info", "<para>Distribution list with the given name <resource>%1</resource> " |
|
"already exists. Please select a different name.</para>", name ) ); |
|
return; |
|
} |
|
|
|
Akonadi::CollectionDialog dlg( this ); |
|
dlg.setMimeTypeFilter( QStringList() << KABC::Addressee::mimeType() << KABC::ContactGroup::mimeType() ); |
|
dlg.setAccessRightsFilter( Akonadi::Collection::CanCreateItem ); |
|
dlg.setDescription( i18n( "Select the address book folder to store the contact group in:" ) ); |
|
if ( !dlg.exec() ) |
|
return; |
|
|
|
const Akonadi::Collection targetCollection = dlg.selectedCollection(); |
|
|
|
KABC::ContactGroup group( name ); |
|
|
|
for ( int i = 0; i < mRecipientsList->topLevelItemCount(); ++i ) { |
|
DistributionListItem *item = static_cast<DistributionListItem *>( mRecipientsList->topLevelItem( i ) ); |
|
if ( item && item->checkState( 0 ) == Qt::Checked ) { |
|
kDebug() << item->addressee().fullEmail() << item->addressee().uid(); |
|
if ( item->isTransient() ) { |
|
Akonadi::Item contactItem( KABC::Addressee::mimeType() ); |
|
contactItem.setPayload<KABC::Addressee>( item->addressee() ); |
|
|
|
Akonadi::ItemCreateJob *job = new Akonadi::ItemCreateJob( contactItem, targetCollection ); |
|
job->exec(); |
|
|
|
group.append( KABC::ContactGroup::ContactGroupReference( QString::number( job->item().id() ) ) ); |
|
} else { |
|
group.append( KABC::ContactGroup::Data( item->addressee().realName(), item->email() ) ); |
|
} |
|
} |
|
} |
|
|
|
Akonadi::Item groupItem( KABC::ContactGroup::mimeType() ); |
|
groupItem.setPayload<KABC::ContactGroup>( group ); |
|
|
|
new Akonadi::ItemCreateJob( groupItem, targetCollection ); |
|
|
|
close(); |
|
}
|
|
|