[Libreoffice-commits] core.git: include/sfx2 include/svtools include/vcl sfx2/Library_sfx.mk sfx2/source svtools/source vcl/source vcl/unx

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Mon Dec 23 16:01:56 UTC 2019


 include/sfx2/sidebar/ControllerFactory.hxx      |    7 +
 include/sfx2/weldutils.hxx                      |   54 +++++++++
 include/svtools/generictoolboxcontroller.hxx    |   47 +++++---
 include/vcl/weld.hxx                            |    6 +
 include/vcl/weldutils.hxx                       |   14 --
 sfx2/Library_sfx.mk                             |    1 
 sfx2/source/dialog/recfloat.cxx                 |    3 
 sfx2/source/inc/recfloat.hxx                    |    6 -
 sfx2/source/sidebar/ControllerFactory.cxx       |   49 ++++++++
 sfx2/source/toolbox/weldutils.cxx               |  135 ++++++++++++++++++++++++
 svtools/source/uno/generictoolboxcontroller.cxx |  104 ++++++++++++------
 vcl/source/app/salvtables.cxx                   |   30 +++++
 vcl/source/app/weldutils.cxx                    |   32 -----
 vcl/unx/gtk3/gtk3gtkinst.cxx                    |   36 ++++++
 14 files changed, 426 insertions(+), 98 deletions(-)

New commits:
commit b7570a5f9d026f7cd6f064594bd7599fe36e9a14
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Mon Dec 23 11:16:28 2019 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Mon Dec 23 17:00:58 2019 +0100

    reorganize ToolbarUnoDispatcher to be useful for sidebar
    
    Change-Id: If129d4832f04758705e121bff88ea7d2e45bf96b
    Reviewed-on: https://gerrit.libreoffice.org/85755
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/include/sfx2/sidebar/ControllerFactory.hxx b/include/sfx2/sidebar/ControllerFactory.hxx
index 056271701110..c54de67b5545 100644
--- a/include/sfx2/sidebar/ControllerFactory.hxx
+++ b/include/sfx2/sidebar/ControllerFactory.hxx
@@ -29,6 +29,8 @@ namespace com::sun::star::frame { class XToolbarController; }
 
 class ToolBox;
 
+namespace weld { class Toolbar; }
+
 namespace sfx2 { namespace sidebar {
 
 /** Convenience class for the easy creation of toolbox controllers.
@@ -45,6 +47,11 @@ public:
         const css::uno::Reference<css::awt::XWindow>& rxParentWindow,
         const sal_Int32 nItemWidth);
 
+    static css::uno::Reference<css::frame::XToolbarController> CreateToolBoxController(
+        weld::Toolbar& rToolbar,
+        const OUString& rsCommandName,
+        const css::uno::Reference<css::frame::XFrame>& rxFrame);
+
 private:
     static css::uno::Reference<css::frame::XToolbarController> CreateToolBarController(
         ToolBox* pToolBox,
diff --git a/include/sfx2/weldutils.hxx b/include/sfx2/weldutils.hxx
new file mode 100644
index 000000000000..ccca8b393042
--- /dev/null
+++ b/include/sfx2/weldutils.hxx
@@ -0,0 +1,54 @@
+/* -*- 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_WELDUTILS_HXX
+#define INCLUDED_SFX2_WELDUTILS_HXX
+
+#include <com/sun/star/frame/XFrame.hpp>
+#include <com/sun/star/frame/XToolbarController.hpp>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <tools/link.hxx>
+#include <sfx2/dllapi.h>
+
+#include <map>
+
+namespace weld
+{
+class Toolbar;
+}
+
+class SFX2_DLLPUBLIC ToolbarUnoDispatcher
+{
+private:
+    css::uno::Reference<css::frame::XFrame> m_xFrame;
+    weld::Toolbar* m_pToolbar;
+
+    DECL_LINK(SelectHdl, const OString&, void);
+
+    void CreateController(const OUString& rCommand);
+
+    typedef std::map<OUString, css::uno::Reference<css::frame::XToolbarController>>
+        ControllerContainer;
+    ControllerContainer maControllers;
+
+    css::uno::Reference<css::frame::XToolbarController>
+    GetControllerForCommand(const OUString& rCommand) const;
+
+public:
+    // fill in the label and icons for actions and dispatch the action on item click
+    ToolbarUnoDispatcher(weld::Toolbar& rToolbar,
+                         const css::uno::Reference<css::frame::XFrame>& rFrame);
+    void dispose();
+    ~ToolbarUnoDispatcher();
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/svtools/generictoolboxcontroller.hxx b/include/svtools/generictoolboxcontroller.hxx
index 6b9c11cc3924..ddf8dc06cee8 100644
--- a/include/svtools/generictoolboxcontroller.hxx
+++ b/include/svtools/generictoolboxcontroller.hxx
@@ -24,33 +24,46 @@
 #include <svtools/toolboxcontroller.hxx>
 #include <vcl/toolbox.hxx>
 
+namespace weld
+{
+    class Toolbar;
+}
+
 namespace svt
 {
 
 class SVT_DLLPUBLIC GenericToolboxController final : public svt::ToolboxController
 {
-    public:
-        GenericToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
-                                  const css::uno::Reference< css::frame::XFrame >& rFrame,
-                                  ToolBox* pToolBox,
-                                  sal_uInt16   nID,
-                                  const OUString& aCommand );
-        virtual ~GenericToolboxController() override;
+public:
+    GenericToolboxController( const css::uno::Reference< css::uno::XComponentContext >& rxContext,
+                              const css::uno::Reference< css::frame::XFrame >& rFrame,
+                              ToolBox* pToolBox,
+                              sal_uInt16   nID,
+                              const OUString& aCommand );
+
+    GenericToolboxController(const css::uno::Reference< css::uno::XComponentContext >& rxContext,
+                             const css::uno::Reference< css::frame::XFrame >& rFrame,
+                             weld::Toolbar& rToolbar,
+                             const OUString& rCommand);
+
+    virtual ~GenericToolboxController() override;
+
+    // XComponent
+    virtual void SAL_CALL dispose() override;
 
-        // XComponent
-        virtual void SAL_CALL dispose() override;
+    // XToolbarController
+    virtual void SAL_CALL execute( sal_Int16 KeyModifier ) override;
 
-        // XToolbarController
-        virtual void SAL_CALL execute( sal_Int16 KeyModifier ) override;
+    // XStatusListener
+    virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) override;
 
-        // XStatusListener
-        virtual void SAL_CALL statusChanged( const css::frame::FeatureStateEvent& Event ) override;
+    DECL_STATIC_LINK( GenericToolboxController, ExecuteHdl_Impl, void*, void );
 
-         DECL_STATIC_LINK( GenericToolboxController, ExecuteHdl_Impl, void*, void );
+private:
+    VclPtr<ToolBox>    m_xToolbox;
+    sal_uInt16         m_nID;
 
-    private:
-        VclPtr<ToolBox>    m_pToolbox;
-        sal_uInt16         m_nID;
+    weld::Toolbar*     m_pToolbox;
 };
 
 }
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index b7d86c9c7df9..e298a85f90c6 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -1966,12 +1966,18 @@ public:
     virtual bool get_item_active(const OString& rIdent) const = 0;
     virtual void set_item_menu(const OString& rIdent, weld::Menu* pMenu) = 0;
     virtual void set_item_popover(const OString& rIdent, weld::Widget* pPopover) = 0;
+    virtual void set_item_visible(const OString& rIdent, bool bVisible) = 0;
+    virtual bool get_item_visible(const OString& rIdent) const = 0;
+    virtual void set_item_label(const OString& rIdent, const OUString& rLabel) = 0;
+    virtual OUString get_item_label(const OString& rIdent) const = 0;
+    virtual void set_item_tooltip_text(const OString& rIdent, const OUString& rTip) = 0;
 
     virtual void insert_separator(int pos, const OUString& rId) = 0;
     void append_separator(const OUString& rId) { insert_separator(-1, rId); }
 
     virtual int get_n_items() const = 0;
     virtual OString get_item_ident(int nIndex) const = 0;
+    virtual void set_item_ident(int nIndex, const OString& rIdent) = 0;
     virtual void set_item_label(int nIndex, const OUString& rLabel) = 0;
     virtual void set_item_icon(int nIndex, const css::uno::Reference<css::graphic::XGraphic>& rIcon)
         = 0;
diff --git a/include/vcl/weldutils.hxx b/include/vcl/weldutils.hxx
index 764d343902df..66e37637e5f7 100644
--- a/include/vcl/weldutils.hxx
+++ b/include/vcl/weldutils.hxx
@@ -11,7 +11,6 @@
 #define INCLUDED_VCL_WELDUTILS_HXX
 
 #include <com/sun/star/awt/XWindow.hpp>
-#include <com/sun/star/frame/XFrame.hpp>
 #include <com/sun/star/uno/Reference.hxx>
 #include <comphelper/interfacecontainer2.hxx>
 #include <cppuhelper/compbase.hxx>
@@ -20,19 +19,6 @@
 
 namespace weld
 {
-class Toolbar;
-
-class VCL_DLLPUBLIC ToolbarUnoDispatcher
-{
-private:
-    css::uno::Reference<css::frame::XFrame> m_xFrame;
-    DECL_LINK(SelectHdl, const OString&, void);
-
-public:
-    // fill in the label and icons for actions and dispatch the action on item click
-    ToolbarUnoDispatcher(Toolbar& rToolbar, const css::uno::Reference<css::frame::XFrame>& rFrame);
-};
-
 typedef cppu::WeakComponentImplHelper<css::awt::XWindow> TransportAsXWindow_Base;
 
 class VCL_DLLPUBLIC TransportAsXWindow : public TransportAsXWindow_Base
diff --git a/sfx2/Library_sfx.mk b/sfx2/Library_sfx.mk
index 5bd8cfca2720..db9b8566b91d 100644
--- a/sfx2/Library_sfx.mk
+++ b/sfx2/Library_sfx.mk
@@ -290,6 +290,7 @@ $(eval $(call gb_Library_add_exception_objects,sfx,\
     sfx2/source/statbar/stbitem \
     sfx2/source/styles/StyleManager \
     sfx2/source/toolbox/tbxitem \
+    sfx2/source/toolbox/weldutils \
     sfx2/source/view/classificationcontroller \
     sfx2/source/view/classificationhelper \
     sfx2/source/view/frame \
diff --git a/sfx2/source/dialog/recfloat.cxx b/sfx2/source/dialog/recfloat.cxx
index 1ff4ba7e0873..ddefb1f6d572 100644
--- a/sfx2/source/dialog/recfloat.cxx
+++ b/sfx2/source/dialog/recfloat.cxx
@@ -102,7 +102,7 @@ SfxRecordingFloat_Impl::SfxRecordingFloat_Impl(SfxBindings* pBind, SfxChildWindo
     : SfxModelessDialogController(pBind, pChildWin, pParent, "sfx/ui/floatingrecord.ui",
                                   "FloatingRecord")
     , m_xToolbar(m_xBuilder->weld_toolbar("toolbar"))
-    , m_aDispatcher(*m_xToolbar, pBind->GetActiveFrame())
+    , m_xDispatcher(new ToolbarUnoDispatcher(*m_xToolbar, pBind->GetActiveFrame()))
 {
     // start recording
     SfxBoolItem aItem( SID_RECORDMACRO, true );
@@ -112,6 +112,7 @@ SfxRecordingFloat_Impl::SfxRecordingFloat_Impl(SfxBindings* pBind, SfxChildWindo
 
 SfxRecordingFloat_Impl::~SfxRecordingFloat_Impl()
 {
+    m_xDispatcher->dispose();
 }
 
 void SfxRecordingFloat_Impl::FillInfo( SfxChildWinInfo& rInfo ) const
diff --git a/sfx2/source/inc/recfloat.hxx b/sfx2/source/inc/recfloat.hxx
index e9d2dd7eb97e..b7aa71668491 100644
--- a/sfx2/source/inc/recfloat.hxx
+++ b/sfx2/source/inc/recfloat.hxx
@@ -20,9 +20,9 @@
 #ifndef INCLUDED_SFX2_SOURCE_INC_RECFLOAT_HXX
 #define INCLUDED_SFX2_SOURCE_INC_RECFLOAT_HXX
 
-#include <sfx2/childwin.hxx>
 #include <sfx2/basedlgs.hxx>
-#include <vcl/weldutils.hxx>
+#include <sfx2/childwin.hxx>
+#include <sfx2/weldutils.hxx>
 
 class SfxRecordingFloatWrapper_Impl : public SfxChildWindow
 {
@@ -41,7 +41,7 @@ public:
 class SfxRecordingFloat_Impl : public SfxModelessDialogController
 {
     std::unique_ptr<weld::Toolbar> m_xToolbar;
-    weld::ToolbarUnoDispatcher m_aDispatcher;
+    std::unique_ptr<ToolbarUnoDispatcher> m_xDispatcher;
 public:
     SfxRecordingFloat_Impl(SfxBindings* pBindings,
                            SfxChildWindow* pChildWin,
diff --git a/sfx2/source/sidebar/ControllerFactory.cxx b/sfx2/source/sidebar/ControllerFactory.cxx
index 643d364bb266..edb29abd5280 100644
--- a/sfx2/source/sidebar/ControllerFactory.cxx
+++ b/sfx2/source/sidebar/ControllerFactory.cxx
@@ -137,6 +137,55 @@ Reference<frame::XToolbarController> ControllerFactory::CreateToolBoxController(
     return xController;
 }
 
+Reference<frame::XToolbarController> ControllerFactory::CreateToolBoxController(
+    weld::Toolbar& rToolbar,
+    const OUString& rsCommandName,
+    const Reference<frame::XFrame>& rxFrame)
+{
+    Reference<frame::XToolbarController> xController;
+
+    xController.set(
+        static_cast<XWeak*>(new svt::GenericToolboxController(
+                ::comphelper::getProcessComponentContext(),
+                rxFrame,
+                rToolbar,
+                rsCommandName)),
+        UNO_QUERY);
+
+    // Initialize the controller with eg a service factory.
+    Reference<lang::XInitialization> xInitialization (xController, UNO_QUERY);
+    if (/*!bFactoryHasController &&*/ xInitialization.is())
+    {
+        beans::PropertyValue aPropValue;
+        std::vector<Any> aPropertyVector;
+
+        aPropValue.Name = "Frame";
+        aPropValue.Value <<= rxFrame;
+        aPropertyVector.push_back(makeAny(aPropValue));
+
+        aPropValue.Name = "ServiceManager";
+        aPropValue.Value <<= ::comphelper::getProcessServiceFactory();
+        aPropertyVector.push_back(makeAny(aPropValue));
+
+        aPropValue.Name = "CommandURL";
+        aPropValue.Value <<= rsCommandName;
+        aPropertyVector.push_back(makeAny(aPropValue));
+
+        Sequence<Any> aArgs (comphelper::containerToSequence(aPropertyVector));
+        xInitialization->initialize(aArgs);
+    }
+
+    if (xController.is())
+    {
+        Reference<util::XUpdatable> xUpdatable(xController, UNO_QUERY);
+        if (xUpdatable.is())
+            xUpdatable->update();
+    }
+
+    return xController;
+}
+
+
 Reference<frame::XToolbarController> ControllerFactory::CreateToolBarController(
     ToolBox* pToolBox,
     const OUString& rsCommandName,
diff --git a/sfx2/source/toolbox/weldutils.cxx b/sfx2/source/toolbox/weldutils.cxx
new file mode 100644
index 000000000000..3f2d0970cc6e
--- /dev/null
+++ b/sfx2/source/toolbox/weldutils.cxx
@@ -0,0 +1,135 @@
+/* -*- 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/.
+ */
+
+#include <comphelper/dispatchcommand.hxx>
+#include <sfx2/sidebar/ControllerFactory.hxx>
+#include <sfx2/weldutils.hxx>
+#include <vcl/commandinfoprovider.hxx>
+#include <vcl/settings.hxx>
+#include <vcl/weld.hxx>
+
+namespace
+{
+bool lcl_RTLizeCommandURL(OUString& rCommandURL)
+{
+    if (rCommandURL == ".uno:ParaLeftToRight")
+    {
+        rCommandURL = ".uno:ParaRightToLeft";
+        return true;
+    }
+    if (rCommandURL == ".uno:ParaRightToLeft")
+    {
+        rCommandURL = ".uno:ParaLeftToRight";
+        return true;
+    }
+    if (rCommandURL == ".uno:LeftPara")
+    {
+        rCommandURL = ".uno:RightPara";
+        return true;
+    }
+    if (rCommandURL == ".uno:RightPara")
+    {
+        rCommandURL = ".uno:LeftPara";
+        return true;
+    }
+    if (rCommandURL == ".uno:AlignLeft")
+    {
+        rCommandURL = ".uno:AlignRight";
+        return true;
+    }
+    if (rCommandURL == ".uno:AlignRight")
+    {
+        rCommandURL = ".uno:AlignLeft";
+        return true;
+    }
+    return false;
+}
+}
+
+ToolbarUnoDispatcher::ToolbarUnoDispatcher(weld::Toolbar& rToolbar,
+                                           const css::uno::Reference<css::frame::XFrame>& rFrame)
+    : m_xFrame(rFrame)
+    , m_pToolbar(&rToolbar)
+{
+    OUString aModuleName(vcl::CommandInfoProvider::GetModuleIdentifier(rFrame));
+    vcl::ImageType eSize = rToolbar.get_icon_size();
+
+    bool bRTL = AllSettings::GetLayoutRTL();
+
+    for (int i = 0, nItems = rToolbar.get_n_items(); i < nItems; ++i)
+    {
+        OUString sCommand = OUString::fromUtf8(rToolbar.get_item_ident(i));
+        if (bRTL && lcl_RTLizeCommandURL(sCommand))
+            rToolbar.set_item_ident(i, sCommand.toUtf8());
+
+        auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(sCommand, aModuleName);
+        OUString aLabel(vcl::CommandInfoProvider::GetLabelForCommand(aProperties));
+        rToolbar.set_item_label(i, aLabel);
+        OUString aTooltip(
+            vcl::CommandInfoProvider::GetTooltipForCommand(sCommand, aProperties, rFrame));
+        rToolbar.set_item_tooltip_text(i, aTooltip);
+        auto xImage(vcl::CommandInfoProvider::GetXGraphicForCommand(sCommand, rFrame, eSize));
+        rToolbar.set_item_icon(i, xImage);
+
+        CreateController(sCommand);
+    }
+
+    rToolbar.connect_clicked(LINK(this, ToolbarUnoDispatcher, SelectHdl));
+}
+
+void ToolbarUnoDispatcher::CreateController(const OUString& rCommand)
+{
+    css::uno::Reference<css::frame::XToolbarController> xController(
+        sfx2::sidebar::ControllerFactory::CreateToolBoxController(*m_pToolbar, rCommand, m_xFrame));
+
+    if (xController.is())
+        maControllers.insert(std::make_pair(rCommand, xController));
+}
+
+css::uno::Reference<css::frame::XToolbarController>
+ToolbarUnoDispatcher::GetControllerForCommand(const OUString& rCommand) const
+{
+    ControllerContainer::const_iterator iController(maControllers.find(rCommand));
+    if (iController != maControllers.end())
+        return iController->second;
+
+    return css::uno::Reference<css::frame::XToolbarController>();
+}
+
+IMPL_LINK(ToolbarUnoDispatcher, SelectHdl, const OString&, rCommand, void)
+{
+    css::uno::Reference<css::frame::XToolbarController> xController(
+        GetControllerForCommand(OUString::fromUtf8(rCommand)));
+
+    if (xController.is())
+        xController->execute(0);
+}
+
+void ToolbarUnoDispatcher::dispose()
+{
+    if (!m_pToolbar)
+        return;
+
+    ControllerContainer aControllers;
+    aControllers.swap(maControllers);
+    for (auto const& controller : aControllers)
+    {
+        css::uno::Reference<css::lang::XComponent> xComponent(controller.second,
+                                                              css::uno::UNO_QUERY);
+        if (xComponent.is())
+            xComponent->dispose();
+    }
+
+    m_pToolbar->connect_clicked(Link<const OString&, void>());
+    m_pToolbar = nullptr;
+}
+
+ToolbarUnoDispatcher::~ToolbarUnoDispatcher() { dispose(); }
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/svtools/source/uno/generictoolboxcontroller.cxx b/svtools/source/uno/generictoolboxcontroller.cxx
index c4e409546018..e126ec8b68a1 100644
--- a/svtools/source/uno/generictoolboxcontroller.cxx
+++ b/svtools/source/uno/generictoolboxcontroller.cxx
@@ -26,6 +26,7 @@
 #include <com/sun/star/frame/XDispatch.hpp>
 
 #include <vcl/svapp.hxx>
+#include <vcl/weld.hxx>
 
 using namespace css::awt;
 using namespace css::uno;
@@ -53,10 +54,28 @@ GenericToolboxController::GenericToolboxController( const Reference< XComponentC
                                                     const Reference< XFrame >&            rFrame,
                                                     ToolBox*                              pToolbox,
                                                     sal_uInt16                            nID,
-                                                    const OUString&                       aCommand ) :
-    svt::ToolboxController( rxContext, rFrame, aCommand )
-    ,   m_pToolbox( pToolbox )
-    ,   m_nID( nID )
+                                                    const OUString&                       aCommand )
+    : svt::ToolboxController( rxContext, rFrame, aCommand )
+    , m_xToolbox( pToolbox )
+    , m_nID( nID )
+    , m_pToolbox(nullptr)
+{
+    // Initialization is done through ctor
+    m_bInitialized = true;
+
+    // insert main command to our listener map
+    if ( !m_aCommandURL.isEmpty() )
+        m_aListenerMap.emplace( aCommand, Reference< XDispatch >() );
+}
+
+GenericToolboxController::GenericToolboxController( const Reference< XComponentContext >& rxContext,
+                                                    const Reference< XFrame >&            rFrame,
+                                                    weld::Toolbar&                        rToolbar,
+                                                    const OUString&                       aCommand )
+    : svt::ToolboxController( rxContext, rFrame, aCommand )
+    , m_xToolbox( nullptr )
+    , m_nID( 0 )
+    , m_pToolbox(&rToolbar)
 {
     // Initialization is done through ctor
     m_bInitialized = true;
@@ -73,8 +92,9 @@ GenericToolboxController::~GenericToolboxController()
 void SAL_CALL GenericToolboxController::dispose()
 {
     SolarMutexGuard aSolarMutexGuard;
-    m_pToolbox.clear();
+    m_xToolbox.clear();
     m_nID = 0;
+    m_pToolbox = nullptr;
     svt::ToolboxController::dispose();
 }
 
@@ -125,40 +145,60 @@ void GenericToolboxController::statusChanged( const FeatureStateEvent& Event )
     if ( m_bDisposed )
         return;
 
-    if ( !m_pToolbox )
-        return;
+    if (m_xToolbox)
+    {
+        m_xToolbox->EnableItem( m_nID, Event.IsEnabled );
 
-    m_pToolbox->EnableItem( m_nID, Event.IsEnabled );
+        ToolBoxItemBits nItemBits = m_xToolbox->GetItemBits( m_nID );
+        nItemBits &= ~ToolBoxItemBits::CHECKABLE;
+        TriState eTri = TRISTATE_FALSE;
 
-    ToolBoxItemBits nItemBits = m_pToolbox->GetItemBits( m_nID );
-    nItemBits &= ~ToolBoxItemBits::CHECKABLE;
-    TriState eTri = TRISTATE_FALSE;
+        bool        bValue;
+        OUString    aStrValue;
+        ItemStatus  aItemState;
 
-    bool        bValue;
-    OUString    aStrValue;
-    ItemStatus  aItemState;
+        if ( Event.State >>= bValue )
+        {
+            // Boolean, treat it as checked/unchecked
+            m_xToolbox->SetItemBits( m_nID, nItemBits );
+            m_xToolbox->CheckItem( m_nID, bValue );
+            if ( bValue )
+                eTri = TRISTATE_TRUE;
+            nItemBits |= ToolBoxItemBits::CHECKABLE;
+        }
+        else if ( Event.State >>= aStrValue )
+        {
+            m_xToolbox->SetItemText( m_nID, aStrValue );
+        }
+        else if ( Event.State >>= aItemState )
+        {
+            eTri = TRISTATE_INDET;
+            nItemBits |= ToolBoxItemBits::CHECKABLE;
+        }
 
-    if ( Event.State >>= bValue )
-    {
-        // Boolean, treat it as checked/unchecked
-        m_pToolbox->SetItemBits( m_nID, nItemBits );
-        m_pToolbox->CheckItem( m_nID, bValue );
-        if ( bValue )
-            eTri = TRISTATE_TRUE;
-        nItemBits |= ToolBoxItemBits::CHECKABLE;
+        m_xToolbox->SetItemState( m_nID, eTri );
+        m_xToolbox->SetItemBits( m_nID, nItemBits );
     }
-    else if ( Event.State >>= aStrValue )
-    {
-        m_pToolbox->SetItemText( m_nID, aStrValue );
-    }
-    else if ( Event.State >>= aItemState )
+
+    if (m_pToolbox)
     {
-        eTri = TRISTATE_INDET;
-        nItemBits |= ToolBoxItemBits::CHECKABLE;
-    }
+        OString sId = m_aCommandURL.toUtf8();
 
-    m_pToolbox->SetItemState( m_nID, eTri );
-    m_pToolbox->SetItemBits( m_nID, nItemBits );
+        m_pToolbox->set_item_sensitive(sId, Event.IsEnabled);
+
+        bool        bValue;
+        OUString    aStrValue;
+
+        if ( Event.State >>= bValue )
+        {
+            // Boolean, treat it as checked/unchecked
+            m_pToolbox->set_item_active( sId, bValue );
+        }
+        else if ( Event.State >>= aStrValue )
+        {
+            m_pToolbox->set_item_label( sId, aStrValue );
+        }
+    }
 }
 
 IMPL_STATIC_LINK( GenericToolboxController, ExecuteHdl_Impl, void*, p, void )
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 7e56847ae509..33870d28111d 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -971,6 +971,16 @@ public:
         return m_xToolBox->IsItemEnabled(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)));
     }
 
+    virtual void set_item_visible(const OString& rIdent, bool bVisible) override
+    {
+        m_xToolBox->ShowItem(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)), bVisible);
+    }
+
+    virtual bool get_item_visible(const OString& rIdent) const override
+    {
+        return m_xToolBox->IsItemVisible(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)));
+    }
+
     virtual void set_item_active(const OString& rIdent, bool bActive) override
     {
         sal_uInt16 nItemId = m_xToolBox->GetItemId(OUString::fromUtf8(rIdent));
@@ -1045,11 +1055,26 @@ public:
         return m_xToolBox->GetItemCommand(m_xToolBox->GetItemId(nIndex)).toUtf8();
     }
 
+    virtual void set_item_ident(int nIndex, const OString& rIdent) override
+    {
+        return m_xToolBox->SetItemCommand(m_xToolBox->GetItemId(nIndex), OUString::fromUtf8(rIdent));
+    }
+
     virtual void set_item_label(int nIndex, const OUString& rLabel) override
     {
         m_xToolBox->SetItemText(m_xToolBox->GetItemId(nIndex), rLabel);
     }
 
+    virtual OUString get_item_label(const OString& rIdent) const override
+    {
+        return m_xToolBox->GetItemText(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)));
+    }
+
+    virtual void set_item_label(const OString& rIdent, const OUString& rLabel) override
+    {
+        m_xToolBox->SetItemText(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)), rLabel);
+    }
+
     virtual void set_item_icon(int nIndex, const css::uno::Reference<css::graphic::XGraphic>& rIcon) override
     {
         m_xToolBox->SetItemImage(m_xToolBox->GetItemId(nIndex), Image(rIcon));
@@ -1060,6 +1085,11 @@ public:
         m_xToolBox->SetQuickHelpText(m_xToolBox->GetItemId(nIndex), rTip);
     }
 
+    virtual void set_item_tooltip_text(const OString& rIdent, const OUString& rTip) override
+    {
+        m_xToolBox->SetQuickHelpText(m_xToolBox->GetItemId(OUString::fromUtf8(rIdent)), rTip);
+    }
+
     virtual vcl::ImageType get_icon_size() const override
     {
         return m_xToolBox->GetImageSize();
diff --git a/vcl/source/app/weldutils.cxx b/vcl/source/app/weldutils.cxx
index 8fc3a16459cf..dea707be3c5e 100644
--- a/vcl/source/app/weldutils.cxx
+++ b/vcl/source/app/weldutils.cxx
@@ -7,9 +7,9 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  */
 
-#include <comphelper/dispatchcommand.hxx>
 #include <vcl/builderpage.hxx>
 #include <vcl/commandinfoprovider.hxx>
+#include <vcl/settings.hxx>
 #include <vcl/svapp.hxx>
 #include <vcl/weldutils.hxx>
 
@@ -105,36 +105,6 @@ void TriStateEnabled::ButtonToggled(weld::ToggleButton& rToggle)
     }
     eState = rToggle.get_state();
 }
-
-ToolbarUnoDispatcher::ToolbarUnoDispatcher(Toolbar& rToolbar,
-                                           const css::uno::Reference<css::frame::XFrame>& rFrame)
-    : m_xFrame(rFrame)
-{
-    OUString aModuleName(vcl::CommandInfoProvider::GetModuleIdentifier(rFrame));
-    vcl::ImageType eSize = rToolbar.get_icon_size();
-
-    for (int i = 0, nItems = rToolbar.get_n_items(); i < nItems; ++i)
-    {
-        OUString sCommand = OUString::fromUtf8(rToolbar.get_item_ident(i));
-
-        auto aProperties = vcl::CommandInfoProvider::GetCommandProperties(sCommand, aModuleName);
-        OUString aLabel(vcl::CommandInfoProvider::GetLabelForCommand(aProperties));
-        rToolbar.set_item_label(i, aLabel);
-        OUString aTooltip(
-            vcl::CommandInfoProvider::GetTooltipForCommand(sCommand, aProperties, rFrame));
-        rToolbar.set_item_tooltip_text(i, aTooltip);
-        auto xImage(vcl::CommandInfoProvider::GetXGraphicForCommand(sCommand, rFrame, eSize));
-        rToolbar.set_item_icon(i, xImage);
-    }
-
-    rToolbar.connect_clicked(LINK(this, ToolbarUnoDispatcher, SelectHdl));
-}
-
-IMPL_LINK(ToolbarUnoDispatcher, SelectHdl, const OString&, rCommand, void)
-{
-    comphelper::dispatchCommand(OUString::fromUtf8(rCommand), m_xFrame,
-                                css::uno::Sequence<css::beans::PropertyValue>());
-}
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 152893cad43f..05e0b89efad0 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -7122,6 +7122,18 @@ public:
         return gtk_widget_get_sensitive(GTK_WIDGET(m_aMap.find(rIdent)->second));
     }
 
+    virtual void set_item_visible(const OString& rIdent, bool bVisible) override
+    {
+        disable_item_notify_events();
+        gtk_widget_set_visible(GTK_WIDGET(m_aMap[rIdent]), bVisible);
+        enable_item_notify_events();
+    }
+
+    virtual bool get_item_visible(const OString& rIdent) const override
+    {
+        return gtk_widget_get_visible(GTK_WIDGET(m_aMap.find(rIdent)->second));
+    }
+
     virtual void set_item_active(const OString& rIdent, bool bActive) override
     {
         disable_item_notify_events();
@@ -7178,12 +7190,30 @@ public:
         return OString(pStr, pStr ? strlen(pStr) : 0);
     }
 
+    virtual void set_item_ident(int nIndex, const OString& rIdent) override
+    {
+        GtkToolItem* pItem = gtk_toolbar_get_nth_item(m_pToolbar, nIndex);
+        gtk_buildable_set_name(GTK_BUILDABLE(pItem), rIdent.getStr());
+    }
+
     virtual void set_item_label(int nIndex, const OUString& rLabel) override
     {
         GtkToolItem* pItem = gtk_toolbar_get_nth_item(m_pToolbar, nIndex);
         gtk_tool_button_set_label(GTK_TOOL_BUTTON(pItem), MapToGtkAccelerator(rLabel).getStr());
     }
 
+    virtual void set_item_label(const OString& rIdent, const OUString& rLabel) override
+    {
+        GtkToolButton* pItem = m_aMap[rIdent];
+        gtk_tool_button_set_label(GTK_TOOL_BUTTON(pItem), MapToGtkAccelerator(rLabel).getStr());
+    }
+
+    OUString get_item_label(const OString& rIdent) const override
+    {
+        const gchar* pText = gtk_tool_button_get_label(m_aMap.find(rIdent)->second);
+        return OUString(pText, pText ? strlen(pText) : 0, RTL_TEXTENCODING_UTF8);
+    }
+
     virtual void set_item_icon(int nIndex, const css::uno::Reference<css::graphic::XGraphic>& rIcon) override
     {
         GtkToolItem* pItem = gtk_toolbar_get_nth_item(m_pToolbar, nIndex);
@@ -7206,6 +7236,12 @@ public:
         gtk_widget_set_tooltip_text(GTK_WIDGET(pItem), OUStringToOString(rTip, RTL_TEXTENCODING_UTF8).getStr());
     }
 
+    virtual void set_item_tooltip_text(const OString& rIdent, const OUString& rTip) override
+    {
+        GtkToolButton* pItem = m_aMap[rIdent];
+        gtk_widget_set_tooltip_text(GTK_WIDGET(pItem), OUStringToOString(rTip, RTL_TEXTENCODING_UTF8).getStr());
+    }
+
     virtual vcl::ImageType get_icon_size() const override
     {
         return GtkToVcl(gtk_toolbar_get_icon_size(m_pToolbar));


More information about the Libreoffice-commits mailing list