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>
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();
76 KABC::ContactGroup::Data groupData( mContactData );
77 groupData.setName( fullName );
78 groupData.setEmail( email );
83 void ContactGroupLineEdit::setContactReference(
const KABC::ContactGroup::ContactReference &reference )
85 mContactReference = reference;
86 mContainsReference =
true;
88 disconnect(
this, SIGNAL(textChanged(QString)),
this, SLOT(invalidateReference()) );
90 updateView( reference.uid(), reference.preferredEmail() );
93 KABC::ContactGroup::ContactReference ContactGroupLineEdit::contactReference()
const
95 return mContactReference;
98 void ContactGroupLineEdit::autoCompleted(
const QModelIndex &index )
100 if ( !index.isValid() ) {
109 disconnect(
this, SIGNAL(textChanged(QString)),
this, SLOT(invalidateReference()) );
110 mContainsReference =
true;
114 connect(
this, SIGNAL(textChanged(QString)), SLOT(invalidateReference()) );
117 void ContactGroupLineEdit::invalidateReference()
119 disconnect(
this, SIGNAL(textChanged(QString)),
this, SLOT(invalidateReference()) );
120 mContainsReference =
false;
123 void ContactGroupLineEdit::updateView(
const QString &uid,
const QString &preferredEmail )
127 job->setProperty(
"preferredEmail", preferredEmail );
128 connect( job, SIGNAL(result(KJob*)), SLOT(fetchDone(KJob*)) );
131 void ContactGroupLineEdit::fetchDone( KJob *job )
135 if ( !fetchJob->
items().isEmpty() ) {
137 updateView( item, fetchJob->property(
"preferredEmail" ).toString() );
140 connect(
this, SIGNAL(textChanged(QString)), SLOT(invalidateReference()) );
143 void ContactGroupLineEdit::updateView(
const Akonadi::Item &item,
const QString &preferredEmail )
149 const KABC::Addressee contact = item.
payload<KABC::Addressee>();
151 QString email( preferredEmail );
152 if ( email.isEmpty() ) {
153 email = requestPreferredEmail( contact );
156 QString name = contact.formattedName();
157 if ( name.isEmpty() ) {
158 name = contact.assembledName();
161 if ( email.isEmpty() ) {
162 setText( QString::fromLatin1(
"%1" ).arg( name ) );
164 setText( QString::fromLatin1(
"%1 <%2>" ).arg( name ).arg( email ) );
167 mContactReference.setUid( QString::number( item.
id() ) );
169 if ( contact.preferredEmail() != email ) {
170 mContactReference.setPreferredEmail( email );
174 QString ContactGroupLineEdit::requestPreferredEmail(
const KABC::Addressee &contact )
const
176 const QStringList emails = contact.emails();
178 if ( emails.isEmpty() ) {
179 qDebug(
"ContactGroupLineEdit::requestPreferredEmail(): Warning!!! no email addresses available" );
183 if ( emails.count() == 1 ) {
184 return emails.first();
190 menu.setTitle( i18n(
"Select preferred email address" ) );
191 const int numberOfEmails( emails.count() );
192 for (
int i = 0; i < numberOfEmails; ++i ) {
193 action = menu.addAction( emails.at( i ) );
194 action->setData( i );
197 action = menu.exec( mapToGlobal( QPoint( x() + width()/2, y() + height()/2 ) ) );
199 return emails.first();
202 return emails.at( action->data().toInt() );
205 #include "moc_contactgrouplineedit_p.cpp"