diff --git a/CMakeLists.txt b/CMakeLists.txt index 0cfc5040d..dc8d403b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -120,6 +120,7 @@ if (NOT WINCE AND KDEPIM_BUILD_DESKTOP) identityeditvcarddialog.cpp identityaddvcarddialog.cpp attachmentmissingwarning.cpp + createnewcontactjob.cpp ) # TODO PORT diff --git a/createnewcontactjob.cpp b/createnewcontactjob.cpp new file mode 100644 index 000000000..bcc2d7567 --- /dev/null +++ b/createnewcontactjob.cpp @@ -0,0 +1,116 @@ +/* + Copyright (c) 2012 Montel Laurent + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + +#include "createnewcontactjob.h" +#include "util.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +CreateNewContactJob::CreateNewContactJob(QWidget *parentWidget, QObject *parent) + : KJob(parent), + mParentWidget(parentWidget) +{ +} + +CreateNewContactJob::~CreateNewContactJob() +{ +} + +void CreateNewContactJob::start() +{ + const QStringList mimeTypes( KABC::Addressee::mimeType() ); + + Akonadi::CollectionFetchJob * const addressBookJob = + new Akonadi::CollectionFetchJob( Akonadi::Collection::root(), + Akonadi::CollectionFetchJob::Recursive ); + + addressBookJob->fetchScope().setContentMimeTypes( mimeTypes ); + connect( addressBookJob, SIGNAL(result(KJob*)), SLOT(slotCollectionsFetched(KJob*)) ); +} + + +void CreateNewContactJob::slotCollectionsFetched(KJob*job) +{ + if ( job->error() ) { + setError( job->error() ); + setErrorText( job->errorText() ); + emitResult(); + return; + } + + const Akonadi::CollectionFetchJob *addressBookJob = qobject_cast( job ); + + Akonadi::Collection::List canCreateItemCollections ; + + foreach ( const Akonadi::Collection &collection, addressBookJob->collections() ) { + if ( Akonadi::Collection::CanCreateItem & collection.rights() ) { + canCreateItemCollections.append(collection); + } + } + if ( canCreateItemCollections.isEmpty() ) { + Akonadi::AgentTypeDialog dlg( mParentWidget ); + dlg.agentFilterProxyModel()->addMimeTypeFilter(KABC::Addressee::mimeType()); + dlg.agentFilterProxyModel()->addMimeTypeFilter(KABC::ContactGroup::mimeType()); + dlg.agentFilterProxyModel()->addCapabilityFilter( QLatin1String( "Resource" ) ); + + if ( dlg.exec() ) { + const Akonadi::AgentType agentType = dlg.agentType(); + + if ( agentType.isValid() ) { + Akonadi::AgentInstanceCreateJob *job = new Akonadi::AgentInstanceCreateJob( agentType, this ); + connect( job, SIGNAL(result(KJob*)), SLOT(slotResourceCreationDone(KJob*)) ); + job->configure( mParentWidget ); + job->start(); + } + } + return; + } + createContact(); + emitResult(); +} + +void CreateNewContactJob::slotResourceCreationDone(KJob* job) +{ + if ( job->error() ) { + setError( job->error() ); + setErrorText( job->errorText() ); + emitResult(); + return; + } + + createContact(); + emitResult(); +} + +void CreateNewContactJob::createContact() +{ + Akonadi::ContactEditorDialog dlg( Akonadi::ContactEditorDialog::CreateMode, mParentWidget ); + dlg.exec(); +} + +#include "createnewcontactjob.moc" diff --git a/createnewcontactjob.h b/createnewcontactjob.h new file mode 100644 index 000000000..786348de4 --- /dev/null +++ b/createnewcontactjob.h @@ -0,0 +1,42 @@ +/* + Copyright (c) 2012 Montel Laurent + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. + +*/ + +#ifndef CREATENEWCONTACTJOB_H +#define CREATENEWCONTACTJOB_H + +#include + +class CreateNewContactJob : public KJob +{ + Q_OBJECT +public: + explicit CreateNewContactJob(QWidget *parentWidget, QObject *parent = 0); + ~CreateNewContactJob(); + + virtual void start(); +private Q_SLOTS: + void slotCollectionsFetched(KJob*); + void slotResourceCreationDone(KJob* job); +private: + void createContact(); + QWidget *mParentWidget; +}; + +#endif // CREATENEWCONTACTJOB_H diff --git a/kmcomposewin.cpp b/kmcomposewin.cpp index b9eea1552..e06afafa1 100644 --- a/kmcomposewin.cpp +++ b/kmcomposewin.cpp @@ -52,6 +52,7 @@ #include "messageviewer/translator/translatorwidget.h" #include "messagecomposer/selectspecialchar.h" #include "attachmentmissingwarning.h" +#include "createnewcontactjob.h" // KDEPIM includes #include @@ -3416,8 +3417,8 @@ void KMComposeWin::slotSaveAsFile() void KMComposeWin::slotCreateAddressBookContact() { - Akonadi::ContactEditorDialog dlg( Akonadi::ContactEditorDialog::CreateMode, this ); - dlg.exec(); + CreateNewContactJob *job = new CreateNewContactJob( this, this ); + job->start(); } void KMComposeWin::slotAttachMissingFile() diff --git a/kmmainwidget.cpp b/kmmainwidget.cpp index d5e42fccf..3f521c794 100644 --- a/kmmainwidget.cpp +++ b/kmmainwidget.cpp @@ -55,6 +55,7 @@ #include "collectionmailinglistpage.h" #include "tagselectdialog.h" #include "archivemailagentinterface.h" +#include "createnewcontactjob.h" #include "pimcommon/collectionaclpage.h" #include "mailcommon/collectiongeneralpage.h" @@ -4842,8 +4843,8 @@ void KMMainWidget::slotExportData() void KMMainWidget::slotCreateAddressBookContact() { - Akonadi::ContactEditorDialog dlg( Akonadi::ContactEditorDialog::CreateMode, this ); - dlg.exec(); + CreateNewContactJob *job = new CreateNewContactJob( this, this ); + job->start(); } void KMMainWidget::slotOpenRecentMsg(const KUrl& url)