22 #include "contacteditor.h"
24 #include "abstractcontacteditorwidget_p.h"
25 #include "autoqpointer_p.h"
26 #include "contactmetadata_p.h"
27 #include "contactmetadataattribute_p.h"
28 #include "editor/contacteditorwidget.h"
30 #include <akonadi/collectiondialog.h>
31 #include <akonadi/collectionfetchjob.h>
32 #include <akonadi/itemcreatejob.h>
33 #include <akonadi/itemfetchjob.h>
34 #include <akonadi/itemfetchscope.h>
35 #include <akonadi/itemmodifyjob.h>
36 #include <akonadi/monitor.h>
37 #include <akonadi/session.h>
38 #include <kabc/addressee.h>
41 #include <QtCore/QPointer>
42 #include <QtGui/QVBoxLayout>
43 #include <QtGui/QMessageBox>
45 using namespace Akonadi;
47 class ContactEditor::Private
50 Private( ContactEditor::Mode mode, AbstractContactEditorWidget *editorWidget, ContactEditor *parent )
51 : mParent( parent ), mMode( mode ), mMonitor( 0 ), mReadOnly( false )
54 mEditorWidget = editorWidget;
55 #ifndef DISABLE_EDITOR_WIDGETS
60 QVBoxLayout *layout =
new QVBoxLayout( mParent );
61 layout->setMargin( 0 );
62 layout->setSpacing( 0 );
63 layout->addWidget( mEditorWidget );
71 void itemFetchDone( KJob* );
72 void parentCollectionFetchDone( KJob* );
73 void storeDone( KJob* );
74 void itemChanged(
const Akonadi::Item &item,
const QSet<QByteArray>& );
76 void loadContact(
const KABC::Addressee &addr,
const ContactMetaData &metaData );
77 void storeContact( KABC::Addressee &addr, ContactMetaData &metaData );
80 ContactEditor *mParent;
81 ContactEditor::Mode mMode;
83 Akonadi::ContactMetaData mContactMetaData;
84 Akonadi::Monitor *mMonitor;
85 Akonadi::Collection mDefaultCollection;
86 AbstractContactEditorWidget *mEditorWidget;
90 void ContactEditor::Private::itemFetchDone( KJob *job )
92 if ( job->error() != KJob::NoError )
95 Akonadi::ItemFetchJob *fetchJob = qobject_cast<Akonadi::ItemFetchJob*>( job );
99 if ( fetchJob->items().isEmpty() )
102 mItem = fetchJob->items().first();
105 if ( mMode == ContactEditor::EditMode ) {
109 Akonadi::CollectionFetchJob *collectionFetchJob =
new Akonadi::CollectionFetchJob( mItem.parentCollection(),
111 mParent->connect( collectionFetchJob, SIGNAL(result(KJob*)),
112 SLOT(parentCollectionFetchDone(KJob*)) );
114 const KABC::Addressee addr = mItem.payload<KABC::Addressee>();
115 mContactMetaData.load( mItem );
116 loadContact( addr, mContactMetaData );
117 mEditorWidget->setReadOnly( mReadOnly );
121 void ContactEditor::Private::parentCollectionFetchDone( KJob *job )
126 Akonadi::CollectionFetchJob *fetchJob = qobject_cast<Akonadi::CollectionFetchJob*>( job );
130 const Akonadi::Collection parentCollection = fetchJob->collections().first();
131 if ( parentCollection.isValid() )
132 mReadOnly = !(parentCollection.rights() & Collection::CanChangeItem);
134 mEditorWidget->setReadOnly( mReadOnly );
136 const KABC::Addressee addr = mItem.payload<KABC::Addressee>();
137 mContactMetaData.load( mItem );
138 loadContact( addr, mContactMetaData );
141 void ContactEditor::Private::storeDone( KJob *job )
143 if ( job->error() != KJob::NoError ) {
144 emit mParent->error( job->errorString() );
148 if ( mMode == EditMode )
149 emit mParent->contactStored( mItem );
150 else if ( mMode == CreateMode )
151 emit mParent->contactStored( static_cast<Akonadi::ItemCreateJob*>( job )->item() );
154 void ContactEditor::Private::itemChanged(
const Akonadi::Item&,
const QSet<QByteArray>& )
156 QPointer<QMessageBox> dlg =
new QMessageBox( mParent );
158 dlg->setInformativeText( i18n(
"The contact has been changed by someone else.\nWhat should be done?" ) );
159 dlg->addButton( i18n(
"Take over changes" ), QMessageBox::AcceptRole );
160 dlg->addButton( i18n(
"Ignore and Overwrite changes" ), QMessageBox::RejectRole );
162 if ( dlg->exec() == QMessageBox::AcceptRole ) {
163 Akonadi::ItemFetchJob *job =
new Akonadi::ItemFetchJob( mItem );
164 job->fetchScope().fetchFullPayload();
165 job->fetchScope().fetchAttribute<ContactMetaDataAttribute>();
166 job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
168 mParent->connect( job, SIGNAL(result(KJob*)), mParent, SLOT(itemFetchDone(KJob*)) );
174 void ContactEditor::Private::loadContact(
const KABC::Addressee &addr,
const ContactMetaData &metaData )
176 mEditorWidget->loadContact( addr, metaData );
179 void ContactEditor::Private::storeContact( KABC::Addressee &addr, ContactMetaData &metaData )
181 mEditorWidget->storeContact( addr, metaData );
184 void ContactEditor::Private::setupMonitor()
187 mMonitor =
new Akonadi::Monitor;
188 mMonitor->ignoreSession( Akonadi::Session::defaultSession() );
190 connect( mMonitor, SIGNAL(itemChanged(Akonadi::Item,QSet<QByteArray>)),
191 mParent, SLOT(itemChanged(Akonadi::Item,QSet<QByteArray>)) );
195 ContactEditor::ContactEditor( Mode mode, QWidget *parent )
196 : QWidget( parent ), d( new Private( mode, 0, this ) )
200 ContactEditor::ContactEditor( Mode mode, AbstractContactEditorWidget *editorWidget, QWidget *parent )
201 : QWidget( parent ), d( new Private( mode, editorWidget, this ) )
205 ContactEditor::~ContactEditor()
210 void ContactEditor::loadContact(
const Akonadi::Item &item )
212 if ( d->mMode == CreateMode )
213 Q_ASSERT_X(
false,
"ContactEditor::loadContact",
"You are calling loadContact in CreateMode!" );
215 Akonadi::ItemFetchJob *job =
new Akonadi::ItemFetchJob( item );
216 job->fetchScope().fetchFullPayload();
217 job->fetchScope().fetchAttribute<ContactMetaDataAttribute>();
218 job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
220 connect( job, SIGNAL(result(KJob*)), SLOT(itemFetchDone(KJob*)) );
223 d->mMonitor->setItemMonitored( item );
226 bool ContactEditor::saveContact()
228 if ( d->mMode == EditMode ) {
229 if ( !d->mItem.isValid() )
235 KABC::Addressee addr = d->mItem.payload<KABC::Addressee>();
237 d->storeContact( addr, d->mContactMetaData );
239 d->mContactMetaData.store( d->mItem );
241 d->mItem.setPayload<KABC::Addressee>( addr );
243 Akonadi::ItemModifyJob *job =
new Akonadi::ItemModifyJob( d->mItem );
244 connect( job, SIGNAL(result(KJob*)), SLOT(storeDone(KJob*)) );
245 }
else if ( d->mMode == CreateMode ) {
246 if ( !d->mDefaultCollection.isValid() ) {
247 const QStringList mimeTypeFilter( KABC::Addressee::mimeType() );
250 dlg->setMimeTypeFilter( mimeTypeFilter );
251 dlg->setAccessRightsFilter( Collection::CanCreateItem );
252 dlg->setCaption( i18n(
"Select Address Book" ) );
253 dlg->setDescription( i18n(
"Select the address book the new contact shall be saved in:" ) );
254 if ( dlg->exec() == KDialog::Accepted )
255 setDefaultAddressBook( dlg->selectedCollection() );
260 KABC::Addressee addr;
261 d->storeContact( addr, d->mContactMetaData );
264 item.setPayload<KABC::Addressee>( addr );
265 item.setMimeType( KABC::Addressee::mimeType() );
267 d->mContactMetaData.store( item );
269 Akonadi::ItemCreateJob *job =
new Akonadi::ItemCreateJob( item, d->mDefaultCollection );
270 connect( job, SIGNAL(result(KJob*)), SLOT(storeDone(KJob*)) );
276 void ContactEditor::setContactTemplate(
const KABC::Addressee &contact )
278 d->loadContact( contact, d->mContactMetaData );
281 void ContactEditor::setDefaultAddressBook(
const Akonadi::Collection &collection )
283 d->mDefaultCollection = collection;
286 #include "contacteditor.moc"