You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
7.2 KiB
190 lines
7.2 KiB
From 6a06c57f52a00018d607085efa7570deb91dc707 Mon Sep 17 00:00:00 2001
|
|
From: David Faure <faure@kde.org>
|
|
Date: Mon, 8 Apr 2013 17:41:39 +0200
|
|
Subject: [PATCH] Fix kmail autocompletion from akonadi.
|
|
|
|
My commit 02f5f0214e made autocompletion from nepomuk work better, but broke
|
|
completion from akonadi. I kept the "keywords" based code, but now it's only
|
|
used for the special case of nickname-based search (because the nickname shouldn't
|
|
appear in the completion item). For everything else it really doesn't make sense
|
|
to have a search engine (akonadi/nepomuk) on top of a search engine
|
|
(the one inside KCompletion).
|
|
|
|
This time I verified that:
|
|
* nepomuk search still works
|
|
* contacts from akonadi work again
|
|
* contact groups from akonadi work (after previous commit)
|
|
* nickname-search in akonadi still doesn't work, but it didn't before. More work
|
|
needed for that one. This is the only reason to keep KMailCompletion around btw,
|
|
everything else would work without it.
|
|
|
|
BUG: 259949
|
|
FIXED-IN: 4.10.3
|
|
---
|
|
libkdepim/addresseelineedit.cpp | 66 +++++++++++------------------------------
|
|
libkdepim/addresseelineedit.h | 5 ----
|
|
libkdepim/kmailcompletion.h | 4 ++-
|
|
3 files changed, 21 insertions(+), 54 deletions(-)
|
|
|
|
diff --git a/libkdepim/addresseelineedit.cpp b/libkdepim/addresseelineedit.cpp
|
|
index b7b11be..ec4caf9 100644
|
|
--- a/libkdepim/addresseelineedit.cpp
|
|
+++ b/libkdepim/addresseelineedit.cpp
|
|
@@ -30,6 +30,8 @@
|
|
#include "completionordereditor.h"
|
|
#endif
|
|
|
|
+#include "kmailcompletion.h"
|
|
+
|
|
#include <Akonadi/Contact/ContactSearchJob>
|
|
#include <Akonadi/Contact/ContactGroupSearchJob>
|
|
#include <Akonadi/CollectionFetchJob>
|
|
@@ -77,6 +79,10 @@
|
|
|
|
using namespace KPIM;
|
|
|
|
+namespace KPIM {
|
|
+ typedef QMap< QString, QPair<int,int> > CompletionItemsMap;
|
|
+}
|
|
+
|
|
class AddresseeLineEditStatic
|
|
{
|
|
public:
|
|
@@ -496,11 +502,9 @@ void AddresseeLineEdit::Private::addCompletionItem( const QString &string, int w
|
|
s_static->completionItemMap.insert( string, qMakePair( weight, completionItemSource ) );
|
|
}
|
|
|
|
- if ( keyWords == 0 ) {
|
|
- s_static->completion->addItem( string, weight );
|
|
- } else {
|
|
- s_static->completion->addItemWithKeys( string, weight, keyWords );
|
|
- }
|
|
+ s_static->completion->addItem(string, weight);
|
|
+ if (keyWords && !keyWords->isEmpty())
|
|
+ s_static->completion->addItemWithKeys(string, weight, keyWords); // see kmailcompletion.cpp
|
|
}
|
|
|
|
const QStringList KPIM::AddresseeLineEdit::Private::adjustedCompletionItems( bool fullSearch )
|
|
@@ -1348,17 +1352,13 @@ void AddresseeLineEdit::addItem( const Akonadi::Item &item, int weight, int sour
|
|
void AddresseeLineEdit::addContactGroup( const KABC::ContactGroup &group, int weight, int source )
|
|
{
|
|
d->addCompletionItem( group.name(), weight, source );
|
|
- QStringList keyWords;
|
|
- keyWords.append( group.name() );
|
|
- d->addCompletionItem( group.name(), weight, source, &keyWords );
|
|
}
|
|
|
|
void AddresseeLineEdit::addContact( const KABC::Addressee &addr, int weight, int source )
|
|
{
|
|
const QStringList emails = addr.emails();
|
|
QStringList::ConstIterator it;
|
|
- const int prefEmailWeight = 1; //increment weight by prefEmailWeight
|
|
- int isPrefEmail = prefEmailWeight; //first in list is preferredEmail
|
|
+ int isPrefEmail = 1; //first in list is preferredEmail
|
|
QStringList::ConstIterator end( emails.constEnd() );
|
|
for ( it = emails.constBegin(); it != end; ++it ) {
|
|
//TODO: highlight preferredEmail
|
|
@@ -1368,40 +1368,6 @@ void AddresseeLineEdit::addContact( const KABC::Addressee &addr, int weight, int
|
|
const QString nickName = addr.nickName();
|
|
QString fullEmail = addr.fullEmail( email );
|
|
|
|
- // Prepare keywords (for CompletionShell, CompletionPopup)
|
|
- QStringList keyWords;
|
|
- const QString realName = addr.realName();
|
|
-
|
|
- if ( !givenName.isEmpty() && !familyName.isEmpty() ) {
|
|
- keyWords.append( givenName + QLatin1Char( ' ' ) + familyName );
|
|
- keyWords.append( familyName + QLatin1Char( ' ' ) + givenName );
|
|
- keyWords.append( familyName + QLatin1String( ", " ) + givenName );
|
|
- } else if ( !givenName.isEmpty() ) {
|
|
- keyWords.append( givenName );
|
|
- } else if ( !familyName.isEmpty() ) {
|
|
- keyWords.append( familyName );
|
|
- }
|
|
-
|
|
- if ( !nickName.isEmpty() ) {
|
|
- keyWords.append( nickName );
|
|
- }
|
|
-
|
|
- if ( !realName.isEmpty() ) {
|
|
- keyWords.append( realName );
|
|
- }
|
|
-
|
|
- keyWords.append( email );
|
|
-
|
|
- /* KMailCompletion does not have knowledge about identities, it stores emails and
|
|
- * keywords for each email. KMailCompletion::allMatches does a lookup on the
|
|
- * keywords and returns an ordered list of emails. In order to get the preferred
|
|
- * email before others for each identity we use this little trick.
|
|
- * We remove the <blank> in adjustedCompletionItems.
|
|
- */
|
|
- if ( isPrefEmail == prefEmailWeight ) {
|
|
- fullEmail.replace( QLatin1String( " <" ), QLatin1String( " <" ) );
|
|
- }
|
|
-
|
|
// Prepare "givenName" + ' ' + "familyName"
|
|
QString fullName = givenName;
|
|
if (!familyName.isEmpty()) {
|
|
@@ -1413,12 +1379,16 @@ void AddresseeLineEdit::addContact( const KABC::Addressee &addr, int weight, int
|
|
// Finally, we can add the completion items
|
|
if (!fullName.isEmpty()) {
|
|
const QString address = KPIMUtils::normalizedAddress(fullName, email, QString());
|
|
- d->addCompletionItem(address, weight + isPrefEmail, source, &keyWords);
|
|
+ if (fullEmail != address) {
|
|
+ // This happens when fullEmail contains a middle name, while our own fullName+email only has "first last".
|
|
+ // Let's offer both, the fullEmail with 3 parts, looks a tad formal.
|
|
+ d->addCompletionItem(address, weight + isPrefEmail, source);
|
|
+ }
|
|
}
|
|
|
|
- if ( !nickName.isEmpty() ) {
|
|
- const QString address = KPIMUtils::normalizedAddress(nickName, email, QString());
|
|
- d->addCompletionItem(address, weight + isPrefEmail, source, &keyWords);
|
|
+ QStringList keyWords;
|
|
+ if (!nickName.isEmpty()) {
|
|
+ keyWords.append(nickName);
|
|
}
|
|
|
|
d->addCompletionItem( fullEmail, weight + isPrefEmail, source, &keyWords );
|
|
diff --git a/libkdepim/addresseelineedit.h b/libkdepim/addresseelineedit.h
|
|
index 4e6784b..b2af4a9 100644
|
|
--- a/libkdepim/addresseelineedit.h
|
|
+++ b/libkdepim/addresseelineedit.h
|
|
@@ -27,7 +27,6 @@
|
|
#ifndef KDEPIM_ADDRESSEELINEEDIT_H
|
|
#define KDEPIM_ADDRESSEELINEEDIT_H
|
|
|
|
-#include "kmailcompletion.h"
|
|
#include "kdepim_export.h"
|
|
|
|
#include "ldap/ldapclient.h"
|
|
@@ -50,10 +49,6 @@ namespace KABC {
|
|
class ContactGroup;
|
|
}
|
|
|
|
-namespace KPIM {
|
|
- typedef QMap< QString, QPair<int,int> > CompletionItemsMap;
|
|
-}
|
|
-
|
|
namespace Nepomuk2 {
|
|
namespace Query {
|
|
class Result;
|
|
diff --git a/libkdepim/kmailcompletion.h b/libkdepim/kmailcompletion.h
|
|
index e8574cc..93771d3 100644
|
|
--- a/libkdepim/kmailcompletion.h
|
|
+++ b/libkdepim/kmailcompletion.h
|
|
@@ -32,7 +32,9 @@ namespace KPIM {
|
|
|
|
/**
|
|
* KMailCompletion allows lookup of email addresses by keyword.
|
|
- * Typically a keywods would be firstname, lastname, nickname or domain.
|
|
+ * This is used for lookup by nickname, since we don't want the nickname to appear in the final email.
|
|
+ * E.g. you have a nickname "idiot" for your boss, you want to type "idiot" but you want the completion
|
|
+ * to offer "Full Name <email@domain>", without the nickname being visible.
|
|
*/
|
|
class KMailCompletion : public KCompletion
|
|
{
|
|
--
|
|
1.8.1.5
|
|
|