diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-01-09 15:45:46 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-01-10 15:13:45 +0100 |
commit | 14e26096f0476b8ecb70511c304a0cdf5440ef7a (patch) | |
tree | 9aca765b2599b23ad5d88e37877c345c1a71c254 /include/svtools | |
parent | lok: avoid emission storms of un-necessary invalidations. (diff) | |
download | core-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.hxx | 6 | ||||
-rw-r--r-- | include/svtools/toolbarmenu.hxx | 31 |
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; |