20 #include "actionstatemanager_p.h"
22 #include "agentmanager.h"
23 #include "collectionutils_p.h"
24 #include "pastehelper_p.h"
25 #include "specialcollectionattribute_p.h"
26 #include "standardactionmanager.h"
28 #include <akonadi/entitydeletedattribute.h>
30 #include <QtGui/QApplication>
31 #include <QtGui/QClipboard>
33 using namespace Akonadi;
35 static bool canCreateSubCollection(
const Collection &collection )
37 if ( !( collection.rights() & Collection::CanCreateCollection ) )
40 if ( !collection.contentMimeTypes().contains( Collection::mimeType() ) )
46 static inline bool canContainItems(
const Collection &collection )
48 if ( collection.contentMimeTypes().isEmpty() )
51 if ( (collection.contentMimeTypes().count() == 1) &&
52 (collection.contentMimeTypes().first() == Collection::mimeType()) )
74 const int collectionCount = collections.count();
75 const bool singleCollectionSelected = (collectionCount == 1);
76 const bool multipleCollectionsSelected = (collectionCount > 1);
77 const bool atLeastOneCollectionSelected = (singleCollectionSelected || multipleCollectionsSelected);
79 const int itemCount = items.count();
80 const bool singleItemSelected = (itemCount == 1);
81 const bool multipleItemsSelected = (itemCount > 1);
82 const bool atLeastOneItemSelected = (singleItemSelected || multipleItemsSelected);
84 const bool listOfCollectionNotEmpty = collections.isEmpty() ?
false :
true;
85 bool canDeleteCollections = listOfCollectionNotEmpty;
86 if ( canDeleteCollections )
88 foreach (
const Collection &collection, collections ) {
90 if ( !(collection.rights() & Collection::CanDeleteCollection) ) {
91 canDeleteCollections =
false;
95 if ( isRootCollection( collection ) ) {
96 canDeleteCollections =
false;
100 if ( isResourceCollection( collection ) ) {
101 canDeleteCollections =
false;
107 bool canCutCollections = canDeleteCollections;
108 foreach (
const Collection &collection, collections ) {
109 if ( isSpecialCollection( collection ) ) {
110 canCutCollections =
false;
114 if ( !isFolderCollection( collection ) ) {
115 canCutCollections =
false;
120 const bool canMoveCollections = canCutCollections;
122 bool canCopyCollections = listOfCollectionNotEmpty;
123 if ( canCopyCollections ) {
124 foreach (
const Collection &collection, collections ) {
125 if ( isRootCollection( collection ) ) {
126 canCopyCollections =
false;
130 if ( !isFolderCollection( collection ) ) {
131 canCopyCollections =
false;
136 bool canAddToFavoriteCollections = listOfCollectionNotEmpty;
137 if ( canAddToFavoriteCollections ) {
138 foreach (
const Collection &collection, collections ) {
139 if ( isRootCollection( collection ) ) {
140 canAddToFavoriteCollections =
false;
144 if ( isFavoriteCollection( collection ) ) {
145 canAddToFavoriteCollections =
false;
149 if ( !isFolderCollection( collection ) ) {
150 canAddToFavoriteCollections =
false;
154 if ( !canContainItems( collection ) ) {
155 canAddToFavoriteCollections =
false;
160 bool canRemoveFromFavoriteCollections = listOfCollectionNotEmpty;
161 foreach (
const Collection &collection, collections ) {
162 if ( !isFavoriteCollection( collection ) ) {
163 canRemoveFromFavoriteCollections =
false;
168 bool collectionsAreFolders = listOfCollectionNotEmpty;
170 foreach (
const Collection &collection, collections ) {
171 if ( !isFolderCollection( collection ) ) {
172 collectionsAreFolders =
false;
177 bool collectionsAreInTrash =
false;
178 foreach (
const Collection &collection, collections ) {
179 if ( collection.hasAttribute<EntityDeletedAttribute>() ) {
180 collectionsAreInTrash =
true;
185 bool atLeastOneCollectionCanHaveItems =
false;
186 foreach (
const Collection &collection, collections ) {
187 if ( collectionCanHaveItems( collection ) ) {
188 atLeastOneCollectionCanHaveItems =
true;
193 const Collection collection = (!collections.isEmpty() ? collections.first() : Collection());
196 enableAction( StandardActionManager::CreateCollection, singleCollectionSelected &&
197 canCreateSubCollection( collection ) );
199 enableAction( StandardActionManager::DeleteCollections, canDeleteCollections );
201 enableAction( StandardActionManager::CopyCollections, canCopyCollections );
203 enableAction( StandardActionManager::CutCollections, canCutCollections );
205 enableAction( StandardActionManager::CopyCollectionToMenu, canCopyCollections );
207 enableAction( StandardActionManager::MoveCollectionToMenu, canMoveCollections );
209 enableAction( StandardActionManager::MoveCollectionsToTrash, atLeastOneCollectionSelected && canMoveCollections && !collectionsAreInTrash );
211 enableAction( StandardActionManager::RestoreCollectionsFromTrash, atLeastOneCollectionSelected && canMoveCollections && collectionsAreInTrash );
213 enableAction( StandardActionManager::CopyCollectionToDialog, canCopyCollections );
215 enableAction( StandardActionManager::MoveCollectionToDialog, canMoveCollections );
217 enableAction( StandardActionManager::CollectionProperties, singleCollectionSelected &&
218 !isRootCollection( collection ) );
220 enableAction( StandardActionManager::SynchronizeCollections, atLeastOneCollectionCanHaveItems );
222 enableAction( StandardActionManager::SynchronizeCollectionsRecursive, atLeastOneCollectionSelected &&
223 collectionsAreFolders );
224 #ifndef QT_NO_CLIPBOARD
225 enableAction( StandardActionManager::Paste, singleCollectionSelected &&
228 enableAction( StandardActionManager::Paste,
false );
232 enableAction( StandardActionManager::AddToFavoriteCollections, canAddToFavoriteCollections );
234 enableAction( StandardActionManager::RemoveFromFavoriteCollections, canRemoveFromFavoriteCollections );
236 enableAction( StandardActionManager::RenameFavoriteCollection, singleCollectionSelected &&
237 isFavoriteCollection( collection ) );
240 int resourceCollectionCount = 0;
241 bool canDeleteResources =
true;
242 bool canConfigureResource =
true;
243 bool canSynchronizeResources =
true;
244 foreach (
const Collection &collection, collections ) {
245 if ( isResourceCollection( collection ) ) {
246 resourceCollectionCount++;
249 if ( hasResourceCapability( collection, QLatin1String(
"NoConfig" ) ) )
250 canConfigureResource =
false;
254 canDeleteResources =
false;
255 canConfigureResource =
false;
256 canSynchronizeResources =
false;
260 if ( resourceCollectionCount == 0 ) {
262 canDeleteResources =
false;
263 canConfigureResource =
false;
264 canSynchronizeResources =
false;
267 enableAction( StandardActionManager::CreateResource,
true );
268 enableAction( StandardActionManager::DeleteResources, canDeleteResources );
269 enableAction( StandardActionManager::ResourceProperties, canConfigureResource );
270 enableAction( StandardActionManager::SynchronizeResources, canSynchronizeResources );
272 if (collectionsAreInTrash) {
273 updateAlternatingAction( StandardActionManager::MoveToTrashRestoreCollectionAlternative );
276 updateAlternatingAction( StandardActionManager::MoveToTrashRestoreCollection );
278 enableAction( StandardActionManager::MoveToTrashRestoreCollection, atLeastOneCollectionSelected && canMoveCollections );
281 bool canDeleteItems = (items.count() > 0);
282 foreach (
const Item &item, items ) {
283 const Collection parentCollection = item.parentCollection();
284 if ( !parentCollection.isValid() )
287 canDeleteItems = canDeleteItems && (parentCollection.rights() & Collection::CanDeleteItem);
290 bool itemsAreInTrash =
false;
291 foreach (
const Item &item, items ) {
292 if ( item.hasAttribute<EntityDeletedAttribute>() ) {
293 itemsAreInTrash =
true;
298 enableAction( StandardActionManager::CopyItems, atLeastOneItemSelected );
300 enableAction( StandardActionManager::CutItems, atLeastOneItemSelected &&
303 enableAction( StandardActionManager::DeleteItems, atLeastOneItemSelected &&
306 enableAction( StandardActionManager::CopyItemToMenu, atLeastOneItemSelected );
308 enableAction( StandardActionManager::MoveItemToMenu, atLeastOneItemSelected &&
311 enableAction( StandardActionManager::MoveItemsToTrash, atLeastOneItemSelected && canDeleteItems && !itemsAreInTrash );
313 enableAction( StandardActionManager::RestoreItemsFromTrash, atLeastOneItemSelected && itemsAreInTrash );
315 enableAction( StandardActionManager::CopyItemToDialog, atLeastOneItemSelected );
317 enableAction( StandardActionManager::MoveItemToDialog, atLeastOneItemSelected &&
320 if (itemsAreInTrash) {
321 updateAlternatingAction( StandardActionManager::MoveToTrashRestoreItemAlternative );
324 updateAlternatingAction( StandardActionManager::MoveToTrashRestoreItem );
326 enableAction( StandardActionManager::MoveToTrashRestoreItem, atLeastOneItemSelected &&
330 updatePluralLabel( StandardActionManager::CopyCollections, collectionCount );
331 updatePluralLabel( StandardActionManager::CopyItems, itemCount );
332 updatePluralLabel( StandardActionManager::DeleteItems, itemCount );
333 updatePluralLabel( StandardActionManager::CutItems, itemCount );
334 updatePluralLabel( StandardActionManager::CutCollections, collectionCount );
335 updatePluralLabel( StandardActionManager::DeleteCollections, collectionCount );
336 updatePluralLabel( StandardActionManager::SynchronizeCollections, collectionCount );
337 updatePluralLabel( StandardActionManager::SynchronizeCollectionsRecursive, collectionCount );
338 updatePluralLabel( StandardActionManager::DeleteResources, resourceCollectionCount );
339 updatePluralLabel( StandardActionManager::SynchronizeResources, resourceCollectionCount );
343 bool ActionStateManager::isRootCollection(
const Collection &collection )
const
345 return CollectionUtils::isRoot( collection );
348 bool ActionStateManager::isResourceCollection(
const Collection &collection )
const
350 return CollectionUtils::isResource( collection );
353 bool ActionStateManager::isFolderCollection(
const Collection &collection )
const
355 return (CollectionUtils::isFolder( collection ) ||
356 CollectionUtils::isResource( collection ) ||
357 CollectionUtils::isStructural( collection ));
360 bool ActionStateManager::isSpecialCollection(
const Collection &collection )
const
362 return collection.hasAttribute<SpecialCollectionAttribute>();
365 bool ActionStateManager::isFavoriteCollection(
const Collection &collection )
const
371 QMetaObject::invokeMethod( mReceiver,
"isFavoriteCollection", Qt::DirectConnection,
372 Q_RETURN_ARG(
bool, result ), Q_ARG( Akonadi::Collection, collection ) );
377 bool ActionStateManager::hasResourceCapability(
const Collection &collection,
const QString &capability )
const
384 bool ActionStateManager::collectionCanHaveItems(
const Collection &collection )
const
386 return !( collection.contentMimeTypes() == ( QStringList() << QLatin1String(
"inode/directory" ) ) ||
387 CollectionUtils::isStructural( collection ) );
390 void ActionStateManager::enableAction(
int action,
bool state )
395 QMetaObject::invokeMethod( mReceiver,
"enableAction", Qt::DirectConnection, Q_ARG(
int, action ), Q_ARG(
bool, state ) );
398 void ActionStateManager::updatePluralLabel(
int action,
int count )
403 QMetaObject::invokeMethod( mReceiver,
"updatePluralLabel", Qt::DirectConnection, Q_ARG(
int, action ), Q_ARG(
int, count ) );
406 void ActionStateManager::updateAlternatingAction(
int action )
411 QMetaObject::invokeMethod( mReceiver,
"updateAlternatingAction", Qt::DirectConnection, Q_ARG(
int, action ));