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 <QHeaderView>
37 #include <QVBoxLayout>
40 #include <KLocalizedString>
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 );
56 layout->setContentsMargins( 0, 0, 0, 0 );
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 );
74 mParent->enableButton( KDialog::Ok,
false );
77 QAbstractItemModel *baseModel;
80 baseModel = customModel;
83 mMonitor->fetchCollection(
true );
92 mMimeTypeFilterModel->setSourceModel( baseModel );
93 mMimeTypeFilterModel->setExcludeVirtualCollections(
true );
96 mRightsFilterModel->setSourceModel( mMimeTypeFilterModel );
98 KRecursiveFilterProxyModel* filterCollection =
new KRecursiveFilterProxyModel( mParent );
99 filterCollection->setDynamicSortFilter(
true );
100 filterCollection->setSourceModel( mRightsFilterModel );
101 filterCollection->setFilterCaseSensitivity( Qt::CaseInsensitive );
102 mView->setModel( filterCollection );
105 mParent->connect( filterCollectionLineEdit, SIGNAL(textChanged(QString)),
106 filterCollection, SLOT(setFilterFixedString(QString)) );
108 mParent->connect( mView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)),
109 mParent, SLOT(slotSelectionChanged()) );
111 mParent->connect( mView, SIGNAL(doubleClicked(QModelIndex)),
112 mParent, SLOT(accept()) );
115 mParent->connect( mSelectionHandler, SIGNAL(collectionAvailable(QModelIndex)),
116 mParent, SLOT(slotCollectionAvailable(QModelIndex)) );
123 void slotCollectionAvailable(
const QModelIndex &index )
126 mView->setCurrentIndex( index );
137 bool mAllowToCreateNewChildCollection;
138 bool mKeepTreeExpanded;
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 );
155 mParent->enableButton( KDialog::User1, ( canCreateChildCollections && !parentCollection.
isVirtual() ) );
156 if ( parentCollection.
isValid() ) {
158 mParent->enableButton( KDialog::Ok, canCreateItems );
163 void CollectionDialog::Private::changeCollectionDialogOptions( CollectionDialogOptions options )
165 mAllowToCreateNewChildCollection = ( options & AllowToCreateNewChildCollection );
166 if ( mAllowToCreateNewChildCollection ) {
167 mParent->setButtons( Ok | Cancel | User1 );
168 mParent->setButtonGuiItem( User1, KGuiItem( i18n(
"&New Subfolder..." ), QLatin1String(
"folder-new" ),
169 i18n(
"Create a new subfolder under the currently selected folder" ) ) );
170 mParent->enableButton( KDialog::User1,
false );
171 connect( mParent, SIGNAL(user1Clicked()), mParent, SLOT(slotAddChildCollection()) );
173 mKeepTreeExpanded = ( options & KeepTreeExpanded );
174 if ( mKeepTreeExpanded ) {
175 mParent->connect( mRightsFilterModel, SIGNAL(rowsInserted(QModelIndex,
int,
int)),
176 mView, SLOT(expandAll()), Qt::UniqueConnection );
183 bool CollectionDialog::Private::canCreateCollection(
const Akonadi::Collection &parentCollection )
const
185 if ( !parentCollection.
isValid() ) {
190 const QStringList dialogMimeTypeFilter = mParent->mimeTypeFilter();
191 const QStringList parentCollectionMimeTypes = parentCollection.
contentMimeTypes();
192 Q_FOREACH (
const QString& mimetype, dialogMimeTypeFilter ) {
193 if ( parentCollectionMimeTypes.contains( mimetype ) ) {
203 void CollectionDialog::Private::slotAddChildCollection()
206 if ( canCreateCollection( parentCollection ) ) {
207 const QString name = KInputDialog::getText( i18nc(
"@title:window",
"New Folder" ),
208 i18nc(
"@label:textbox, name of a thing",
"Name" ),
209 QString(), 0, mParent );
210 if ( name.isEmpty() ) {
218 connect( job, SIGNAL(result(KJob*)), mParent, SLOT(slotCollectionCreationResult(KJob*)) );
222 void CollectionDialog::Private::slotCollectionCreationResult( KJob* job )
224 if ( job->error() ) {
225 KMessageBox::error( mParent, i18n(
"Could not create folder: %1", job->errorString() ),
226 i18n(
"Folder creation failed" ) );
246 d( new Private( model, this, options ) )
258 if (
selectionMode() == QAbstractItemView::SingleSelection ) {
259 const QModelIndex index = d->mView->currentIndex();
260 if ( index.isValid() ) {
271 const QItemSelectionModel *selectionModel = d->mView->selectionModel();
272 const QModelIndexList selectedIndexes = selectionModel->selectedIndexes();
273 foreach (
const QModelIndex &index, selectedIndexes ) {
274 if ( index.isValid() ) {
277 collections.append( collection );
290 d->mMimeTypeFilterModel->clearFilters();
291 d->mMimeTypeFilterModel->addMimeTypeFilters( mimeTypes );
294 foreach (
const QString &mimetype, mimeTypes ) {
295 d->mMonitor->setMimeTypeMonitored( mimetype );
302 return d->mMimeTypeFilterModel->mimeTypeFilters();
309 d->mRightsFilterModel->setAccessRights( rights );
314 return d->mRightsFilterModel->accessRights();
319 d->mTextLabel->setText( text );
320 d->mTextLabel->show();
325 d->mSelectionHandler->waitForCollection( collection );
330 d->mView->setSelectionMode( mode );
335 return d->mView->selectionMode();
340 d->changeCollectionDialogOptions( options );
343 #include "collectiondialog.moc"