22 #include "contactgrouplineedit_p.h"
24 #include "contactcompletionmodel_p.h"
26 #include <akonadi/entitytreemodel.h>
27 #include <akonadi/itemfetchjob.h>
28 #include <akonadi/itemfetchscope.h>
31 #include <QtCore/QAbstractItemModel>
32 #include <QtGui/QAction>
33 #include <QtGui/QCompleter>
34 #include <QtGui/QMenu>
36 ContactGroupLineEdit::ContactGroupLineEdit( QWidget *parent )
37 : KLineEdit( parent ),
39 mContainsReference( false )
41 setClearButtonShown(
true );
44 void ContactGroupLineEdit::setCompletionModel( QAbstractItemModel *model )
46 mCompleter =
new QCompleter( model,
this );
47 mCompleter->setCompletionColumn( Akonadi::ContactCompletionModel::NameAndEmailColumn );
48 connect( mCompleter, SIGNAL(activated(QModelIndex)),
49 this, SLOT(autoCompleted(QModelIndex)) );
51 setCompleter( mCompleter );
54 bool ContactGroupLineEdit::containsReference()
const
56 return mContainsReference;
59 void ContactGroupLineEdit::setContactData(
const KABC::ContactGroup::Data &groupData )
61 mContactData = groupData;
62 mContainsReference =
false;
64 setText( QString::fromLatin1(
"%1 <%2>" ).arg( groupData.name() ).arg( groupData.email() ) );
67 KABC::ContactGroup::Data ContactGroupLineEdit::contactData()
const
69 QString fullName, email;
70 KABC::Addressee::parseEmailAddress( text(), fullName, email );
72 if ( fullName.isEmpty() || email.isEmpty() )
73 return KABC::ContactGroup::Data();
75 KABC::ContactGroup::Data groupData( mContactData );
76 groupData.setName( fullName );
77 groupData.setEmail( email );
82 void ContactGroupLineEdit::setContactReference(
const KABC::ContactGroup::ContactReference &reference )
84 mContactReference = reference;
85 mContainsReference =
true;
87 disconnect(
this, SIGNAL(textChanged(QString)),
this, SLOT(invalidateReference()) );
89 updateView( reference.uid(), reference.preferredEmail() );
92 KABC::ContactGroup::ContactReference ContactGroupLineEdit::contactReference()
const
94 return mContactReference;
97 void ContactGroupLineEdit::autoCompleted(
const QModelIndex &index )
99 if ( !index.isValid() )
106 disconnect(
this, SIGNAL(textChanged(QString)),
this, SLOT(invalidateReference()) );
107 mContainsReference =
true;
111 connect(
this, SIGNAL(textChanged(QString)), SLOT(invalidateReference()) );
114 void ContactGroupLineEdit::invalidateReference()
116 disconnect(
this, SIGNAL(textChanged(QString)),
this, SLOT(invalidateReference()) );
117 mContainsReference =
false;
120 void ContactGroupLineEdit::updateView(
const QString &uid,
const QString &preferredEmail )
124 job->setProperty(
"preferredEmail", preferredEmail );
125 connect( job, SIGNAL(result(KJob*)), SLOT(fetchDone(KJob*)) );
128 void ContactGroupLineEdit::fetchDone( KJob *job )
132 if ( !fetchJob->
items().isEmpty() ) {
134 updateView( item, fetchJob->property(
"preferredEmail" ).toString() );
137 connect(
this, SIGNAL(textChanged(QString)), SLOT(invalidateReference()) );
140 void ContactGroupLineEdit::updateView(
const Akonadi::Item &item,
const QString &preferredEmail )
145 const KABC::Addressee contact = item.
payload<KABC::Addressee>();
147 QString email( preferredEmail );
148 if ( email.isEmpty() )
149 email = requestPreferredEmail( contact );
151 QString name = contact.formattedName();
152 if ( name.isEmpty() )
153 name = contact.assembledName();
155 if ( email.isEmpty() )
156 setText( QString::fromLatin1(
"%1" ).arg( name ) );
158 setText( QString::fromLatin1(
"%1 <%2>" ).arg( name ).arg( email ) );
160 mContactReference.setUid( QString::number( item.
id() ) );
162 if ( contact.preferredEmail() != email )
163 mContactReference.setPreferredEmail( email );
166 QString ContactGroupLineEdit::requestPreferredEmail(
const KABC::Addressee &contact )
const
168 const QStringList emails = contact.emails();
170 if ( emails.isEmpty() ) {
171 qDebug(
"ContactGroupLineEdit::requestPreferredEmail(): Warning!!! no email addresses available" );
175 if ( emails.count() == 1 )
176 return emails.first();
181 menu.setTitle( i18n(
"Select preferred email address" ) );
182 const int numberOfEmails( emails.count() );
183 for (
int i = 0; i < numberOfEmails; ++i ) {
184 action = menu.addAction( emails.at( i ) );
185 action->setData( i );
188 action = menu.exec( mapToGlobal( QPoint( x() + width()/2, y() + height()/2 ) ) );
190 return emails.first();
192 return emails.at( action->data().toInt() );
195 #include "contactgrouplineedit_p.moc"