[Libreoffice-commits] core.git: include/svx svx/source

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Tue Jan 21 12:56:21 UTC 2020


 include/svx/colorwindow.hxx      |   29 ----------------
 include/svx/dlgctrl.hxx          |   61 +++++++++++++++++++++++++++++++++
 svx/source/tbxctrls/linectrl.cxx |   70 +++++++++++++++++++++------------------
 svx/source/tbxctrls/tbcontrl.cxx |    2 -
 4 files changed, 102 insertions(+), 60 deletions(-)

New commits:
commit 08e633d777f1d2cf11a93ccb55f231d084f3220c
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Tue Jan 21 11:39:19 2020 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Tue Jan 21 13:55:46 2020 +0100

    Related: tdf#130035 let SvxLineEndWindow have a menubutton parent
    
    Change-Id: Id658dc0ac88d98ade67bdeb233eca6c912a3b253
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/87133
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/include/svx/colorwindow.hxx b/include/svx/colorwindow.hxx
index 8a2f42751dfd..e87b60141160 100644
--- a/include/svx/colorwindow.hxx
+++ b/include/svx/colorwindow.hxx
@@ -22,6 +22,7 @@
 
 #include <svtools/toolbarmenu.hxx>
 #include <rtl/ustring.hxx>
+#include <svx/dlgctrl.hxx>
 #include <svx/SvxColorValueSet.hxx>
 #include <svx/Palette.hxx>
 #include <vcl/lstbox.hxx>
@@ -109,34 +110,6 @@ public:
 
 class SvxColorToolBoxControl;
 
-class SVX_DLLPUBLIC MenuOrToolMenuButton
-{
-private:
-    // either
-    weld::MenuButton* m_pMenuButton;
-    // or
-    weld::Toolbar* m_pToolbar;
-    OString m_aIdent;
-    // or
-    SvxColorToolBoxControl* m_pControl;
-    VclPtr<ToolBox> m_xToolBox;
-    sal_uInt16 m_nId;
-public:
-    MenuOrToolMenuButton(weld::MenuButton* pMenuButton);
-    MenuOrToolMenuButton(weld::Toolbar* pToolbar, const OString& rIdent);
-    MenuOrToolMenuButton(SvxColorToolBoxControl* pControl, ToolBox* pToolbar, sal_uInt16 nId);
-    ~MenuOrToolMenuButton();
-
-    MenuOrToolMenuButton(MenuOrToolMenuButton const &) = default;
-    MenuOrToolMenuButton(MenuOrToolMenuButton &&) = default;
-    MenuOrToolMenuButton & operator =(MenuOrToolMenuButton const &) = default;
-    MenuOrToolMenuButton & operator =(MenuOrToolMenuButton &&) = default;
-
-    bool get_active() const;
-    void set_inactive() const;
-    weld::Widget* get_widget() const;
-};
-
 class SVX_DLLPUBLIC ColorWindow final : public WeldToolbarPopup
 {
 private:
diff --git a/include/svx/dlgctrl.hxx b/include/svx/dlgctrl.hxx
index eaa31a5d0e3f..88f6b0025740 100644
--- a/include/svx/dlgctrl.hxx
+++ b/include/svx/dlgctrl.hxx
@@ -20,6 +20,7 @@
 #define INCLUDED_SVX_DLGCTRL_HXX
 
 #include <sfx2/tabdlg.hxx>
+#include <svtools/toolbarmenu.hxx>
 #include <svx/svxdllapi.h>
 #include <svx/rectenum.hxx>
 #include <vcl/customweld.hxx>
@@ -36,6 +37,13 @@ namespace com { namespace sun { namespace star { namespace awt {
     struct Point;
 } } } }
 
+namespace svt {
+    class PopupWindowController;
+}
+
+class SvtValueSet;
+class ToolBox;
+
 /*************************************************************************
 |* Derived from SfxTabPage for being able to get notified through the
 |* virtual method from the control.
@@ -211,6 +219,34 @@ public:
     virtual void        LoseFocus() override;
 };
 
+class SVX_DLLPUBLIC MenuOrToolMenuButton
+{
+private:
+    // either
+    weld::MenuButton* m_pMenuButton;
+    // or
+    weld::Toolbar* m_pToolbar;
+    OString m_aIdent;
+    // or
+    svt::PopupWindowController* m_pControl;
+    VclPtr<ToolBox> m_xToolBox;
+    sal_uInt16 m_nId;
+public:
+    MenuOrToolMenuButton(weld::MenuButton* pMenuButton);
+    MenuOrToolMenuButton(weld::Toolbar* pToolbar, const OString& rIdent);
+    MenuOrToolMenuButton(svt::PopupWindowController* pControl, ToolBox* pToolbar, sal_uInt16 nId);
+    ~MenuOrToolMenuButton();
+
+    MenuOrToolMenuButton(MenuOrToolMenuButton const &) = default;
+    MenuOrToolMenuButton(MenuOrToolMenuButton &&) = default;
+    MenuOrToolMenuButton & operator =(MenuOrToolMenuButton const &) = default;
+    MenuOrToolMenuButton & operator =(MenuOrToolMenuButton &&) = default;
+
+    bool get_active() const;
+    void set_inactive() const;
+    weld::Widget* get_widget() const;
+};
+
 /************************************************************************/
 
 class SAL_WARN_UNUSED SVX_DLLPUBLIC FillTypeLB : public ListBox
@@ -288,6 +324,31 @@ public:
     bool get_sensitive() const { return m_xControl->get_sensitive(); }
 };
 
+typedef std::function<void(const css::uno::Sequence<css::beans::PropertyValue>&)> LineEndSelectFunction;
+
+class SvxLineEndWindow final : public WeldToolbarPopup
+{
+private:
+    XLineEndListRef mpLineEndList;
+    MenuOrToolMenuButton maMenuButton;
+    LineEndSelectFunction maLineEndSelectFunction;
+    std::unique_ptr<SvtValueSet> mxLineEndSet;
+    std::unique_ptr<weld::CustomWeld> mxLineEndSetWin;
+    sal_uInt16 mnLines;
+    Size maBmpSize;
+
+    DECL_LINK(SelectHdl, SvtValueSet*, void);
+    void FillValueSet();
+    void SetSize();
+
+    virtual void GrabFocus() override;
+
+public:
+    SvxLineEndWindow(const css::uno::Reference< css::frame::XFrame >& rFrame, weld::Window* pParent,
+                     const MenuOrToolMenuButton &rMenuButton, const LineEndSelectFunction& rLineEndSelectFunction);
+    virtual void statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
+};
+
 class SdrObject;
 class SdrPathObj;
 class SdrModel;
diff --git a/svx/source/tbxctrls/linectrl.cxx b/svx/source/tbxctrls/linectrl.cxx
index 80c36beb55d5..bb4ef331de16 100644
--- a/svx/source/tbxctrls/linectrl.cxx
+++ b/svx/source/tbxctrls/linectrl.cxx
@@ -19,6 +19,7 @@
 
 #include <string>
 
+#include <vcl/svapp.hxx>
 #include <vcl/toolbox.hxx>
 #include <sfx2/app.hxx>
 #include <sfx2/dispatch.hxx>
@@ -263,39 +264,20 @@ public:
 private:
     virtual std::unique_ptr<WeldToolbarPopup> weldPopupWindow() override;
     virtual VclPtr<vcl::Window> createVclPopupWindow( vcl::Window* pParent ) override;
-};
 
-class SvxLineEndWindow final : public WeldToolbarPopup
-{
-private:
-    XLineEndListRef mpLineEndList;
-    rtl::Reference<SvxLineEndToolBoxControl> mxControl;
-    std::unique_ptr<SvtValueSet> mxLineEndSet;
-    std::unique_ptr<weld::CustomWeld> mxLineEndSetWin;
-    sal_uInt16 mnLines;
-    Size maBmpSize;
-
-    DECL_LINK( SelectHdl, SvtValueSet*, void );
-    void FillValueSet();
-    void SetSize();
-
-    virtual void GrabFocus() override
-    {
-        mxLineEndSet->GrabFocus();
-    }
-
-public:
-    SvxLineEndWindow(SvxLineEndToolBoxControl* pControl, weld::Widget* pParent);
-    virtual void statusChanged( const css::frame::FeatureStateEvent& rEvent ) override;
+    void dispatch(const Sequence<PropertyValue>& rArgs);
 };
 
 }
 
 static constexpr sal_uInt16 gnCols = 2;
 
-SvxLineEndWindow::SvxLineEndWindow(SvxLineEndToolBoxControl* pControl, weld::Widget* pParent)
-    : WeldToolbarPopup(pControl->getFrameInterface(), pParent, "svx/ui/floatinglineend.ui", "FloatingLineEnd")
-    , mxControl(pControl)
+SvxLineEndWindow::SvxLineEndWindow(const Reference<XFrame>& rFrame, weld::Window* pParent,
+                                   const MenuOrToolMenuButton &rMenuButton,
+                                   const LineEndSelectFunction& rLineEndSelectFunction)
+    : WeldToolbarPopup(rFrame, pParent, "svx/ui/floatinglineend.ui", "FloatingLineEnd")
+    , maMenuButton(rMenuButton)
+    , maLineEndSelectFunction(rLineEndSelectFunction)
     , mxLineEndSet(new SvtValueSet(m_xBuilder->weld_scrolled_window("valuesetwin")))
     , mxLineEndSetWin(new weld::CustomWeld(*m_xBuilder, "valueset", *mxLineEndSet))
     , mnLines(12)
@@ -322,6 +304,11 @@ SvxLineEndWindow::SvxLineEndWindow(SvxLineEndToolBoxControl* pControl, weld::Wid
     AddStatusListener( ".uno:LineEndListState");
 }
 
+void SvxLineEndWindow::GrabFocus()
+{
+    mxLineEndSet->GrabFocus();
+}
+
 IMPL_LINK_NOARG(SvxLineEndWindow, SelectHdl, SvtValueSet*, void)
 {
     std::unique_ptr<XLineEndItem> pLineEndItem;
@@ -368,9 +355,9 @@ IMPL_LINK_NOARG(SvxLineEndWindow, SelectHdl, SvtValueSet*, void)
         while in Dispatch()), accessing members will crash in this case. */
     mxLineEndSet->SetNoSelection();
 
-    mxControl->dispatchCommand(mxControl->getCommandURL(), aArgs);
+    maLineEndSelectFunction(aArgs);
 
-    mxControl->EndPopupMode();
+    maMenuButton.set_inactive();
 }
 
 void SvxLineEndWindow::FillValueSet()
@@ -478,6 +465,11 @@ void SAL_CALL SvxLineEndToolBoxControl::execute(sal_Int16 /*KeyModifier*/)
     }
 }
 
+void SvxLineEndToolBoxControl::dispatch(const Sequence<PropertyValue>& rArgs)
+{
+    dispatchCommand(getCommandURL(), rArgs);
+}
+
 void SvxLineEndToolBoxControl::initialize( const css::uno::Sequence<css::uno::Any>& rArguments )
 {
     svt::PopupWindowController::initialize( rArguments );
@@ -496,13 +488,29 @@ void SvxLineEndToolBoxControl::initialize( const css::uno::Sequence<css::uno::An
 
 std::unique_ptr<WeldToolbarPopup> SvxLineEndToolBoxControl::weldPopupWindow()
 {
-    return std::make_unique<SvxLineEndWindow>(this, m_pToolbar);
+    const css::uno::Reference<css::awt::XWindow> xParent = m_xFrame->getContainerWindow();
+    weld::Window* pParentFrame = Application::GetFrameWeld(xParent);
+
+    const OString aId(m_aCommandURL.toUtf8());
+    return std::make_unique<SvxLineEndWindow>(m_xFrame, pParentFrame,
+            MenuOrToolMenuButton(m_pToolbar, aId),
+            std::bind(&SvxLineEndToolBoxControl::dispatch, this, std::placeholders::_1));
 }
 
 VclPtr<vcl::Window> SvxLineEndToolBoxControl::createVclPopupWindow( vcl::Window* pParent )
 {
-    mxInterimPopover = VclPtr<InterimToolbarPopup>::Create(getFrameInterface(), pParent,
-        std::make_unique<SvxLineEndWindow>(this, pParent->GetFrameWeld()));
+    ToolBox* pToolBox = nullptr;
+    sal_uInt16 nId = 0;
+    if (!getToolboxId(nId, &pToolBox))
+        return nullptr;
+
+    const css::uno::Reference<css::awt::XWindow> xParent = m_xFrame->getContainerWindow();
+    weld::Window* pParentFrame = Application::GetFrameWeld(xParent);
+
+    mxInterimPopover = VclPtr<InterimToolbarPopup>::Create(m_xFrame, pParent,
+        std::make_unique<SvxLineEndWindow>(m_xFrame, pParentFrame,
+            MenuOrToolMenuButton(this, pToolBox, nId),
+            std::bind(&SvxLineEndToolBoxControl::dispatch, this, std::placeholders::_1)));
 
     mxInterimPopover->Show();
 
diff --git a/svx/source/tbxctrls/tbcontrl.cxx b/svx/source/tbxctrls/tbcontrl.cxx
index fcd99c90d8fc..129e2b90c82b 100644
--- a/svx/source/tbxctrls/tbcontrl.cxx
+++ b/svx/source/tbxctrls/tbcontrl.cxx
@@ -4363,7 +4363,7 @@ MenuOrToolMenuButton::MenuOrToolMenuButton(weld::Toolbar* pToolbar, const OStrin
 {
 }
 
-MenuOrToolMenuButton::MenuOrToolMenuButton(SvxColorToolBoxControl* pControl, ToolBox* pToolbar, sal_uInt16 nId)
+MenuOrToolMenuButton::MenuOrToolMenuButton(svt::PopupWindowController* pControl, ToolBox* pToolbar, sal_uInt16 nId)
     : m_pMenuButton(nullptr)
     , m_pToolbar(nullptr)
     , m_pControl(pControl)


More information about the Libreoffice-commits mailing list