diff --git a/vcl/source/accessibility/AccessibleTextAttributeHelper.cxx b/vcl/source/accessibility/AccessibleTextAttributeHelper.cxx index 5862b96a86c6..f69b7483d9e5 100644 --- a/vcl/source/accessibility/AccessibleTextAttributeHelper.cxx +++ b/vcl/source/accessibility/AccessibleTextAttributeHelper.cxx @@ -20,10 +20,12 @@ #include #include +#include #include #include #include #include +#include #include #include @@ -303,13 +305,53 @@ OUString AccessibleTextAttributeHelper::GetIAccessible2TextAttributes( const css::uno::Sequence attribs = xText->getCharacterAttributes(nOffset, css::uno::Sequence()); - const OUString sAttributes = ConvertUnoToIAccessible2TextAttributes(attribs); + OUString sAttributes = ConvertUnoToIAccessible2TextAttributes(attribs); css::accessibility::TextSegment aAttributeRun = xText->getTextAtIndex(nOffset, css::accessibility::AccessibleTextType::ATTRIBUTE_RUN); rStartOffset = aAttributeRun.SegmentStart; rEndOffset = aAttributeRun.SegmentEnd; + // report spelling error as "invalid:spelling;" IA2 text attribute and + // adapt start/end index as necessary + css::uno::Reference xTextMarkup(xText, + css::uno::UNO_QUERY); + if (xTextMarkup.is()) + { + bool bInvalidSpelling = false; + const sal_Int32 nMarkupCount( + xTextMarkup->getTextMarkupCount(css::text::TextMarkupType::SPELLCHECK)); + for (sal_Int32 nMarkupIndex = 0; nMarkupIndex < nMarkupCount; ++nMarkupIndex) + { + const css::accessibility::TextSegment aTextSegment + = xTextMarkup->getTextMarkup(nMarkupIndex, css::text::TextMarkupType::SPELLCHECK); + const sal_Int32 nStartOffsetTextMarkup = aTextSegment.SegmentStart; + const sal_Int32 nEndOffsetTextMarkup = aTextSegment.SegmentEnd; + if (nStartOffsetTextMarkup <= nOffset) + { + if (nOffset < nEndOffsetTextMarkup) + { + // offset is inside invalid spelling + rStartOffset = ::std::max(rStartOffset, nStartOffsetTextMarkup); + rEndOffset = ::std::min(rEndOffset, nEndOffsetTextMarkup); + bInvalidSpelling = true; + break; + } + else + { + rStartOffset = ::std::max(rStartOffset, nEndOffsetTextMarkup); + } + } + else + { + rEndOffset = ::std::min(rEndOffset, nStartOffsetTextMarkup); + } + } + + if (bInvalidSpelling) + sAttributes += u"invalid:spelling;"_ustr; + } + return sAttributes; }