File indexing completed on 2024-05-12 05:10:50

0001 /*
0002  *  SPDX-FileCopyrightText: 2010 Casey Link <unnamedrambler@gmail.com>
0003  *  SPDX-FileCopyrightText: 2010 Klaralvdalens Datakonsult AB, a KDAB Group company <info@kdab.net>
0004  *  SPDX-FileCopyrightText: 2009-2010 Tobias Koenig <tokoe@kde.org>
0005  *
0006  *  SPDX-License-Identifier: LGPL-2.0-or-later
0007  */
0008 
0009 #include "standardcalendaractionmanager.h"
0010 
0011 #include <Akonadi/EntityTreeModel>
0012 
0013 #include <KActionCollection>
0014 #include <KCalendarCore/Event>
0015 #include <KCalendarCore/Journal>
0016 #include <KLocalizedString>
0017 #include <QAction>
0018 
0019 #include <QItemSelectionModel>
0020 
0021 using namespace Akonadi;
0022 
0023 class Akonadi::StandardCalendarActionManagerPrivate
0024 {
0025 public:
0026     StandardCalendarActionManagerPrivate(KActionCollection *actionCollection, QWidget *parentWidget, StandardCalendarActionManager *parent)
0027         : mActionCollection(actionCollection)
0028         , mParentWidget(parentWidget)
0029         , mParent(parent)
0030     {
0031         mGenericManager = new StandardActionManager(actionCollection, parentWidget);
0032         mParent->connect(mGenericManager, &StandardActionManager::actionStateUpdated, mParent, &StandardCalendarActionManager::actionStateUpdated);
0033         mGenericManager->setMimeTypeFilter(QStringList() << QStringLiteral("text/calendar"));
0034         mGenericManager->setCapabilityFilter(QStringList() << QStringLiteral("Resource"));
0035     }
0036 
0037     ~StandardCalendarActionManagerPrivate()
0038     {
0039         delete mGenericManager;
0040     }
0041 
0042     void updateGenericAction(StandardActionManager::Type type)
0043     {
0044         switch (type) {
0045         case Akonadi::StandardActionManager::CreateCollection:
0046             mGenericManager->action(Akonadi::StandardActionManager::CreateCollection)->setText(i18n("Add Folder..."));
0047             mGenericManager->action(Akonadi::StandardActionManager::CreateCollection)
0048                 ->setWhatsThis(i18n("Add a new calendar folder to the currently selected calendar folder."));
0049             mGenericManager->setContextText(StandardActionManager::CreateCollection, StandardActionManager::DialogTitle, i18nc("@title:window", "New Folder"));
0050 
0051             mGenericManager->setContextText(StandardActionManager::CreateCollection,
0052                                             StandardActionManager::ErrorMessageText,
0053                                             ki18n("Could not create calendar folder: %1"));
0054 
0055             mGenericManager->setContextText(StandardActionManager::CreateCollection,
0056                                             StandardActionManager::ErrorMessageTitle,
0057                                             i18nc("@title:window", "Calendar Folder Creation Failed"));
0058             mGenericManager->action(Akonadi::StandardActionManager::CreateCollection)
0059                 ->setProperty("ContentMimeTypes",
0060                               QStringList() << QStringLiteral("inode/directory") << QStringLiteral("application/x-vnd.akonadi.calendar.todo")
0061                                             << QStringLiteral("application/x-vnd.akonadi.calendar.event")
0062                                             << QStringLiteral("application/x-vnd.akonadi.calendar.journal"));
0063 
0064             break;
0065         case Akonadi::StandardActionManager::CopyCollections:
0066             mGenericManager->setActionText(Akonadi::StandardActionManager::CopyCollections, ki18np("Copy Folder", "Copy %1 Folders"));
0067             mGenericManager->action(Akonadi::StandardActionManager::CopyCollections)
0068                 ->setWhatsThis(i18n("Copy the selected calendar folders to the clipboard."));
0069             break;
0070         case Akonadi::StandardActionManager::DeleteCollections:
0071             mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteCollections, ki18np("Delete Folder", "Delete %1 Folders"));
0072             mGenericManager->action(Akonadi::StandardActionManager::DeleteCollections)
0073                 ->setWhatsThis(i18n("Delete the selected calendar folders from the calendar."));
0074             mGenericManager->setContextText(StandardActionManager::DeleteCollections,
0075                                             StandardActionManager::MessageBoxText,
0076                                             ki18np("Do you really want to delete this calendar folder and all its sub-folders?",
0077                                                    "Do you really want to delete %1 calendar folders and all their sub-folders?"));
0078 
0079             mGenericManager->setContextText(StandardActionManager::DeleteCollections,
0080                                             StandardActionManager::MessageBoxTitle,
0081                                             ki18ncp("@title:window", "Delete Calendar Folder?", "Delete Calendar Folders?"));
0082 
0083             mGenericManager->setContextText(StandardActionManager::DeleteCollections,
0084                                             StandardActionManager::ErrorMessageText,
0085                                             ki18n("Could not delete calendar folder: %1"));
0086 
0087             mGenericManager->setContextText(StandardActionManager::DeleteCollections,
0088                                             StandardActionManager::ErrorMessageTitle,
0089                                             i18nc("@title:window", "Calendar Folder Deletion Failed"));
0090 
0091             break;
0092         case Akonadi::StandardActionManager::SynchronizeCollections:
0093             mGenericManager->setActionText(Akonadi::StandardActionManager::SynchronizeCollections, ki18np("Update Folder", "Update %1 Folders"));
0094             mGenericManager->action(Akonadi::StandardActionManager::SynchronizeCollections)
0095                 ->setWhatsThis(i18n("Update the content of the selected calendar folders."));
0096 
0097             break;
0098         case Akonadi::StandardActionManager::CutCollections:
0099             mGenericManager->setActionText(Akonadi::StandardActionManager::CutCollections, ki18np("Cut Folder", "Cut %1 Folders"));
0100             mGenericManager->action(Akonadi::StandardActionManager::CutCollections)->setWhatsThis(i18n("Cut the selected calendar folders from the calendar."));
0101             break;
0102         case Akonadi::StandardActionManager::CollectionProperties:
0103             mGenericManager->action(Akonadi::StandardActionManager::CollectionProperties)->setText(i18n("Folder Properties..."));
0104             mGenericManager->action(Akonadi::StandardActionManager::CollectionProperties)
0105                 ->setWhatsThis(i18n("Open a dialog to edit the properties of the selected calendar folder."));
0106             mGenericManager->setContextText(StandardActionManager::CollectionProperties,
0107                                             StandardActionManager::DialogTitle,
0108                                             ki18nc("@title:window", "Properties of Calendar Folder %1"));
0109             break;
0110         case Akonadi::StandardActionManager::CopyItems:
0111             mGenericManager->setActionText(Akonadi::StandardActionManager::CopyItems, ki18np("Copy Event", "Copy %1 Events"));
0112             mGenericManager->action(Akonadi::StandardActionManager::CopyItems)->setWhatsThis(i18n("Copy the selected events to the clipboard."));
0113 
0114             break;
0115         case Akonadi::StandardActionManager::DeleteItems:
0116             mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteItems, ki18np("Delete Event", "Delete %1 Events"));
0117             mGenericManager->action(Akonadi::StandardActionManager::DeleteItems)->setWhatsThis(i18n("Delete the selected events from the calendar."));
0118             mGenericManager->setContextText(StandardActionManager::DeleteItems,
0119                                             StandardActionManager::MessageBoxText,
0120                                             ki18np("Do you really want to delete the selected event?", "Do you really want to delete %1 events?"));
0121 
0122             mGenericManager->setContextText(StandardActionManager::DeleteItems,
0123                                             StandardActionManager::MessageBoxTitle,
0124                                             ki18ncp("@title:window", "Delete Event?", "Delete Events?"));
0125 
0126             mGenericManager->setContextText(StandardActionManager::DeleteItems, StandardActionManager::ErrorMessageText, ki18n("Could not delete event: %1"));
0127 
0128             mGenericManager->setContextText(StandardActionManager::DeleteItems,
0129                                             StandardActionManager::ErrorMessageTitle,
0130                                             i18nc("@title:window", "Event Deletion Failed"));
0131             break;
0132 
0133         case Akonadi::StandardActionManager::CutItems:
0134             mGenericManager->setActionText(Akonadi::StandardActionManager::CutItems, ki18np("Cut Event", "Cut %1 Events"));
0135             mGenericManager->action(Akonadi::StandardActionManager::CutItems)->setWhatsThis(i18n("Cut the selected events from the calendar."));
0136             break;
0137         case Akonadi::StandardActionManager::CreateResource:
0138             mGenericManager->action(Akonadi::StandardActionManager::CreateResource)->setText(i18n("Add &Calendar..."));
0139             mGenericManager->action(Akonadi::StandardActionManager::CreateResource)
0140                 ->setWhatsThis(i18n("Add a new calendar<p>"
0141                                     "You will be presented with a dialog where you can select "
0142                                     "the type of the calendar that shall be added.</p>"));
0143             mGenericManager->setContextText(StandardActionManager::CreateResource, StandardActionManager::DialogTitle, i18nc("@title:window", "Add Calendar"));
0144 
0145             mGenericManager->setContextText(StandardActionManager::CreateResource,
0146                                             StandardActionManager::ErrorMessageText,
0147                                             ki18n("Could not create calendar: %1"));
0148 
0149             mGenericManager->setContextText(StandardActionManager::CreateResource,
0150                                             StandardActionManager::ErrorMessageTitle,
0151                                             i18nc("@title:window", "Calendar Creation Failed"));
0152 
0153             break;
0154         case Akonadi::StandardActionManager::DeleteResources:
0155 
0156             mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteResources, ki18np("&Delete Calendar", "&Delete %1 Calendars"));
0157             mGenericManager->action(Akonadi::StandardActionManager::DeleteResources)
0158                 ->setWhatsThis(i18n("Delete the selected calendars<p>"
0159                                     "The currently selected calendars will be deleted, "
0160                                     "along with all the events, todos and journals they contain.</p>"));
0161             mGenericManager->setContextText(StandardActionManager::DeleteResources,
0162                                             StandardActionManager::MessageBoxText,
0163                                             ki18np("Do you really want to delete this calendar?", "Do you really want to delete %1 calendars?"));
0164 
0165             mGenericManager->setContextText(StandardActionManager::DeleteResources,
0166                                             StandardActionManager::MessageBoxTitle,
0167                                             ki18ncp("@title:window", "Delete Calendar?", "Delete Calendars?"));
0168 
0169             break;
0170         case Akonadi::StandardActionManager::ResourceProperties:
0171             mGenericManager->action(Akonadi::StandardActionManager::ResourceProperties)->setText(i18n("Calendar Properties..."));
0172             mGenericManager->action(Akonadi::StandardActionManager::ResourceProperties)
0173                 ->setWhatsThis(i18n("Open a dialog to edit properties of the selected calendar."));
0174             break;
0175         case Akonadi::StandardActionManager::SynchronizeResources:
0176 
0177             mGenericManager->setActionText(Akonadi::StandardActionManager::SynchronizeResources, ki18np("Update Calendar", "Update %1 Calendars"));
0178             mGenericManager->action(Akonadi::StandardActionManager::SynchronizeResources)
0179                 ->setWhatsThis(i18n("Updates the content of all folders of the selected calendars."));
0180             break;
0181         case Akonadi::StandardActionManager::CopyItemToMenu:
0182             mGenericManager->action(Akonadi::StandardActionManager::CopyItemToMenu)->setText(i18n("&Copy to Calendar"));
0183             mGenericManager->action(Akonadi::StandardActionManager::CopyItemToMenu)->setWhatsThis(i18n("Copy the selected event to a different calendar."));
0184             break;
0185         case Akonadi::StandardActionManager::MoveItemToMenu:
0186             mGenericManager->action(Akonadi::StandardActionManager::MoveItemToMenu)->setText(i18n("&Move to Calendar"));
0187             mGenericManager->action(Akonadi::StandardActionManager::MoveItemToMenu)->setWhatsThis(i18n("Move the selected event to a different calendar."));
0188             break;
0189         case StandardActionManager::Paste:
0190             mGenericManager->setContextText(StandardActionManager::Paste, StandardActionManager::ErrorMessageText, ki18n("Could not paste event: %1"));
0191 
0192             mGenericManager->setContextText(StandardActionManager::Paste, StandardActionManager::ErrorMessageTitle, i18nc("@title:window", "Paste Failed"));
0193             break;
0194         case Akonadi::StandardActionManager::SynchronizeCollectionTree:
0195             mGenericManager->action(Akonadi::StandardActionManager::SynchronizeCollectionTree)->setText(i18n("Update Available Calendars"));
0196             mGenericManager->action(Akonadi::StandardActionManager::SynchronizeCollectionTree)->setWhatsThis(i18n("Updates the tree of available calendars."));
0197 
0198             break;
0199         default:
0200             break;
0201         }
0202     }
0203 
0204     void updateGenericAllActions()
0205     {
0206         updateGenericAction(StandardActionManager::CreateCollection);
0207         updateGenericAction(StandardActionManager::CopyCollections);
0208         updateGenericAction(StandardActionManager::DeleteCollections);
0209         updateGenericAction(StandardActionManager::SynchronizeCollections);
0210         updateGenericAction(StandardActionManager::CollectionProperties);
0211         updateGenericAction(StandardActionManager::CopyItems);
0212         updateGenericAction(StandardActionManager::Paste);
0213         updateGenericAction(StandardActionManager::DeleteItems);
0214         updateGenericAction(StandardActionManager::ManageLocalSubscriptions);
0215         updateGenericAction(StandardActionManager::AddToFavoriteCollections);
0216         updateGenericAction(StandardActionManager::RemoveFromFavoriteCollections);
0217         updateGenericAction(StandardActionManager::RenameFavoriteCollection);
0218         updateGenericAction(StandardActionManager::CopyCollectionToMenu);
0219         updateGenericAction(StandardActionManager::CopyItemToMenu);
0220         updateGenericAction(StandardActionManager::MoveItemToMenu);
0221         updateGenericAction(StandardActionManager::MoveCollectionToMenu);
0222         updateGenericAction(StandardActionManager::CutItems);
0223         updateGenericAction(StandardActionManager::CutCollections);
0224         updateGenericAction(StandardActionManager::CreateResource);
0225         updateGenericAction(StandardActionManager::DeleteResources);
0226         updateGenericAction(StandardActionManager::ResourceProperties);
0227         updateGenericAction(StandardActionManager::SynchronizeResources);
0228         updateGenericAction(StandardActionManager::ToggleWorkOffline);
0229         updateGenericAction(StandardActionManager::CopyCollectionToDialog);
0230         updateGenericAction(StandardActionManager::MoveCollectionToDialog);
0231         updateGenericAction(StandardActionManager::CopyItemToDialog);
0232         updateGenericAction(StandardActionManager::MoveItemToDialog);
0233         updateGenericAction(StandardActionManager::SynchronizeCollectionsRecursive);
0234         updateGenericAction(StandardActionManager::MoveCollectionsToTrash);
0235         updateGenericAction(StandardActionManager::MoveItemsToTrash);
0236         updateGenericAction(StandardActionManager::RestoreCollectionsFromTrash);
0237         updateGenericAction(StandardActionManager::RestoreItemsFromTrash);
0238         updateGenericAction(StandardActionManager::MoveToTrashRestoreCollection);
0239         updateGenericAction(StandardActionManager::MoveToTrashRestoreCollectionAlternative);
0240         updateGenericAction(StandardActionManager::MoveToTrashRestoreItem);
0241         updateGenericAction(StandardActionManager::MoveToTrashRestoreItemAlternative);
0242         updateGenericAction(StandardActionManager::SynchronizeFavoriteCollections);
0243         updateGenericAction(StandardActionManager::SynchronizeCollectionTree);
0244     }
0245 
0246     static bool hasWritableCollection(const QModelIndex &index, const QString &mimeType)
0247     {
0248         const auto collection = index.data(Akonadi::EntityTreeModel::CollectionRole).value<Akonadi::Collection>();
0249         if (collection.isValid()) {
0250             if (collection.contentMimeTypes().contains(mimeType) && (collection.rights() & Akonadi::Collection::CanCreateItem)) {
0251                 return true;
0252             }
0253         }
0254 
0255         const QAbstractItemModel *model = index.model();
0256         if (!model) {
0257             return false;
0258         }
0259 
0260         for (int row = 0; row < model->rowCount(index); ++row) {
0261             if (hasWritableCollection(model->index(row, 0, index), mimeType)) {
0262                 return true;
0263             }
0264         }
0265 
0266         return false;
0267     }
0268 
0269     [[nodiscard]] bool hasWritableCollection(const QString &mimeType) const
0270     {
0271         if (!mCollectionSelectionModel) {
0272             return false;
0273         }
0274 
0275         const QAbstractItemModel *collectionModel = mCollectionSelectionModel->model();
0276         for (int row = 0; row < collectionModel->rowCount(); ++row) {
0277             if (hasWritableCollection(collectionModel->index(row, 0, QModelIndex()), mimeType)) {
0278                 return true;
0279             }
0280         }
0281 
0282         return false;
0283     }
0284 
0285     void updateActions()
0286     {
0287         if (!mItemSelectionModel) {
0288             return;
0289         }
0290 
0291         // update action labels
0292         const int itemCount = mItemSelectionModel->selectedRows().count();
0293         if (itemCount == 1) {
0294             const QModelIndex index = mItemSelectionModel->selectedRows().at(0);
0295             if (index.isValid()) {
0296                 const QString mimeType = index.data(EntityTreeModel::MimeTypeRole).toString();
0297                 if (mimeType == KCalendarCore::Event::eventMimeType()) {
0298                     if (mGenericManager->action(Akonadi::StandardActionManager::CopyItems)) {
0299                         mGenericManager->setActionText(Akonadi::StandardActionManager::CopyItems, ki18np("Copy Event", "Copy %1 Events"));
0300                     }
0301                     QAction *act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToMenu);
0302                     if (act) {
0303                         act->setText(i18n("Copy Event To"));
0304                     }
0305                     act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToDialog);
0306                     if (act) {
0307                         act->setText(i18n("Copy Event To"));
0308                     }
0309                     if (mGenericManager->action(Akonadi::StandardActionManager::DeleteItems)) {
0310                         mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteItems, ki18np("Delete Event", "Delete %1 Events"));
0311                     }
0312                     if (mGenericManager->action(Akonadi::StandardActionManager::CutItems)) {
0313                         mGenericManager->setActionText(Akonadi::StandardActionManager::CutItems, ki18np("Cut Event", "Cut %1 Events"));
0314                     }
0315                     act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToMenu);
0316                     if (act) {
0317                         act->setText(i18n("Move Event To"));
0318                     }
0319                     act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToDialog);
0320                     if (act) {
0321                         act->setText(i18n("Move Event To"));
0322                     }
0323                     act = mActions.value(StandardCalendarActionManager::EditIncidence);
0324                     if (act) {
0325                         act->setText(i18n("Edit Event..."));
0326                     }
0327                 } else if (mimeType == KCalendarCore::Todo::todoMimeType()) {
0328                     if (mGenericManager->action(Akonadi::StandardActionManager::CopyItems)) {
0329                         mGenericManager->setActionText(Akonadi::StandardActionManager::CopyItems, ki18np("Copy To-do", "Copy %1 To-dos"));
0330                     }
0331                     QAction *act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToMenu);
0332                     if (act) {
0333                         act->setText(i18n("Copy To-do To"));
0334                     }
0335                     act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToDialog);
0336                     if (act) {
0337                         act->setText(i18n("Copy To-do To"));
0338                     }
0339                     if (mGenericManager->action(Akonadi::StandardActionManager::DeleteItems)) {
0340                         mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteItems, ki18np("Delete To-do", "Delete %1 To-dos"));
0341                     }
0342                     if (mGenericManager->action(Akonadi::StandardActionManager::CutItems)) {
0343                         mGenericManager->setActionText(Akonadi::StandardActionManager::CutItems, ki18np("Cut To-do", "Cut %1 To-dos"));
0344                     }
0345                     act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToMenu);
0346                     if (act) {
0347                         act->setText(i18n("Move To-do To"));
0348                     }
0349                     act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToDialog);
0350                     if (act) {
0351                         act->setText(i18n("Move To-do To"));
0352                     }
0353                     act = mActions.value(StandardCalendarActionManager::EditIncidence);
0354                     if (act) {
0355                         act->setText(i18n("Edit To-do..."));
0356                     }
0357                 } else if (mimeType == KCalendarCore::Journal::journalMimeType()) {
0358                     if (mGenericManager->action(Akonadi::StandardActionManager::CopyItems)) {
0359                         mGenericManager->setActionText(Akonadi::StandardActionManager::CopyItems, ki18np("Copy Journal", "Copy %1 Journals"));
0360                     }
0361                     QAction *act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToMenu);
0362                     if (act) {
0363                         act->setText(i18n("Copy Journal To"));
0364                     }
0365                     act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToDialog);
0366                     if (act) {
0367                         act->setText(i18n("Copy Journal To"));
0368                     }
0369                     if (mGenericManager->action(Akonadi::StandardActionManager::DeleteItems)) {
0370                         mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteItems, ki18np("Delete Journal", "Delete %1 Journals"));
0371                     }
0372                     if (mGenericManager->action(Akonadi::StandardActionManager::CutItems)) {
0373                         mGenericManager->setActionText(Akonadi::StandardActionManager::CutItems, ki18np("Cut Journal", "Cut %1 Journals"));
0374                     }
0375                     act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToMenu);
0376                     if (act) {
0377                         act->setText(i18n("Move Journal To"));
0378                     }
0379                     act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToDialog);
0380                     if (act) {
0381                         act->setText(i18n("Move Journal To"));
0382                     }
0383                     act = mActions.value(StandardCalendarActionManager::EditIncidence);
0384                     if (act) {
0385                         act->setText(i18n("Edit Journal..."));
0386                     }
0387                 }
0388             }
0389         }
0390 
0391         // update action states
0392         QAction *act = mActions.value(StandardCalendarActionManager::CreateEvent);
0393         if (act) {
0394             act->setEnabled(hasWritableCollection(KCalendarCore::Event::eventMimeType()));
0395         }
0396         act = mActions.value(StandardCalendarActionManager::CreateTodo);
0397         if (act) {
0398             act->setEnabled(hasWritableCollection(KCalendarCore::Todo::todoMimeType()));
0399         }
0400         act = mActions.value(StandardCalendarActionManager::CreateJournal);
0401         if (act) {
0402             act->setEnabled(hasWritableCollection(KCalendarCore::Journal::journalMimeType()));
0403         }
0404 
0405         act = mActions.value(StandardCalendarActionManager::EditIncidence);
0406         if (act) {
0407             bool canEditItem = true;
0408 
0409             // only one selected item can be edited
0410             canEditItem = canEditItem && (itemCount == 1);
0411 
0412             // check whether parent collection allows changing the item
0413             const QModelIndexList rows = mItemSelectionModel->selectedRows();
0414             if (rows.count() == 1) {
0415                 const QModelIndex index = rows.first();
0416                 const auto parentCollection = index.data(EntityTreeModel::ParentCollectionRole).value<Collection>();
0417                 if (parentCollection.isValid()) {
0418                     canEditItem = canEditItem && (parentCollection.rights() & Collection::CanChangeItem);
0419                 }
0420             }
0421 
0422             act->setEnabled(canEditItem);
0423         }
0424 
0425         act = mActions.value(StandardCalendarActionManager::CreateSubTodo);
0426         if (act) {
0427             act->setEnabled(false);
0428         }
0429 
0430         if (itemCount == 1) {
0431             const Akonadi::Item item = mGenericManager->selectedItems().at(0);
0432             if (item.isValid() && item.hasPayload<KCalendarCore::Todo::Ptr>()) {
0433                 if (QAction *actSubTodo = mActions.value(StandardCalendarActionManager::CreateSubTodo)) {
0434                     actSubTodo->setEnabled(hasWritableCollection(KCalendarCore::Todo::todoMimeType()));
0435                 }
0436             }
0437         }
0438 
0439         Q_EMIT mParent->actionStateUpdated();
0440     }
0441 
0442     void slotCreateEvent()
0443     {
0444         // dummy as long as there are no editors available in kdepimlibs/
0445     }
0446 
0447     void slotCreateTodo()
0448     {
0449         // dummy as long as there are no editors available in kdepimlibs/
0450     }
0451 
0452     void slotCreateSubTodo()
0453     {
0454         // dummy as long as there are no editors available in kdepimlibs/
0455     }
0456 
0457     void slotCreateJournal()
0458     {
0459         // dummy as long as there are no editors available in kdepimlibs/
0460     }
0461 
0462     void slotEditIncidence()
0463     {
0464         // dummy as long as there are no editors available in kdepimlibs/
0465     }
0466 
0467     KActionCollection *mActionCollection = nullptr;
0468     QWidget *mParentWidget = nullptr;
0469     StandardActionManager *mGenericManager = nullptr;
0470     QItemSelectionModel *mCollectionSelectionModel = nullptr;
0471     QItemSelectionModel *mItemSelectionModel = nullptr;
0472     QHash<StandardCalendarActionManager::Type, QAction *> mActions;
0473     QSet<StandardCalendarActionManager::Type> mInterceptedActions;
0474     StandardCalendarActionManager *const mParent;
0475 };
0476 
0477 Akonadi::StandardCalendarActionManager::StandardCalendarActionManager(KActionCollection *actionCollection, QWidget *parent)
0478     : QObject(parent)
0479     , d(new StandardCalendarActionManagerPrivate(actionCollection, parent, this))
0480 {
0481 }
0482 
0483 StandardCalendarActionManager::~StandardCalendarActionManager() = default;
0484 
0485 void StandardCalendarActionManager::setCollectionSelectionModel(QItemSelectionModel *selectionModel)
0486 {
0487     d->mCollectionSelectionModel = selectionModel;
0488     d->mGenericManager->setCollectionSelectionModel(selectionModel);
0489 
0490     connect(selectionModel->model(), &QAbstractItemModel::rowsInserted, this, [this]() {
0491         d->updateActions();
0492     });
0493     connect(selectionModel->model(), &QAbstractItemModel::rowsRemoved, this, [this]() {
0494         d->updateActions();
0495     });
0496     connect(selectionModel, &QItemSelectionModel::selectionChanged, this, [this]() {
0497         d->updateActions();
0498     });
0499     d->updateActions();
0500 }
0501 
0502 void StandardCalendarActionManager::setItemSelectionModel(QItemSelectionModel *selectionModel)
0503 {
0504     d->mItemSelectionModel = selectionModel;
0505     d->mGenericManager->setItemSelectionModel(selectionModel);
0506 
0507     connect(selectionModel, &QItemSelectionModel::selectionChanged, this, [this]() {
0508         d->updateActions();
0509     });
0510 
0511     d->updateActions();
0512 }
0513 
0514 QAction *StandardCalendarActionManager::createAction(StandardCalendarActionManager::Type type)
0515 {
0516     QAction *action = d->mActions.value(type);
0517     if (action) {
0518         return action;
0519     }
0520 
0521     switch (type) {
0522     case CreateEvent:
0523         action = new QAction(d->mParentWidget);
0524         action->setIcon(QIcon::fromTheme(QStringLiteral("appointment-new")));
0525         action->setText(i18n("New E&vent..."));
0526         action->setWhatsThis(i18n("Create a new event"));
0527         d->mActions.insert(CreateEvent, action);
0528         d->mActionCollection->addAction(QStringLiteral("akonadi_event_create"), action);
0529         connect(action, &QAction::triggered, this, [this]() {
0530             d->slotCreateEvent();
0531         });
0532         break;
0533     case CreateTodo:
0534         action = new QAction(d->mParentWidget);
0535         action->setIcon(QIcon::fromTheme(QStringLiteral("task-new")));
0536         action->setText(i18n("New &To-do..."));
0537         action->setWhatsThis(i18n("Create a new To-do"));
0538         d->mActions.insert(CreateTodo, action);
0539         d->mActionCollection->addAction(QStringLiteral("akonadi_todo_create"), action);
0540         connect(action, &QAction::triggered, this, [this]() {
0541             d->slotCreateTodo();
0542         });
0543         break;
0544     case CreateSubTodo:
0545         action = new QAction(d->mParentWidget);
0546         action->setText(i18n("New Su&b-to-do..."));
0547         action->setWhatsThis(i18n("Create a new Sub-to-do"));
0548         d->mActions.insert(CreateSubTodo, action);
0549         d->mActionCollection->addAction(QStringLiteral("akonadi_subtodo_create"), action);
0550         connect(action, &QAction::triggered, this, [this]() {
0551             d->slotCreateSubTodo();
0552         });
0553         break;
0554     case CreateJournal:
0555         action = new QAction(d->mParentWidget);
0556         action->setIcon(QIcon::fromTheme(QStringLiteral("journal-new")));
0557         action->setText(i18n("New &Journal..."));
0558         action->setWhatsThis(i18n("Create a new Journal"));
0559         d->mActions.insert(CreateJournal, action);
0560         d->mActionCollection->addAction(QStringLiteral("akonadi_journal_create"), action);
0561         connect(action, &QAction::triggered, this, [this]() {
0562             d->slotCreateJournal();
0563         });
0564         break;
0565     case EditIncidence:
0566         action = new QAction(d->mParentWidget);
0567         action->setText(i18n("&Edit..."));
0568         action->setWhatsThis(i18n("Edit the selected incidence."));
0569         d->mActions.insert(EditIncidence, action);
0570         d->mActionCollection->addAction(QStringLiteral("akonadi_incidence_edit"), action);
0571         connect(action, &QAction::triggered, this, [this]() {
0572             d->slotEditIncidence();
0573         });
0574         break;
0575     default:
0576         Q_ASSERT(false); // should never happen
0577         break;
0578     }
0579 
0580     return action;
0581 }
0582 
0583 QAction *StandardCalendarActionManager::createAction(StandardActionManager::Type type)
0584 {
0585     QAction *act = d->mGenericManager->action(type);
0586     if (!act) {
0587         act = d->mGenericManager->createAction(type);
0588     }
0589     d->updateGenericAction(type);
0590     return act;
0591 }
0592 
0593 void StandardCalendarActionManager::createAllActions()
0594 {
0595     createAction(CreateEvent);
0596     createAction(CreateTodo);
0597     createAction(CreateSubTodo);
0598     createAction(CreateJournal);
0599     createAction(EditIncidence);
0600 
0601     d->mGenericManager->createAllActions();
0602     d->updateGenericAllActions();
0603     d->updateActions();
0604 }
0605 
0606 QAction *StandardCalendarActionManager::action(StandardCalendarActionManager::Type type) const
0607 {
0608     return d->mActions.value(type);
0609 }
0610 
0611 QAction *StandardCalendarActionManager::action(StandardActionManager::Type type) const
0612 {
0613     return d->mGenericManager->action(type);
0614 }
0615 
0616 void StandardCalendarActionManager::setActionText(StandardActionManager::Type type, const KLocalizedString &text)
0617 {
0618     d->mGenericManager->setActionText(type, text);
0619 }
0620 
0621 void StandardCalendarActionManager::interceptAction(StandardCalendarActionManager::Type type, bool intercept)
0622 {
0623     if (intercept) {
0624         d->mInterceptedActions.insert(type);
0625     } else {
0626         d->mInterceptedActions.remove(type);
0627     }
0628 }
0629 
0630 void StandardCalendarActionManager::interceptAction(StandardActionManager::Type type, bool intercept)
0631 {
0632     d->mGenericManager->interceptAction(type, intercept);
0633 }
0634 
0635 Akonadi::Collection::List StandardCalendarActionManager::selectedCollections() const
0636 {
0637     return d->mGenericManager->selectedCollections();
0638 }
0639 
0640 Akonadi::Item::List StandardCalendarActionManager::selectedItems() const
0641 {
0642     return d->mGenericManager->selectedItems();
0643 }
0644 
0645 void StandardCalendarActionManager::setContextText(StandardActionManager::Type type, StandardActionManager::TextContext context, const QString &text)
0646 {
0647     d->mGenericManager->setContextText(type, context, text);
0648 }
0649 
0650 void StandardCalendarActionManager::setContextText(StandardActionManager::Type type, StandardActionManager::TextContext context, const KLocalizedString &text)
0651 {
0652     d->mGenericManager->setContextText(type, context, text);
0653 }
0654 
0655 void StandardCalendarActionManager::setCollectionPropertiesPageNames(const QStringList &names)
0656 {
0657     d->mGenericManager->setCollectionPropertiesPageNames(names);
0658 }
0659 
0660 #include "moc_standardcalendaractionmanager.cpp"