framework/inc/uielement/styletoolbarcontroller.hxx    |    4 +
 framework/source/uielement/styletoolbarcontroller.cxx |   47 +++++++++++++-----
 2 files changed, 39 insertions(+), 12 deletions(-)

New commits:
commit 9a459a782b9cb03ef70906a7916dc70adebb6cc5
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Fri Dec 6 17:51:10 2024 +0500
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Mon Dec 9 14:40:20 2024 +0100

    Let StyleDispatcher take the state of StyleApply slot into account
    
    Before, it only listened to ParaStyle, or CharStyle, etc. obtained
    in MapFamilyToCommand; and that meant, that its actual command was
    ".uno:StyleApply?...", but StyleApply state was ignored. This meant
    that all respective items under "Style" menu were enabled in read-
    only mode, where StyleApply itself was inactive.
    
    Listen to both. When StyleApply is disabled, that takes priority.
    
    Change-Id: Ic087ba6fc6fe6d45b8c8ecc35494734cd8765bd4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/178008
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/framework/inc/uielement/styletoolbarcontroller.hxx 
b/framework/inc/uielement/styletoolbarcontroller.hxx
index 45b1ad7eccce..c155a7b2242b 100644
--- a/framework/inc/uielement/styletoolbarcontroller.hxx
+++ b/framework/inc/uielement/styletoolbarcontroller.hxx
@@ -52,8 +52,10 @@ private:
     OUString m_aStyleName, m_aCommand, m_aStatusCommand;
     css::uno::Reference< css::util::XURLTransformer > m_xUrlTransformer;
     css::uno::Reference< css::frame::XDispatchProvider > m_xFrame;
-    css::uno::Reference< css::frame::XDispatch > m_xStatusDispatch;
+    css::uno::Reference< css::frame::XDispatch > m_xStyleApplyStatusDispatch;
+    css::uno::Reference< css::frame::XDispatch > m_xStyleFamilyStatusDispatch;
     css::uno::Reference< css::frame::XStatusListener > m_xOwner;
+    bool m_bStyleApplyEnabled = true; // If this is disabled, style family 
state is irrelevant
 };
 
 class StyleToolbarController final : public svt::ToolboxController
diff --git a/framework/source/uielement/styletoolbarcontroller.cxx 
b/framework/source/uielement/styletoolbarcontroller.cxx
index 3ff1e777eb6d..e2ebc5032d1e 100644
--- a/framework/source/uielement/styletoolbarcontroller.cxx
+++ b/framework/source/uielement/styletoolbarcontroller.cxx
@@ -127,9 +127,12 @@ StyleDispatcher::StyleDispatcher( const 
css::uno::Reference< css::frame::XFrame
     if ( m_xFrame.is() )
     {
         css::util::URL aStatusURL;
+        aStatusURL.Complete = u".uno:StyleApply"_ustr;
+        m_xUrlTransformer->parseStrict( aStatusURL );
+        m_xStyleApplyStatusDispatch = m_xFrame->queryDispatch(aStatusURL, 
OUString(), 0);
         aStatusURL.Complete = m_aStatusCommand;
         m_xUrlTransformer->parseStrict( aStatusURL );
-        m_xStatusDispatch = m_xFrame->queryDispatch( aStatusURL, OUString(), 0 
);
+        m_xStyleFamilyStatusDispatch = m_xFrame->queryDispatch(aStatusURL, 
OUString(), 0);
     }
 }
 
@@ -147,32 +150,51 @@ void StyleDispatcher::dispatch( const css::util::URL& 
rURL,
 void StyleDispatcher::addStatusListener( const css::uno::Reference< 
css::frame::XStatusListener >& rListener,
                                          const css::util::URL& /*rURL*/ )
 {
-    if ( m_xStatusDispatch.is() )
+    if ( !m_xOwner.is() )
+        m_xOwner.set( rListener );
+    if (m_xStyleApplyStatusDispatch)
+    {
+        css::util::URL aStatusURL;
+        aStatusURL.Complete = u".uno:StyleApply"_ustr;
+        m_xUrlTransformer->parseStrict(aStatusURL);
+        m_xStyleApplyStatusDispatch->addStatusListener(this, aStatusURL);
+    }
+    if (m_xStyleFamilyStatusDispatch)
     {
-        if ( !m_xOwner.is() )
-            m_xOwner.set( rListener );
-
         css::util::URL aStatusURL;
         aStatusURL.Complete = m_aStatusCommand;
         m_xUrlTransformer->parseStrict( aStatusURL );
-        m_xStatusDispatch->addStatusListener( this, aStatusURL );
+        m_xStyleFamilyStatusDispatch->addStatusListener(this, aStatusURL);
     }
 }
 
 void StyleDispatcher::removeStatusListener( const css::uno::Reference< 
css::frame::XStatusListener >& /*rListener*/,
                                             const css::util::URL& /*rURL*/ )
 {
-    if ( m_xStatusDispatch.is() )
+    if (m_xStyleFamilyStatusDispatch)
     {
         css::util::URL aStatusURL;
         aStatusURL.Complete = m_aStatusCommand;
         m_xUrlTransformer->parseStrict( aStatusURL );
-        m_xStatusDispatch->removeStatusListener( this, aStatusURL );
+        m_xStyleFamilyStatusDispatch->removeStatusListener(this, aStatusURL);
+    }
+    if (m_xStyleApplyStatusDispatch)
+    {
+        css::util::URL aStatusURL;
+        aStatusURL.Complete = u".uno:StyleApply"_ustr;
+        m_xUrlTransformer->parseStrict(aStatusURL);
+        m_xStyleApplyStatusDispatch->removeStatusListener(this, aStatusURL);
     }
 }
 
 void StyleDispatcher::statusChanged( const css::frame::FeatureStateEvent& 
rEvent )
 {
+    if (rEvent.FeatureURL.Complete == ".uno:StyleApply")
+    {
+        m_bStyleApplyEnabled = rEvent.IsEnabled;
+        return;
+    }
+
     css::frame::status::Template aTemplate;
     rEvent.State >>= aTemplate;
 
@@ -180,15 +202,18 @@ void StyleDispatcher::statusChanged( const 
css::frame::FeatureStateEvent& rEvent
     aEvent.FeatureURL.Complete = m_aCommand;
     m_xUrlTransformer->parseStrict( aEvent.FeatureURL );
 
-    aEvent.IsEnabled = rEvent.IsEnabled;
+    aEvent.IsEnabled = m_bStyleApplyEnabled && rEvent.IsEnabled;
     aEvent.Requery = rEvent.Requery;
     aEvent.State <<= m_aStyleName == aTemplate.StyleName;
     m_xOwner->statusChanged( aEvent );
 }
 
-void StyleDispatcher::disposing( const css::lang::EventObject& /*rSource*/ )
+void StyleDispatcher::disposing( const css::lang::EventObject& rSource )
 {
-    m_xStatusDispatch.clear();
+    if (rSource.Source == m_xStyleFamilyStatusDispatch)
+        m_xStyleFamilyStatusDispatch.clear();
+    if (rSource.Source == m_xStyleApplyStatusDispatch)
+        m_xStyleApplyStatusDispatch.clear();
 }
 
 StyleToolbarController::StyleToolbarController( const css::uno::Reference< 
css::uno::XComponentContext >& rContext,

Reply via email to