1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
commit 6a06c57f52a00018d607085efa7570deb91dc707
Author: David Faure <faure@kde.org>
Date: Mon Apr 8 17:41:39 2013 +0200
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
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
{
|