starmath/source/accessibility.cxx | 176 ++------------------------------------ starmath/source/accessibility.hxx | 43 ++------- starmath/source/view.cxx | 2 3 files changed, 22 insertions(+), 199 deletions(-)
New commits: commit 25798f072420fd0a3e3111a8f47614edf6d5f5f3 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Wed Feb 12 15:02:30 2025 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Wed Feb 12 20:05:47 2025 +0100 math a11y: Drop SmGraphicAccessible::getAccessibleIndexInParent The base class implementation in OCommonAccessibleComponent::getAccessibleIndexInParent already implements the same logic. Change-Id: I47ca934da330c90a68dc0060a68121fe34a5ce01 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181504 Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> Tested-by: Jenkins diff --git a/starmath/source/accessibility.cxx b/starmath/source/accessibility.cxx index 62bb72af15cb..d34746c862a0 100644 --- a/starmath/source/accessibility.cxx +++ b/starmath/source/accessibility.cxx @@ -171,43 +171,6 @@ Reference< XAccessible > SAL_CALL SmGraphicAccessible::getAccessibleParent() return pWin->GetDrawingArea()->get_accessible_parent(); } -sal_Int64 SAL_CALL SmGraphicAccessible::getAccessibleIndexInParent() -{ - SolarMutexGuard aGuard; - - // -1 for child not found/no parent (according to specification) - sal_Int64 nRet = -1; - - css::uno::Reference<css::accessibility::XAccessible> xParent(getAccessibleParent()); - if (!xParent) - return nRet; - - try - { - css::uno::Reference<css::accessibility::XAccessibleContext> xParentContext( - xParent->getAccessibleContext()); - - // iterate over parent's children and search for this object - if (xParentContext.is()) - { - sal_Int64 nChildCount = xParentContext->getAccessibleChildCount(); - for (sal_Int64 nChild = 0; (nChild < nChildCount) && (-1 == nRet); ++nChild) - { - css::uno::Reference<css::accessibility::XAccessible> xChild( - xParentContext->getAccessibleChild(nChild)); - if (xChild.get() == this) - nRet = nChild; - } - } - } - catch (const css::uno::Exception&) - { - TOOLS_WARN_EXCEPTION("svx", "WeldEditAccessible::getAccessibleIndexInParent"); - } - - return nRet; -} - sal_Int16 SAL_CALL SmGraphicAccessible::getAccessibleRole() { return AccessibleRole::DOCUMENT; diff --git a/starmath/source/accessibility.hxx b/starmath/source/accessibility.hxx index 1a193f7dba1d..59081ae74b31 100644 --- a/starmath/source/accessibility.hxx +++ b/starmath/source/accessibility.hxx @@ -77,7 +77,6 @@ public: virtual sal_Int64 SAL_CALL getAccessibleChildCount( ) override; virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleChild( sal_Int64 i ) override; virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleParent( ) override; - virtual sal_Int64 SAL_CALL getAccessibleIndexInParent( ) override; virtual sal_Int16 SAL_CALL getAccessibleRole( ) override; virtual OUString SAL_CALL getAccessibleDescription( ) override; virtual OUString SAL_CALL getAccessibleName( ) override; commit f9cdea4bb53c3c954b9656a94e711276d553bf40 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Wed Feb 12 14:56:10 2025 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Wed Feb 12 20:05:41 2025 +0100 math a11y: Use comphelper::OAccessibleComponentHelper Turn SmGraphicAccessible into a comphelper::OAccessibleComponentHelper subclass. comphelper::OAccessibleComponentHelper already implements the logic for event handling and most of the location/bounds handling, so avoid reimplementing it. Move the SmGraphicAccessible::ClearWin logic into SmGraphicAccessible::disposing and call SmGraphicAccessible::dispose from the SmGraphicWidget dtor instead. Change-Id: I0fa3e6e5a73a8318be730e8165a0e0f149b771ca Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181503 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/starmath/source/accessibility.cxx b/starmath/source/accessibility.cxx index 98df66e81d62..62bb72af15cb 100644 --- a/starmath/source/accessibility.cxx +++ b/starmath/source/accessibility.cxx @@ -51,10 +51,9 @@ using namespace com::sun::star::lang; using namespace com::sun::star::uno; using namespace com::sun::star::accessibility; -SmGraphicAccessible::SmGraphicAccessible(SmGraphicWidget *pGraphicWin) : - aAccName (SmResId(RID_DOCUMENTSTR)), - nClientId (0), - pWin (pGraphicWin) +SmGraphicAccessible::SmGraphicAccessible(SmGraphicWidget* pGraphicWin) + : aAccName(SmResId(RID_DOCUMENTSTR)) + , pWin(pGraphicWin) { assert(pWin && "SmGraphicAccessible: window missing"); } @@ -78,14 +77,11 @@ OUString SmGraphicAccessible::GetAccessibleText_Impl() return aTxt; } -void SmGraphicAccessible::ClearWin() +void SAL_CALL SmGraphicAccessible::disposing() { pWin = nullptr; // implicitly results in AccessibleStateType::DEFUNC set - if ( nClientId ) - { - comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( std::exchange(nClientId, 0), *this ); - } + comphelper::OAccessibleComponentHelper::disposing(); } void SmGraphicAccessible::LaunchEvent( @@ -93,15 +89,7 @@ void SmGraphicAccessible::LaunchEvent( const uno::Any &rOldVal, const uno::Any &rNewVal) { - AccessibleEventObject aEvt; - aEvt.Source = static_cast<XAccessible *>(this); - aEvt.EventId = nAccessibleEventId; - aEvt.OldValue = rOldVal; - aEvt.NewValue = rNewVal ; - - // pass event on to event-listener's - if (nClientId) - comphelper::AccessibleEventNotifier::addEvent( nClientId, aEvt ); + NotifyAccessibleEvent(nAccessibleEventId, rOldVal, rNewVal); } uno::Reference< XAccessibleContext > SAL_CALL SmGraphicAccessible::getAccessibleContext() @@ -109,90 +97,21 @@ uno::Reference< XAccessibleContext > SAL_CALL SmGraphicAccessible::getAccessible return this; } -sal_Bool SAL_CALL SmGraphicAccessible::containsPoint( const awt::Point& aPoint ) -{ - //! the arguments coordinates are relative to the current window ! - //! Thus the top-left point is (0, 0) - - SolarMutexGuard aGuard; - if (!pWin) - throw RuntimeException(); - - Size aSz( pWin->GetOutputSizePixel() ); - return aPoint.X >= 0 && aPoint.Y >= 0 && - aPoint.X < aSz.Width() && aPoint.Y < aSz.Height(); -} - uno::Reference<XAccessible> SAL_CALL SmGraphicAccessible::getAccessibleAtPoint(const awt::Point&) { SolarMutexGuard aGuard; return nullptr; } -awt::Rectangle SAL_CALL SmGraphicAccessible::getBounds() +awt::Rectangle SmGraphicAccessible::implGetBounds() { - SolarMutexGuard aGuard; - if (!pWin) - throw RuntimeException(); + assert(pWin); const Size aOutSize(pWin->GetOutputSizePixel()); return css::awt::Rectangle(0, 0, aOutSize.Width(), aOutSize.Height()); } -awt::Point SAL_CALL SmGraphicAccessible::getLocation() -{ - SolarMutexGuard aGuard; - if (!pWin) - throw RuntimeException(); - - const css::awt::Rectangle aRect(getBounds()); - css::awt::Point aRet; - - aRet.X = aRect.X; - aRet.Y = aRect.Y; - - return aRet; -} - -awt::Point SAL_CALL SmGraphicAccessible::getLocationOnScreen() -{ - SolarMutexGuard aGuard; - if (!pWin) - throw RuntimeException(); - - css::awt::Point aScreenLoc(0, 0); - - css::uno::Reference<css::accessibility::XAccessible> xParent(getAccessibleParent()); - if (xParent) - { - css::uno::Reference<css::accessibility::XAccessibleContext> xParentContext( - xParent->getAccessibleContext()); - css::uno::Reference<css::accessibility::XAccessibleComponent> xParentComponent( - xParentContext, css::uno::UNO_QUERY); - OSL_ENSURE(xParentComponent.is(), - "WeldEditAccessible::getLocationOnScreen: no parent component!"); - if (xParentComponent.is()) - { - css::awt::Point aParentScreenLoc(xParentComponent->getLocationOnScreen()); - css::awt::Point aOwnRelativeLoc(getLocation()); - aScreenLoc.X = aParentScreenLoc.X + aOwnRelativeLoc.X; - aScreenLoc.Y = aParentScreenLoc.Y + aOwnRelativeLoc.Y; - } - } - - return aScreenLoc; -} - -awt::Size SAL_CALL SmGraphicAccessible::getSize() -{ - SolarMutexGuard aGuard; - if (!pWin) - throw RuntimeException(); - Size aSz(pWin->GetOutputSizePixel()); - return css::awt::Size(aSz.Width(), aSz.Height()); -} - void SAL_CALL SmGraphicAccessible::grabFocus() { SolarMutexGuard aGuard; @@ -348,40 +267,6 @@ Locale SAL_CALL SmGraphicAccessible::getLocale() return Application::GetSettings().GetUILanguageTag().getLocale(); } - -void SAL_CALL SmGraphicAccessible::addAccessibleEventListener( - const Reference< XAccessibleEventListener >& xListener ) -{ - if (xListener.is()) - { - SolarMutexGuard aGuard; - if (pWin) - { - if (!nClientId) - nClientId = comphelper::AccessibleEventNotifier::registerClient( ); - comphelper::AccessibleEventNotifier::addEventListener( nClientId, xListener ); - } - } -} - -void SAL_CALL SmGraphicAccessible::removeAccessibleEventListener( - const Reference< XAccessibleEventListener >& xListener ) -{ - if (!(xListener.is() && nClientId)) - return; - - SolarMutexGuard aGuard; - sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( nClientId, xListener ); - if ( !nListenerCount ) - { - // no listeners anymore - // -> revoke ourself. This may lead to the notifier thread dying (if we were the last client), - // and at least to us not firing any events anymore, in case somebody calls - // NotifyAccessibleEvent, again - comphelper::AccessibleEventNotifier::revokeClient( std::exchange(nClientId, 0) ); - } -} - sal_Int32 SAL_CALL SmGraphicAccessible::getCaretPosition() { return 0; diff --git a/starmath/source/accessibility.hxx b/starmath/source/accessibility.hxx index fd41e5a32146..1a193f7dba1d 100644 --- a/starmath/source/accessibility.hxx +++ b/starmath/source/accessibility.hxx @@ -21,12 +21,10 @@ #include <com/sun/star/accessibility/AccessibleScrollType.hpp> #include <com/sun/star/accessibility/XAccessible.hpp> -#include <com/sun/star/accessibility/XAccessibleComponent.hpp> -#include <com/sun/star/accessibility/XAccessibleContext.hpp> #include <com/sun/star/accessibility/XAccessibleText.hpp> -#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp> #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/uno/Reference.h> +#include <comphelper/accessiblecomponenthelper.hxx> #include <cppuhelper/implbase.hxx> #include <view.hxx> @@ -35,27 +33,14 @@ class SmDocShell; namespace accessibility { class AccessibleTextHelper; } -// classes and helper-classes used for accessibility in the graphic-window +// classe used for accessibility in the graphic-window - -typedef -cppu::WeakImplHelper - < - css::lang::XServiceInfo, - css::accessibility::XAccessible, - css::accessibility::XAccessibleComponent, - css::accessibility::XAccessibleContext, - css::accessibility::XAccessibleText, - css::accessibility::XAccessibleEventBroadcaster - > -SmGraphicAccessibleBaseClass; - -class SmGraphicAccessible final : - public SmGraphicAccessibleBaseClass +class SmGraphicAccessible final + : public cppu::ImplInheritanceHelper<comphelper::OAccessibleComponentHelper, + css::lang::XServiceInfo, css::accessibility::XAccessible, + css::accessibility::XAccessibleText> { OUString aAccName; - /// client id in the AccessibleEventNotifier queue - sal_uInt32 nClientId; SmGraphicWidget* pWin; @@ -65,26 +50,25 @@ class SmGraphicAccessible final : SmDocShell * GetDoc_Impl(); OUString GetAccessibleText_Impl(); +protected: + virtual css::awt::Rectangle implGetBounds() override; + public: explicit SmGraphicAccessible( SmGraphicWidget *pGraphicWin ); virtual ~SmGraphicAccessible() override; - void ClearWin(); // to be called when view is destroyed void LaunchEvent( const sal_Int16 nAccessibleEventId, const css::uno::Any &rOldVal, const css::uno::Any &rNewVal); + void SAL_CALL disposing() override; + // XAccessible virtual css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext( ) override; // XAccessibleComponent - virtual sal_Bool SAL_CALL containsPoint( const css::awt::Point& aPoint ) override; virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL getAccessibleAtPoint( const css::awt::Point& aPoint ) override; - virtual css::awt::Rectangle SAL_CALL getBounds( ) override; - virtual css::awt::Point SAL_CALL getLocation( ) override; - virtual css::awt::Point SAL_CALL getLocationOnScreen( ) override; - virtual css::awt::Size SAL_CALL getSize( ) override; virtual void SAL_CALL grabFocus( ) override; virtual sal_Int32 SAL_CALL getForeground( ) override; virtual sal_Int32 SAL_CALL getBackground( ) override; @@ -101,10 +85,6 @@ public: virtual sal_Int64 SAL_CALL getAccessibleStateSet( ) override; virtual css::lang::Locale SAL_CALL getLocale( ) override; - // XAccessibleEventBroadcaster - virtual void SAL_CALL addAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override; - virtual void SAL_CALL removeAccessibleEventListener( const css::uno::Reference< css::accessibility::XAccessibleEventListener >& xListener ) override; - // XAccessibleText virtual sal_Int32 SAL_CALL getCaretPosition( ) override; virtual sal_Bool SAL_CALL setCaretPosition ( sal_Int32 nIndex ) override; diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx index ac6c90d78747..430745e33644 100644 --- a/starmath/source/view.cxx +++ b/starmath/source/view.cxx @@ -349,7 +349,7 @@ void SmGraphicWidget::SetDrawingArea(weld::DrawingArea* pDrawingArea) SmGraphicWidget::~SmGraphicWidget() { if (mxAccessible.is()) - mxAccessible->ClearWin(); // make Accessible nonfunctional + mxAccessible->dispose(); mxAccessible.clear(); CaretBlinkStop(); } commit 6afcb3da1f7831ef53af014ebf510cc830f03452 Author: Michael Weghorn <m.wegh...@posteo.de> AuthorDate: Wed Feb 12 14:44:20 2025 +0100 Commit: Michael Weghorn <m.wegh...@posteo.de> CommitDate: Wed Feb 12 20:05:34 2025 +0100 math a11y: Don't return self in SmGraphicAccessible::getAccessibleAtPoint As the XAccessibleComponent::getAccessibleAtPoint doc says, the purpose of this method is: > Returns the Accessible child that is rendered under the given point. Returning a reference to self is incorrect and bad. It e.g. triggers an infinite loop when using Accerciser's "Inspect object under mouse" feature when the mouse is over the formula in Math, because it recursively queries for the child at the position until null is returned. Change-Id: I1aefd6fe69df32bb766351fe068d1c8b151156ea Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181496 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.wegh...@posteo.de> diff --git a/starmath/source/accessibility.cxx b/starmath/source/accessibility.cxx index dffd973a8309..98df66e81d62 100644 --- a/starmath/source/accessibility.cxx +++ b/starmath/source/accessibility.cxx @@ -123,14 +123,10 @@ sal_Bool SAL_CALL SmGraphicAccessible::containsPoint( const awt::Point& aPoint ) aPoint.X < aSz.Width() && aPoint.Y < aSz.Height(); } -uno::Reference< XAccessible > SAL_CALL SmGraphicAccessible::getAccessibleAtPoint( - const awt::Point& aPoint ) +uno::Reference<XAccessible> SAL_CALL SmGraphicAccessible::getAccessibleAtPoint(const awt::Point&) { SolarMutexGuard aGuard; - XAccessible *pRes = nullptr; - if (containsPoint( aPoint )) - pRes = this; - return pRes; + return nullptr; } awt::Rectangle SAL_CALL SmGraphicAccessible::getBounds()