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 mBrowser->document()->addResource( QTextDocument::ImageResource,
95 QUrl( QLatin1String(
"map_icon" ) ),
96 KIcon( QLatin1String(
"document-open-remote" ) ).pixmap( QSize( 16, 16 ) ) );
98 mBrowser->document()->addResource( QTextDocument::ImageResource,
99 QUrl( QLatin1String(
"sms_icon" ) ),
100 KIcon( IMProtocols::self()->icon( QString::fromLatin1(
"messaging/sms" ) ) ).pixmap( QSize( 16, 16 ) ) );
103 KConfig config( QLatin1String(
"akonadi_contactrc" ) );
104 KConfigGroup group( &config, QLatin1String(
"View" ) );
105 if ( group.readEntry(
"QRCodes",
true ) ) {
106 KABC::VCardConverter converter;
107 KABC::Addressee addr( mCurrentContact );
108 addr.setPhoto( KABC::Picture() );
109 addr.setLogo( KABC::Picture() );
110 const QString data = QString::fromUtf8( converter.createVCard( addr ) );
111 mQRCode->setData( data );
112 mDataMatrix->setData( data );
113 mBrowser->document()->addResource( QTextDocument::ImageResource,
114 QUrl( QLatin1String(
"qrcode" ) ),
115 mQRCode->toImage( QSizeF( 50, 50 ) ) );
116 mBrowser->document()->addResource( QTextDocument::ImageResource,
117 QUrl( QLatin1String(
"datamatrix" ) ),
118 mDataMatrix->toImage( QSizeF( 50, 50 ) ) );
120 #endif // HAVE_PRISON
123 QList<QVariantMap> customFieldDescriptions;
124 foreach (
const QVariant &entry, localCustomFieldDescriptions ) {
125 customFieldDescriptions << entry.toMap();
128 const CustomField::List globalCustomFields = CustomFieldManager::globalCustomFieldDescriptions();
129 foreach (
const CustomField &field, globalCustomFields ) {
130 QVariantMap description;
131 description.insert( QLatin1String(
"key" ), field.key() );
132 description.insert( QLatin1String(
"title" ), field.title() );
134 customFieldDescriptions << description;
137 KABC::Addressee
contact( mCurrentContact );
138 if ( !addressBookName.isEmpty() ) {
139 contact.insertCustom( QLatin1String(
"KADDRESSBOOK" ), QLatin1String(
"AddressBook" ), addressBookName );
142 mContactFormatter->setContact(
contact );
143 mContactFormatter->setCustomFieldDescriptions( customFieldDescriptions );
145 mBrowser->setHtml( mContactFormatter->toHtml() );
148 void slotMailClicked(
const QString&,
const QString &email )
150 QString name, address;
153 KABC::Addressee::parseEmailAddress( email.mid( 7 ), name, address );
155 emit mParent->emailClicked( name, address );
158 void slotUrlClicked(
const QString &urlString )
160 KUrl url( urlString );
161 const QString urlScheme( url.scheme() );
162 if ( urlScheme == QLatin1String(
"http" ) ||
163 urlScheme == QLatin1String(
"https" ) ) {
164 emit mParent->urlClicked( url );
165 }
else if ( urlScheme == QLatin1String(
"phone" ) ) {
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->phoneNumberClicked( numbers.at( pos ) );
172 }
else if ( urlScheme == QLatin1String(
"sms" ) ) {
173 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
175 const KABC::PhoneNumber::List numbers = mCurrentContact.phoneNumbers();
176 if ( pos < numbers.count() ) {
177 emit mParent->smsClicked( numbers.at( pos ) );
179 }
else if ( urlScheme == QLatin1String(
"address" ) ) {
180 const int pos = url.queryItemValue( QLatin1String(
"index" ) ).toInt();
182 const KABC::Address::List addresses = mCurrentContact.addresses();
183 if ( pos < addresses.count() ) {
184 emit mParent->addressClicked( addresses.at( pos ) );
189 void slotParentCollectionFetched( KJob *job )
191 mParentCollectionFetchJob = 0;
193 QString addressBookName;
195 if ( !job->error() ) {
196 CollectionFetchJob *fetchJob = qobject_cast<CollectionFetchJob*>( job );
197 if ( !fetchJob->collections().isEmpty() ) {
198 const Collection collection = fetchJob->collections().first();
199 addressBookName = collection.displayName();
205 metaData.
load( mCurrentItem );
212 KABC::Addressee mCurrentContact;
216 CollectionFetchJob *mParentCollectionFetchJob;
218 prison::AbstractBarcode* mQRCode;
219 prison::AbstractBarcode* mDataMatrix;
220 #endif // HAVE_PRISON
224 : QWidget( parent ), d( new Private( this ) )
226 QVBoxLayout *layout =
new QVBoxLayout(
this );
227 layout->setMargin( 0 );
230 d->mBrowser->setNotifyClick(
true );
232 connect( d->mBrowser, SIGNAL(mailClick(QString,QString)),
233 this, SLOT(slotMailClicked(QString,QString)) );
234 connect( d->mBrowser, SIGNAL(urlClick(QString)),
235 this, SLOT(slotUrlClicked(QString)) );
237 layout->addWidget( d->mBrowser );
240 fetchScope().fetchFullPayload();
242 fetchScope().setAncestorRetrieval( ItemFetchScope::Parent );
252 return ItemMonitor::item();
257 return d->mCurrentContact;
262 if ( formatter == 0 ) {
263 d->mContactFormatter = d->mStandardContactFormatter;
265 d->mContactFormatter = formatter;
271 ItemMonitor::setItem( contact );
281 void ContactViewer::itemChanged(
const Item &contactItem )
283 if ( !contactItem.hasPayload<KABC::Addressee>() ) {
287 d->mCurrentItem = contactItem;
288 d->mCurrentContact = contactItem.payload<KABC::Addressee>();
291 if ( d->mParentCollectionFetchJob ) {
292 disconnect( d->mParentCollectionFetchJob, SIGNAL(result(KJob*)),
this, SLOT(slotParentCollectionFetched(KJob*)) );
293 delete d->mParentCollectionFetchJob;
294 d->mParentCollectionFetchJob = 0;
297 d->mParentCollectionFetchJob =
new CollectionFetchJob( contactItem.parentCollection(), CollectionFetchJob::Base, this );
298 connect( d->mParentCollectionFetchJob, SIGNAL(result(KJob*)), SLOT(slotParentCollectionFetched(KJob*)) );
301 void ContactViewer::itemRemoved()
303 d->mBrowser->clear();
306 #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...