23 #include "emailaddressselectionwidget.h"
25 #include "emailaddressselection_p.h"
26 #include "emailaddressselectionproxymodel_p.h"
28 #include <akonadi/changerecorder.h>
29 #include <akonadi/contact/contactsfilterproxymodel.h>
30 #include <akonadi/contact/contactstreemodel.h>
31 #include <akonadi/control.h>
32 #include <akonadi/entitydisplayattribute.h>
33 #include <akonadi/entitytreeview.h>
34 #include <akonadi/itemfetchscope.h>
35 #include <akonadi/session.h>
36 #include <kabc/addressee.h>
37 #include <kabc/contactgroup.h>
38 #include <klineedit.h>
42 #include <QtCore/QTimer>
43 #include <QHBoxLayout>
44 #include <QHeaderView>
47 #include <QVBoxLayout>
49 using namespace Akonadi;
54 class SearchLineEdit :
public KLineEdit
57 SearchLineEdit( QWidget *receiver, QWidget *parent = 0 )
58 : KLineEdit( parent ), mReceiver( receiver )
63 virtual void keyPressEvent( QKeyEvent *event )
65 if ( event->key() == Qt::Key_Down ) {
66 QMetaObject::invokeMethod( mReceiver,
"setFocus" );
69 KLineEdit::keyPressEvent( event );
79 class EmailAddressSelectionWidget::Private
83 : q( qq ), mModel( model )
91 QAbstractItemModel *mModel;
92 QLabel *mDescriptionLabel;
93 SearchLineEdit *mSearchLine;
100 EmailAddressSelectionProxyModel *mSelectionModel;
103 void EmailAddressSelectionWidget::Private::init()
105 KGlobal::locale()->insertCatalog( QLatin1String(
"akonadicontact" ) );
115 changeRecorder->setSession( session );
116 changeRecorder->fetchCollection(
true );
117 changeRecorder->setItemFetchScope( scope );
119 changeRecorder->setMimeTypeMonitored( KABC::Addressee::mimeType(),
true );
120 changeRecorder->setMimeTypeMonitored( KABC::ContactGroup::mimeType(),
true );
129 QVBoxLayout *layout =
new QVBoxLayout( q );
131 mDescriptionLabel =
new QLabel;
132 mDescriptionLabel->hide();
133 layout->addWidget( mDescriptionLabel );
135 QHBoxLayout *searchLayout =
new QHBoxLayout;
136 layout->addLayout( searchLayout );
142 mView =
new QTreeView;
145 QLabel *label =
new QLabel( i18nc(
"@label Search in a list of contacts",
"Search:" ) );
146 mSearchLine =
new SearchLineEdit( mView );
147 label->setBuddy( mSearchLine );
148 searchLayout->addWidget( label );
149 searchLayout->addWidget( mSearchLine );
151 #ifndef QT_NO_DRAGANDDROP
152 mView->setDragDropMode( QAbstractItemView::NoDragDrop );
154 layout->addWidget( mView );
159 filter->setSourceModel( mModel );
161 mSelectionModel =
new EmailAddressSelectionProxyModel( q );
162 mSelectionModel->setSourceModel( filter );
164 mView->setModel( mSelectionModel );
165 mView->header()->hide();
167 q->connect( mSearchLine, SIGNAL(textChanged(QString)),
168 filter, SLOT(setFilterString(QString)) );
173 q, SIGNAL(doubleClicked()));
177 mSearchLine->setFocus();
179 QTimer::singleShot( 1000, mView, SLOT(expandAll()) );
185 d( new Private( this, 0 ) )
191 d( new Private( this, model ) )
204 if ( !d->mView->selectionModel() ) {
208 const QModelIndexList selectedRows = d->mView->selectionModel()->selectedRows( 0 );
209 foreach (
const QModelIndex &index, selectedRows ) {
211 selection.d->mName = index.data( EmailAddressSelectionProxyModel::NameRole ).toString();
212 selection.d->mEmailAddress = index.data( EmailAddressSelectionProxyModel::EmailAddressRole ).toString();
215 if ( !selection.d->mEmailAddress.isEmpty() ) {
216 selections << selection;
225 return d->mSearchLine;