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,