22 #include "contactgroupviewer.h"
24 #include "contactgroupexpandjob.h"
25 #include "standardcontactgroupformatter.h"
26 #include "textbrowser_p.h"
28 #include <akonadi/collectionfetchjob.h>
29 #include <akonadi/entitydisplayattribute.h>
30 #include <akonadi/item.h>
31 #include <akonadi/itemfetchjob.h>
32 #include <akonadi/itemfetchscope.h>
33 #include <kabc/addressee.h>
34 #include <kabc/contactgroup.h>
35 #include <kcolorscheme.h>
39 #include <kstringhandler.h>
41 #include <QtGui/QVBoxLayout>
43 using namespace Akonadi;
45 class ContactGroupViewer::Private
48 Private( ContactGroupViewer *parent )
49 : mParent( parent ), mExpandJob( 0 ), mParentCollectionFetchJob( 0 )
51 mBrowser =
new TextBrowser;
53 static QPixmap groupPixmap = KIcon( QLatin1String(
"x-mail-distribution-list" ) ).pixmap( QSize( 100, 100 ) );
54 mBrowser->document()->addResource( QTextDocument::ImageResource,
55 QUrl( QLatin1String(
"group_photo" ) ),
58 mStandardContactGroupFormatter =
new StandardContactGroupFormatter;
59 mContactGroupFormatter = mStandardContactGroupFormatter;
64 delete mStandardContactGroupFormatter;
69 mParent->setWindowTitle( i18n(
"Contact Group %1", mCurrentGroupName ) );
71 KABC::ContactGroup group;
72 group.setName( mCurrentGroupName );
73 foreach (
const KABC::Addressee &contact, mCurrentContacts )
74 group.append( KABC::ContactGroup::Data( contact.realName(), contact.preferredEmail() ) );
76 mContactGroupFormatter->setContactGroup( group );
78 QList<QVariantMap> additionalFields;
80 if ( !mCurrentAddressBookName.isEmpty() ) {
81 QVariantMap addressBookName;
82 addressBookName.insert( QLatin1String(
"title" ), i18n(
"Address Book" ) );
83 addressBookName.insert( QLatin1String(
"value" ), mCurrentAddressBookName );
85 additionalFields << addressBookName;
88 mContactGroupFormatter->setAdditionalFields( additionalFields );
90 mBrowser->setHtml( mContactGroupFormatter->toHtml() );
93 void slotMailClicked(
const QString&,
const QString &email )
95 QString name, address;
98 KABC::Addressee::parseEmailAddress( email.mid( 7 ), name, address );
100 emit mParent->emailClicked( name, address );
103 void _k_expandResult( KJob *job )
107 if ( !job->error() ) {
108 ContactGroupExpandJob *expandJob = qobject_cast<ContactGroupExpandJob*>( job );
109 mCurrentContacts = expandJob->contacts();
113 if ( mParentCollectionFetchJob ) {
114 mParent->disconnect( mParentCollectionFetchJob, SIGNAL(result(KJob*)), mParent, SLOT(slotParentCollectionFetched(KJob*)) );
115 delete mParentCollectionFetchJob;
116 mParentCollectionFetchJob = 0;
119 mParentCollectionFetchJob =
new CollectionFetchJob( mCurrentItem.parentCollection(), CollectionFetchJob::Base, mParent );
120 mParent->connect( mParentCollectionFetchJob, SIGNAL(result(KJob*)), SLOT(slotParentCollectionFetched(KJob*)) );
123 void slotParentCollectionFetched( KJob *job )
125 mParentCollectionFetchJob = 0;
126 mCurrentAddressBookName.clear();
128 if ( !job->error() ) {
129 CollectionFetchJob *fetchJob = qobject_cast<CollectionFetchJob*>( job );
130 if ( !fetchJob->collections().isEmpty() ) {
131 const Collection collection = fetchJob->collections().first();
132 if ( collection.hasAttribute<EntityDisplayAttribute>() )
133 mCurrentAddressBookName = collection.attribute<EntityDisplayAttribute>()->displayName();
135 mCurrentAddressBookName = collection.name();
142 ContactGroupViewer *mParent;
143 TextBrowser *mBrowser;
144 QString mCurrentGroupName;
145 KABC::Addressee::List mCurrentContacts;
146 QString mCurrentAddressBookName;
148 ContactGroupExpandJob *mExpandJob;
149 CollectionFetchJob *mParentCollectionFetchJob;
150 AbstractContactGroupFormatter *mStandardContactGroupFormatter;
151 AbstractContactGroupFormatter *mContactGroupFormatter;
154 ContactGroupViewer::ContactGroupViewer( QWidget *parent )
155 : QWidget( parent ), d( new Private( this ) )
157 QVBoxLayout *layout =
new QVBoxLayout(
this );
158 layout->setMargin( 0 );
160 d->mBrowser->setNotifyClick(
true );
162 connect( d->mBrowser, SIGNAL(mailClick(QString,QString)),
163 this, SLOT(slotMailClicked(QString,QString)) );
165 layout->addWidget( d->mBrowser );
172 ContactGroupViewer::~ContactGroupViewer()
177 Akonadi::Item ContactGroupViewer::contactGroup()
const
179 return ItemMonitor::item();
182 void ContactGroupViewer::setContactGroup(
const Akonadi::Item &group )
184 ItemMonitor::setItem( group );
187 void ContactGroupViewer::setContactGroupFormatter( AbstractContactGroupFormatter *formatter )
189 if ( formatter == 0 )
190 d->mContactGroupFormatter = d->mStandardContactGroupFormatter;
192 d->mContactGroupFormatter = formatter;
195 void ContactGroupViewer::itemChanged(
const Item &item )
197 if ( !item.hasPayload<KABC::ContactGroup>() )
200 const KABC::ContactGroup group = item.payload<KABC::ContactGroup>();
201 d->mCurrentGroupName = group.name();
202 d->mCurrentItem = item;
204 if ( d->mExpandJob ) {
205 disconnect( d->mExpandJob, SIGNAL(result(KJob*)),
this, SLOT(_k_expandResult(KJob*)) );
206 d->mExpandJob->kill();
209 d->mExpandJob =
new ContactGroupExpandJob( group );
210 connect( d->mExpandJob, SIGNAL(result(KJob*)), SLOT(_k_expandResult(KJob*)) );
211 d->mExpandJob->start();
214 void ContactGroupViewer::itemRemoved()
216 d->mBrowser->clear();
219 #include "contactgroupviewer.moc"