1 /*
2     SPDX-FileCopyrightText: 2007 Volker Krause <vkrause@kde.org>
3 
4     SPDX-License-Identifier: GPL-2.0-or-later
5 */
6 
7 #pragma once
8 
9 #include <MessageComposer/MessageFactoryNG>
10 #include <QUrl>
11 
12 #include <QObject>
13 
14 class QWidget;
15 class QAction;
16 class KJob;
17 class QAction;
18 class KActionMenu;
19 class KActionCollection;
20 class KXMLGUIClient;
21 class KMReaderWin;
22 class QMenu;
23 
24 namespace Akonadi
25 {
26 class Item;
27 class StandardMailActionManager;
28 }
29 
30 namespace TemplateParser
31 {
32 class CustomTemplatesMenu;
33 }
34 
35 namespace KIO
36 {
37 class KUriFilterSearchProviderActions;
38 }
39 namespace KMail
40 {
41 /**
42   Manages common actions that can be performed on one or more messages.
43 */
44 class MessageActions : public QObject
45 {
46     Q_OBJECT
47 public:
48     explicit MessageActions(KActionCollection *ac, QWidget *parent);
49     ~MessageActions() override;
50     void setMessageView(KMReaderWin *msgView);
51 
52     /**
53      * This function adds or updates the actions of the forward action menu, taking the
54      * preference whether to forward inline or as attachment by default into account.
55      * This has to be called when that preference config has been changed.
56      */
57     void setupForwardActions(KActionCollection *ac);
58 
59     /**
60      * Sets up action list for forward menu.
61      */
62     void setupForwardingActionsList(KXMLGUIClient *guiClient);
63 
64     void setCurrentMessage(const Akonadi::Item &item, const Akonadi::Item::List &items = Akonadi::Item::List());
65 
66     KActionMenu *replyMenu() const;
67     QAction *replyListAction() const;
68     QAction *forwardInlineAction() const;
69     QAction *forwardAttachedAction() const;
70     QAction *redirectAction() const;
71     QAction *newToRecipientsAction() const;
72 
73     KActionMenu *messageStatusMenu() const;
74     KActionMenu *forwardMenu() const;
75 
76     QAction *annotateAction() const;
77     QAction *printAction() const;
78     QAction *printPreviewAction() const;
79     QAction *listFilterAction() const;
80 
81     KActionMenu *mailingListActionMenu() const;
82     TemplateParser::CustomTemplatesMenu *customTemplatesMenu() const;
83 
84     void addWebShortcutsMenu(QMenu *menu, const QString &text);
85 
86     QAction *debugAkonadiSearchAction() const;
87     QAction *addFollowupReminderAction() const;
88 
89     QAction *sendAgainAction() const;
90 
91     QAction *newMessageFromTemplateAction() const;
92 
93     QAction *editAsNewAction() const;
94 
95     QAction *exportToPdfAction() const;
96 
97     void fillAkonadiStandardAction(Akonadi::StandardMailActionManager *akonadiStandardActionManager);
98     Q_REQUIRED_RESULT Akonadi::Item currentItem() const;
99 
100 Q_SIGNALS:
101     // This signal is emitted when a reply is triggered and the
102     // action has finished.
103     // This is useful for the stand-alone reader, it might want to close the window in
104     // that case.
105     void replyActionFinished();
106 
107 public Q_SLOTS:
108     void editCurrentMessage();
109 
110 private:
111     Q_DISABLE_COPY(MessageActions)
112     void annotateMessage();
113     void updateActions();
114     void replyCommand(MessageComposer::ReplyStrategy strategy);
115     void addMailingListAction(const QString &item, const QUrl &url);
116     void addMailingListActions(const QString &item, const QList<QUrl> &list);
117     void updateMailingListActions(const Akonadi::Item &messageItem);
118     void printMessage(bool preview);
119     void clearMailingListActions();
120 
121 private Q_SLOTS:
122     void slotItemModified(const Akonadi::Item &item, const QSet<QByteArray> &partIdentifiers);
123     void slotItemRemoved(const Akonadi::Item &item);
124 
125     void slotReplyToMsg();
126     void slotReplyAuthorToMsg();
127     void slotReplyListToMsg();
128     void slotReplyAllToMsg();
129     void slotNoQuoteReplyToMsg();
130     void slotRunUrl(QAction *urlAction);
131     void slotPrintMessage();
132     void slotPrintPreviewMsg();
133 
134     void slotUpdateActionsFetchDone(KJob *job);
135     void slotMailingListFilter();
136     void slotDebugAkonadiSearch();
137 
138     void slotAddFollowupReminder();
139     void slotResendMessage();
140     void slotUseTemplate();
141 
142     void slotExportToPdf();
143 
144 private:
145     QList<QAction *> mMailListActionList;
146     Akonadi::Item mCurrentItem;
147     Akonadi::Item::List mVisibleItems;
148     QWidget *const mParent;
149     KMReaderWin *mMessageView = nullptr;
150 
151     KActionMenu *const mReplyActionMenu;
152     QAction *const mReplyAction;
153     QAction *const mReplyAllAction;
154     QAction *const mReplyAuthorAction;
155     QAction *const mReplyListAction;
156     QAction *const mNoQuoteReplyAction;
157     QAction *const mForwardInlineAction;
158     QAction *const mForwardAttachedAction;
159     QAction *const mRedirectAction;
160     QAction *const mNewToRecipientsAction;
161     KActionMenu *const mStatusMenu;
162     KActionMenu *const mForwardActionMenu;
163     KActionMenu *const mMailingListActionMenu;
164     QAction *const mAnnotateAction;
165     QAction *const mEditAsNewAction;
166     QAction *mPrintAction = nullptr;
167     QAction *mPrintPreviewAction = nullptr;
168     TemplateParser::CustomTemplatesMenu *mCustomTemplatesMenu = nullptr;
169     QAction *const mListFilterAction;
170     QAction *const mAddFollowupReminderAction;
171     QAction *const mDebugAkonadiSearchAction;
172     QAction *const mSendAgainAction;
173     QAction *const mNewMessageFromTemplateAction;
174     KIO::KUriFilterSearchProviderActions *const mWebShortcutMenuManager;
175     QAction *const mExportToPdfAction;
176 };
177 }
178 
179