From f3f78cf09f1bdce8e9979f3a6cfe354d74dafb68 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 5 Feb 2014 16:44:03 +0100 Subject: [PATCH] SearchWindow fixes. * Update status label also when the job fails * Deal with existing "Last Search" folders (reuse them) * actually set the persistentsearchattribute * cleanups --- searchdialog/searchwindow.cpp | 49 +++++++++++++++++++++++++++-------- searchdialog/searchwindow.h | 3 +++ 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/searchdialog/searchwindow.cpp b/searchdialog/searchwindow.cpp index d037a40bf..638062523 100644 --- a/searchdialog/searchwindow.cpp +++ b/searchdialog/searchwindow.cpp @@ -37,6 +37,7 @@ #include "pimcommon/folderdialog/selectmulticollectiondialog.h" #include +#include #include #include #include @@ -382,6 +383,33 @@ void SearchWindow::activateFolder( const Akonadi::Collection &collection ) } void SearchWindow::slotSearch() +{ + if (mFolder.isValid()) { + doSearch(); + return; + } + //We're going to try to create a new search folder, let's ensure first the name is not yet used. + + //Fetch all search collecitons + Akonadi::CollectionFetchJob *fetchJob = new Akonadi::CollectionFetchJob(Akonadi::Collection(1), Akonadi::CollectionFetchJob::FirstLevel); + connect(fetchJob, SIGNAL(result(KJob*)), this, SLOT(slotSearchCollectionsFetched(KJob*))); +} + +void SearchWindow::slotSearchCollectionsFetched(KJob *job) +{ + if (job->error()) { + kWarning() << job->errorString(); + } + Akonadi::CollectionFetchJob *fetchJob = static_cast(job); + Q_FOREACH(const Akonadi::Collection &col, fetchJob->collections()) { + if (col.name() == mUi.mSearchFolderEdt->text()) { + mFolder = col; + } + } + doSearch(); +} + +void SearchWindow::doSearch() { mSearchPatternWidget->hideWarningPattern(); if ( mUi.mSearchFolderEdt->text().isEmpty() ) { @@ -441,8 +469,6 @@ void SearchWindow::slotSearch() MailCommon::SearchPattern::SparqlQueryError queryError = MailCommon::SearchPattern::NoError; queryError = searchPattern.asAkonadiQuery(mQuery); - const QString queryLanguage = QLatin1String("akonadi"); - switch(queryError) { case MailCommon::SearchPattern::NoError: break; @@ -469,14 +495,11 @@ void SearchWindow::slotSearch() return; } mSearchPatternWidget->hideWarningPattern(); - qDebug() << queryLanguage; - qDebug() << mQuery.toJSON(); + kDebug() << mQuery.toJSON(); mUi.mSearchFolderOpenBtn->setEnabled( true ); if ( !mFolder.isValid() ) { - qDebug()<<" create new folder"; - // FIXME if another app created a virtual 'Last Search' folder without - // out custom attributes it will result in problems + kDebug()<<" create new folder " << mUi.mSearchFolderEdt->text(); Akonadi::SearchCreateJob *searchJob = new Akonadi::SearchCreateJob( mUi.mSearchFolderEdt->text(), mQuery, this ); searchJob->setSearchMimeTypes( QStringList() << QLatin1String("message/rfc822") ); searchJob->setSearchCollections( searchCollections ); @@ -484,14 +507,15 @@ void SearchWindow::slotSearch() searchJob->setRemoteSearchEnabled( true ); mSearchJob = searchJob; } else { - qDebug()<<" use existing folder"; - Akonadi::PersistentSearchAttribute *attribute = mFolder.attribute(); + kDebug()<<" use existing folder " << mFolder.id(); + Akonadi::PersistentSearchAttribute *attribute = new Akonadi::PersistentSearchAttribute(); mFolder.setContentMimeTypes(QStringList() << QLatin1String("message/rfc822")); - attribute->setQueryLanguage( queryLanguage ); + attribute->setQueryLanguage( QLatin1String("akonadi") ); attribute->setQueryString( QString::fromLatin1(mQuery.toJSON()) ); attribute->setQueryCollections( searchCollections ); attribute->setRecursive( recursive ); attribute->setRemoteSearchEnabled( true ); + mFolder.addAttribute(attribute); mSearchJob = new Akonadi::CollectionModifyJob( mFolder, this ); } @@ -505,12 +529,14 @@ void SearchWindow::searchDone( KJob* job ) Q_ASSERT( job == mSearchJob ); QMetaObject::invokeMethod( this, "enableGUI", Qt::QueuedConnection ); if ( job->error() ) { + kDebug() << job->errorString(); KMessageBox::sorry( this, i18n("Cannot get search result. %1", job->errorString() ) ); if ( mSearchJob ) { mSearchJob = 0; } enableGUI(); mUi.mSearchFolderEdt->setEnabled( true ); + mUi.mStatusLbl->setText( i18n("Search failed.") ); } else { @@ -550,7 +576,7 @@ void SearchWindow::searchDone( KJob* job ) new Akonadi::CollectionModifyJob( mFolder, this ); mSearchJob = 0; - mUi.mStatusLbl->setText( QString() ); + mUi.mStatusLbl->setText( i18n("Search complete.") ); createSearchModel(); if ( mCloseRequested ) @@ -569,6 +595,7 @@ void SearchWindow::slotStop() mSearchJob->kill( KJob::Quietly ); mSearchJob->deleteLater(); mSearchJob = 0; + mUi.mStatusLbl->setText( i18n("Search stopped.") ); } enableGUI(); diff --git a/searchdialog/searchwindow.h b/searchdialog/searchwindow.h index 262d4d77e..411eff767 100644 --- a/searchdialog/searchwindow.h +++ b/searchdialog/searchwindow.h @@ -155,7 +155,10 @@ private Q_SLOTS: void slotContextMenuRequested( const QPoint& ); void slotSelectMultipleFolders(); + void slotSearchCollectionsFetched( KJob *job ); + private: + void doSearch(); QPointer mSelectMultiCollectionDialog; QList mCollectionId; Akonadi::SearchQuery mQuery;