editeng/source/accessibility/AccessibleEditableTextPara.cxx |  170 ------------
 editeng/source/accessibility/AccessibleParaManager.cxx      |    4 
 editeng/source/accessibility/AccessibleStaticTextBase.cxx   |    2 
 include/editeng/AccessibleEditableTextPara.hxx              |   48 ---
 4 files changed, 19 insertions(+), 205 deletions(-)

New commits:
commit 72f62009c95bd9a70fc4be05999852d12e2402af
Author:     Michael Weghorn <[email protected]>
AuthorDate: Thu Apr 3 12:57:33 2025 +0200
Commit:     Michael Weghorn <[email protected]>
CommitDate: Thu Apr 3 22:31:54 2025 +0200

    editeng a11y: Use OAccessibleComponentHelper for paragraph
    
    Let editeng's AccessibleEditableTextPara derive from
    OAccessibleComponentHelper to make use of the
    logic already implemented there instead of having to
    implement all the XAccessibleComponent
    and XAccessibleEventBroadcaster methods manually.
    
    The existing AccessibleEditableTextPara::getBounds
    implementations provide the necessary logic to implement
    OAccessibleComponentHelper::implGetBounds,
    so rename those accordingly (and drop the extra mutex
    guard, as the base class takes care of that).
    
    Drop all of the other overrides that are no longer
    needed as the implementation is now provided by
    the base class.
    
    No change in behavior intended or observed in a quick
    test with text in Impress slides and Accerciser and Orca
    when using the gtk3 and qt6 VCL plugins on Linux.
    
    Change-Id: I5cb47eb9c6738f4bd7807cbeef260151437c0862
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183681
    Reviewed-by: Michael Weghorn <[email protected]>
    Tested-by: Jenkins

diff --git a/editeng/source/accessibility/AccessibleEditableTextPara.cxx 
b/editeng/source/accessibility/AccessibleEditableTextPara.cxx
index e25fe7e5395b..11e99480577a 100644
--- a/editeng/source/accessibility/AccessibleEditableTextPara.cxx
+++ b/editeng/source/accessibility/AccessibleEditableTextPara.cxx
@@ -110,13 +110,6 @@ AccessibleEditableTextPara::AccessibleEditableTextPara(
       mpEditSource( nullptr ),
       maEEOffset( 0, 0 ),
       mxParent(std::move( xParent )),
-      // well, that's strictly (UNO) exception safe, though not
-      // really robust. We rely on the fact that this member is
-      // constructed last, and that the constructor body catches
-      // exceptions, thus no chance for exceptions once the Id is
-      // fetched. Nevertheless, normally should employ RAII here...
-      
mnNotifierClientId(::comphelper::AccessibleEventNotifier::registerClient()),
-      // #i27138#
       mpParaManager( _pParaManager )
 {
 
@@ -132,21 +125,6 @@ AccessibleEditableTextPara::AccessibleEditableTextPara(
     mnStateSet |= AccessibleStateType::SENSITIVE;
 }
 
-AccessibleEditableTextPara::~AccessibleEditableTextPara()
-{
-    // sign off from event notifier
-    if( getNotifierClientId() != -1 )
-    {
-        try
-        {
-            ::comphelper::AccessibleEventNotifier::revokeClient( 
getNotifierClientId() );
-        }
-        catch (const uno::Exception&)
-        {
-        }
-    }
-}
-
 OUString AccessibleEditableTextPara::implGetText()
 {
     return GetTextRange( 0, GetTextLen() );
@@ -275,29 +253,12 @@ void AccessibleEditableTextPara::SetParagraphIndex( 
sal_Int32 nIndex )
 }
 
 
-void AccessibleEditableTextPara::Dispose()
+void SAL_CALL AccessibleEditableTextPara::dispose()
 {
-    int nClientId( getNotifierClientId() );
-
-    // #108212# drop all references before notifying dispose
     mxParent = nullptr;
-    mnNotifierClientId = -1;
     mpEditSource = nullptr;
 
-    // notify listeners
-    if( nClientId == -1 )
-        return;
-
-    try
-    {
-        uno::Reference < XAccessibleContext > xThis = getAccessibleContext();
-
-        // #106234# Delegate to EventNotifier
-        ::comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( 
nClientId, xThis );
-    }
-    catch (const uno::Exception&)
-    {
-    }
+    comphelper::OAccessibleComponentHelper::dispose();
 }
 
 void AccessibleEditableTextPara::SetEditSource( SvxEditSourceAdapter* 
pEditSource )
@@ -538,14 +499,7 @@ void AccessibleEditableTextPara::SetEEOffset( const Point& 
rOffset )
 
 void AccessibleEditableTextPara::FireEvent(const sal_Int16 nEventId, const 
uno::Any& rNewValue, const uno::Any& rOldValue)
 {
-    uno::Reference <XAccessibleContext> xThis(this);
-
-    AccessibleEventObject aEvent(xThis, nEventId, rNewValue, rOldValue, -1);
-
-    // #106234# Delegate to EventNotifier
-    if( getNotifierClientId() != -1 )
-        ::comphelper::AccessibleEventNotifier::addEvent( getNotifierClientId(),
-                                                         aEvent );
+    NotifyAccessibleEvent(nEventId, rOldValue, rNewValue);
 }
 
 void AccessibleEditableTextPara::SetState( const sal_Int64 nStateId )
@@ -593,34 +547,6 @@ bool AccessibleEditableTextPara::GetAttributeRun( 
sal_Int32& nStartIndex, sal_In
                                                nIndex );
 }
 
-uno::Any SAL_CALL AccessibleEditableTextPara::queryInterface (const uno::Type 
& rType)
-{
-    uno::Any aRet;
-
-    // must provide XAccessibleText by hand, since it comes publicly inherited 
by XAccessibleEditableText
-    if ( rType == cppu::UnoType<XAccessibleText>::get())
-    {
-        uno::Reference< XAccessibleText > aAccText = static_cast< 
XAccessibleEditableText * >(this);
-        aRet <<= aAccText;
-    }
-    else if ( rType == cppu::UnoType<XAccessibleEditableText>::get())
-    {
-        uno::Reference< XAccessibleEditableText > aAccEditText = this;
-        aRet <<= aAccEditText;
-    }
-    else if ( rType == cppu::UnoType<XAccessibleHypertext>::get())
-    {
-        uno::Reference< XAccessibleHypertext > aAccHyperText = this;
-        aRet <<= aAccHyperText;
-    }
-    else
-    {
-        aRet = AccessibleTextParaInterfaceBase::queryInterface(rType);
-    }
-
-    return aRet;
-}
-
 // XAccessible
 uno::Reference< XAccessibleContext > SAL_CALL 
AccessibleEditableTextPara::getAccessibleContext()
 {
@@ -896,44 +822,7 @@ lang::Locale SAL_CALL 
AccessibleEditableTextPara::getLocale()
     return implGetLocale();
 }
 
-void SAL_CALL AccessibleEditableTextPara::addAccessibleEventListener( const 
uno::Reference< XAccessibleEventListener >& xListener )
-{
-    if( getNotifierClientId() != -1 )
-        ::comphelper::AccessibleEventNotifier::addEventListener( 
getNotifierClientId(), xListener );
-}
-
-void SAL_CALL AccessibleEditableTextPara::removeAccessibleEventListener( const 
uno::Reference< XAccessibleEventListener >& xListener )
-{
-    if( getNotifierClientId() == -1 )
-        return;
-
-    const sal_Int32 nListenerCount = 
::comphelper::AccessibleEventNotifier::removeEventListener( 
getNotifierClientId(), 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::TClientId nId( 
getNotifierClientId() );
-        mnNotifierClientId = -1;
-        ::comphelper::AccessibleEventNotifier::revokeClient( nId );
-    }
-}
-
 // XAccessibleComponent
-sal_Bool SAL_CALL AccessibleEditableTextPara::containsPoint( const awt::Point& 
aTmpPoint )
-{
-    SolarMutexGuard aGuard;
-
-    DBG_ASSERT(GetParagraphIndex() >= 0,
-               "AccessibleEditableTextPara::contains: index value overflow");
-
-    awt::Rectangle aTmpRect = getBounds();
-    tools::Rectangle aRect( Point(aTmpRect.X, aTmpRect.Y), 
Size(aTmpRect.Width, aTmpRect.Height) );
-    Point aPoint( aTmpPoint.X, aTmpPoint.Y );
-
-    return aRect.Contains( aPoint );
-}
 
 uno::Reference< XAccessible > SAL_CALL 
AccessibleEditableTextPara::getAccessibleAtPoint( const awt::Point& _aPoint )
 {
@@ -968,12 +857,10 @@ uno::Reference< XAccessible > SAL_CALL 
AccessibleEditableTextPara::getAccessible
     return uno::Reference< XAccessible >();
 }
 
-awt::Rectangle SAL_CALL AccessibleEditableTextPara::getBounds()
+awt::Rectangle AccessibleEditableTextPara::implGetBounds()
 {
-    SolarMutexGuard aGuard;
-
     DBG_ASSERT(GetParagraphIndex() >= 0,
-               "AccessibleEditableTextPara::getBounds: index value overflow");
+               "AccessibleEditableTextPara::implGetBounds: index value 
overflow");
 
     SvxTextForwarder& rCacheTF = GetTextForwarder();
     tools::Rectangle aRect = rCacheTF.GetParaBounds( GetParagraphIndex() );
@@ -992,53 +879,6 @@ awt::Rectangle SAL_CALL 
AccessibleEditableTextPara::getBounds()
                            aScreenRect.GetSize().Height() );
 }
 
-awt::Point SAL_CALL AccessibleEditableTextPara::getLocation(  )
-{
-    SolarMutexGuard aGuard;
-
-    awt::Rectangle aRect = getBounds();
-
-    return awt::Point( aRect.X, aRect.Y );
-}
-
-awt::Point SAL_CALL AccessibleEditableTextPara::getLocationOnScreen(  )
-{
-    SolarMutexGuard aGuard;
-
-    // relate us to parent
-    uno::Reference< XAccessible > xParent = getAccessibleParent();
-    if( xParent.is() )
-    {
-        uno::Reference< XAccessibleContext > xParentContext = 
xParent->getAccessibleContext();
-        if ( xParentContext.is() )
-        {
-            uno::Reference< XAccessibleComponent > xParentContextComponent( 
xParentContext, uno::UNO_QUERY );
-            if( xParentContextComponent.is() )
-            {
-                awt::Point aRefPoint = 
xParentContextComponent->getLocationOnScreen();
-                awt::Point aPoint = getLocation();
-                aPoint.X += aRefPoint.X;
-                aPoint.Y += aRefPoint.Y;
-
-                return aPoint;
-            }
-        }
-    }
-
-    throw uno::RuntimeException(u"Cannot access parent"_ustr,
-                                uno::Reference< uno::XInterface >
-                                ( static_cast< XAccessible* > (this) ) );   // 
disambiguate hierarchy
-}
-
-awt::Size SAL_CALL AccessibleEditableTextPara::getSize(  )
-{
-    SolarMutexGuard aGuard;
-
-    awt::Rectangle aRect = getBounds();
-
-    return awt::Size( aRect.Width, aRect.Height );
-}
-
 void SAL_CALL AccessibleEditableTextPara::grabFocus(  )
 {
     // set cursor to this paragraph
diff --git a/editeng/source/accessibility/AccessibleParaManager.cxx 
b/editeng/source/accessibility/AccessibleParaManager.cxx
index 649fe1585a33..d78eda7230b3 100644
--- a/editeng/source/accessibility/AccessibleParaManager.cxx
+++ b/editeng/source/accessibility/AccessibleParaManager.cxx
@@ -285,7 +285,7 @@ public:
     AccessibleParaManager_DisposeChildren() {}
     void operator()( ::accessibility::AccessibleEditableTextPara& rPara )
     {
-        rPara.Dispose();
+        rPara.dispose();
     }
 };
 
@@ -377,7 +377,7 @@ void AccessibleParaManager::Release( sal_Int32 nStartPara, 
sal_Int32 nEndPara )
                            if (IsReferencable(aChild))
                            {
                                aChild->SetEditSource(nullptr);
-                               aChild->Dispose();
+                               aChild->dispose();
                            }
 
                            // clear reference
diff --git a/editeng/source/accessibility/AccessibleStaticTextBase.cxx 
b/editeng/source/accessibility/AccessibleStaticTextBase.cxx
index 321b4c10da0b..61206f79438c 100644
--- a/editeng/source/accessibility/AccessibleStaticTextBase.cxx
+++ b/editeng/source/accessibility/AccessibleStaticTextBase.cxx
@@ -329,7 +329,7 @@ void AccessibleStaticTextBase::Dispose()
 {
     // we're the owner of the paragraph, so destroy it, too
     if (mxTextParagraph.is())
-        mxTextParagraph->Dispose();
+        mxTextParagraph->dispose();
 
     // drop reference
     mxTextParagraph.clear();
diff --git a/include/editeng/AccessibleEditableTextPara.hxx 
b/include/editeng/AccessibleEditableTextPara.hxx
index 0be4bd1088d9..3ed5da76353d 100644
--- a/include/editeng/AccessibleEditableTextPara.hxx
+++ b/include/editeng/AccessibleEditableTextPara.hxx
@@ -23,21 +23,18 @@
 #include <config_options.h>
 #include <rtl/ustring.hxx>
 #include <tools/gen.hxx>
-#include <comphelper/compbase.hxx>
 
 #include <com/sun/star/uno/Reference.hxx>
 #include <com/sun/star/lang/XServiceInfo.hpp>
 #include <com/sun/star/accessibility/AccessibleScrollType.hpp>
 #include <com/sun/star/accessibility/XAccessible.hpp>
-#include <com/sun/star/accessibility/XAccessibleContext.hpp>
-#include <com/sun/star/accessibility/XAccessibleComponent.hpp>
 #include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
 #include <com/sun/star/accessibility/XAccessibleTextAttributes.hpp>
 #include <com/sun/star/accessibility/XAccessibleHypertext.hpp>
 #include <com/sun/star/accessibility/XAccessibleMultiLineText.hpp>
-#include <com/sun/star/accessibility/XAccessibleEventBroadcaster.hpp>
 
 #include <comphelper/accessibletexthelper.hxx>
+#include <cppuhelper/implbase.hxx>
 #include <editeng/editdata.hxx>
 #include <editeng/editengdllapi.h>
 #include <editeng/unoedprx.hxx>
@@ -54,19 +51,15 @@ namespace accessibility
 
 class AccessibleParaManager;
 
-typedef ::comphelper::WeakComponentImplHelper< css::accessibility::XAccessible,
-                                 css::accessibility::XAccessibleContext,
-                                 css::accessibility::XAccessibleComponent,
-                                 css::accessibility::XAccessibleEditableText,
-                                 
css::accessibility::XAccessibleEventBroadcaster,
-                                 css::accessibility::XAccessibleTextAttributes,
-                                 css::accessibility::XAccessibleHypertext,
-                                 css::accessibility::XAccessibleMultiLineText,
-                                 css::lang::XServiceInfo >  
AccessibleTextParaInterfaceBase;
-
 /** This class implements the actual text paragraphs for the 
EditEngine/Outliner UAA
  */
-class UNLESS_MERGELIBS(EDITENG_DLLPUBLIC) AccessibleEditableTextPara final : 
public AccessibleTextParaInterfaceBase, private 
::comphelper::OCommonAccessibleText
+class UNLESS_MERGELIBS(EDITENG_DLLPUBLIC) AccessibleEditableTextPara final
+    : public cppu::ImplInheritanceHelper<
+          comphelper::OAccessibleComponentHelper, 
css::accessibility::XAccessible,
+          css::accessibility::XAccessibleEditableText,
+          css::accessibility::XAccessibleTextAttributes, 
css::accessibility::XAccessibleHypertext,
+          css::accessibility::XAccessibleMultiLineText, 
css::lang::XServiceInfo>,
+      private ::comphelper::OCommonAccessibleText
 {
 
     // override OCommonAccessibleText methods
@@ -85,11 +78,6 @@ public:
     AccessibleEditableTextPara ( css::uno::Reference< 
css::accessibility::XAccessible > xParent,
                                  const AccessibleParaManager* _pParaManager = 
nullptr );
 
-    virtual ~AccessibleEditableTextPara () override;
-
-    // XInterface
-    virtual css::uno::Any SAL_CALL queryInterface (const css::uno::Type & 
rType) override;
-
     // XAccessible
     virtual css::uno::Reference< css::accessibility::XAccessibleContext > 
SAL_CALL getAccessibleContext(  ) override;
 
@@ -107,17 +95,11 @@ 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;
+    // OAccessibleComponentHelper
+    virtual css::awt::Rectangle implGetBounds() 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;
@@ -228,11 +210,7 @@ public:
      */
     void SetEditSource( SvxEditSourceAdapter* pEditSource );
 
-    /** Dispose this object
-
-        Notifies and deregisters the listeners, drops all references.
-     */
-    void Dispose();
+    void SAL_CALL dispose() override;
 
     /// Calls all Listener objects to tell them the change. Don't hold locks 
when calling this!
     void FireEvent(const sal_Int16 nEventId, const css::uno::Any& rNewValue = 
css::uno::Any(), const css::uno::Any& rOldValue = css::uno::Any());
@@ -309,8 +287,6 @@ private:
      */
     bool GetAttributeRun( sal_Int32& nStartIndex, sal_Int32& nEndIndex, 
sal_Int32 nIndex );
 
-    int getNotifierClientId() const { return mnNotifierClientId; }
-
     /// Do we have children? This is the case for image bullets
     bool HaveChildren();
 
@@ -374,8 +350,6 @@ private:
     /// The shape we're the accessible for (unguarded)
     css::uno::Reference< css::accessibility::XAccessible > mxParent;
 
-    /// Our listeners (guarded by maMutex)
-    int mnNotifierClientId;
 private:
     // Text paragraphs should provide FLOWS_TO and FLOWS_FROM relations 
(#i27138#)
     // the paragraph manager, which created this instance - is NULL, if

Reply via email to