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