summaryrefslogtreecommitdiffstats
path: root/include/sfx2/infobar.hxx
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--include/sfx2/infobar.hxx140
1 files changed, 140 insertions, 0 deletions
diff --git a/include/sfx2/infobar.hxx b/include/sfx2/infobar.hxx
new file mode 100644
index 000000000..f5b948014
--- /dev/null
+++ b/include/sfx2/infobar.hxx
@@ -0,0 +1,140 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#ifndef INCLUDED_SFX2_INFOBAR_HXX
+#define INCLUDED_SFX2_INFOBAR_HXX
+
+#include <vector>
+
+#include <basegfx/color/bcolor.hxx>
+
+#include <sfx2/childwin.hxx>
+#include <sfx2/dllapi.h>
+#include <vcl/InterimItemWindow.hxx>
+
+// These must match the values in offapi/com/sun/star/frame/InfobarType.idl
+enum class InfobarType
+{
+ INFO = 0,
+ SUCCESS = 1,
+ WARNING = 2,
+ DANGER = 3
+};
+
+class InfobarData
+{
+public:
+ OUString msId;
+ OUString msPrimaryMessage;
+ OUString msSecondaryMessage;
+ InfobarType maInfobarType;
+ bool mbShowCloseButton;
+};
+
+/** SfxChildWindow for positioning the InfoBar in the view.
+ */
+class SFX2_DLLPUBLIC SfxInfoBarContainerChild final : public SfxChildWindow
+{
+private:
+ SfxBindings* m_pBindings;
+
+public:
+ SfxInfoBarContainerChild(vcl::Window* pParent, sal_uInt16 nId, SfxBindings* pBindings,
+ SfxChildWinInfo* pInfo);
+ virtual ~SfxInfoBarContainerChild() override;
+
+ SFX_DECL_CHILDWINDOW_WITHID(SfxInfoBarContainerChild);
+
+ void Update();
+};
+
+class ExtraButton;
+
+/** Class representing a single InfoBar to be added in a SfxInfoBarContainerWindow.
+ */
+class SFX2_DLLPUBLIC SfxInfoBarWindow final : public InterimItemWindow
+{
+private:
+ OUString m_sId;
+ InfobarType m_eType;
+ Size m_aMessageSize;
+ Size m_aOrigMessageSize;
+ bool m_bLayingOut;
+ std::unique_ptr<weld::Image> m_xImage;
+ std::unique_ptr<weld::Label> m_xPrimaryMessage;
+ std::unique_ptr<weld::TextView> m_xSecondaryMessage;
+ std::unique_ptr<weld::Container> m_xButtonBox;
+ std::unique_ptr<weld::Toolbar> m_xCloseBtn;
+ std::vector<std::unique_ptr<ExtraButton>> m_aActionBtns;
+
+ DECL_DLLPRIVATE_LINK(SizeAllocHdl, const Size&, void);
+
+ void SetForeAndBackgroundColors(InfobarType eType);
+ void SetCloseButtonImage();
+
+public:
+ SfxInfoBarWindow(vcl::Window* parent, const OUString& sId, const OUString& sPrimaryMessage,
+ const OUString& sSecondaryMessage, InfobarType InfobarType,
+ bool bShowCloseButton);
+ Size DoLayout();
+ virtual void Layout() override;
+ virtual ~SfxInfoBarWindow() override;
+ virtual void dispose() override;
+
+ const OUString& getId() const { return m_sId; }
+ void Update(const OUString& sPrimaryMessage, const OUString& sSecondaryMessage,
+ InfobarType eType);
+ basegfx::BColor m_aBackgroundColor;
+ basegfx::BColor m_aForegroundColor;
+
+ /** Add button to Infobar.
+ * Infobar takes ownership of the button so the button is
+ * destroyed when the infobar gets destroyed.
+ *
+ * The optional "pCommand" is used by extensions, via XInfobarProvider, to
+ * dispatch pCommand on click.
+ */
+ weld::Button& addButton(const OUString* pCommand = nullptr);
+
+ void SetCommandHandler(weld::Button& rBtn, const OUString& aCommand);
+
+private:
+ DECL_DLLPRIVATE_LINK(CloseHandler, const OString&, void);
+};
+
+class SfxInfoBarContainerWindow final : public vcl::Window
+{
+private:
+ SfxInfoBarContainerChild* m_pChildWin;
+ std::vector<VclPtr<SfxInfoBarWindow>> m_pInfoBars;
+ Idle m_aLayoutIdle;
+ bool m_bResizing;
+
+ DECL_LINK(DoUpdateLayout, Timer*, void);
+
+public:
+ SfxInfoBarContainerWindow(SfxInfoBarContainerChild* pChildWin);
+ virtual ~SfxInfoBarContainerWindow() override;
+ virtual void dispose() override;
+
+ VclPtr<SfxInfoBarWindow> appendInfoBar(const OUString& sId, const OUString& sPrimaryMessage,
+ const OUString& sSecondaryMessage, InfobarType ibType,
+ bool bShowCloseButton);
+ VclPtr<SfxInfoBarWindow> getInfoBar(std::u16string_view sId);
+ bool hasInfoBarWithID(std::u16string_view sId);
+ void removeInfoBar(VclPtr<SfxInfoBarWindow> const& pInfoBar);
+ static bool isInfobarEnabled(std::u16string_view sId);
+
+ void TriggerUpdateLayout();
+
+ virtual void Resize() override;
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */