diff options
-rw-r--r-- | accessibility/source/standard/vclxaccessibleedit.cxx | 15 | ||||
-rw-r--r-- | include/vcl/texteng.hxx | 2 | ||||
-rw-r--r-- | vcl/source/edit/texteng.cxx | 20 |
3 files changed, 37 insertions, 0 deletions
diff --git a/accessibility/source/standard/vclxaccessibleedit.cxx b/accessibility/source/standard/vclxaccessibleedit.cxx index 750ce0afb337..2eff38f73020 100644 --- a/accessibility/source/standard/vclxaccessibleedit.cxx +++ b/accessibility/source/standard/vclxaccessibleedit.cxx @@ -30,6 +30,7 @@ #include <com/sun/star/accessibility/AccessibleEventId.hpp> #include <com/sun/star/accessibility/AccessibleRole.hpp> #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> +#include <com/sun/star/accessibility/AccessibleTextType.hpp> #include <cppuhelper/typeprovider.hxx> #include <comphelper/sequence.hxx> #include <comphelper/string.hxx> @@ -475,6 +476,20 @@ css::accessibility::TextSegment VCLXAccessibleEdit::getTextAtIndex( sal_Int32 nI { OExternalLockGuard aGuard( this ); + // Override general text component behavior: MultiLineEdit can have more text portions + if ( aTextType == AccessibleTextType::ATTRIBUTE_RUN ) + { + VclPtr<VclMultiLineEdit> pMulitLineEdit = GetAsDynamic< VclMultiLineEdit >(); + if ( pMulitLineEdit ) + { + ExtTextEngine* pTextEngine = pMulitLineEdit->GetTextEngine(); + TextPaM aCursor( 0, nIndex ); + TextSegment aResult; + pTextEngine->GetTextPortionRange( aCursor, aResult.SegmentStart, aResult.SegmentEnd ); + return aResult; + } + } + return VCLXAccessibleTextComponent::getTextAtIndex( nIndex, aTextType ); } diff --git a/include/vcl/texteng.hxx b/include/vcl/texteng.hxx index 96ac4261116e..4c6c3dfb4746 100644 --- a/include/vcl/texteng.hxx +++ b/include/vcl/texteng.hxx @@ -257,6 +257,8 @@ public: sal_Int32 GetTextLen( sal_uInt32 nParagraph ) const; long GetTextHeight( sal_uInt32 nParagraph ) const; + void GetTextPortionRange(const TextPaM& rPaM, sal_Int32& nStart, sal_Int32& nEnd); + sal_uInt16 GetLineCount( sal_uInt32 nParagraph ) const; sal_Int32 GetLineLen( sal_uInt32 nParagraph, sal_uInt16 nLine ) const; diff --git a/vcl/source/edit/texteng.cxx b/vcl/source/edit/texteng.cxx index f91e69d8252e..3ac06dd47f67 100644 --- a/vcl/source/edit/texteng.cxx +++ b/vcl/source/edit/texteng.cxx @@ -1212,6 +1212,26 @@ long TextEngine::CalcTextWidth( sal_uInt32 nPara, sal_Int32 nPortionStart, sal_I return nWidth; } +void TextEngine::GetTextPortionRange(const TextPaM& rPaM, sal_Int32& nStart, sal_Int32& nEnd) +{ + nStart = 0; + nEnd = 0; + TEParaPortion* pParaPortion = mpTEParaPortions->GetObject( rPaM.GetPara() ); + for ( size_t i = 0; i < pParaPortion->GetTextPortions().size(); ++i ) + { + TETextPortion* pTextPortion = pParaPortion->GetTextPortions()[ i ]; + if (nStart + pTextPortion->GetLen() > rPaM.GetIndex()) + { + nEnd = nStart + pTextPortion->GetLen(); + return; + } + else + { + nStart += pTextPortion->GetLen(); + } + } +} + sal_uInt16 TextEngine::GetLineCount( sal_uInt32 nParagraph ) const { SAL_WARN_IF( nParagraph >= mpTEParaPortions->Count(), "vcl", "GetLineCount: Out of range" ); |