vcl/qt5/QtAccessibleWidget.cxx |   86 ++++++++++++++++++++++++++++++++++++-----
 1 file changed, 76 insertions(+), 10 deletions(-)

New commits:
commit 38289a8abed7dc2a34035d579bf8f0dbbf058d67
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Wed Aug 10 15:21:39 2022 +0200
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Thu Aug 11 08:46:19 2022 +0200

    qt a11y: Implement QtAccessibleWidget::text{After,Before}Offset
    
    In a quick test with a Writer paragraph having the text
    "Abcd efgh ijkl" selected in Accerciser's treeview of the
    LO a11y hierarchy, the results of running these
    commands looked as expected:
    
        In [28]: text = acc.queryText()
        In [29]: text.getTextBeforeOffset(4, pyatspi.text.TEXT_BOUNDARY_CHAR)
        Out[29]: ('d', 3, 4)
        In [30]: text.getTextAfterOffset(4, pyatspi.text.TEXT_BOUNDARY_CHAR)
        Out[30]: ('e', 5, 6)
        In [31]: text.getTextBeforeOffset(4, 
pyatspi.text.TEXT_BOUNDARY_WORD_START)
        Out[31]: ('Abcd', 0, 4)
        In [32]: text.getTextAfterOffset(4, 
pyatspi.text.TEXT_BOUNDARY_WORD_START)
        Out[32]: ('efgh', 5, 9)
    
    Change-Id: Icc310c05634763e92c298e793d87a603b654ac4c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138092
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/vcl/qt5/QtAccessibleWidget.cxx b/vcl/qt5/QtAccessibleWidget.cxx
index ac60b3746803..90f345919ef7 100644
--- a/vcl/qt5/QtAccessibleWidget.cxx
+++ b/vcl/qt5/QtAccessibleWidget.cxx
@@ -1023,12 +1023,46 @@ QString QtAccessibleWidget::text(int startOffset, int 
endOffset) const
     return toQString(xText->getTextRange(startOffset, endOffset));
 }
 
-QString QtAccessibleWidget::textAfterOffset(int /* offset */,
-                                            QAccessible::TextBoundaryType /* 
boundaryType */,
-                                            int* /* startOffset */, int* /* 
endOffset */) const
+QString QtAccessibleWidget::textAfterOffset(int nOffset,
+                                            QAccessible::TextBoundaryType 
eBoundaryType,
+                                            int* pStartOffset, int* 
pEndOffset) const
 {
-    SAL_INFO("vcl.qt", "Unsupported 
QAccessibleTextInterface::textAfterOffset");
-    return QString();
+    if (pStartOffset == nullptr || pEndOffset == nullptr)
+        return QString();
+
+    *pStartOffset = -1;
+    *pEndOffset = -1;
+
+    Reference<XAccessibleText> xText(getAccessibleContextImpl(), UNO_QUERY);
+    if (!xText.is())
+        return QString();
+
+    const int nCharCount = characterCount();
+    // -1 is special value for text length
+    if (nOffset == -1)
+        nOffset = nCharCount;
+    else if (nOffset < -1 || nOffset > nCharCount)
+    {
+        SAL_WARN("vcl.qt",
+                 "QtAccessibleWidget::textAfterOffset called with invalid 
offset: " << nOffset);
+        return QString();
+    }
+
+    if (eBoundaryType == QAccessible::NoBoundary)
+    {
+        if (nOffset == nCharCount)
+            return QString();
+        *pStartOffset = nOffset + 1;
+        *pEndOffset = nCharCount;
+        return text(nOffset + 1, nCharCount);
+    }
+
+    sal_Int16 nUnoBoundaryType = lcl_matchQtTextBoundaryType(eBoundaryType);
+    assert(nUnoBoundaryType > 0);
+    const TextSegment aSegment = xText->getTextBehindIndex(nOffset, 
nUnoBoundaryType);
+    *pStartOffset = aSegment.SegmentStart;
+    *pEndOffset = aSegment.SegmentEnd;
+    return toQString(aSegment.SegmentText);
 }
 
 QString QtAccessibleWidget::textAtOffset(int offset, 
QAccessible::TextBoundaryType boundaryType,
@@ -1069,12 +1103,44 @@ QString QtAccessibleWidget::textAtOffset(int offset, 
QAccessible::TextBoundaryTy
     return toQString(segment.SegmentText);
 }
 
-QString QtAccessibleWidget::textBeforeOffset(int /* offset */,
-                                             QAccessible::TextBoundaryType /* 
boundaryType */,
-                                             int* /* startOffset */, int* /* 
endOffset */) const
+QString QtAccessibleWidget::textBeforeOffset(int nOffset,
+                                             QAccessible::TextBoundaryType 
eBoundaryType,
+                                             int* pStartOffset, int* 
pEndOffset) const
 {
-    SAL_INFO("vcl.qt", "Unsupported 
QAccessibleTextInterface::textBeforeOffset");
-    return QString();
+    if (pStartOffset == nullptr || pEndOffset == nullptr)
+        return QString();
+
+    *pStartOffset = -1;
+    *pEndOffset = -1;
+
+    Reference<XAccessibleText> xText(getAccessibleContextImpl(), UNO_QUERY);
+    if (!xText.is())
+        return QString();
+
+    const int nCharCount = characterCount();
+    // -1 is special value for text length
+    if (nOffset == -1)
+        nOffset = nCharCount;
+    else if (nOffset < -1 || nOffset > nCharCount)
+    {
+        SAL_WARN("vcl.qt",
+                 "QtAccessibleWidget::textBeforeOffset called with invalid 
offset: " << nOffset);
+        return QString();
+    }
+
+    if (eBoundaryType == QAccessible::NoBoundary)
+    {
+        *pStartOffset = 0;
+        *pEndOffset = nOffset;
+        return text(0, nOffset);
+    }
+
+    sal_Int16 nUnoBoundaryType = lcl_matchQtTextBoundaryType(eBoundaryType);
+    assert(nUnoBoundaryType > 0);
+    const TextSegment aSegment = xText->getTextBeforeIndex(nOffset, 
nUnoBoundaryType);
+    *pStartOffset = aSegment.SegmentStart;
+    *pEndOffset = aSegment.SegmentEnd;
+    return toQString(aSegment.SegmentText);
 }
 
 // QAccessibleEditableTextInterface

Reply via email to