22 #include "contactgroupeditor.h"
23 #include "contactgroupeditor_p.h"
25 #include "autoqpointer_p.h"
26 #include "contactgroupmodel_p.h"
27 #include "contactgroupeditordelegate_p.h"
28 #include "waitingoverlay_p.h"
30 #include <akonadi/collectiondialog.h>
31 #include <akonadi/collectionfetchjob.h>
32 #include <akonadi/itemcreatejob.h>
33 #include <akonadi/itemfetchjob.h>
34 #include <akonadi/itemfetchscope.h>
35 #include <akonadi/itemmodifyjob.h>
36 #include <akonadi/monitor.h>
37 #include <akonadi/session.h>
38 #include <kabc/contactgroup.h>
40 #include <klineedit.h>
41 #include <kmessagebox.h>
42 #include <KColorScheme>
45 #include <QtCore/QTimer>
46 #include <QtGui/QGridLayout>
47 #include <QtGui/QMessageBox>
48 #include <QtGui/QTableView>
50 using namespace Akonadi;
53 : mParent( parent ), mMonitor( 0 ), mReadOnly( false )
57 ContactGroupEditor::Private::~Private()
62 void ContactGroupEditor::Private::adaptHeaderSizes()
64 mGui.membersView->header()->setDefaultSectionSize( mGui.membersView->header()->width() / 2 );
65 mGui.membersView->header()->resizeSections( QHeaderView::Interactive );
68 void ContactGroupEditor::Private::itemFetchDone( KJob *job )
77 if ( fetchJob->
items().isEmpty() )
80 mItem = fetchJob->
items().first();
83 if ( mMode == ContactGroupEditor::EditMode ) {
89 mParent->connect( collectionFetchJob, SIGNAL(result(KJob*)),
90 SLOT(parentCollectionFetchDone(KJob*)) );
92 const KABC::ContactGroup group = mItem.payload<KABC::ContactGroup>();
93 loadContactGroup( group );
95 setReadOnly( mReadOnly );
97 QTimer::singleShot( 0, mParent, SLOT(adaptHeaderSizes()) );
101 void ContactGroupEditor::Private::parentCollectionFetchDone( KJob *job )
111 if ( parentCollection.
isValid() )
112 mReadOnly = !(parentCollection.
rights() & Collection::CanChangeItem);
114 const KABC::ContactGroup group = mItem.payload<KABC::ContactGroup>();
115 loadContactGroup( group );
117 setReadOnly( mReadOnly );
119 QTimer::singleShot( 0, mParent, SLOT(adaptHeaderSizes()) );
122 void ContactGroupEditor::Private::storeDone( KJob *job )
124 if ( job->error() ) {
125 emit mParent->error( job->errorString() );
129 if ( mMode == EditMode )
130 emit mParent->contactGroupStored( mItem );
131 else if ( mMode == CreateMode )
132 emit mParent->contactGroupStored( static_cast<ItemCreateJob*>( job )->item() );
135 void ContactGroupEditor::Private::itemChanged(
const Item&,
const QSet<QByteArray>& )
139 dlg->setInformativeText( i18n(
"The contact group has been changed by someone else.\nWhat should be done?" ) );
140 dlg->addButton( i18n(
"Take over changes" ), QMessageBox::AcceptRole );
141 dlg->addButton( i18n(
"Ignore and Overwrite changes" ), QMessageBox::RejectRole );
143 if ( dlg->exec() == QMessageBox::AcceptRole ) {
148 mParent->connect( job, SIGNAL(result(KJob*)), mParent, SLOT(itemFetchDone(KJob*)) );
153 void ContactGroupEditor::Private::loadContactGroup(
const KABC::ContactGroup &group )
155 mGui.groupName->setText( group.name() );
157 mGroupModel->loadContactGroup( group );
159 const QAbstractItemModel *model = mGui.membersView->model();
160 mGui.membersView->setCurrentIndex( model->index( model->rowCount() - 1, 0 ) );
162 if ( mMode == EditMode )
163 mGui.membersView->setFocus();
165 mGui.membersView->header()->resizeSections( QHeaderView::Stretch );
168 bool ContactGroupEditor::Private::storeContactGroup( KABC::ContactGroup &group )
170 if ( mGui.groupName->text().isEmpty() ) {
171 KMessageBox::error( mParent, i18n(
"The name of the contact group must not be empty." ) );
175 group.setName( mGui.groupName->text() );
177 if ( !mGroupModel->storeContactGroup( group ) ) {
178 KMessageBox::error( mParent, mGroupModel->lastErrorMessage() );
185 void ContactGroupEditor::Private::setupMonitor()
191 connect( mMonitor, SIGNAL(itemChanged(
Akonadi::Item,QSet<QByteArray>)),
192 mParent, SLOT(itemChanged(
Akonadi::Item,QSet<QByteArray>)) );
195 void ContactGroupEditor::Private::setReadOnly(
bool readOnly )
197 mGui.groupName->setReadOnly( readOnly );
198 mGui.membersView->setEnabled( !readOnly );
202 ContactGroupEditor::ContactGroupEditor(
Mode mode, QWidget *parent )
203 : QWidget( parent ), d( new Private( this ) )
206 d->mGui.setupUi(
this );
208 d->mGui.membersView->setEditTriggers( QAbstractItemView::AllEditTriggers );
210 d->mGroupModel =
new ContactGroupModel(
this );
211 d->mGui.membersView->setModel( d->mGroupModel );
212 d->mGui.membersView->setItemDelegate(
new ContactGroupEditorDelegate( d->mGui.membersView,
this ) );
215 KABC::ContactGroup dummyGroup;
216 d->mGroupModel->loadContactGroup( dummyGroup );
218 QTimer::singleShot( 0,
this, SLOT(adaptHeaderSizes()) );
219 QTimer::singleShot( 0, d->mGui.groupName, SLOT(setFocus()) );
222 d->mGui.membersView->header()->setStretchLastSection(
true );
233 Q_ASSERT_X(
false,
"ContactGroupEditor::loadContactGroup",
"You are calling loadContactGroup in CreateMode!" );
239 connect( job, SIGNAL(result(KJob*)), SLOT(itemFetchDone(KJob*)) );
242 d->mMonitor->setItemMonitored( item );
250 if ( !d->mItem.isValid() )
256 KABC::ContactGroup group = d->mItem.payload<KABC::ContactGroup>();
258 if ( !d->storeContactGroup( group ) )
261 d->mItem.setPayload<KABC::ContactGroup>( group );
264 connect( job, SIGNAL(result(KJob*)), SLOT(storeDone(KJob*)) );
266 if ( !d->mDefaultCollection.isValid() ) {
267 const QStringList mimeTypeFilter( KABC::ContactGroup::mimeType() );
270 dlg->setMimeTypeFilter( mimeTypeFilter );
272 dlg->setCaption( i18n(
"Select Address Book" ) );
273 dlg->setDescription( i18n(
"Select the address book the new contact group shall be saved in:" ) );
275 if ( dlg->exec() == KDialog::Accepted )
281 KABC::ContactGroup group;
282 if ( !d->storeContactGroup( group ) )
287 item.
setMimeType( KABC::ContactGroup::mimeType() );
290 connect( job, SIGNAL(result(KJob*)), SLOT(storeDone(KJob*)) );
298 d->mGroupModel->loadContactGroup( group );
299 d->mGui.membersView->header()->setDefaultSectionSize( d->mGui.membersView->header()->width() / 2 );
300 d->mGui.membersView->header()->resizeSections( QHeaderView::Interactive );
305 d->mDefaultCollection = collection;
308 void ContactGroupEditor::groupNameIsValid(
bool isValid)
310 #ifndef QT_NO_STYLE_STYLESHEET
313 const KColorScheme::BackgroundRole bgColorScheme( KColorScheme::NegativeBackground );
314 KStatefulBrush bgBrush( KColorScheme::View, bgColorScheme );
315 styleSheet = QString::fromLatin1(
"QLineEdit{ background-color:%1 }" ).
316 arg( bgBrush.brush(
this ).color().name() );
318 d->mGui.groupName->setStyleSheet(styleSheet);
322 #include "contactgroupeditor.moc"