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 <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();
122 const CustomField::List globalCustomFields = CustomFieldManager::globalCustomFieldDescriptions();
123 foreach (
const CustomField &field, globalCustomFields ) {
124 QVariantMap description;
125 description.insert( QLatin1String(
"key" ), field.key() );
126 description.insert( QLatin1String(
"title" ), field.title() );
128 customFieldDescriptions << description;
131 KABC::Addressee
contact( mCurrentContact );
132 if ( !addressBookName.isEmpty() ) {
133 contact.insertCustom( QLatin1String(
"KADDRESSBOOK" ), QLatin1String(
"AddressBook" ), addressBookName );
136 mContactFormatter->setContact(
contact );
137 mContactFormatter->setCustomFieldDescriptions( customFieldDescriptions );
139 mBrowser->setHtml( mContactFormatter->toHtml() );
142 void slotMailClicked(
const QString&,
const QString &email )
144 QString name, address;
147 KABC::Addressee::parseEmailAddress( email.mid( 7 ), name, address );
149 emit mParent->emailClicked( name, address );
152 void slotUrlClicked(
const QString &urlString )
154 KUrl url( urlString );
155 const QString urlScheme( url.scheme() );
156 if ( urlScheme == QLatin1String(
"http" ) ||
157 urlScheme == QLatin1String(
"https" ) ) {
158 emit mParent->urlClicked( url );
159 }
else if ( urlScheme == QLatin1String(
"phone" ) ) {
160 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
162 const KABC::PhoneNumber::List numbers = mCurrentContact.phoneNumbers();
163 if ( pos < numbers.count() ) {
164 emit mParent->phoneNumberClicked( numbers.at( pos ) );
166 }
else if ( urlScheme == QLatin1String(
"sms" ) ) {
167 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
169 const KABC::PhoneNumber::List numbers = mCurrentContact.phoneNumbers();
170 if ( pos < numbers.count() ) {
171 emit mParent->smsClicked( numbers.at( pos ) );
173 }
else if ( urlScheme == QLatin1String(
"address" ) ) {
174 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
176 const KABC::Address::List addresses = mCurrentContact.addresses();
177 if ( pos < addresses.count() ) {
178 emit mParent->addressClicked( addresses.at( pos ) );
183 void slotParentCollectionFetched( KJob *job )
185 mParentCollectionFetchJob = 0;
187 QString addressBookName;
189 if ( !job->error() ) {
196 addressBookName = collection.
name();
203 metaData.
load( mCurrentItem );
210 KABC::Addressee mCurrentContact;
216 prison::AbstractBarcode* mQRCode;
217 prison::AbstractBarcode* mDataMatrix;
218 #endif // HAVE_PRISON
222 : QWidget( parent ), d( new Private( this ) )
224 QVBoxLayout *layout =
new QVBoxLayout(
this );
225 layout->setMargin( 0 );
228 d->mBrowser->setNotifyClick(
true );
230 connect( d->mBrowser, SIGNAL(mailClick(QString,QString)),
231 this, SLOT(slotMailClicked(QString,QString)) );
232 connect( d->mBrowser, SIGNAL(urlClick(QString)),
233 this, SLOT(slotUrlClicked(QString)) );
235 layout->addWidget( d->mBrowser );
255 return d->mCurrentContact;
260 if ( formatter == 0 ) {
261 d->mContactFormatter = d->mStandardContactFormatter;
263 d->mContactFormatter = formatter;
279 void ContactViewer::itemChanged(
const Item &contactItem )
281 if ( !contactItem.
hasPayload<KABC::Addressee>() ) {
285 d->mCurrentItem = contactItem;
286 d->mCurrentContact = contactItem.
payload<KABC::Addressee>();
289 if ( d->mParentCollectionFetchJob ) {
290 disconnect( d->mParentCollectionFetchJob, SIGNAL(result(KJob*)),
this, SLOT(slotParentCollectionFetched(KJob*)) );
291 delete d->mParentCollectionFetchJob;
292 d->mParentCollectionFetchJob = 0;
296 connect( d->mParentCollectionFetchJob, SIGNAL(result(KJob*)), SLOT(slotParentCollectionFetched(KJob*)) );
299 void ContactViewer::itemRemoved()
301 d->mBrowser->clear();
304 #include "moc_contactviewer.cpp"