21 #include "collectiondialog.h"
23 #include "asyncselectionhandler_p.h"
25 #include <akonadi/changerecorder.h>
26 #include <akonadi/collectionfetchscope.h>
27 #include <akonadi/collectionfilterproxymodel.h>
28 #include <akonadi/entityrightsfiltermodel.h>
29 #include <akonadi/entitytreemodel.h>
30 #include <akonadi/entitytreeview.h>
31 #include <akonadi/session.h>
32 #include <akonadi/collectioncreatejob.h>
33 #include <akonadi/collectionutils_p.h>
35 #include <QtGui/QHeaderView>
36 #include <QtGui/QLabel>
37 #include <QtGui/QVBoxLayout>
41 #include <KInputDialog>
42 #include <KMessageBox>
44 using namespace Akonadi;
46 class CollectionDialog::Private
49 Private( QAbstractItemModel *customModel,
CollectionDialog *parent, CollectionDialogOptions options )
54 QWidget *widget = mParent->mainWidget();
55 QVBoxLayout *layout =
new QVBoxLayout( widget );
59 mTextLabel =
new QLabel;
60 layout->addWidget( mTextLabel );
63 KLineEdit* filterCollectionLineEdit =
new KLineEdit( widget );
64 filterCollectionLineEdit->setClearButtonShown(
true );
65 filterCollectionLineEdit->setClickMessage( i18nc(
"@info/plain Displayed grayed-out inside the "
66 "textbox, verb to search",
"Search" ) );
67 layout->addWidget( filterCollectionLineEdit );
70 mView->setDragDropMode( QAbstractItemView::NoDragDrop );
71 mView->header()->hide();
72 layout->addWidget( mView );
75 mParent->enableButton( KDialog::Ok,
false );
78 QAbstractItemModel *baseModel;
81 baseModel = customModel;
84 mMonitor->fetchCollection(
true );
93 mMimeTypeFilterModel->setSourceModel( baseModel );
94 mMimeTypeFilterModel->setExcludeVirtualCollections(
true );
97 mRightsFilterModel->setSourceModel( mMimeTypeFilterModel );
100 mParent->connect( mSelectionHandler, SIGNAL(collectionAvailable(QModelIndex)),
101 mParent, SLOT(slotCollectionAvailable(QModelIndex)) );
103 KRecursiveFilterProxyModel* filterCollection =
new KRecursiveFilterProxyModel( mParent );
104 filterCollection->setDynamicSortFilter(
true );
105 filterCollection->setSourceModel( mRightsFilterModel );
106 filterCollection->setFilterCaseSensitivity( Qt::CaseInsensitive );
107 mView->setModel( filterCollection );
109 mParent->connect( filterCollectionLineEdit, SIGNAL(textChanged(QString)),
110 filterCollection, SLOT(setFilterFixedString(QString)) );
112 mParent->connect( mView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
113 mParent, SLOT(slotSelectionChanged()) );
115 mParent->connect( mView, SIGNAL(doubleClicked(QModelIndex)),
116 mParent, SLOT(accept()) );
124 void slotCollectionAvailable(
const QModelIndex &index )
127 mView->setCurrentIndex( index );
138 bool mAllowToCreateNewChildCollection;
140 void slotSelectionChanged();
141 void slotAddChildCollection();
142 void slotCollectionCreationResult( KJob* job );
148 void CollectionDialog::Private::slotSelectionChanged()
150 mParent->enableButton( KDialog::Ok, mView->selectionModel()->selectedIndexes().count() > 0 );
151 if ( mAllowToCreateNewChildCollection ) {
153 const bool canCreateChildCollections = canCreateCollection( parentCollection );
154 const bool isVirtual = Akonadi::CollectionUtils::isVirtual( parentCollection );
156 mParent->enableButton( KDialog::User1, (canCreateChildCollections && !isVirtual) );
157 if ( parentCollection.
isValid() ) {
159 mParent->enableButton( KDialog::Ok, canCreateItems );
166 mAllowToCreateNewChildCollection = ( options & AllowToCreateNewChildCollection );
167 if ( mAllowToCreateNewChildCollection ) {
168 mParent->setButtons( Ok | Cancel | User1 );
169 mParent->setButtonGuiItem( User1, KGuiItem( i18n(
"&New Subfolder..." ), QLatin1String(
"folder-new" ),
170 i18n(
"Create a new subfolder under the currently selected folder" ) ) );
171 mParent->enableButton( KDialog::User1,
false );
172 connect( mParent, SIGNAL(user1Clicked()), mParent, SLOT(slotAddChildCollection()) );
178 bool CollectionDialog::Private::canCreateCollection(
const Akonadi::Collection &parentCollection )
const
180 if ( !parentCollection.
isValid() )
184 const QStringList dialogMimeTypeFilter = mParent->mimeTypeFilter();
185 const QStringList parentCollectionMimeTypes = parentCollection.
contentMimeTypes();
186 Q_FOREACH (
const QString& mimetype, dialogMimeTypeFilter ) {
187 if ( parentCollectionMimeTypes.contains( mimetype ) )
196 void CollectionDialog::Private::slotAddChildCollection()
199 if ( canCreateCollection( parentCollection ) ) {
200 const QString name = KInputDialog::getText( i18nc(
"@title:window",
"New Folder" ),
201 i18nc(
"@label:textbox, name of a thing",
"Name" ),
202 QString(), 0, mParent );
203 if ( name.isEmpty() )
210 connect( job, SIGNAL(result(KJob*)), mParent, SLOT(slotCollectionCreationResult(KJob*)) );
214 void CollectionDialog::Private::slotCollectionCreationResult( KJob* job )
216 if ( job->error() ) {
217 KMessageBox::error( mParent, i18n(
"Could not create folder: %1", job->errorString() ),
218 i18n(
"Folder creation failed" ) );
238 d( new Private( model, this, options ) )
250 if (
selectionMode() == QAbstractItemView::SingleSelection ) {
251 const QModelIndex index = d->mView->currentIndex();
252 if ( index.isValid() )
262 const QItemSelectionModel *selectionModel = d->mView->selectionModel();
263 const QModelIndexList selectedIndexes = selectionModel->selectedIndexes();
264 foreach (
const QModelIndex &index, selectedIndexes ) {
265 if ( index.isValid() ) {
268 collections.append( collection );
277 d->mMimeTypeFilterModel->clearFilters();
278 d->mMimeTypeFilterModel->addMimeTypeFilters( mimeTypes );
281 foreach (
const QString &mimetype, mimeTypes )
282 d->mMonitor->setMimeTypeMonitored( mimetype );
287 return d->mMimeTypeFilterModel->mimeTypeFilters();
292 d->mRightsFilterModel->setAccessRights( rights );
297 return d->mRightsFilterModel->accessRights();
302 d->mTextLabel->setText( text );
303 d->mTextLabel->show();
308 d->mSelectionHandler->waitForCollection( collection );
313 d->mView->setSelectionMode( mode );
318 return d->mView->selectionMode();
323 d->changeCollectionDialogOptions( options );
326 #include "collectiondialog.moc"