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 "editor/im/improtocols.h"
32 #include <akonadi/collection.h>
33 #include <akonadi/collectionfetchjob.h>
34 #include <akonadi/entitydisplayattribute.h>
35 #include <akonadi/item.h>
36 #include <akonadi/itemfetchscope.h>
37 #include <kabc/addressee.h>
38 #include <kcolorscheme.h>
39 #include <kconfiggroup.h>
42 #include <klocalizedstring.h>
43 #include <kstringhandler.h>
45 #include <QVBoxLayout>
48 #include <prison/QRCodeBarcode>
49 #include <prison/DataMatrixBarcode>
50 #include <kabc/vcardconverter.h>
53 using namespace Akonadi;
55 class ContactViewer::Private
59 : mParent( parent ), mParentCollectionFetchJob( 0 )
62 mContactFormatter = mStandardContactFormatter;
64 mQRCode =
new prison::QRCodeBarcode();
65 mDataMatrix =
new prison::DataMatrixBarcode();
71 delete mStandardContactFormatter;
78 void updateView(
const QVariantList &localCustomFieldDescriptions = QVariantList(),
const QString &addressBookName = QString() )
80 static QPixmap defaultPixmap = KIcon( QLatin1String(
"user-identity" ) ).pixmap( QSize( 100, 100 ) );
82 mParent->setWindowTitle( i18n(
"Contact %1", mCurrentContact.assembledName() ) );
84 if ( mCurrentContact.photo().isIntern() ) {
85 mBrowser->document()->addResource( QTextDocument::ImageResource,
86 QUrl( QLatin1String(
"contact_photo" ) ),
87 mCurrentContact.photo().data() );
89 mBrowser->document()->addResource( QTextDocument::ImageResource,
90 QUrl( QLatin1String(
"contact_photo" ) ),
94 if ( mCurrentContact.logo().isIntern() ) {
95 mBrowser->document()->addResource( QTextDocument::ImageResource,
96 QUrl( QLatin1String(
"contact_logo" ) ),
97 mCurrentContact.logo().data() );
100 mBrowser->document()->addResource( QTextDocument::ImageResource,
101 QUrl( QLatin1String(
"map_icon" ) ),
102 KIcon( QLatin1String(
"document-open-remote" ) ).pixmap( QSize( 16, 16 ) ) );
104 mBrowser->document()->addResource( QTextDocument::ImageResource,
105 QUrl( QLatin1String(
"sms_icon" ) ),
106 KIcon( IMProtocols::self()->icon( QString::fromLatin1(
"messaging/sms" ) ) ).pixmap( QSize( 16, 16 ) ) );
109 KConfig config( QLatin1String(
"akonadi_contactrc" ) );
110 KConfigGroup group( &config, QLatin1String(
"View" ) );
111 if ( group.readEntry(
"QRCodes",
true ) ) {
112 KABC::VCardConverter converter;
113 KABC::Addressee addr( mCurrentContact );
114 addr.setPhoto( KABC::Picture() );
115 addr.setLogo( KABC::Picture() );
116 const QString data = QString::fromUtf8( converter.createVCard( addr ) );
117 mQRCode->setData( data );
118 mDataMatrix->setData( data );
119 mBrowser->document()->addResource( QTextDocument::ImageResource,
120 QUrl( QLatin1String(
"qrcode" ) ),
121 mQRCode->toImage( QSizeF( 50, 50 ) ) );
122 mBrowser->document()->addResource( QTextDocument::ImageResource,
123 QUrl( QLatin1String(
"datamatrix" ) ),
124 mDataMatrix->toImage( QSizeF( 50, 50 ) ) );
126 #endif // HAVE_PRISON
129 QList<QVariantMap> customFieldDescriptions;
130 foreach (
const QVariant &entry, localCustomFieldDescriptions ) {
131 customFieldDescriptions << entry.toMap();
134 const CustomField::List globalCustomFields = CustomFieldManager::globalCustomFieldDescriptions();
135 foreach (
const CustomField &field, globalCustomFields ) {
136 QVariantMap description;
137 description.insert( QLatin1String(
"key" ), field.key() );
138 description.insert( QLatin1String(
"title" ), field.title() );
140 customFieldDescriptions << description;
143 KABC::Addressee
contact( mCurrentContact );
144 if ( !addressBookName.isEmpty() ) {
145 contact.insertCustom( QLatin1String(
"KADDRESSBOOK" ), QLatin1String(
"AddressBook" ), addressBookName );
148 mContactFormatter->setContact(
contact );
149 mContactFormatter->setCustomFieldDescriptions( customFieldDescriptions );
151 mBrowser->setHtml( mContactFormatter->toHtml() );
154 void slotMailClicked(
const QString&,
const QString &email )
156 QString name, address;
159 KABC::Addressee::parseEmailAddress( email.mid( 7 ), name, address );
161 emit mParent->emailClicked( name, address );
164 void slotUrlClicked(
const QString &urlString )
166 KUrl url( urlString );
167 const QString urlScheme( url.scheme() );
168 if ( urlScheme == QLatin1String(
"http" ) ||
169 urlScheme == QLatin1String(
"https" ) ) {
170 emit mParent->urlClicked( url );
171 }
else if ( urlScheme == QLatin1String(
"phone" ) ) {
172 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
174 const KABC::PhoneNumber::List numbers = mCurrentContact.phoneNumbers();
175 if ( pos < numbers.count() ) {
176 emit mParent->phoneNumberClicked( numbers.at( pos ) );
178 }
else if ( urlScheme == QLatin1String(
"sms" ) ) {
179 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
181 const KABC::PhoneNumber::List numbers = mCurrentContact.phoneNumbers();
182 if ( pos < numbers.count() ) {
183 emit mParent->smsClicked( numbers.at( pos ) );
185 }
else if ( urlScheme == QLatin1String(
"address" ) ) {
186 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
188 const KABC::Address::List addresses = mCurrentContact.addresses();
189 if ( pos < addresses.count() ) {
190 emit mParent->addressClicked( addresses.at( pos ) );
195 void slotParentCollectionFetched( KJob *job )
197 mParentCollectionFetchJob = 0;
199 QString addressBookName;
201 if ( !job->error() ) {
202 CollectionFetchJob *fetchJob = qobject_cast<CollectionFetchJob*>( job );
203 if ( !fetchJob->collections().isEmpty() ) {
204 const Collection collection = fetchJob->collections().first();
205 addressBookName = collection.displayName();
211 metaData.
load( mCurrentItem );
218 KABC::Addressee mCurrentContact;
222 CollectionFetchJob *mParentCollectionFetchJob;
224 prison::AbstractBarcode* mQRCode;
225 prison::AbstractBarcode* mDataMatrix;
226 #endif // HAVE_PRISON
230 : QWidget( parent ), d( new Private( this ) )
232 QVBoxLayout *layout =
new QVBoxLayout(
this );
233 layout->setMargin( 0 );
236 d->mBrowser->setNotifyClick(
true );
238 connect( d->mBrowser, SIGNAL(mailClick(QString,QString)),
239 this, SLOT(slotMailClicked(QString,QString)) );
240 connect( d->mBrowser, SIGNAL(urlClick(QString)),
241 this, SLOT(slotUrlClicked(QString)) );
243 layout->addWidget( d->mBrowser );
246 fetchScope().fetchFullPayload();
248 fetchScope().setAncestorRetrieval( ItemFetchScope::Parent );
258 return ItemMonitor::item();
263 return d->mCurrentContact;
268 if ( formatter == 0 ) {
269 d->mContactFormatter = d->mStandardContactFormatter;
271 d->mContactFormatter = formatter;
277 ItemMonitor::setItem( contact );
287 void ContactViewer::itemChanged(
const Item &contactItem )
289 if ( !contactItem.hasPayload<KABC::Addressee>() ) {
293 d->mCurrentItem = contactItem;
294 d->mCurrentContact = contactItem.payload<KABC::Addressee>();
297 if ( d->mParentCollectionFetchJob ) {
298 disconnect( d->mParentCollectionFetchJob, SIGNAL(result(KJob*)),
this, SLOT(slotParentCollectionFetched(KJob*)) );
299 delete d->mParentCollectionFetchJob;
300 d->mParentCollectionFetchJob = 0;
303 d->mParentCollectionFetchJob =
new CollectionFetchJob( contactItem.parentCollection(), CollectionFetchJob::Base, this );
304 connect( d->mParentCollectionFetchJob, SIGNAL(result(KJob*)), SLOT(slotParentCollectionFetched(KJob*)) );
307 void ContactViewer::itemRemoved()
309 d->mBrowser->clear();
312 #include "moc_contactviewer.cpp"
A class that represents non-standard contact fields.
A convenience class to remove the 'Copy Link Location' action from the context menu of KTextBrowser...