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()

Reply via email to