summaryrefslogtreecommitdiffstats
path: root/include/svtools
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-01-09 15:45:46 +0000
committerCaolán McNamara <caolanm@redhat.com>2020-01-10 15:13:45 +0100
commit14e26096f0476b8ecb70511c304a0cdf5440ef7a (patch)
tree9aca765b2599b23ad5d88e37877c345c1a71c254 /include/svtools
parentlok: avoid emission storms of un-necessary invalidations. (diff)
downloadcore-14e26096f0476b8ecb70511c304a0cdf5440ef7a.tar.gz
core-14e26096f0476b8ecb70511c304a0cdf5440ef7a.zip
make welded toolbars on-demand that were previously on-demand
Change-Id: I795723260deb317093e83d951d968e0b3d3a1850 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86531 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'include/svtools')
-rw-r--r--include/svtools/popupwindowcontroller.hxx6
-rw-r--r--include/svtools/toolbarmenu.hxx31
2 files changed, 33 insertions, 4 deletions
diff --git a/include/svtools/popupwindowcontroller.hxx b/include/svtools/popupwindowcontroller.hxx
index be39cc8e2b69..f1df441a4979 100644
--- a/include/svtools/popupwindowcontroller.hxx
+++ b/include/svtools/popupwindowcontroller.hxx
@@ -33,6 +33,7 @@
namespace vcl { class Window; }
class InterimToolbarPopup;
+class ToolbarPopupContainer;
class WeldToolbarPopup;
namespace svt
@@ -46,11 +47,13 @@ public:
PopupWindowController( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
const css::uno::Reference< css::frame::XFrame >& xFrame,
const OUString& aCommandURL );
+
virtual ~PopupWindowController() override;
void EndPopupMode();
virtual VclPtr<vcl::Window> createPopupWindow( vcl::Window* pParent ) = 0;
+ virtual std::unique_ptr<WeldToolbarPopup> weldPopupWindow();
// XServiceInfo
virtual OUString SAL_CALL getImplementationName() override = 0;
@@ -65,9 +68,10 @@ public:
// XToolbarController
virtual css::uno::Reference< css::awt::XWindow > SAL_CALL createPopupWindow() override;
+ virtual void SAL_CALL click() override;
protected:
- std::unique_ptr<WeldToolbarPopup> mxPopover;
+ std::unique_ptr<ToolbarPopupContainer> mxPopoverContainer;
VclPtr<InterimToolbarPopup> mxInterimPopover;
private:
diff --git a/include/svtools/toolbarmenu.hxx b/include/svtools/toolbarmenu.hxx
index 1ff5079e569a..f06611817797 100644
--- a/include/svtools/toolbarmenu.hxx
+++ b/include/svtools/toolbarmenu.hxx
@@ -173,16 +173,41 @@ public:
virtual void GrabFocus() = 0;
};
+// we want to create WeldToolbarPopup on-demand when a toolbar dropdown is
+// clicked, but the widget to be shown must exist before the dropdown
+// is activated, so ToolbarPopupContainer is that widget and the
+// contents of the on-demand created WeldToolbarPopup is placed
+// within the ToolbarPopupContainer
+class SVT_DLLPUBLIC ToolbarPopupContainer
+{
+private:
+ DECL_LINK(FocusHdl, weld::Widget&, void);
+
+protected:
+ std::unique_ptr<weld::Builder> m_xBuilder;
+ std::unique_ptr<weld::Container> m_xTopLevel;
+ std::unique_ptr<weld::Container> m_xContainer;
+ std::unique_ptr<WeldToolbarPopup> m_xPopup;
+public:
+ ToolbarPopupContainer(weld::Widget* pParent);
+ ~ToolbarPopupContainer();
+ weld::Container* getTopLevel() { return m_xTopLevel.get(); }
+ weld::Container* getContainer() { return m_xContainer.get(); }
+
+ void setPopover(std::unique_ptr<WeldToolbarPopup> xPopup);
+ void unsetPopover();
+};
+
class SVT_DLLPUBLIC InterimToolbarPopup : public svtools::ToolbarPopup
{
protected:
VclPtr<vcl::Window> m_xBox;
std::unique_ptr<weld::Builder> m_xBuilder;
std::unique_ptr<weld::Container> m_xContainer;
-
- WeldToolbarPopup* m_pPopup;
+ std::unique_ptr<WeldToolbarPopup> m_xPopup;
public:
- InterimToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParent, WeldToolbarPopup* pPopup);
+ InterimToolbarPopup(const css::uno::Reference<css::frame::XFrame>& rFrame, vcl::Window* pParent,
+ std::unique_ptr<WeldToolbarPopup> xPopup);
weld::Container* getContainer() { return m_xContainer.get(); }
virtual void dispose() override;
virtual ~InterimToolbarPopup() override;