1 /*
2     This file is part of Akonadi Mail.
3 
4     Copyright (c) 2009 - 2010 Tobias Koenig <tokoe@kde.org>
5 
6     SPDX-License-Identifier: LGPL-2.0-or-later
7 */
8 
9 #pragma once
10 
11 #include "akonadi-mime_export.h"
12 
13 #include <Akonadi/StandardActionManager>
14 
15 #include <QObject>
16 
17 #include <memory>
18 
19 class QAction;
20 class KActionCollection;
21 class QItemSelectionModel;
22 class QWidget;
23 
24 namespace Akonadi
25 {
26 class Item;
27 class StandardMailActionManagerPrivate;
28 
29 /**
30  * @short Manages emails specific actions for collection and item views.
31  *
32  * @author Andras Mantia <amantia@kde.org>
33  * @since 4.6
34  */
35 class AKONADI_MIME_EXPORT StandardMailActionManager : public QObject
36 {
37     Q_OBJECT
38 
39 public:
40     /**
41      * Describes the supported actions.
42      */
43     enum Type {
44         MarkMailAsRead = StandardActionManager::LastType + 1, ///< Marks a mail as read
45         MarkMailAsUnread, ///< Marks a mail as unread
46         MarkMailAsImportant, ///< Marks a mail as important
47         MarkMailAsActionItem, ///< Marks a mail as action item
48         MarkAllMailAsRead, ///< Marks all mails in a folder as read.
49         MarkAllMailAsReadRecursive, ///< Marks all mails in a folder and its subfolders as read.
50         MarkAllMailAsUnread, ///< Marks all mails in a folder as unread.
51         MarkAllMailAsImportant, ///< Marks all mails in a folder as important
52         MarkAllMailAsActionItem, ///< Marks all mails in a folder as action item
53         MoveToTrash, ///< Move all selected messages and folders to trash.
54         MoveAllToTrash, ///< Move all messages of the current folder to trash.
55         RemoveDuplicates, ///< Removes all duplicated messages.
56         EmptyAllTrash, ///< Empties trash folders on all accounts
57         EmptyTrash, ///< Empties the trash folder, if a trash folder was selected
58         LastType ///< Marks last action.
59     };
60 
61     /**
62      * Creates a new standard mail action manager.
63      *
64      * @param actionCollection The action collection to operate on.
65      * @param parent The parent widget.
66      */
67     explicit StandardMailActionManager(KActionCollection *actionCollection, QWidget *parent = nullptr);
68 
69     /**
70      * Destroys the standard mail action manager.
71      */
72     ~StandardMailActionManager() override;
73 
74     /**
75      * Sets the collection selection model based on which the collection
76      * related actions should operate. If none is set, all collection actions
77      * will be disabled.
78      *
79      * @param selectionModel selection model for collections
80      */
81     void setCollectionSelectionModel(QItemSelectionModel *selectionModel);
82 
83     /**
84      * Sets the item selection model based on which the item related actions
85      * should operate. If none is set, all item actions will be disabled.
86      *
87      * @param selectionModel selection model for items
88      */
89     void setItemSelectionModel(QItemSelectionModel *selectionModel);
90 
91     /**
92      * Creates the action of the given type and adds it to the action collection
93      * specified in the constructor if it does not exist yet. The action is
94      * connected to its default implementation provided by this class.
95      *
96      * @param type action type
97      */
98     QAction *createAction(Type type);
99 
100     /**
101      * Creates the action of the given type and adds it to the action collection
102      * specified in the constructor if it does not exist yet. The action is
103      * connected to its default implementation provided by this class.
104      * @param type action type
105      */
106     QAction *createAction(StandardActionManager::Type type);
107 
108     /**
109      * Convenience method to create all standard actions.
110      * @see createAction()
111      */
112     void createAllActions();
113 
114     /**
115      * Returns the action of the given type, 0 if it has not been created (yet).
116      * @param type action type
117      */
118     QAction *action(Type type) const;
119 
120     /**
121      * Returns the action of the given type, 0 if it has not been created (yet).
122      * @param type action type
123      */
124     QAction *action(StandardActionManager::Type type) const;
125 
126     /**
127      * Sets the label of the action @p type to @p text, which is used during
128      * updating the action state and substituted according to the number of
129      * selected objects. This is mainly useful to customize the label of actions
130      * that can operate on multiple objects.
131      *
132      * Example:
133      * @code
134      * acctMgr->setActionText( Akonadi::StandardActionManager::CopyItems,
135      *                         ki18np( "Copy Item", "Copy %1 Items" ) );
136      * @endcode
137      *
138      * @param type action type
139      * @param text localized text for action
140      */
141     void setActionText(StandardActionManager::Type type, const KLocalizedString &text);
142 
143     /**
144      * Sets whether the default implementation for the given action @p type
145      * shall be executed when the action is triggered.
146      *
147      * @param intercept If @c false, the default implementation will be executed,
148      *                  if @c true no action is taken.
149      */
150     void interceptAction(Type type, bool intercept = true);
151 
152     /**
153      * Sets whether the default implementation for the given action @p type
154      * shall be executed when the action is triggered.
155      *
156      * @param type action type
157      * @param intercept If @c false, the default implementation will be executed,
158      *                  if @c true no action is taken.
159      */
160     void interceptAction(StandardActionManager::Type type, bool intercept = true);
161 
162     /**
163      * Returns the list of collections that are currently selected.
164      * The list is empty if no collection is currently selected.
165      */
166     Q_REQUIRED_RESULT Akonadi::Collection::List selectedCollections() const;
167 
168     /**
169      * Returns the list of items that are currently selected.
170      * The list is empty if no item is currently selected.
171      */
172     Q_REQUIRED_RESULT Akonadi::Item::List selectedItems() const;
173 
174     /**
175      * Sets the favorite collections model based on which the collection
176      * relatedactions should operate. If none is set, the "Add to Favorite Folders" action
177      * will be disabled.
178      *
179      * @param favoritesModel model for a user's favorite mail collections
180      */
181     void setFavoriteCollectionsModel(FavoriteCollectionsModel *favoritesModel);
182 
183     /**
184      * Sets the favorite collection selection model based on which the favorite
185      * collection related actions should operate. If none is set, all favorite modifications
186      * actions will be disabled.
187      *
188      * @param selection model for favorite collections
189      */
190     void setFavoriteSelectionModel(QItemSelectionModel *selectionModel);
191 
192     void setCollectionPropertiesPageNames(const QStringList &names);
193 
194     Akonadi::StandardActionManager *standardActionManager() const;
195 
196     void markItemsAs(const QByteArray &typeStr, const Akonadi::Item::List &items, bool checkIntercept = true);
197     void markAllItemsAs(const QByteArray &typeStr, const Akonadi::Collection::List &collections, bool checkIntercept = true);
198 
199     void setItems(const Item::List &selectedItems);
200 
201 Q_SIGNALS:
202     /**
203      * This signal is emitted whenever the action state has been updated.
204      * In case you have special needs for changing the state of some actions,
205      * connect to this signal and adjust the action state.
206      */
207     void actionStateUpdated();
208 
209 private:
210     //@cond PRIVATE
211     friend class StandardMailActionManagerPrivate;
212     std::unique_ptr<StandardMailActionManagerPrivate> const d;
213     //@endcond
214 };
215 }
216 
217