1 /*
2  *  messagewindow.h  -  displays an alarm message in a window
3  *  Program:  kalarm
4  *  SPDX-FileCopyrightText: 2001-2020 David Jarvie <djarvie@kde.org>
5  *
6  *  SPDX-License-Identifier: GPL-2.0-or-later
7  */
8 
9 #pragma once
10 
11 #include "mainwindowbase.h"
12 #include "messagedisplay.h"
13 
14 
15 class QShowEvent;
16 class QMoveEvent;
17 class QResizeEvent;
18 class QCloseEvent;
19 class PushButton;
20 class MessageText;
21 class QCheckBox;
22 class QLabel;
23 class EditAlarmDlg;
24 
25 using namespace KAlarmCal;
26 
27 /**
28  * MessageWindow: A window to display an alarm or error message
29  */
30 class MessageWindow : public MainWindowBase, public MessageDisplay
31 {
32     Q_OBJECT
33 public:
34     MessageWindow();     // for session management restoration only
35     MessageWindow(const KAEvent&, const KAAlarm&, int flags);
36     MessageWindow(const KAEvent&, const DateTime& alarmDateTime, const QStringList& errmsgs,
37                   const QString& dontShowAgain);
38     ~MessageWindow() override;
39 
40     QWidget* displayParent() override;
41     void closeDisplay() override;
42     void showDisplay() override;
43     void raiseDisplay() override;
44 
45     void                repeat(const KAAlarm&) override;
46     bool                hasDefer() const override;
47     void                showDefer() override;
48     void                showDateTime(const KAEvent&, const KAAlarm&) override;
49     void                cancelReminder(const KAEvent&, const KAAlarm&) override;
50 
51     /** Use display() instead of show() to display a message window.
52      *  This prevents windows which should be auto-closed from being shown.
53      */
54     void                display();
55 
56     QSize               sizeHint() const override;
57     static void         redisplayAlarms();
58     static int          windowCount(bool excludeAlwaysHidden = false);
59     static bool         spread(bool scatter);
60 
61 protected Q_SLOTS:
62     void textsChanged(MessageDisplayHelper::DisplayTexts::TextIds ids, const QString& change);
63 
64 protected:
65     /** Called by MessageDisplayHelper to confirm that the alarm message should
66      *  be acknowledged (closed).
67      *  @return  true to close the alarm message, false to keep it open.
68      */
69     bool confirmAcknowledgement() override;
70 
71     void setUpDisplay() override;
72 
73     bool isDeferButtonEnabled() const override;
74     void enableDeferButton(bool enable) override;
75     void enableEditButton(bool enable) override;
76 
77     /** Called when the edit alarm dialog has been cancelled. */
78     void editDlgCancelled() override;
79 
80     void                showEvent(QShowEvent*) override;
81     void                moveEvent(QMoveEvent*) override;
82     void                resizeEvent(QResizeEvent*) override;
83     void                closeEvent(QCloseEvent*) override;
84     void                saveProperties(KConfigGroup&) override;
85     void                readProperties(const KConfigGroup&) override;
86 
87 private Q_SLOTS:
88     void                slotOk();
89     void                slotEdit();
90     void                slotDefer();
91     void                activeWindowChanged(WId);
92     void                displayMainWindow();
93     void                slotShowKMailMessage();
94     void                enableButtons();
95     void                commandCompleted(bool success);
96     void                frameDrawn();
97 
98 private:
99     void                displayComplete();
100     void                setButtonsReadOnly(bool);
101     bool                getWorkAreaAndModal();
102     static bool         isSpread(const QPoint& topLeft);
103     void show();   // ensure that display() is called instead of show() on a MessageWindow object
104 
105     static QVector<MessageWindow*> mWindowList;   // list of message window instances
106     // Properties needed by readProperties()
107     int                 mRestoreHeight;
108     // Miscellaneous
109     QLabel*             mTimeLabel {nullptr};     // trigger time label
110     QLabel*             mRemainingText {nullptr}; // the remaining time (for a reminder window)
111     PushButton*         mOkButton;
112     PushButton*         mEditButton {nullptr};
113     PushButton*         mDeferButton {nullptr};
114     PushButton*         mSilenceButton {nullptr};
115     PushButton*         mKAlarmButton;
116     PushButton*         mKMailButton {nullptr};
117     MessageText*        mCommandText {nullptr};   // shows output from command
118     QCheckBox*          mDontShowAgainCheck {nullptr};
119     DeferDlgData*       mDeferData {nullptr};     // defer dialog data
120     int                 mButtonDelay;             // delay (ms) after window is shown before buttons are enabled
121     int                 mScreenNumber;            // screen to display on, or -1 for default
122     bool                mInitialised {false};     // setUpDisplay() has been called to create the window's widgets
123     bool                mShown {false};           // true once the window has been displayed
124     bool                mPositioning {false};     // true when the window is being positioned initially
125 };
126 
127 
128 // vim: et sw=4:
129