22 #include "contactviewer.h"
24 #include "contactmetadata_p.h"
25 #include "contactmetadataattribute_p.h"
26 #include "customfieldmanager_p.h"
27 #include "standardcontactformatter.h"
28 #include "textbrowser_p.h"
30 #include <akonadi/collection.h>
31 #include <akonadi/collectionfetchjob.h>
32 #include <akonadi/entitydisplayattribute.h>
33 #include <akonadi/item.h>
34 #include <akonadi/itemfetchscope.h>
35 #include <kabc/addressee.h>
36 #include <kcolorscheme.h>
37 #include <kconfiggroup.h>
41 #include <kstringhandler.h>
43 #include <QtGui/QVBoxLayout>
46 #include <prison/QRCodeBarcode>
47 #include <prison/DataMatrixBarcode>
48 #include <kabc/vcardconverter.h>
51 using namespace Akonadi;
53 class ContactViewer::Private
57 : mParent( parent ), mParentCollectionFetchJob( 0 )
60 mContactFormatter = mStandardContactFormatter;
62 mQRCode =
new prison::QRCodeBarcode();
63 mDataMatrix =
new prison::DataMatrixBarcode();
69 delete mStandardContactFormatter;
76 void updateView(
const QVariantList &localCustomFieldDescriptions = QVariantList(),
const QString &addressBookName = QString() )
78 static QPixmap defaultPixmap = KIcon( QLatin1String(
"user-identity" ) ).pixmap( QSize( 100, 100 ) );
80 mParent->setWindowTitle( i18n(
"Contact %1", mCurrentContact.assembledName() ) );
82 if ( mCurrentContact.photo().isIntern() ) {
83 mBrowser->document()->addResource( QTextDocument::ImageResource,
84 QUrl( QLatin1String(
"contact_photo" ) ),
85 mCurrentContact.photo().data() );
87 mBrowser->document()->addResource( QTextDocument::ImageResource,
88 QUrl( QLatin1String(
"contact_photo" ) ),
92 mBrowser->document()->addResource( QTextDocument::ImageResource,
93 QUrl( QLatin1String(
"map_icon" ) ),
94 KIcon( QLatin1String(
"document-open-remote" ) ).pixmap( QSize( 16, 16 ) ) );
97 KConfig config( QLatin1String(
"akonadi_contactrc" ) );
98 KConfigGroup group( &config, QLatin1String(
"View" ) );
99 if ( group.readEntry(
"QRCodes",
true ) ) {
100 KABC::VCardConverter converter;
101 KABC::Addressee addr(mCurrentContact);
102 addr.setPhoto(KABC::Picture());
103 addr.setLogo(KABC::Picture());
104 const QString data = QString::fromUtf8( converter.createVCard( addr ) );
105 mQRCode->setData( data );
106 mDataMatrix->setData( data );
107 mBrowser->document()->addResource( QTextDocument::ImageResource,
108 QUrl( QLatin1String(
"qrcode" ) ),
109 mQRCode->toImage( QSizeF(50,50) ) );
110 mBrowser->document()->addResource( QTextDocument::ImageResource,
111 QUrl( QLatin1String(
"datamatrix" ) ),
112 mDataMatrix->toImage( QSizeF(50,50) ) );
114 #endif // HAVE_PRISON
117 QList<QVariantMap> customFieldDescriptions;
118 foreach (
const QVariant &entry, localCustomFieldDescriptions )
119 customFieldDescriptions << entry.toMap();
121 const CustomField::List globalCustomFields = CustomFieldManager::globalCustomFieldDescriptions();
122 foreach (
const CustomField &field, globalCustomFields ) {
123 QVariantMap description;
124 description.insert( QLatin1String(
"key" ), field.key() );
125 description.insert( QLatin1String(
"title" ), field.title() );
127 customFieldDescriptions << description;
130 KABC::Addressee
contact( mCurrentContact );
131 if ( !addressBookName.isEmpty() ) {
132 contact.insertCustom( QLatin1String(
"KADDRESSBOOK" ), QLatin1String(
"AddressBook" ), addressBookName );
135 mContactFormatter->setContact(
contact );
136 mContactFormatter->setCustomFieldDescriptions( customFieldDescriptions );
138 mBrowser->setHtml( mContactFormatter->toHtml() );
141 void slotMailClicked(
const QString&,
const QString &email )
143 QString name, address;
146 KABC::Addressee::parseEmailAddress( email.mid( 7 ), name, address );
148 emit mParent->emailClicked( name, address );
151 void slotUrlClicked(
const QString &urlString )
153 KUrl url( urlString );
154 const QString urlScheme( url.scheme() );
155 if ( urlScheme == QLatin1String(
"http" ) ||
156 urlScheme == QLatin1String(
"https" ) ) {
157 emit mParent->urlClicked( url );
158 }
else if ( urlScheme == QLatin1String(
"phone" ) ) {
159 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
161 const KABC::PhoneNumber::List numbers = mCurrentContact.phoneNumbers();
162 if ( pos < numbers.count() ) {
163 emit mParent->phoneNumberClicked( numbers.at( pos ) );
165 }
else if ( urlScheme == QLatin1String(
"sms" ) ) {
166 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
168 const KABC::PhoneNumber::List numbers = mCurrentContact.phoneNumbers();
169 if ( pos < numbers.count() ) {
170 emit mParent->smsClicked( numbers.at( pos ) );
172 }
else if ( urlScheme == QLatin1String(
"address" ) ) {
173 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
175 const KABC::Address::List addresses = mCurrentContact.addresses();
176 if ( pos < addresses.count() ) {
177 emit mParent->addressClicked( addresses.at( pos ) );
182 void slotParentCollectionFetched( KJob *job )
184 mParentCollectionFetchJob = 0;
186 QString addressBookName;
188 if ( !job->error() ) {
195 addressBookName = collection.
name();
201 metaData.
load( mCurrentItem );
208 KABC::Addressee mCurrentContact;
214 prison::AbstractBarcode* mQRCode;
215 prison::AbstractBarcode* mDataMatrix;
216 #endif // HAVE_PRISON
220 : QWidget( parent ), d( new Private( this ) )
222 QVBoxLayout *layout =
new QVBoxLayout(
this );
223 layout->setMargin( 0 );
226 d->mBrowser->setNotifyClick(
true );
228 connect( d->mBrowser, SIGNAL(mailClick(QString,QString)),
229 this, SLOT(slotMailClicked(QString,QString)) );
230 connect( d->mBrowser, SIGNAL(urlClick(QString)),
231 this, SLOT(slotUrlClicked(QString)) );
233 layout->addWidget( d->mBrowser );
253 return d->mCurrentContact;
258 if ( formatter == 0 )
259 d->mContactFormatter = d->mStandardContactFormatter;
261 d->mContactFormatter = formatter;
276 void ContactViewer::itemChanged(
const Item &contactItem )
278 if ( !contactItem.
hasPayload<KABC::Addressee>() )
281 d->mCurrentItem = contactItem;
282 d->mCurrentContact = contactItem.
payload<KABC::Addressee>();
285 if ( d->mParentCollectionFetchJob ) {
286 disconnect( d->mParentCollectionFetchJob, SIGNAL(result(KJob*)),
this, SLOT(slotParentCollectionFetched(KJob*)) );
287 delete d->mParentCollectionFetchJob;
288 d->mParentCollectionFetchJob = 0;
292 connect( d->mParentCollectionFetchJob, SIGNAL(result(KJob*)), SLOT(slotParentCollectionFetched(KJob*)) );
295 void ContactViewer::itemRemoved()
297 d->mBrowser->clear();
300 #include "contactviewer.moc"