diff options
author | Michael Weghorn <m.weghorn@posteo.de> | 2025-04-02 12:15:06 +0200 |
---|---|---|
committer | Michael Weghorn <m.weghorn@posteo.de> | 2025-04-03 22:29:57 +0200 |
commit | 9b892757d2ccae1fe74e616158f378c31a67ae6d (patch) | |
tree | 21fb522f9343c8a497ecf5bcdcfcdcf86f6041a1 /editeng/source | |
parent | 053365d29e28af88b173ed8594649ca70c17ce6b (diff) |
editeng a11y: Drop extra indentation level
Change-Id: I5f2d99730cfda9490c3fa9fa43242e0d5219ca82
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183626
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Diffstat (limited to 'editeng/source')
-rw-r--r-- | editeng/source/accessibility/AccessibleEditableTextPara.cxx | 3959 | ||||
-rw-r--r-- | editeng/source/accessibility/AccessibleHyperlink.cxx | 130 | ||||
-rw-r--r-- | editeng/source/accessibility/AccessibleHyperlink.hxx | 44 | ||||
-rw-r--r-- | editeng/source/accessibility/AccessibleImageBullet.cxx | 670 | ||||
-rw-r--r-- | editeng/source/accessibility/AccessibleParaManager.cxx | 545 | ||||
-rw-r--r-- | editeng/source/accessibility/AccessibleSelectionBase.cxx | 85 | ||||
-rw-r--r-- | editeng/source/accessibility/AccessibleStaticTextBase.cxx | 1325 |
7 files changed, 3381 insertions, 3377 deletions
diff --git a/editeng/source/accessibility/AccessibleEditableTextPara.cxx b/editeng/source/accessibility/AccessibleEditableTextPara.cxx index b8a00af82f7c..23d90285f842 100644 --- a/editeng/source/accessibility/AccessibleEditableTextPara.cxx +++ b/editeng/source/accessibility/AccessibleEditableTextPara.cxx @@ -83,2534 +83,2535 @@ using namespace ::com::sun::star::accessibility; namespace accessibility { - static const SvxItemPropertySet* ImplGetSvxCharAndParaPropertiesSet() - { - // PropertyMap for character and paragraph properties - static const SfxItemPropertyMapEntry aPropMap[] = - { - SVX_UNOEDIT_OUTLINER_PROPERTIES, - SVX_UNOEDIT_CHAR_PROPERTIES, - SVX_UNOEDIT_PARA_PROPERTIES, - SVX_UNOEDIT_NUMBERING_PROPERTY, - { u"TextUserDefinedAttributes"_ustr, EE_CHAR_XMLATTRIBS, cppu::UnoType<css::container::XNameContainer>::get(), 0, 0}, - { u"ParaUserDefinedAttributes"_ustr, EE_PARA_XMLATTRIBS, cppu::UnoType<css::container::XNameContainer>::get(), 0, 0}, - }; - static SvxItemPropertySet aPropSet( aPropMap, EditEngine::GetGlobalItemPool() ); - return &aPropSet; - } - - // #i27138# - add parameter <_pParaManager> - AccessibleEditableTextPara::AccessibleEditableTextPara( - uno::Reference< XAccessible > xParent, - const AccessibleParaManager* _pParaManager ) - : mnParagraphIndex( 0 ), - mnIndexInParent( 0 ), - 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 ) - { - - // Create the state set. - mnStateSet = 0; - - // these are always on - mnStateSet |= AccessibleStateType::MULTI_LINE; - mnStateSet |= AccessibleStateType::FOCUSABLE; - mnStateSet |= AccessibleStateType::VISIBLE; - mnStateSet |= AccessibleStateType::SHOWING; - mnStateSet |= AccessibleStateType::ENABLED; - 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() ); - } +static const SvxItemPropertySet* ImplGetSvxCharAndParaPropertiesSet() +{ + // PropertyMap for character and paragraph properties + static const SfxItemPropertyMapEntry aPropMap[] = + { + SVX_UNOEDIT_OUTLINER_PROPERTIES, + SVX_UNOEDIT_CHAR_PROPERTIES, + SVX_UNOEDIT_PARA_PROPERTIES, + SVX_UNOEDIT_NUMBERING_PROPERTY, + { u"TextUserDefinedAttributes"_ustr, EE_CHAR_XMLATTRIBS, cppu::UnoType<css::container::XNameContainer>::get(), 0, 0}, + { u"ParaUserDefinedAttributes"_ustr, EE_PARA_XMLATTRIBS, cppu::UnoType<css::container::XNameContainer>::get(), 0, 0}, + }; + static SvxItemPropertySet aPropSet( aPropMap, EditEngine::GetGlobalItemPool() ); + return &aPropSet; +} - css::lang::Locale AccessibleEditableTextPara::implGetLocale() - { - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getLocale: paragraph index value overflow"); +// #i27138# - add parameter <_pParaManager> +AccessibleEditableTextPara::AccessibleEditableTextPara( + uno::Reference< XAccessible > xParent, + const AccessibleParaManager* _pParaManager ) + : mnParagraphIndex( 0 ), + mnIndexInParent( 0 ), + 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 ) +{ - // return locale of first character in the paragraph - return LanguageTag(GetTextForwarder().GetLanguage( GetParagraphIndex(), 0 )).getLocale(); - } + // Create the state set. + mnStateSet = 0; - void AccessibleEditableTextPara::implGetSelection( sal_Int32& nStartIndex, sal_Int32& nEndIndex ) - { - sal_Int32 nStart, nEnd; + // these are always on + mnStateSet |= AccessibleStateType::MULTI_LINE; + mnStateSet |= AccessibleStateType::FOCUSABLE; + mnStateSet |= AccessibleStateType::VISIBLE; + mnStateSet |= AccessibleStateType::SHOWING; + mnStateSet |= AccessibleStateType::ENABLED; + mnStateSet |= AccessibleStateType::SENSITIVE; +} - if( GetSelection( nStart, nEnd ) ) +AccessibleEditableTextPara::~AccessibleEditableTextPara() +{ + // sign off from event notifier + if( getNotifierClientId() != -1 ) + { + try { - nStartIndex = nStart; - nEndIndex = nEnd; + ::comphelper::AccessibleEventNotifier::revokeClient( getNotifierClientId() ); } - else + catch (const uno::Exception&) { - // #102234# No exception, just set to 'invalid' - nStartIndex = -1; - nEndIndex = -1; } } +} - void AccessibleEditableTextPara::implGetParagraphBoundary( const OUString& rText, css::i18n::Boundary& rBoundary, sal_Int32 /*nIndex*/ ) - { - SAL_INFO( "editeng", "AccessibleEditableTextPara::implGetParagraphBoundary: only a base implementation, ignoring the index" ); +OUString AccessibleEditableTextPara::implGetText() +{ + return GetTextRange( 0, GetTextLen() ); +} - rBoundary.startPos = 0; - rBoundary.endPos = rText.getLength(); - } +css::lang::Locale AccessibleEditableTextPara::implGetLocale() +{ + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getLocale: paragraph index value overflow"); + + // return locale of first character in the paragraph + return LanguageTag(GetTextForwarder().GetLanguage( GetParagraphIndex(), 0 )).getLocale(); +} - void AccessibleEditableTextPara::implGetLineBoundary( const OUString&, css::i18n::Boundary& rBoundary, sal_Int32 nIndex ) +void AccessibleEditableTextPara::implGetSelection( sal_Int32& nStartIndex, sal_Int32& nEndIndex ) +{ + sal_Int32 nStart, nEnd; + + if( GetSelection( nStart, nEnd ) ) { - SvxTextForwarder& rCacheTF = GetTextForwarder(); - const sal_Int32 nParaIndex = GetParagraphIndex(); + nStartIndex = nStart; + nEndIndex = nEnd; + } + else + { + // #102234# No exception, just set to 'invalid' + nStartIndex = -1; + nEndIndex = -1; + } +} - DBG_ASSERT(nParaIndex >= 0, - "AccessibleEditableTextPara::implGetLineBoundary: paragraph index value overflow"); +void AccessibleEditableTextPara::implGetParagraphBoundary( const OUString& rText, css::i18n::Boundary& rBoundary, sal_Int32 /*nIndex*/ ) +{ + SAL_INFO( "editeng", "AccessibleEditableTextPara::implGetParagraphBoundary: only a base implementation, ignoring the index" ); - const sal_Int32 nTextLen = rCacheTF.GetTextLen( nParaIndex ); + rBoundary.startPos = 0; + rBoundary.endPos = rText.getLength(); +} - CheckPosition(nIndex); +void AccessibleEditableTextPara::implGetLineBoundary( const OUString&, css::i18n::Boundary& rBoundary, sal_Int32 nIndex ) +{ + SvxTextForwarder& rCacheTF = GetTextForwarder(); + const sal_Int32 nParaIndex = GetParagraphIndex(); - rBoundary.startPos = rBoundary.endPos = -1; + DBG_ASSERT(nParaIndex >= 0, + "AccessibleEditableTextPara::implGetLineBoundary: paragraph index value overflow"); - const sal_Int32 nLineCount=rCacheTF.GetLineCount( nParaIndex ); + const sal_Int32 nTextLen = rCacheTF.GetTextLen( nParaIndex ); - if( nIndex == nTextLen ) - { - // #i17014# Special-casing one-behind-the-end character - if( nLineCount <= 1 ) - rBoundary.startPos = 0; - else - rBoundary.startPos = nTextLen - rCacheTF.GetLineLen( nParaIndex, - nLineCount-1 ); + CheckPosition(nIndex); - rBoundary.endPos = nTextLen; - } + rBoundary.startPos = rBoundary.endPos = -1; + + const sal_Int32 nLineCount=rCacheTF.GetLineCount( nParaIndex ); + + if( nIndex == nTextLen ) + { + // #i17014# Special-casing one-behind-the-end character + if( nLineCount <= 1 ) + rBoundary.startPos = 0; else + rBoundary.startPos = nTextLen - rCacheTF.GetLineLen( nParaIndex, + nLineCount-1 ); + + rBoundary.endPos = nTextLen; + } + else + { + // normal line search + sal_Int32 nLine; + sal_Int32 nCurIndex; + for( nLine=0, nCurIndex=0; nLine<nLineCount; ++nLine ) { - // normal line search - sal_Int32 nLine; - sal_Int32 nCurIndex; - for( nLine=0, nCurIndex=0; nLine<nLineCount; ++nLine ) - { - nCurIndex += rCacheTF.GetLineLen( nParaIndex, nLine); + nCurIndex += rCacheTF.GetLineLen( nParaIndex, nLine); - if( nCurIndex > nIndex ) - { - rBoundary.startPos = nCurIndex - rCacheTF.GetLineLen( nParaIndex, nLine); - rBoundary.endPos = nCurIndex; - break; - } + if( nCurIndex > nIndex ) + { + rBoundary.startPos = nCurIndex - rCacheTF.GetLineLen( nParaIndex, nLine); + rBoundary.endPos = nCurIndex; + break; } } } +} - void AccessibleEditableTextPara::SetIndexInParent( sal_Int32 nIndex ) - { - mnIndexInParent = nIndex; - } +void AccessibleEditableTextPara::SetIndexInParent( sal_Int32 nIndex ) +{ + mnIndexInParent = nIndex; +} - void AccessibleEditableTextPara::SetParagraphIndex( sal_Int32 nIndex ) - { - sal_Int32 nOldIndex = mnParagraphIndex; +void AccessibleEditableTextPara::SetParagraphIndex( sal_Int32 nIndex ) +{ + sal_Int32 nOldIndex = mnParagraphIndex; - mnParagraphIndex = nIndex; + mnParagraphIndex = nIndex; - auto aChild( maImageBullet.get() ); - if( aChild.is() ) - aChild->SetParagraphIndex(mnParagraphIndex); + auto aChild( maImageBullet.get() ); + if( aChild.is() ) + aChild->SetParagraphIndex(mnParagraphIndex); - try + try + { + if( nOldIndex != nIndex ) { - if( nOldIndex != nIndex ) - { - uno::Any aOldDesc; - uno::Any aOldName; + uno::Any aOldDesc; + uno::Any aOldName; - try - { - aOldDesc <<= getAccessibleDescription(); - aOldName <<= getAccessibleName(); - } - catch (const uno::Exception&) // optional behaviour - { - } - // index and therefore description changed - FireEvent( AccessibleEventId::DESCRIPTION_CHANGED, uno::Any( getAccessibleDescription() ), aOldDesc ); - FireEvent( AccessibleEventId::NAME_CHANGED, uno::Any( getAccessibleName() ), aOldName ); + try + { + aOldDesc <<= getAccessibleDescription(); + aOldName <<= getAccessibleName(); } - } - catch (const uno::Exception&) // optional behaviour - { + catch (const uno::Exception&) // optional behaviour + { + } + // index and therefore description changed + FireEvent( AccessibleEventId::DESCRIPTION_CHANGED, uno::Any( getAccessibleDescription() ), aOldDesc ); + FireEvent( AccessibleEventId::NAME_CHANGED, uno::Any( getAccessibleName() ), aOldName ); } } - - - void AccessibleEditableTextPara::Dispose() + catch (const uno::Exception&) // optional behaviour { - int nClientId( getNotifierClientId() ); + } +} - // #108212# drop all references before notifying dispose - mxParent = nullptr; - mnNotifierClientId = -1; - mpEditSource = nullptr; - // notify listeners - if( nClientId == -1 ) - return; +void AccessibleEditableTextPara::Dispose() +{ + int nClientId( getNotifierClientId() ); - try - { - uno::Reference < XAccessibleContext > xThis = getAccessibleContext(); + // #108212# drop all references before notifying dispose + mxParent = nullptr; + mnNotifierClientId = -1; + mpEditSource = nullptr; - // #106234# Delegate to EventNotifier - ::comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( nClientId, xThis ); - } - catch (const uno::Exception&) - { - } - } + // notify listeners + if( nClientId == -1 ) + return; - void AccessibleEditableTextPara::SetEditSource( SvxEditSourceAdapter* pEditSource ) + try { - auto aChild( maImageBullet.get() ); - if( aChild.is() ) - aChild->SetEditSource(pEditSource); - - if( !pEditSource ) - { - // going defunc - UnSetState( AccessibleStateType::SHOWING ); - UnSetState( AccessibleStateType::VISIBLE ); - SetState( AccessibleStateType::INVALID ); - SetState( AccessibleStateType::DEFUNC ); + uno::Reference < XAccessibleContext > xThis = getAccessibleContext(); - Dispose(); - } - mpEditSource = pEditSource; - // #108900# Init last text content - try - { - TextChanged(); - } - catch (const uno::RuntimeException&) - { - } + // #106234# Delegate to EventNotifier + ::comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( nClientId, xThis ); } - - ESelection AccessibleEditableTextPara::MakeSelection( sal_Int32 nStartEEIndex, sal_Int32 nEndEEIndex ) + catch (const uno::Exception&) { - // check overflow - DBG_ASSERT(nStartEEIndex >= 0 && - nEndEEIndex >= 0 && - GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::MakeSelection: index value overflow"); - - sal_Int32 nParaIndex = GetParagraphIndex(); - return ESelection(nParaIndex, nStartEEIndex, nParaIndex, nEndEEIndex); } +} - ESelection AccessibleEditableTextPara::MakeSelection( sal_Int32 nEEIndex ) - { - return MakeSelection( nEEIndex, nEEIndex+1 ); - } +void AccessibleEditableTextPara::SetEditSource( SvxEditSourceAdapter* pEditSource ) +{ + auto aChild( maImageBullet.get() ); + if( aChild.is() ) + aChild->SetEditSource(pEditSource); - ESelection AccessibleEditableTextPara::MakeCursor( sal_Int32 nEEIndex ) + if( !pEditSource ) { - return MakeSelection( nEEIndex, nEEIndex ); - } + // going defunc + UnSetState( AccessibleStateType::SHOWING ); + UnSetState( AccessibleStateType::VISIBLE ); + SetState( AccessibleStateType::INVALID ); + SetState( AccessibleStateType::DEFUNC ); - void AccessibleEditableTextPara::CheckIndex( sal_Int32 nIndex ) - { - if( nIndex < 0 || nIndex >= getCharacterCount() ) - throw lang::IndexOutOfBoundsException(u"AccessibleEditableTextPara: character index out of bounds"_ustr, - getXWeak() ); + Dispose(); } - - void AccessibleEditableTextPara::CheckPosition( sal_Int32 nIndex ) + mpEditSource = pEditSource; + // #108900# Init last text content + try { - if( nIndex < 0 || nIndex > getCharacterCount() ) - throw lang::IndexOutOfBoundsException(u"AccessibleEditableTextPara: character position out of bounds"_ustr, - getXWeak() ); + TextChanged(); } - - void AccessibleEditableTextPara::CheckRange( sal_Int32 nStart, sal_Int32 nEnd ) + catch (const uno::RuntimeException&) { - CheckPosition( nStart ); - CheckPosition( nEnd ); } +} - bool AccessibleEditableTextPara::GetSelection(sal_Int32 &nStartPos, sal_Int32 &nEndPos) - { - ESelection aSelection; - sal_Int32 nPara = GetParagraphIndex(); - if( !GetEditViewForwarder().GetSelection( aSelection ) ) - return false; +ESelection AccessibleEditableTextPara::MakeSelection( sal_Int32 nStartEEIndex, sal_Int32 nEndEEIndex ) +{ + // check overflow + DBG_ASSERT(nStartEEIndex >= 0 && + nEndEEIndex >= 0 && + GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::MakeSelection: index value overflow"); + + sal_Int32 nParaIndex = GetParagraphIndex(); + return ESelection(nParaIndex, nStartEEIndex, nParaIndex, nEndEEIndex); +} - if( aSelection.start.nPara < aSelection.end.nPara ) - { - if( aSelection.start.nPara > nPara || - aSelection.end.nPara < nPara ) - return false; +ESelection AccessibleEditableTextPara::MakeSelection( sal_Int32 nEEIndex ) +{ + return MakeSelection( nEEIndex, nEEIndex+1 ); +} - if( nPara == aSelection.start.nPara ) - nStartPos = aSelection.start.nIndex; - else - nStartPos = 0; +ESelection AccessibleEditableTextPara::MakeCursor( sal_Int32 nEEIndex ) +{ + return MakeSelection( nEEIndex, nEEIndex ); +} - if( nPara == aSelection.end.nPara ) - nEndPos = aSelection.end.nIndex; - else - nEndPos = GetTextLen(); - } - else - { - if( aSelection.start.nPara < nPara || - aSelection.end.nPara > nPara ) - return false; +void AccessibleEditableTextPara::CheckIndex( sal_Int32 nIndex ) +{ + if( nIndex < 0 || nIndex >= getCharacterCount() ) + throw lang::IndexOutOfBoundsException(u"AccessibleEditableTextPara: character index out of bounds"_ustr, + getXWeak() ); +} - if( nPara == aSelection.start.nPara ) - nStartPos = aSelection.start.nIndex; - else - nStartPos = GetTextLen(); +void AccessibleEditableTextPara::CheckPosition( sal_Int32 nIndex ) +{ + if( nIndex < 0 || nIndex > getCharacterCount() ) + throw lang::IndexOutOfBoundsException(u"AccessibleEditableTextPara: character position out of bounds"_ustr, + getXWeak() ); +} - if( nPara == aSelection.end.nPara ) - nEndPos = aSelection.end.nIndex; - else - nEndPos = 0; - } +void AccessibleEditableTextPara::CheckRange( sal_Int32 nStart, sal_Int32 nEnd ) +{ + CheckPosition( nStart ); + CheckPosition( nEnd ); +} - return true; - } +bool AccessibleEditableTextPara::GetSelection(sal_Int32 &nStartPos, sal_Int32 &nEndPos) +{ + ESelection aSelection; + sal_Int32 nPara = GetParagraphIndex(); + if( !GetEditViewForwarder().GetSelection( aSelection ) ) + return false; - OUString AccessibleEditableTextPara::GetTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) + if( aSelection.start.nPara < aSelection.end.nPara ) { - return GetTextForwarder().GetText( MakeSelection(nStartIndex, nEndIndex) ); - } + if( aSelection.start.nPara > nPara || + aSelection.end.nPara < nPara ) + return false; - sal_Int32 AccessibleEditableTextPara::GetTextLen() const - { - return GetTextForwarder().GetTextLen(GetParagraphIndex()); - } + if( nPara == aSelection.start.nPara ) + nStartPos = aSelection.start.nIndex; + else + nStartPos = 0; - SvxEditSourceAdapter& AccessibleEditableTextPara::GetEditSource() const - { - if( !mpEditSource ) - throw uno::RuntimeException(u"No edit source, object is defunct"_ustr, - const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); - return *mpEditSource; + if( nPara == aSelection.end.nPara ) + nEndPos = aSelection.end.nIndex; + else + nEndPos = GetTextLen(); } - - SvxAccessibleTextAdapter& AccessibleEditableTextPara::GetTextForwarder() const + else { - SvxEditSourceAdapter& rEditSource = GetEditSource(); - SvxAccessibleTextAdapter* pTextForwarder = rEditSource.GetTextForwarderAdapter(); + if( aSelection.start.nPara < nPara || + aSelection.end.nPara > nPara ) + return false; - if( !pTextForwarder ) - throw uno::RuntimeException(u"Unable to fetch text forwarder, object is defunct"_ustr, - const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); + if( nPara == aSelection.start.nPara ) + nStartPos = aSelection.start.nIndex; + else + nStartPos = GetTextLen(); - if( !pTextForwarder->IsValid() ) - throw uno::RuntimeException(u"Text forwarder is invalid, object is defunct"_ustr, - const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); - return *pTextForwarder; + if( nPara == aSelection.end.nPara ) + nEndPos = aSelection.end.nIndex; + else + nEndPos = 0; } - SvxViewForwarder& AccessibleEditableTextPara::GetViewForwarder() const + return true; +} + +OUString AccessibleEditableTextPara::GetTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) +{ + return GetTextForwarder().GetText( MakeSelection(nStartIndex, nEndIndex) ); +} + +sal_Int32 AccessibleEditableTextPara::GetTextLen() const +{ + return GetTextForwarder().GetTextLen(GetParagraphIndex()); +} + +SvxEditSourceAdapter& AccessibleEditableTextPara::GetEditSource() const +{ + if( !mpEditSource ) + throw uno::RuntimeException(u"No edit source, object is defunct"_ustr, + const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); + return *mpEditSource; +} + +SvxAccessibleTextAdapter& AccessibleEditableTextPara::GetTextForwarder() const +{ + SvxEditSourceAdapter& rEditSource = GetEditSource(); + SvxAccessibleTextAdapter* pTextForwarder = rEditSource.GetTextForwarderAdapter(); + + if( !pTextForwarder ) + throw uno::RuntimeException(u"Unable to fetch text forwarder, object is defunct"_ustr, + const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); + + if( !pTextForwarder->IsValid() ) + throw uno::RuntimeException(u"Text forwarder is invalid, object is defunct"_ustr, + const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); + return *pTextForwarder; +} + +SvxViewForwarder& AccessibleEditableTextPara::GetViewForwarder() const +{ + SvxEditSource& rEditSource = GetEditSource(); + SvxViewForwarder* pViewForwarder = rEditSource.GetViewForwarder(); + + if( !pViewForwarder ) { - SvxEditSource& rEditSource = GetEditSource(); - SvxViewForwarder* pViewForwarder = rEditSource.GetViewForwarder(); + throw uno::RuntimeException(u"Unable to fetch view forwarder, object is defunct"_ustr, + const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); + } - if( !pViewForwarder ) - { + if( !pViewForwarder->IsValid() ) + throw uno::RuntimeException(u"View forwarder is invalid, object is defunct"_ustr, + const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); + return *pViewForwarder; +} + +SvxAccessibleTextEditViewAdapter& AccessibleEditableTextPara::GetEditViewForwarder( bool bCreate ) const +{ + SvxEditSourceAdapter& rEditSource = GetEditSource(); + SvxAccessibleTextEditViewAdapter* pTextEditViewForwarder = rEditSource.GetEditViewForwarderAdapter( bCreate ); + + if( !pTextEditViewForwarder ) + { + if( bCreate ) throw uno::RuntimeException(u"Unable to fetch view forwarder, object is defunct"_ustr, const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); - } - - if( !pViewForwarder->IsValid() ) - throw uno::RuntimeException(u"View forwarder is invalid, object is defunct"_ustr, + else + throw uno::RuntimeException(u"No view forwarder, object not in edit mode"_ustr, const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); - return *pViewForwarder; } - SvxAccessibleTextEditViewAdapter& AccessibleEditableTextPara::GetEditViewForwarder( bool bCreate ) const + if( pTextEditViewForwarder->IsValid() ) + return *pTextEditViewForwarder; + else { - SvxEditSourceAdapter& rEditSource = GetEditSource(); - SvxAccessibleTextEditViewAdapter* pTextEditViewForwarder = rEditSource.GetEditViewForwarderAdapter( bCreate ); - - if( !pTextEditViewForwarder ) - { - if( bCreate ) - throw uno::RuntimeException(u"Unable to fetch view forwarder, object is defunct"_ustr, - const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); - else - throw uno::RuntimeException(u"No view forwarder, object not in edit mode"_ustr, - const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); - } - - if( pTextEditViewForwarder->IsValid() ) - return *pTextEditViewForwarder; + if( bCreate ) + throw uno::RuntimeException(u"View forwarder is invalid, object is defunct"_ustr, + const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); else - { - if( bCreate ) - throw uno::RuntimeException(u"View forwarder is invalid, object is defunct"_ustr, - const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); - else - throw uno::RuntimeException(u"View forwarder is invalid, object not in edit mode"_ustr, - const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); - } + throw uno::RuntimeException(u"View forwarder is invalid, object not in edit mode"_ustr, + const_cast< AccessibleEditableTextPara* > (this)->getXWeak() ); } +} - bool AccessibleEditableTextPara::HaveEditView() const - { - SvxEditSource& rEditSource = GetEditSource(); - SvxEditViewForwarder* pViewForwarder = rEditSource.GetEditViewForwarder(); +bool AccessibleEditableTextPara::HaveEditView() const +{ + SvxEditSource& rEditSource = GetEditSource(); + SvxEditViewForwarder* pViewForwarder = rEditSource.GetEditViewForwarder(); - if( !pViewForwarder ) - return false; + if( !pViewForwarder ) + return false; - if( !pViewForwarder->IsValid() ) - return false; + if( !pViewForwarder->IsValid() ) + return false; - return true; - } + return true; +} - bool AccessibleEditableTextPara::HaveChildren() - { - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::HaveChildren: paragraph index value overflow"); +bool AccessibleEditableTextPara::HaveChildren() +{ + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::HaveChildren: paragraph index value overflow"); - return GetTextForwarder().HaveImageBullet( GetParagraphIndex() ); - } + return GetTextForwarder().HaveImageBullet( GetParagraphIndex() ); +} - tools::Rectangle AccessibleEditableTextPara::LogicToPixel( const tools::Rectangle& rRect, const MapMode& rMapMode, SvxViewForwarder const & rForwarder ) - { - // convert to screen coordinates - return tools::Rectangle( rForwarder.LogicToPixel( rRect.TopLeft(), rMapMode ), - rForwarder.LogicToPixel( rRect.BottomRight(), rMapMode ) ); - } +tools::Rectangle AccessibleEditableTextPara::LogicToPixel( const tools::Rectangle& rRect, const MapMode& rMapMode, SvxViewForwarder const & rForwarder ) +{ + // convert to screen coordinates + return tools::Rectangle( rForwarder.LogicToPixel( rRect.TopLeft(), rMapMode ), + rForwarder.LogicToPixel( rRect.BottomRight(), rMapMode ) ); +} - void AccessibleEditableTextPara::SetEEOffset( const Point& rOffset ) - { - auto aChild( maImageBullet.get() ); - if( aChild.is() ) - aChild->SetEEOffset(rOffset); +void AccessibleEditableTextPara::SetEEOffset( const Point& rOffset ) +{ + auto aChild( maImageBullet.get() ); + if( aChild.is() ) + aChild->SetEEOffset(rOffset); - maEEOffset = rOffset; - } + maEEOffset = rOffset; +} - void AccessibleEditableTextPara::FireEvent(const sal_Int16 nEventId, const uno::Any& rNewValue, const uno::Any& rOldValue) const - { - uno::Reference < XAccessibleContext > xThis( const_cast< AccessibleEditableTextPara* > (this)->getAccessibleContext() ); +void AccessibleEditableTextPara::FireEvent(const sal_Int16 nEventId, const uno::Any& rNewValue, const uno::Any& rOldValue) const +{ + uno::Reference < XAccessibleContext > xThis( const_cast< AccessibleEditableTextPara* > (this)->getAccessibleContext() ); - AccessibleEventObject aEvent(xThis, nEventId, rNewValue, rOldValue, -1); + AccessibleEventObject aEvent(xThis, nEventId, rNewValue, rOldValue, -1); - // #106234# Delegate to EventNotifier - if( getNotifierClientId() != -1 ) - ::comphelper::AccessibleEventNotifier::addEvent( getNotifierClientId(), - aEvent ); - } + // #106234# Delegate to EventNotifier + if( getNotifierClientId() != -1 ) + ::comphelper::AccessibleEventNotifier::addEvent( getNotifierClientId(), + aEvent ); +} - void AccessibleEditableTextPara::SetState( const sal_Int64 nStateId ) +void AccessibleEditableTextPara::SetState( const sal_Int64 nStateId ) +{ + if( !(mnStateSet & nStateId) ) { - if( !(mnStateSet & nStateId) ) - { - mnStateSet |= nStateId; - FireEvent( AccessibleEventId::STATE_CHANGED, uno::Any( nStateId ) ); - } + mnStateSet |= nStateId; + FireEvent( AccessibleEventId::STATE_CHANGED, uno::Any( nStateId ) ); } +} - void AccessibleEditableTextPara::UnSetState( const sal_Int64 nStateId ) +void AccessibleEditableTextPara::UnSetState( const sal_Int64 nStateId ) +{ + if( mnStateSet & nStateId ) { - if( mnStateSet & nStateId ) - { - mnStateSet &= ~nStateId; - FireEvent( AccessibleEventId::STATE_CHANGED, uno::Any(), uno::Any( nStateId ) ); - } + mnStateSet &= ~nStateId; + FireEvent( AccessibleEventId::STATE_CHANGED, uno::Any(), uno::Any( nStateId ) ); } +} - void AccessibleEditableTextPara::TextChanged() +void AccessibleEditableTextPara::TextChanged() +{ + OUString aCurrentString( implGetText() ); + uno::Any aDeleted; + uno::Any aInserted; + if( OCommonAccessibleText::implInitTextChangedEvent( maLastTextString, aCurrentString, + aDeleted, aInserted) ) { - OUString aCurrentString( implGetText() ); - uno::Any aDeleted; - uno::Any aInserted; - if( OCommonAccessibleText::implInitTextChangedEvent( maLastTextString, aCurrentString, - aDeleted, aInserted) ) - { - FireEvent( AccessibleEventId::TEXT_CHANGED, aInserted, aDeleted ); - maLastTextString = aCurrentString; - } + FireEvent( AccessibleEventId::TEXT_CHANGED, aInserted, aDeleted ); + maLastTextString = aCurrentString; } +} - bool AccessibleEditableTextPara::GetAttributeRun( sal_Int32& nStartIndex, sal_Int32& nEndIndex, sal_Int32 nIndex ) - { - DBG_ASSERT(nIndex >= 0, - "AccessibleEditableTextPara::GetAttributeRun: index value overflow"); - - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getLocale: paragraph index value overflow"); +bool AccessibleEditableTextPara::GetAttributeRun( sal_Int32& nStartIndex, sal_Int32& nEndIndex, sal_Int32 nIndex ) +{ + DBG_ASSERT(nIndex >= 0, + "AccessibleEditableTextPara::GetAttributeRun: index value overflow"); - return GetTextForwarder().GetAttributeRun( nStartIndex, - nEndIndex, - GetParagraphIndex(), - nIndex ); - } + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getLocale: paragraph index value overflow"); - uno::Any SAL_CALL AccessibleEditableTextPara::queryInterface (const uno::Type & rType) - { - uno::Any aRet; + return GetTextForwarder().GetAttributeRun( nStartIndex, + nEndIndex, + GetParagraphIndex(), + nIndex ); +} - // 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); - } +uno::Any SAL_CALL AccessibleEditableTextPara::queryInterface (const uno::Type & rType) +{ + uno::Any aRet; - return 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; } - - // XAccessible - uno::Reference< XAccessibleContext > SAL_CALL AccessibleEditableTextPara::getAccessibleContext() + else if ( rType == cppu::UnoType<XAccessibleEditableText>::get()) { - // We implement the XAccessibleContext interface in the same object - return uno::Reference< XAccessibleContext > ( this ); + uno::Reference< XAccessibleEditableText > aAccEditText = this; + aRet <<= aAccEditText; } - - // XAccessibleContext - sal_Int64 SAL_CALL AccessibleEditableTextPara::getAccessibleChildCount() + else if ( rType == cppu::UnoType<XAccessibleHypertext>::get()) { - SolarMutexGuard aGuard; - - return HaveChildren() ? 1 : 0; + uno::Reference< XAccessibleHypertext > aAccHyperText = this; + aRet <<= aAccHyperText; } - - uno::Reference< XAccessible > SAL_CALL AccessibleEditableTextPara::getAccessibleChild( sal_Int64 i ) + else { - SolarMutexGuard aGuard; + aRet = AccessibleTextParaInterfaceBase::queryInterface(rType); + } - if( !HaveChildren() ) - throw lang::IndexOutOfBoundsException(u"No children available"_ustr, - getXWeak() ); + return aRet; +} - if( i != 0 ) - throw lang::IndexOutOfBoundsException(u"Invalid child index"_ustr, - getXWeak() ); +// XAccessible +uno::Reference< XAccessibleContext > SAL_CALL AccessibleEditableTextPara::getAccessibleContext() +{ + // We implement the XAccessibleContext interface in the same object + return uno::Reference< XAccessibleContext > ( this ); +} - auto aChild( maImageBullet.get() ); +// XAccessibleContext +sal_Int64 SAL_CALL AccessibleEditableTextPara::getAccessibleChildCount() +{ + SolarMutexGuard aGuard; - if( !aChild.is() ) - { - // there is no hard reference available, create object then - aChild = new AccessibleImageBullet(this); + return HaveChildren() ? 1 : 0; +} - aChild->SetEditSource( &GetEditSource() ); - aChild->SetParagraphIndex( GetParagraphIndex() ); - aChild->SetIndexInParent( i ); +uno::Reference< XAccessible > SAL_CALL AccessibleEditableTextPara::getAccessibleChild( sal_Int64 i ) +{ + SolarMutexGuard aGuard; - maImageBullet = aChild; - } + if( !HaveChildren() ) + throw lang::IndexOutOfBoundsException(u"No children available"_ustr, + getXWeak() ); - return aChild; - } + if( i != 0 ) + throw lang::IndexOutOfBoundsException(u"Invalid child index"_ustr, + getXWeak() ); - uno::Reference< XAccessible > SAL_CALL AccessibleEditableTextPara::getAccessibleParent() + auto aChild( maImageBullet.get() ); + + if( !aChild.is() ) { - SAL_WARN_IF(!mxParent.is(), "editeng", "AccessibleEditableTextPara::getAccessibleParent: no frontend set, did somebody forgot to call AccessibleTextHelper::SetEventSource()?"); + // there is no hard reference available, create object then + aChild = new AccessibleImageBullet(this); - return mxParent; - } + aChild->SetEditSource( &GetEditSource() ); + aChild->SetParagraphIndex( GetParagraphIndex() ); + aChild->SetIndexInParent( i ); - sal_Int64 SAL_CALL AccessibleEditableTextPara::getAccessibleIndexInParent() - { - return mnIndexInParent; + maImageBullet = aChild; } - sal_Int16 SAL_CALL AccessibleEditableTextPara::getAccessibleRole() - { - return AccessibleRole::PARAGRAPH; - } + return aChild; +} - OUString SAL_CALL AccessibleEditableTextPara::getAccessibleDescription() - { - return OUString(); - } +uno::Reference< XAccessible > SAL_CALL AccessibleEditableTextPara::getAccessibleParent() +{ + SAL_WARN_IF(!mxParent.is(), "editeng", "AccessibleEditableTextPara::getAccessibleParent: no frontend set, did somebody forgot to call AccessibleTextHelper::SetEventSource()?"); - OUString SAL_CALL AccessibleEditableTextPara::getAccessibleName() - { - //See tdf#101003 before implementing a body - return OUString(); - } + return mxParent; +} - uno::Reference< XAccessibleRelationSet > SAL_CALL AccessibleEditableTextPara::getAccessibleRelationSet() - { - // #i27138# - provide relations CONTENT_FLOWS_FROM - // and CONTENT_FLOWS_TO - if ( mpParaManager ) - { - rtl::Reference<utl::AccessibleRelationSetHelper> pAccRelSetHelper = - new utl::AccessibleRelationSetHelper(); - sal_Int32 nMyParaIndex( GetParagraphIndex() ); - // relation CONTENT_FLOWS_FROM - if ( nMyParaIndex > 0 && - mpParaManager->IsReferencable( nMyParaIndex - 1 ) ) - { - uno::Sequence<uno::Reference<XAccessible>> aSequence - { mpParaManager->GetChild( nMyParaIndex - 1 ).first.get() }; - AccessibleRelation aAccRel(AccessibleRelationType_CONTENT_FLOWS_FROM, - aSequence ); - pAccRelSetHelper->AddRelation( aAccRel ); - } +sal_Int64 SAL_CALL AccessibleEditableTextPara::getAccessibleIndexInParent() +{ + return mnIndexInParent; +} - // relation CONTENT_FLOWS_TO - if ( (nMyParaIndex + 1) < mpParaManager->GetNum() && - mpParaManager->IsReferencable( nMyParaIndex + 1 ) ) - { - uno::Sequence<uno::Reference<XAccessible>> aSequence - { mpParaManager->GetChild( nMyParaIndex + 1 ).first.get() }; - AccessibleRelation aAccRel(AccessibleRelationType_CONTENT_FLOWS_TO, - aSequence ); - pAccRelSetHelper->AddRelation( aAccRel ); - } +sal_Int16 SAL_CALL AccessibleEditableTextPara::getAccessibleRole() +{ + return AccessibleRole::PARAGRAPH; +} - return pAccRelSetHelper; - } - else - { - // no relations, therefore empty - return uno::Reference< XAccessibleRelationSet >(); - } - } +OUString SAL_CALL AccessibleEditableTextPara::getAccessibleDescription() +{ + return OUString(); +} + +OUString SAL_CALL AccessibleEditableTextPara::getAccessibleName() +{ + //See tdf#101003 before implementing a body + return OUString(); +} - static uno::Sequence< OUString > const & getAttributeNames() - { - static const uno::Sequence<OUString> aNames{ - u"CharColor"_ustr, - u"CharContoured"_ustr, - u"CharEmphasis"_ustr, - u"CharEscapement"_ustr, - u"CharFontName"_ustr, - u"CharHeight"_ustr, - u"CharPosture"_ustr, - u"CharShadowed"_ustr, - u"CharStrikeout"_ustr, - u"CharCaseMap"_ustr, - u"CharUnderline"_ustr, - u"CharUnderlineColor"_ustr, - u"CharWeight"_ustr, - u"NumberingLevel"_ustr, - u"NumberingRules"_ustr, - u"ParaAdjust"_ustr, - u"ParaBottomMargin"_ustr, - u"ParaFirstLineIndent"_ustr, - u"ParaLeftMargin"_ustr, - u"ParaLineSpacing"_ustr, - u"ParaRightMargin"_ustr, - u"ParaTabStops"_ustr}; - - return aNames; - } - - namespace { - - struct IndexCompare - { - const uno::Sequence<beans::PropertyValue>& m_rValues; - explicit IndexCompare(const uno::Sequence<beans::PropertyValue>& rValues) - : m_rValues(rValues) +uno::Reference< XAccessibleRelationSet > SAL_CALL AccessibleEditableTextPara::getAccessibleRelationSet() +{ + // #i27138# - provide relations CONTENT_FLOWS_FROM + // and CONTENT_FLOWS_TO + if ( mpParaManager ) + { + rtl::Reference<utl::AccessibleRelationSetHelper> pAccRelSetHelper = + new utl::AccessibleRelationSetHelper(); + sal_Int32 nMyParaIndex( GetParagraphIndex() ); + // relation CONTENT_FLOWS_FROM + if ( nMyParaIndex > 0 && + mpParaManager->IsReferencable( nMyParaIndex - 1 ) ) { + uno::Sequence<uno::Reference<XAccessible>> aSequence + { mpParaManager->GetChild( nMyParaIndex - 1 ).first.get() }; + AccessibleRelation aAccRel(AccessibleRelationType_CONTENT_FLOWS_FROM, + aSequence ); + pAccRelSetHelper->AddRelation( aAccRel ); } - bool operator() ( sal_Int32 a, sal_Int32 b ) const + + // relation CONTENT_FLOWS_TO + if ( (nMyParaIndex + 1) < mpParaManager->GetNum() && + mpParaManager->IsReferencable( nMyParaIndex + 1 ) ) { - return m_rValues[a].Name < m_rValues[b].Name; + uno::Sequence<uno::Reference<XAccessible>> aSequence + { mpParaManager->GetChild( nMyParaIndex + 1 ).first.get() }; + AccessibleRelation aAccRel(AccessibleRelationType_CONTENT_FLOWS_TO, + aSequence ); + pAccRelSetHelper->AddRelation( aAccRel ); } - }; + return pAccRelSetHelper; } + else + { + // no relations, therefore empty + return uno::Reference< XAccessibleRelationSet >(); + } +} + +static uno::Sequence< OUString > const & getAttributeNames() +{ + static const uno::Sequence<OUString> aNames{ + u"CharColor"_ustr, + u"CharContoured"_ustr, + u"CharEmphasis"_ustr, + u"CharEscapement"_ustr, + u"CharFontName"_ustr, + u"CharHeight"_ustr, + u"CharPosture"_ustr, + u"CharShadowed"_ustr, + u"CharStrikeout"_ustr, + u"CharCaseMap"_ustr, + u"CharUnderline"_ustr, + u"CharUnderlineColor"_ustr, + u"CharWeight"_ustr, + u"NumberingLevel"_ustr, + u"NumberingRules"_ustr, + u"ParaAdjust"_ustr, + u"ParaBottomMargin"_ustr, + u"ParaFirstLineIndent"_ustr, + u"ParaLeftMargin"_ustr, + u"ParaLineSpacing"_ustr, + u"ParaRightMargin"_ustr, + u"ParaTabStops"_ustr}; + + return aNames; +} + +namespace { + +struct IndexCompare +{ + const uno::Sequence<beans::PropertyValue>& m_rValues; + explicit IndexCompare(const uno::Sequence<beans::PropertyValue>& rValues) + : m_rValues(rValues) + { + } + bool operator() ( sal_Int32 a, sal_Int32 b ) const + { + return m_rValues[a].Name < m_rValues[b].Name; + } +}; + +} } namespace { - OUString GetFieldTypeNameFromField(EFieldInfo const &ree) +OUString GetFieldTypeNameFromField(EFieldInfo const &ree) +{ + OUString strFldType; + sal_Int32 nFieldType = -1; + if (ree.pFieldItem) { - OUString strFldType; - sal_Int32 nFieldType = -1; - if (ree.pFieldItem) - { - // So we get a field, check its type now. - nFieldType = ree.pFieldItem->GetField()->GetClassId() ; - } - switch (nFieldType) + // So we get a field, check its type now. + nFieldType = ree.pFieldItem->GetField()->GetClassId() ; + } + switch (nFieldType) + { + case text::textfield::Type::DATE: { - case text::textfield::Type::DATE: + const SvxDateField* pDateField = static_cast< const SvxDateField* >(ree.pFieldItem->GetField()); + if (pDateField) { - const SvxDateField* pDateField = static_cast< const SvxDateField* >(ree.pFieldItem->GetField()); - if (pDateField) - { - if (pDateField->GetType() == SvxDateType::Fix) - strFldType = "date (fixed)"; - else if (pDateField->GetType() == SvxDateType::Var) - strFldType = "date (variable)"; - } - break; + if (pDateField->GetType() == SvxDateType::Fix) + strFldType = "date (fixed)"; + else if (pDateField->GetType() == SvxDateType::Var) + strFldType = "date (variable)"; } - case text::textfield::Type::PAGE: - strFldType = "page-number"; - break; - //support the sheet name & pages fields - case text::textfield::Type::PAGES: - strFldType = "page-count"; - break; - case text::textfield::Type::TABLE: - strFldType = "sheet-name"; - break; - //End - case text::textfield::Type::TIME: - strFldType = "time"; - break; - case text::textfield::Type::EXTENDED_TIME: + break; + } + case text::textfield::Type::PAGE: + strFldType = "page-number"; + break; + //support the sheet name & pages fields + case text::textfield::Type::PAGES: + strFldType = "page-count"; + break; + case text::textfield::Type::TABLE: + strFldType = "sheet-name"; + break; + //End + case text::textfield::Type::TIME: + strFldType = "time"; + break; + case text::textfield::Type::EXTENDED_TIME: + { + const SvxExtTimeField* pTimeField = static_cast< const SvxExtTimeField* >(ree.pFieldItem->GetField()); + if (pTimeField) { - const SvxExtTimeField* pTimeField = static_cast< const SvxExtTimeField* >(ree.pFieldItem->GetField()); - if (pTimeField) - { - if (pTimeField->GetType() == SvxTimeType::Fix) - strFldType = "time (fixed)"; - else if (pTimeField->GetType() == SvxTimeType::Var) - strFldType = "time (variable)"; - } - break; + if (pTimeField->GetType() == SvxTimeType::Fix) + strFldType = "time (fixed)"; + else if (pTimeField->GetType() == SvxTimeType::Var) + strFldType = "time (variable)"; } - case text::textfield::Type::AUTHOR: - strFldType = "author"; - break; - case text::textfield::Type::EXTENDED_FILE: - case text::textfield::Type::DOCINFO_TITLE: - strFldType = "file name"; - break; - case text::textfield::Type::DOCINFO_CUSTOM: - strFldType = "custom document property"; - break; - default: - break; + break; } - return strFldType; + case text::textfield::Type::AUTHOR: + strFldType = "author"; + break; + case text::textfield::Type::EXTENDED_FILE: + case text::textfield::Type::DOCINFO_TITLE: + strFldType = "file name"; + break; + case text::textfield::Type::DOCINFO_CUSTOM: + strFldType = "custom document property"; + break; + default: + break; } + return strFldType; +} } namespace accessibility { - OUString AccessibleEditableTextPara::GetFieldTypeNameAtIndex(sal_Int32 nIndex) - { - SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); - //For field object info - sal_Int32 nParaIndex = GetParagraphIndex(); - sal_Int32 nAllFieldLen = 0; - std::vector<EFieldInfo> aFieldInfos = rCacheTF.GetFieldInfo(nParaIndex); - for (const EFieldInfo& ree : aFieldInfos) - { - sal_Int32 reeBegin = ree.aPosition.nIndex + nAllFieldLen; - sal_Int32 reeEnd = reeBegin + ree.aCurrentText.getLength(); - nAllFieldLen += (ree.aCurrentText.getLength() - 1); - if (nIndex < reeBegin) - break; - if (nIndex < reeEnd) - return GetFieldTypeNameFromField(ree); - } - return OUString(); +OUString AccessibleEditableTextPara::GetFieldTypeNameAtIndex(sal_Int32 nIndex) +{ + SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); + //For field object info + sal_Int32 nParaIndex = GetParagraphIndex(); + sal_Int32 nAllFieldLen = 0; + std::vector<EFieldInfo> aFieldInfos = rCacheTF.GetFieldInfo(nParaIndex); + for (const EFieldInfo& ree : aFieldInfos) + { + sal_Int32 reeBegin = ree.aPosition.nIndex + nAllFieldLen; + sal_Int32 reeEnd = reeBegin + ree.aCurrentText.getLength(); + nAllFieldLen += (ree.aCurrentText.getLength() - 1); + if (nIndex < reeBegin) + break; + if (nIndex < reeEnd) + return GetFieldTypeNameFromField(ree); } + return OUString(); +} - sal_Int64 SAL_CALL AccessibleEditableTextPara::getAccessibleStateSet() - { - SolarMutexGuard aGuard; +sal_Int64 SAL_CALL AccessibleEditableTextPara::getAccessibleStateSet() +{ + SolarMutexGuard aGuard; - // Create a copy of the state set and return it. + // Create a copy of the state set and return it. - sal_Int64 nParentStates = 0; - if (getAccessibleParent().is()) - { - uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext(); - nParentStates = xParentContext->getAccessibleStateSet(); - } - if (nParentStates & AccessibleStateType::EDITABLE) - { - mnStateSet |= AccessibleStateType::EDITABLE; - } - return mnStateSet; - } - - lang::Locale SAL_CALL AccessibleEditableTextPara::getLocale() + sal_Int64 nParentStates = 0; + if (getAccessibleParent().is()) { - SolarMutexGuard aGuard; - - return implGetLocale(); + uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext(); + nParentStates = xParentContext->getAccessibleStateSet(); } - - void SAL_CALL AccessibleEditableTextPara::addAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) + if (nParentStates & AccessibleStateType::EDITABLE) { - if( getNotifierClientId() != -1 ) - ::comphelper::AccessibleEventNotifier::addEventListener( getNotifierClientId(), xListener ); + mnStateSet |= AccessibleStateType::EDITABLE; } + return mnStateSet; +} - void SAL_CALL AccessibleEditableTextPara::removeAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) - { - if( getNotifierClientId() == -1 ) - return; +lang::Locale SAL_CALL AccessibleEditableTextPara::getLocale() +{ + SolarMutexGuard aGuard; - 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 ); - } - } + 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; - // XAccessibleComponent - sal_Bool SAL_CALL AccessibleEditableTextPara::containsPoint( const awt::Point& aTmpPoint ) + const sal_Int32 nListenerCount = ::comphelper::AccessibleEventNotifier::removeEventListener( getNotifierClientId(), xListener ); + if ( !nListenerCount ) { - SolarMutexGuard aGuard; + // 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 ); + } +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::contains: index value overflow"); +// XAccessibleComponent +sal_Bool SAL_CALL AccessibleEditableTextPara::containsPoint( const awt::Point& aTmpPoint ) +{ + SolarMutexGuard aGuard; - awt::Rectangle aTmpRect = getBounds(); - tools::Rectangle aRect( Point(aTmpRect.X, aTmpRect.Y), Size(aTmpRect.Width, aTmpRect.Height) ); - Point aPoint( aTmpPoint.X, aTmpPoint.Y ); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::contains: index value overflow"); - return aRect.Contains( aPoint ); - } + awt::Rectangle aTmpRect = getBounds(); + tools::Rectangle aRect( Point(aTmpRect.X, aTmpRect.Y), Size(aTmpRect.Width, aTmpRect.Height) ); + Point aPoint( aTmpPoint.X, aTmpPoint.Y ); - uno::Reference< XAccessible > SAL_CALL AccessibleEditableTextPara::getAccessibleAtPoint( const awt::Point& _aPoint ) - { - SolarMutexGuard aGuard; + return aRect.Contains( aPoint ); +} - if( HaveChildren() ) - { - // #103862# No longer need to make given position relative - Point aPoint( _aPoint.X, _aPoint.Y ); +uno::Reference< XAccessible > SAL_CALL AccessibleEditableTextPara::getAccessibleAtPoint( const awt::Point& _aPoint ) +{ + SolarMutexGuard aGuard; - // respect EditEngine offset to surrounding shape/cell - aPoint -= GetEEOffset(); + if( HaveChildren() ) + { + // #103862# No longer need to make given position relative + Point aPoint( _aPoint.X, _aPoint.Y ); - // convert to EditEngine coordinate system - SvxTextForwarder& rCacheTF = GetTextForwarder(); - Point aLogPoint( GetViewForwarder().PixelToLogic( aPoint, rCacheTF.GetMapMode() ) ); + // respect EditEngine offset to surrounding shape/cell + aPoint -= GetEEOffset(); - EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(GetParagraphIndex()); + // convert to EditEngine coordinate system + SvxTextForwarder& rCacheTF = GetTextForwarder(); + Point aLogPoint( GetViewForwarder().PixelToLogic( aPoint, rCacheTF.GetMapMode() ) ); - if( aBulletInfo.nParagraph != EE_PARA_MAX && - aBulletInfo.bVisible && - aBulletInfo.nType == SVX_NUM_BITMAP ) - { - tools::Rectangle aRect = aBulletInfo.aBounds; + EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(GetParagraphIndex()); - if( aRect.Contains( aLogPoint ) ) - return getAccessibleChild(0); - } - } + if( aBulletInfo.nParagraph != EE_PARA_MAX && + aBulletInfo.bVisible && + aBulletInfo.nType == SVX_NUM_BITMAP ) + { + tools::Rectangle aRect = aBulletInfo.aBounds; - // no children at all, or none at given position - return uno::Reference< XAccessible >(); + if( aRect.Contains( aLogPoint ) ) + return getAccessibleChild(0); + } } - awt::Rectangle SAL_CALL AccessibleEditableTextPara::getBounds() - { - SolarMutexGuard aGuard; + // no children at all, or none at given position + return uno::Reference< XAccessible >(); +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getBounds: index value overflow"); +awt::Rectangle SAL_CALL AccessibleEditableTextPara::getBounds() +{ + SolarMutexGuard aGuard; - SvxTextForwarder& rCacheTF = GetTextForwarder(); - tools::Rectangle aRect = rCacheTF.GetParaBounds( GetParagraphIndex() ); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getBounds: index value overflow"); - // convert to screen coordinates - tools::Rectangle aScreenRect = AccessibleEditableTextPara::LogicToPixel( aRect, - rCacheTF.GetMapMode(), - GetViewForwarder() ); + SvxTextForwarder& rCacheTF = GetTextForwarder(); + tools::Rectangle aRect = rCacheTF.GetParaBounds( GetParagraphIndex() ); - // offset from shape/cell - Point aOffset = GetEEOffset(); + // convert to screen coordinates + tools::Rectangle aScreenRect = AccessibleEditableTextPara::LogicToPixel( aRect, + rCacheTF.GetMapMode(), + GetViewForwarder() ); - return awt::Rectangle( aScreenRect.Left() + aOffset.X(), - aScreenRect.Top() + aOffset.Y(), - aScreenRect.GetSize().Width(), - aScreenRect.GetSize().Height() ); - } + // offset from shape/cell + Point aOffset = GetEEOffset(); - awt::Point SAL_CALL AccessibleEditableTextPara::getLocation( ) - { - SolarMutexGuard aGuard; + return awt::Rectangle( aScreenRect.Left() + aOffset.X(), + aScreenRect.Top() + aOffset.Y(), + aScreenRect.GetSize().Width(), + aScreenRect.GetSize().Height() ); +} - awt::Rectangle aRect = getBounds(); +awt::Point SAL_CALL AccessibleEditableTextPara::getLocation( ) +{ + SolarMutexGuard aGuard; - return awt::Point( aRect.X, aRect.Y ); - } + awt::Rectangle aRect = getBounds(); - awt::Point SAL_CALL AccessibleEditableTextPara::getLocationOnScreen( ) - { - SolarMutexGuard aGuard; + 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() ) + // relate us to parent + uno::Reference< XAccessible > xParent = getAccessibleParent(); + if( xParent.is() ) + { + uno::Reference< XAccessibleContext > xParentContext = xParent->getAccessibleContext(); + if ( xParentContext.is() ) { - uno::Reference< XAccessibleContext > xParentContext = xParent->getAccessibleContext(); - if ( xParentContext.is() ) + uno::Reference< XAccessibleComponent > xParentContextComponent( xParentContext, uno::UNO_QUERY ); + if( xParentContextComponent.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; + awt::Point aRefPoint = xParentContextComponent->getLocationOnScreen(); + awt::Point aPoint = getLocation(); + aPoint.X += aRefPoint.X; + aPoint.Y += aRefPoint.Y; - return aPoint; - } + 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(); + throw uno::RuntimeException(u"Cannot access parent"_ustr, + uno::Reference< uno::XInterface > + ( static_cast< XAccessible* > (this) ) ); // disambiguate hierarchy +} - return awt::Size( aRect.Width, aRect.Height ); - } +awt::Size SAL_CALL AccessibleEditableTextPara::getSize( ) +{ + SolarMutexGuard aGuard; - void SAL_CALL AccessibleEditableTextPara::grabFocus( ) - { - // set cursor to this paragraph - setSelection(0,0); - } + awt::Rectangle aRect = getBounds(); - sal_Int32 SAL_CALL AccessibleEditableTextPara::getForeground( ) - { - // #104444# Added to XAccessibleComponent interface - svtools::ColorConfig aColorConfig; - Color nColor = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor; - return static_cast<sal_Int32>(nColor); - } + return awt::Size( aRect.Width, aRect.Height ); +} - sal_Int32 SAL_CALL AccessibleEditableTextPara::getBackground( ) - { - // #104444# Added to XAccessibleComponent interface - Color aColor( Application::GetSettings().GetStyleSettings().GetWindowColor() ); +void SAL_CALL AccessibleEditableTextPara::grabFocus( ) +{ + // set cursor to this paragraph + setSelection(0,0); +} - // the background is transparent - aColor.SetAlpha(0); +sal_Int32 SAL_CALL AccessibleEditableTextPara::getForeground( ) +{ + // #104444# Added to XAccessibleComponent interface + svtools::ColorConfig aColorConfig; + Color nColor = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor; + return static_cast<sal_Int32>(nColor); +} - return static_cast<sal_Int32>( aColor ); - } +sal_Int32 SAL_CALL AccessibleEditableTextPara::getBackground( ) +{ + // #104444# Added to XAccessibleComponent interface + Color aColor( Application::GetSettings().GetStyleSettings().GetWindowColor() ); - // XAccessibleText - sal_Int32 SAL_CALL AccessibleEditableTextPara::getCaretPosition() - { - SolarMutexGuard aGuard; + // the background is transparent + aColor.SetAlpha(0); - if( !HaveEditView() ) - return -1; + return static_cast<sal_Int32>( aColor ); +} - ESelection aSelection; - if( GetEditViewForwarder().GetSelection( aSelection ) && - GetParagraphIndex() == aSelection.end.nPara ) - { - // caret is always nEndPara,nEndPos - EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); - if( aBulletInfo.nParagraph != EE_PARA_MAX && - aBulletInfo.bVisible && - aBulletInfo.nType != SVX_NUM_BITMAP ) - { - sal_Int32 nBulletLen = aBulletInfo.aText.getLength(); - if( aSelection.end.nIndex - nBulletLen >= 0 ) - return aSelection.end.nIndex - nBulletLen; - } - return aSelection.end.nIndex; - } +// XAccessibleText +sal_Int32 SAL_CALL AccessibleEditableTextPara::getCaretPosition() +{ + SolarMutexGuard aGuard; - // not within this paragraph + if( !HaveEditView() ) return -1; - } - sal_Bool SAL_CALL AccessibleEditableTextPara::setCaretPosition( sal_Int32 nIndex ) + ESelection aSelection; + if( GetEditViewForwarder().GetSelection( aSelection ) && + GetParagraphIndex() == aSelection.end.nPara ) { - return setSelection(nIndex, nIndex); + // caret is always nEndPara,nEndPos + EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); + if( aBulletInfo.nParagraph != EE_PARA_MAX && + aBulletInfo.bVisible && + aBulletInfo.nType != SVX_NUM_BITMAP ) + { + sal_Int32 nBulletLen = aBulletInfo.aText.getLength(); + if( aSelection.end.nIndex - nBulletLen >= 0 ) + return aSelection.end.nIndex - nBulletLen; + } + return aSelection.end.nIndex; } - sal_Unicode SAL_CALL AccessibleEditableTextPara::getCharacter( sal_Int32 nIndex ) - { - SolarMutexGuard aGuard; + // not within this paragraph + return -1; +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getCharacter: index value overflow"); +sal_Bool SAL_CALL AccessibleEditableTextPara::setCaretPosition( sal_Int32 nIndex ) +{ + return setSelection(nIndex, nIndex); +} - return OCommonAccessibleText::implGetCharacter( implGetText(), nIndex ); - } +sal_Unicode SAL_CALL AccessibleEditableTextPara::getCharacter( sal_Int32 nIndex ) +{ + SolarMutexGuard aGuard; - uno::Sequence< beans::PropertyValue > SAL_CALL AccessibleEditableTextPara::getCharacterAttributes( sal_Int32 nIndex, const css::uno::Sequence< OUString >& rRequestedAttributes ) - { - SolarMutexGuard aGuard; + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getCharacter: index value overflow"); - //Skip the bullet range to ignore the bullet text - SvxTextForwarder& rCacheTF = GetTextForwarder(); - EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(GetParagraphIndex()); - if (aBulletInfo.bVisible) - nIndex += aBulletInfo.aText.getLength(); - CheckIndex(nIndex); // may throw IndexOutOfBoundsException + return OCommonAccessibleText::implGetCharacter( implGetText(), nIndex ); +} - bool bSupplementalMode = false; - uno::Sequence< OUString > aPropertyNames = rRequestedAttributes; - if (!aPropertyNames.hasElements()) - { - bSupplementalMode = true; - aPropertyNames = getAttributeNames(); - } +uno::Sequence< beans::PropertyValue > SAL_CALL AccessibleEditableTextPara::getCharacterAttributes( sal_Int32 nIndex, const css::uno::Sequence< OUString >& rRequestedAttributes ) +{ + SolarMutexGuard aGuard; - // get default attributes... - ::comphelper::SequenceAsHashMap aPropHashMap( getDefaultAttributes( aPropertyNames ) ); + //Skip the bullet range to ignore the bullet text + SvxTextForwarder& rCacheTF = GetTextForwarder(); + EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(GetParagraphIndex()); + if (aBulletInfo.bVisible) + nIndex += aBulletInfo.aText.getLength(); + CheckIndex(nIndex); // may throw IndexOutOfBoundsException - // ... and override them with the direct attributes from the specific position - const uno::Sequence< beans::PropertyValue > aRunAttribs( getRunAttributes( nIndex, aPropertyNames ) ); - for (auto const& rRunAttrib : aRunAttribs) - { - aPropHashMap[ rRunAttrib.Name ] = rRunAttrib.Value; //!! should not only be the value !! - } + bool bSupplementalMode = false; + uno::Sequence< OUString > aPropertyNames = rRequestedAttributes; + if (!aPropertyNames.hasElements()) + { + bSupplementalMode = true; + aPropertyNames = getAttributeNames(); + } - // get resulting sequence - uno::Sequence< beans::PropertyValue > aRes; - aPropHashMap >> aRes; + // get default attributes... + ::comphelper::SequenceAsHashMap aPropHashMap( getDefaultAttributes( aPropertyNames ) ); - // since SequenceAsHashMap ignores property handles and property state - // we have to restore the property state here (property handles are - // of no use to the accessibility API). - for (beans::PropertyValue & rRes : asNonConstRange(aRes)) - { - bool bIsDirectVal = false; - for (auto const& rRunAttrib : aRunAttribs) - { - bIsDirectVal = rRes.Name == rRunAttrib.Name; - if (bIsDirectVal) - break; - } - rRes.Handle = -1; - rRes.State = bIsDirectVal ? PropertyState_DIRECT_VALUE : PropertyState_DEFAULT_VALUE; - } - if( bSupplementalMode ) - { - _correctValues( aRes ); - // NumberingPrefix - sal_Int32 nRes = aRes.getLength(); - aRes.realloc( nRes + 1 ); - beans::PropertyValue &rRes = aRes.getArray()[nRes]; - rRes.Name = "NumberingPrefix"; - OUString numStr; - if (aBulletInfo.nType != SVX_NUM_CHAR_SPECIAL && aBulletInfo.nType != SVX_NUM_BITMAP) - numStr = aBulletInfo.aText; - rRes.Value <<= numStr; - rRes.Handle = -1; - rRes.State = PropertyState_DIRECT_VALUE; - //For field object. - OUString strFieldType = GetFieldTypeNameAtIndex(nIndex); - if (!strFieldType.isEmpty()) - { - nRes = aRes.getLength(); - aRes.realloc( nRes + 1 ); - beans::PropertyValue &rResField = aRes.getArray()[nRes]; - rResField.Name = "FieldType"; - rResField.Value <<= strFieldType.toAsciiLowerCase(); - rResField.Handle = -1; - rResField.State = PropertyState_DIRECT_VALUE; - } - //sort property values - // build sorted index array - sal_Int32 nLength = aRes.getLength(); - std::vector<sal_Int32> indices(nLength); - std::iota(indices.begin(), indices.end(), 0); - std::sort(indices.begin(), indices.end(), IndexCompare(aRes)); - // create sorted sequences according to index array - uno::Sequence<beans::PropertyValue> aNewValues( nLength ); - std::transform(indices.begin(), indices.end(), aNewValues.getArray(), - [&aRes](sal_Int32 index) -> const beans::PropertyValue& { return aRes[index]; }); - - return aNewValues; - } - return aRes; + // ... and override them with the direct attributes from the specific position + const uno::Sequence< beans::PropertyValue > aRunAttribs( getRunAttributes( nIndex, aPropertyNames ) ); + for (auto const& rRunAttrib : aRunAttribs) + { + aPropHashMap[ rRunAttrib.Name ] = rRunAttrib.Value; //!! should not only be the value !! } - awt::Rectangle SAL_CALL AccessibleEditableTextPara::getCharacterBounds( sal_Int32 nIndex ) + // get resulting sequence + uno::Sequence< beans::PropertyValue > aRes; + aPropHashMap >> aRes; + + // since SequenceAsHashMap ignores property handles and property state + // we have to restore the property state here (property handles are + // of no use to the accessibility API). + for (beans::PropertyValue & rRes : asNonConstRange(aRes)) { - SolarMutexGuard aGuard; + bool bIsDirectVal = false; + for (auto const& rRunAttrib : aRunAttribs) + { + bIsDirectVal = rRes.Name == rRunAttrib.Name; + if (bIsDirectVal) + break; + } + rRes.Handle = -1; + rRes.State = bIsDirectVal ? PropertyState_DIRECT_VALUE : PropertyState_DEFAULT_VALUE; + } + if( bSupplementalMode ) + { + _correctValues( aRes ); + // NumberingPrefix + sal_Int32 nRes = aRes.getLength(); + aRes.realloc( nRes + 1 ); + beans::PropertyValue &rRes = aRes.getArray()[nRes]; + rRes.Name = "NumberingPrefix"; + OUString numStr; + if (aBulletInfo.nType != SVX_NUM_CHAR_SPECIAL && aBulletInfo.nType != SVX_NUM_BITMAP) + numStr = aBulletInfo.aText; + rRes.Value <<= numStr; + rRes.Handle = -1; + rRes.State = PropertyState_DIRECT_VALUE; + //For field object. + OUString strFieldType = GetFieldTypeNameAtIndex(nIndex); + if (!strFieldType.isEmpty()) + { + nRes = aRes.getLength(); + aRes.realloc( nRes + 1 ); + beans::PropertyValue &rResField = aRes.getArray()[nRes]; + rResField.Name = "FieldType"; + rResField.Value <<= strFieldType.toAsciiLowerCase(); + rResField.Handle = -1; + rResField.State = PropertyState_DIRECT_VALUE; + } + //sort property values + // build sorted index array + sal_Int32 nLength = aRes.getLength(); + std::vector<sal_Int32> indices(nLength); + std::iota(indices.begin(), indices.end(), 0); + std::sort(indices.begin(), indices.end(), IndexCompare(aRes)); + // create sorted sequences according to index array + uno::Sequence<beans::PropertyValue> aNewValues( nLength ); + std::transform(indices.begin(), indices.end(), aNewValues.getArray(), + [&aRes](sal_Int32 index) -> const beans::PropertyValue& { return aRes[index]; }); + + return aNewValues; + } + return aRes; +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getCharacterBounds: index value overflow"); +awt::Rectangle SAL_CALL AccessibleEditableTextPara::getCharacterBounds( sal_Int32 nIndex ) +{ + SolarMutexGuard aGuard; + + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getCharacterBounds: index value overflow"); + + // #108900# Have position semantics now for nIndex, as + // one-past-the-end values are legal, too. + CheckPosition( nIndex ); + + SvxTextForwarder& rCacheTF = GetTextForwarder(); + tools::Rectangle aRect = rCacheTF.GetCharBounds(GetParagraphIndex(), nIndex); + + // convert to screen + tools::Rectangle aScreenRect = AccessibleEditableTextPara::LogicToPixel( aRect, + rCacheTF.GetMapMode(), + GetViewForwarder() ); + // #109864# offset from parent (paragraph), but in screen + // coordinates. This makes sure the internal text offset in + // the outline view forwarder gets cancelled out here + awt::Rectangle aParaRect( getBounds() ); + aScreenRect.Move( -aParaRect.X, -aParaRect.Y ); + + // offset from shape/cell + Point aOffset = GetEEOffset(); + + return awt::Rectangle( aScreenRect.Left() + aOffset.X(), + aScreenRect.Top() + aOffset.Y(), + aScreenRect.GetSize().Width(), + aScreenRect.GetSize().Height() ); +} - // #108900# Have position semantics now for nIndex, as - // one-past-the-end values are legal, too. - CheckPosition( nIndex ); +sal_Int32 SAL_CALL AccessibleEditableTextPara::getCharacterCount() +{ + SolarMutexGuard aGuard; - SvxTextForwarder& rCacheTF = GetTextForwarder(); - tools::Rectangle aRect = rCacheTF.GetCharBounds(GetParagraphIndex(), nIndex); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getCharacterCount: index value overflow"); - // convert to screen - tools::Rectangle aScreenRect = AccessibleEditableTextPara::LogicToPixel( aRect, - rCacheTF.GetMapMode(), - GetViewForwarder() ); - // #109864# offset from parent (paragraph), but in screen - // coordinates. This makes sure the internal text offset in - // the outline view forwarder gets cancelled out here - awt::Rectangle aParaRect( getBounds() ); - aScreenRect.Move( -aParaRect.X, -aParaRect.Y ); + return implGetText().getLength(); +} - // offset from shape/cell - Point aOffset = GetEEOffset(); +sal_Int32 SAL_CALL AccessibleEditableTextPara::getIndexAtPoint( const awt::Point& rPoint ) +{ + SolarMutexGuard aGuard; - return awt::Rectangle( aScreenRect.Left() + aOffset.X(), - aScreenRect.Top() + aOffset.Y(), - aScreenRect.GetSize().Width(), - aScreenRect.GetSize().Height() ); - } + sal_Int32 nPara; + sal_Int32 nIndex; - sal_Int32 SAL_CALL AccessibleEditableTextPara::getCharacterCount() - { - SolarMutexGuard aGuard; + // offset from surrounding cell/shape + Point aOffset( GetEEOffset() ); + Point aPoint( rPoint.X - aOffset.X(), rPoint.Y - aOffset.Y() ); - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getCharacterCount: index value overflow"); + // convert to logical coordinates + SvxTextForwarder& rCacheTF = GetTextForwarder(); + Point aLogPoint( GetViewForwarder().PixelToLogic( aPoint, rCacheTF.GetMapMode() ) ); - return implGetText().getLength(); - } + // re-offset to parent (paragraph) + tools::Rectangle aParaRect = rCacheTF.GetParaBounds( GetParagraphIndex() ); + aLogPoint.Move( aParaRect.Left(), aParaRect.Top() ); - sal_Int32 SAL_CALL AccessibleEditableTextPara::getIndexAtPoint( const awt::Point& rPoint ) + if( rCacheTF.GetIndexAtPoint( aLogPoint, nPara, nIndex ) && + GetParagraphIndex() == nPara ) { - SolarMutexGuard aGuard; - - sal_Int32 nPara; - sal_Int32 nIndex; - - // offset from surrounding cell/shape - Point aOffset( GetEEOffset() ); - Point aPoint( rPoint.X - aOffset.X(), rPoint.Y - aOffset.Y() ); - - // convert to logical coordinates - SvxTextForwarder& rCacheTF = GetTextForwarder(); - Point aLogPoint( GetViewForwarder().PixelToLogic( aPoint, rCacheTF.GetMapMode() ) ); - - // re-offset to parent (paragraph) - tools::Rectangle aParaRect = rCacheTF.GetParaBounds( GetParagraphIndex() ); - aLogPoint.Move( aParaRect.Left(), aParaRect.Top() ); - - if( rCacheTF.GetIndexAtPoint( aLogPoint, nPara, nIndex ) && - GetParagraphIndex() == nPara ) + // #102259# Double-check if we're _really_ on the given character + try { - // #102259# Double-check if we're _really_ on the given character - try - { - awt::Rectangle aRect1( getCharacterBounds(nIndex) ); - tools::Rectangle aRect2( aRect1.X, aRect1.Y, - aRect1.Width + aRect1.X, aRect1.Height + aRect1.Y ); - if( aRect2.Contains( Point( rPoint.X, rPoint.Y ) ) ) - return nIndex; - else - return -1; - } - catch (const lang::IndexOutOfBoundsException&) - { - // #103927# Don't throw for invalid nIndex values + awt::Rectangle aRect1( getCharacterBounds(nIndex) ); + tools::Rectangle aRect2( aRect1.X, aRect1.Y, + aRect1.Width + aRect1.X, aRect1.Height + aRect1.Y ); + if( aRect2.Contains( Point( rPoint.X, rPoint.Y ) ) ) + return nIndex; + else return -1; - } } - else + catch (const lang::IndexOutOfBoundsException&) { - // not within our paragraph + // #103927# Don't throw for invalid nIndex values return -1; } } - - OUString SAL_CALL AccessibleEditableTextPara::getSelectedText() + else { - SolarMutexGuard aGuard; + // not within our paragraph + return -1; + } +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getSelectedText: index value overflow"); +OUString SAL_CALL AccessibleEditableTextPara::getSelectedText() +{ + SolarMutexGuard aGuard; - if( !HaveEditView() ) - return OUString(); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getSelectedText: index value overflow"); - return OCommonAccessibleText::getSelectedText(); - } + if( !HaveEditView() ) + return OUString(); - sal_Int32 SAL_CALL AccessibleEditableTextPara::getSelectionStart() - { - SolarMutexGuard aGuard; + return OCommonAccessibleText::getSelectedText(); +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getSelectionStart: index value overflow"); +sal_Int32 SAL_CALL AccessibleEditableTextPara::getSelectionStart() +{ + SolarMutexGuard aGuard; - if( !HaveEditView() ) - return -1; + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getSelectionStart: index value overflow"); - return OCommonAccessibleText::getSelectionStart(); - } + if( !HaveEditView() ) + return -1; - sal_Int32 SAL_CALL AccessibleEditableTextPara::getSelectionEnd() - { - SolarMutexGuard aGuard; + return OCommonAccessibleText::getSelectionStart(); +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getSelectionEnd: index value overflow"); +sal_Int32 SAL_CALL AccessibleEditableTextPara::getSelectionEnd() +{ + SolarMutexGuard aGuard; - if( !HaveEditView() ) - return -1; + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getSelectionEnd: index value overflow"); - return OCommonAccessibleText::getSelectionEnd(); - } + if( !HaveEditView() ) + return -1; - sal_Bool SAL_CALL AccessibleEditableTextPara::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) - { - SolarMutexGuard aGuard; + return OCommonAccessibleText::getSelectionEnd(); +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::setSelection: paragraph index value overflow"); +sal_Bool SAL_CALL AccessibleEditableTextPara::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) +{ + SolarMutexGuard aGuard; - CheckRange(nStartIndex, nEndIndex); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::setSelection: paragraph index value overflow"); - try - { - SvxEditViewForwarder& rCacheVF = GetEditViewForwarder( true ); - return rCacheVF.SetSelection( MakeSelection(nStartIndex, nEndIndex) ); - } - catch (const uno::RuntimeException&) - { - return false; - } - } + CheckRange(nStartIndex, nEndIndex); - OUString SAL_CALL AccessibleEditableTextPara::getText() + try + { + SvxEditViewForwarder& rCacheVF = GetEditViewForwarder( true ); + return rCacheVF.SetSelection( MakeSelection(nStartIndex, nEndIndex) ); + } + catch (const uno::RuntimeException&) { - SolarMutexGuard aGuard; + return false; + } +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getText: paragraph index value overflow"); +OUString SAL_CALL AccessibleEditableTextPara::getText() +{ + SolarMutexGuard aGuard; - return implGetText(); - } + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getText: paragraph index value overflow"); - OUString SAL_CALL AccessibleEditableTextPara::getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) - { - SolarMutexGuard aGuard; + return implGetText(); +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getTextRange: paragraph index value overflow"); +OUString SAL_CALL AccessibleEditableTextPara::getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) +{ + SolarMutexGuard aGuard; - return OCommonAccessibleText::implGetTextRange(implGetText(), nStartIndex, nEndIndex); - } + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getTextRange: paragraph index value overflow"); - void AccessibleEditableTextPara::_correctValues( uno::Sequence< PropertyValue >& rValues) - { - SvxTextForwarder& rCacheTF = GetTextForwarder(); - sal_Int32 nRes = rValues.getLength(); - beans::PropertyValue *pRes = rValues.getArray(); - for (sal_Int32 i = 0; i < nRes; ++i) - { - beans::PropertyValue &rRes = pRes[i]; - // Char color - if (rRes.Name == "CharColor") + return OCommonAccessibleText::implGetTextRange(implGetText(), nStartIndex, nEndIndex); +} + +void AccessibleEditableTextPara::_correctValues( uno::Sequence< PropertyValue >& rValues) +{ + SvxTextForwarder& rCacheTF = GetTextForwarder(); + sal_Int32 nRes = rValues.getLength(); + beans::PropertyValue *pRes = rValues.getArray(); + for (sal_Int32 i = 0; i < nRes; ++i) + { + beans::PropertyValue &rRes = pRes[i]; + // Char color + if (rRes.Name == "CharColor") + { + uno::Any &anyChar = rRes.Value; + Color crChar; + anyChar >>= crChar; + if (COL_AUTO == crChar ) { - uno::Any &anyChar = rRes.Value; - Color crChar; - anyChar >>= crChar; - if (COL_AUTO == crChar ) + uno::Reference< css::accessibility::XAccessibleComponent > xComponent(mxParent,uno::UNO_QUERY); + if (xComponent.is()) { - uno::Reference< css::accessibility::XAccessibleComponent > xComponent(mxParent,uno::UNO_QUERY); - if (xComponent.is()) + uno::Reference< css::accessibility::XAccessibleContext > xContext(xComponent,uno::UNO_QUERY); + if (xContext->getAccessibleRole() == AccessibleRole::SHAPE + || xContext->getAccessibleRole() == AccessibleRole::TABLE_CELL) { - uno::Reference< css::accessibility::XAccessibleContext > xContext(xComponent,uno::UNO_QUERY); - if (xContext->getAccessibleRole() == AccessibleRole::SHAPE - || xContext->getAccessibleRole() == AccessibleRole::TABLE_CELL) - { - anyChar <<= COL_BLACK; - } - else - { - Color cr(ColorTransparency, xComponent->getBackground()); - crChar = cr.IsDark() ? COL_WHITE : COL_BLACK; - anyChar <<= crChar; - } + anyChar <<= COL_BLACK; + } + else + { + Color cr(ColorTransparency, xComponent->getBackground()); + crChar = cr.IsDark() ? COL_WHITE : COL_BLACK; + anyChar <<= crChar; } } - continue; - } - // Underline - if (rRes.Name == "CharUnderline") - { - continue; } - // Underline color && Mis-spell - if (rRes.Name == "CharUnderlineColor") + continue; + } + // Underline + if (rRes.Name == "CharUnderline") + { + continue; + } + // Underline color && Mis-spell + if (rRes.Name == "CharUnderlineColor") + { + uno::Any &anyCharUnderLine = rRes.Value; + Color crCharUnderLine; + anyCharUnderLine >>= crCharUnderLine; + if (COL_AUTO == crCharUnderLine ) { - uno::Any &anyCharUnderLine = rRes.Value; - Color crCharUnderLine; - anyCharUnderLine >>= crCharUnderLine; - if (COL_AUTO == crCharUnderLine ) + uno::Reference< css::accessibility::XAccessibleComponent > xComponent(mxParent,uno::UNO_QUERY); + if (xComponent.is()) { - uno::Reference< css::accessibility::XAccessibleComponent > xComponent(mxParent,uno::UNO_QUERY); - if (xComponent.is()) + uno::Reference< css::accessibility::XAccessibleContext > xContext(xComponent,uno::UNO_QUERY); + if (xContext->getAccessibleRole() == AccessibleRole::SHAPE + || xContext->getAccessibleRole() == AccessibleRole::TABLE_CELL) { - uno::Reference< css::accessibility::XAccessibleContext > xContext(xComponent,uno::UNO_QUERY); - if (xContext->getAccessibleRole() == AccessibleRole::SHAPE - || xContext->getAccessibleRole() == AccessibleRole::TABLE_CELL) - { - anyCharUnderLine <<= COL_BLACK; - } - else - { - Color cr(ColorTransparency, xComponent->getBackground()); - crCharUnderLine = cr.IsDark() ? COL_WHITE : COL_BLACK; - anyCharUnderLine <<= crCharUnderLine; - } + anyCharUnderLine <<= COL_BLACK; + } + else + { + Color cr(ColorTransparency, xComponent->getBackground()); + crCharUnderLine = cr.IsDark() ? COL_WHITE : COL_BLACK; + anyCharUnderLine <<= crCharUnderLine; } } - continue; } - // NumberingLevel - if (rRes.Name == "NumberingLevel") + continue; + } + // NumberingLevel + if (rRes.Name == "NumberingLevel") + { + if(rCacheTF.GetParaAttribs(GetParagraphIndex()).Get(EE_PARA_NUMBULLET).GetNumRule().GetLevelCount()==0) + { + rRes.Value <<= sal_Int16(-1); + rRes.Handle = -1; + rRes.State = PropertyState_DIRECT_VALUE; + } + else { - if(rCacheTF.GetParaAttribs(GetParagraphIndex()).Get(EE_PARA_NUMBULLET).GetNumRule().GetLevelCount()==0) - { - rRes.Value <<= sal_Int16(-1); - rRes.Handle = -1; - rRes.State = PropertyState_DIRECT_VALUE; - } - else - { // SvxAccessibleTextPropertySet aPropSet( &GetEditSource(), // ImplGetSvxCharAndParaPropertiesMap() ); - // MT IA2 TODO: Check if this is the correct replacement for ImplGetSvxCharAndParaPropertiesMap - rtl::Reference< SvxAccessibleTextPropertySet > xPropSet( new SvxAccessibleTextPropertySet( &GetEditSource(), ImplGetSvxTextPortionSvxPropertySet() ) ); + // MT IA2 TODO: Check if this is the correct replacement for ImplGetSvxCharAndParaPropertiesMap + rtl::Reference< SvxAccessibleTextPropertySet > xPropSet( new SvxAccessibleTextPropertySet( &GetEditSource(), ImplGetSvxTextPortionSvxPropertySet() ) ); - xPropSet->SetSelection( MakeSelection( 0, GetTextLen() ) ); - rRes.Value = xPropSet->_getPropertyValue( rRes.Name, mnParagraphIndex ); - rRes.State = xPropSet->_getPropertyState( rRes.Name, mnParagraphIndex ); - rRes.Handle = -1; - } - continue; - } - // NumberingRules - if (rRes.Name == "NumberingRules") - { - SfxItemSet aAttribs = rCacheTF.GetParaAttribs(GetParagraphIndex()); - bool bVis = aAttribs.Get( EE_PARA_BULLETSTATE ).GetValue(); - if(bVis) - { - rRes.Value <<= sal_Int16(-1); - rRes.Handle = -1; - rRes.State = PropertyState_DIRECT_VALUE; - } - else - { - // MT IA2 TODO: Check if this is the correct replacement for ImplGetSvxCharAndParaPropertiesMap - rtl::Reference< SvxAccessibleTextPropertySet > xPropSet( new SvxAccessibleTextPropertySet( &GetEditSource(), ImplGetSvxTextPortionSvxPropertySet() ) ); - xPropSet->SetSelection( MakeSelection( 0, GetTextLen() ) ); - rRes.Value = xPropSet->_getPropertyValue( rRes.Name, mnParagraphIndex ); - rRes.State = xPropSet->_getPropertyState( rRes.Name, mnParagraphIndex ); - rRes.Handle = -1; - } - continue; + xPropSet->SetSelection( MakeSelection( 0, GetTextLen() ) ); + rRes.Value = xPropSet->_getPropertyValue( rRes.Name, mnParagraphIndex ); + rRes.State = xPropSet->_getPropertyState( rRes.Name, mnParagraphIndex ); + rRes.Handle = -1; } + continue; } - } - sal_Int32 AccessibleEditableTextPara::SkipField(sal_Int32 nIndex, bool bForward) - { - sal_Int32 nParaIndex = GetParagraphIndex(); - SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); - sal_Int32 nAllFieldLen = 0; - sal_Int32 nFoundFieldIndex = -1; - std::vector<EFieldInfo> aFieldInfos = rCacheTF.GetFieldInfo(nParaIndex); - sal_Int32 reeBegin=0, reeEnd=0; - sal_Int32 j = 0; - for (const EFieldInfo& ree : aFieldInfos) + // NumberingRules + if (rRes.Name == "NumberingRules") { - reeBegin = ree.aPosition.nIndex + nAllFieldLen; - reeEnd = reeBegin + ree.aCurrentText.getLength(); - nAllFieldLen += (ree.aCurrentText.getLength() - 1); - if (nIndex < reeBegin) - break; - if (!ree.pFieldItem) - continue; - if (nIndex < reeEnd) + SfxItemSet aAttribs = rCacheTF.GetParaAttribs(GetParagraphIndex()); + bool bVis = aAttribs.Get( EE_PARA_BULLETSTATE ).GetValue(); + if(bVis) { - if (ree.pFieldItem->GetField()->GetClassId() != text::textfield::Type::URL) - { - nFoundFieldIndex = j; - break; - } + rRes.Value <<= sal_Int16(-1); + rRes.Handle = -1; + rRes.State = PropertyState_DIRECT_VALUE; } - j++; - } - if( nFoundFieldIndex >= 0 ) - { - if( bForward ) - return reeEnd - 1; else - return reeBegin; + { + // MT IA2 TODO: Check if this is the correct replacement for ImplGetSvxCharAndParaPropertiesMap + rtl::Reference< SvxAccessibleTextPropertySet > xPropSet( new SvxAccessibleTextPropertySet( &GetEditSource(), ImplGetSvxTextPortionSvxPropertySet() ) ); + xPropSet->SetSelection( MakeSelection( 0, GetTextLen() ) ); + rRes.Value = xPropSet->_getPropertyValue( rRes.Name, mnParagraphIndex ); + rRes.State = xPropSet->_getPropertyState( rRes.Name, mnParagraphIndex ); + rRes.Handle = -1; + } + continue; } - return nIndex; } - void AccessibleEditableTextPara::ExtendByField( css::accessibility::TextSegment& Segment ) - { - sal_Int32 nParaIndex = GetParagraphIndex(); - SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); - std::vector<EFieldInfo> aFieldInfos = rCacheTF.GetFieldInfo(nParaIndex); - sal_Int32 nAllFieldLen = 0; - sal_Int32 nField = aFieldInfos.size(), nFoundFieldIndex = -1; - sal_Int32 reeBegin=0, reeEnd=0; - for (sal_Int32 j = 0; j < nField; ++j) +} +sal_Int32 AccessibleEditableTextPara::SkipField(sal_Int32 nIndex, bool bForward) +{ + sal_Int32 nParaIndex = GetParagraphIndex(); + SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); + sal_Int32 nAllFieldLen = 0; + sal_Int32 nFoundFieldIndex = -1; + std::vector<EFieldInfo> aFieldInfos = rCacheTF.GetFieldInfo(nParaIndex); + sal_Int32 reeBegin=0, reeEnd=0; + sal_Int32 j = 0; + for (const EFieldInfo& ree : aFieldInfos) + { + reeBegin = ree.aPosition.nIndex + nAllFieldLen; + reeEnd = reeBegin + ree.aCurrentText.getLength(); + nAllFieldLen += (ree.aCurrentText.getLength() - 1); + if (nIndex < reeBegin) + break; + if (!ree.pFieldItem) + continue; + if (nIndex < reeEnd) { - const EFieldInfo& ree = aFieldInfos[j]; - reeBegin = ree.aPosition.nIndex + nAllFieldLen; - reeEnd = reeBegin + ree.aCurrentText.getLength(); - nAllFieldLen += (ree.aCurrentText.getLength() - 1); - if( reeBegin > Segment.SegmentEnd ) + if (ree.pFieldItem->GetField()->GetClassId() != text::textfield::Type::URL) { + nFoundFieldIndex = j; break; } - if (!ree.pFieldItem) - continue; - if( (Segment.SegmentEnd > reeBegin && Segment.SegmentEnd <= reeEnd) || - (Segment.SegmentStart >= reeBegin && Segment.SegmentStart < reeEnd) ) - { - if(ree.pFieldItem->GetField()->GetClassId() != text::textfield::Type::URL) - { - nFoundFieldIndex = j; - break; - } - } } - if( nFoundFieldIndex < 0 ) - return; - - bool bExtend = false; - if( Segment.SegmentEnd < reeEnd ) + j++; + } + if( nFoundFieldIndex >= 0 ) + { + if( bForward ) + return reeEnd - 1; + else + return reeBegin; + } + return nIndex; +} +void AccessibleEditableTextPara::ExtendByField( css::accessibility::TextSegment& Segment ) +{ + sal_Int32 nParaIndex = GetParagraphIndex(); + SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); + std::vector<EFieldInfo> aFieldInfos = rCacheTF.GetFieldInfo(nParaIndex); + sal_Int32 nAllFieldLen = 0; + sal_Int32 nField = aFieldInfos.size(), nFoundFieldIndex = -1; + sal_Int32 reeBegin=0, reeEnd=0; + for (sal_Int32 j = 0; j < nField; ++j) + { + const EFieldInfo& ree = aFieldInfos[j]; + reeBegin = ree.aPosition.nIndex + nAllFieldLen; + reeEnd = reeBegin + ree.aCurrentText.getLength(); + nAllFieldLen += (ree.aCurrentText.getLength() - 1); + if( reeBegin > Segment.SegmentEnd ) { - Segment.SegmentEnd = reeEnd; - bExtend = true; + break; } - if( Segment.SegmentStart > reeBegin ) + if (!ree.pFieldItem) + continue; + if( (Segment.SegmentEnd > reeBegin && Segment.SegmentEnd <= reeEnd) || + (Segment.SegmentStart >= reeBegin && Segment.SegmentStart < reeEnd) ) { - Segment.SegmentStart = reeBegin; - bExtend = true; + if(ree.pFieldItem->GetField()->GetClassId() != text::textfield::Type::URL) + { + nFoundFieldIndex = j; + break; + } } - if( !bExtend ) - return; + } + if( nFoundFieldIndex < 0 ) + return; - //If there is a bullet before the field, should add the bullet length into the segment. - EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(nParaIndex); - sal_Int32 nBulletLen = aBulletInfo.aText.getLength(); - if (nBulletLen > 0) - { - Segment.SegmentEnd += nBulletLen; - if (nFoundFieldIndex > 0) - Segment.SegmentStart += nBulletLen; - Segment.SegmentText = GetTextRange(Segment.SegmentStart, Segment.SegmentEnd); - //After get the correct field name, should restore the offset value which don't contain the bullet. - Segment.SegmentEnd -= nBulletLen; - if (nFoundFieldIndex > 0) - Segment.SegmentStart -= nBulletLen; - } - else - Segment.SegmentText = GetTextRange(Segment.SegmentStart, Segment.SegmentEnd); + bool bExtend = false; + if( Segment.SegmentEnd < reeEnd ) + { + Segment.SegmentEnd = reeEnd; + bExtend = true; + } + if( Segment.SegmentStart > reeBegin ) + { + Segment.SegmentStart = reeBegin; + bExtend = true; } + if( !bExtend ) + return; - css::accessibility::TextSegment SAL_CALL AccessibleEditableTextPara::getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) + //If there is a bullet before the field, should add the bullet length into the segment. + EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(nParaIndex); + sal_Int32 nBulletLen = aBulletInfo.aText.getLength(); + if (nBulletLen > 0) { - SolarMutexGuard aGuard; + Segment.SegmentEnd += nBulletLen; + if (nFoundFieldIndex > 0) + Segment.SegmentStart += nBulletLen; + Segment.SegmentText = GetTextRange(Segment.SegmentStart, Segment.SegmentEnd); + //After get the correct field name, should restore the offset value which don't contain the bullet. + Segment.SegmentEnd -= nBulletLen; + if (nFoundFieldIndex > 0) + Segment.SegmentStart -= nBulletLen; + } + else + Segment.SegmentText = GetTextRange(Segment.SegmentStart, Segment.SegmentEnd); +} - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getTextAtIndex: paragraph index value overflow"); +css::accessibility::TextSegment SAL_CALL AccessibleEditableTextPara::getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) +{ + SolarMutexGuard aGuard; + + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getTextAtIndex: paragraph index value overflow"); - css::accessibility::TextSegment aResult; - aResult.SegmentStart = -1; - aResult.SegmentEnd = -1; + css::accessibility::TextSegment aResult; + aResult.SegmentStart = -1; + aResult.SegmentEnd = -1; - switch( aTextType ) + switch( aTextType ) + { + case AccessibleTextType::CHARACTER: + case AccessibleTextType::WORD: { - case AccessibleTextType::CHARACTER: - case AccessibleTextType::WORD: + aResult = OCommonAccessibleText::getTextAtIndex( nIndex, aTextType ); + ExtendByField( aResult ); + break; + } + // Not yet handled by OCommonAccessibleText. Missing + // implGetAttributeRunBoundary() method there + case AccessibleTextType::ATTRIBUTE_RUN: + { + const sal_Int32 nTextLen = GetTextForwarder().GetTextLen( GetParagraphIndex() ); + + if( nIndex == nTextLen ) { - aResult = OCommonAccessibleText::getTextAtIndex( nIndex, aTextType ); - ExtendByField( aResult ); - break; + // #i17014# Special-casing one-behind-the-end character + aResult.SegmentStart = aResult.SegmentEnd = nTextLen; } - // Not yet handled by OCommonAccessibleText. Missing - // implGetAttributeRunBoundary() method there - case AccessibleTextType::ATTRIBUTE_RUN: + else { - const sal_Int32 nTextLen = GetTextForwarder().GetTextLen( GetParagraphIndex() ); - - if( nIndex == nTextLen ) - { - // #i17014# Special-casing one-behind-the-end character - aResult.SegmentStart = aResult.SegmentEnd = nTextLen; - } - else + sal_Int32 nStartIndex, nEndIndex; + //For the bullet paragraph, the bullet string is ignored for IAText::attributes() function. + SvxTextForwarder& rCacheTF = GetTextForwarder(); + // MT IA2: Not used? sal_Int32 nBulletLen = 0; + EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(GetParagraphIndex()); + if (aBulletInfo.bVisible) + nIndex += aBulletInfo.aText.getLength(); + if (nIndex != 0 && nIndex >= getCharacterCount()) + nIndex = getCharacterCount()-1; + CheckPosition(nIndex); + if( GetAttributeRun(nStartIndex, nEndIndex, nIndex) ) { - sal_Int32 nStartIndex, nEndIndex; - //For the bullet paragraph, the bullet string is ignored for IAText::attributes() function. - SvxTextForwarder& rCacheTF = GetTextForwarder(); - // MT IA2: Not used? sal_Int32 nBulletLen = 0; - EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(GetParagraphIndex()); + aResult.SegmentText = GetTextRange(nStartIndex, nEndIndex); if (aBulletInfo.bVisible) - nIndex += aBulletInfo.aText.getLength(); - if (nIndex != 0 && nIndex >= getCharacterCount()) - nIndex = getCharacterCount()-1; - CheckPosition(nIndex); - if( GetAttributeRun(nStartIndex, nEndIndex, nIndex) ) { - aResult.SegmentText = GetTextRange(nStartIndex, nEndIndex); - if (aBulletInfo.bVisible) - { - nStartIndex -= aBulletInfo.aText.getLength(); - nEndIndex -= aBulletInfo.aText.getLength(); - } - aResult.SegmentStart = nStartIndex; - aResult.SegmentEnd = nEndIndex; + nStartIndex -= aBulletInfo.aText.getLength(); + nEndIndex -= aBulletInfo.aText.getLength(); } + aResult.SegmentStart = nStartIndex; + aResult.SegmentEnd = nEndIndex; } - break; } - case AccessibleTextType::LINE: + break; + } + case AccessibleTextType::LINE: + { + SvxTextForwarder& rCacheTF = GetTextForwarder(); + sal_Int32 nParaIndex = GetParagraphIndex(); + CheckPosition(nIndex); + if (nIndex != 0 && nIndex == getCharacterCount()) + --nIndex; + sal_Int32 nLine, nLineCount=rCacheTF.GetLineCount( nParaIndex ); + sal_Int32 nCurIndex; + //the problem is that rCacheTF.GetLineLen() will include the bullet length. But for the bullet line, + //the text value doesn't contain the bullet characters. all of the bullet and numbering info are exposed + //by the IAText::attributes(). So here must do special support for bullet line. + sal_Int32 nBulletLen = 0; + for( nLine=0, nCurIndex=0; nLine<nLineCount; ++nLine ) { - SvxTextForwarder& rCacheTF = GetTextForwarder(); - sal_Int32 nParaIndex = GetParagraphIndex(); - CheckPosition(nIndex); - if (nIndex != 0 && nIndex == getCharacterCount()) - --nIndex; - sal_Int32 nLine, nLineCount=rCacheTF.GetLineCount( nParaIndex ); - sal_Int32 nCurIndex; - //the problem is that rCacheTF.GetLineLen() will include the bullet length. But for the bullet line, - //the text value doesn't contain the bullet characters. all of the bullet and numbering info are exposed - //by the IAText::attributes(). So here must do special support for bullet line. - sal_Int32 nBulletLen = 0; - for( nLine=0, nCurIndex=0; nLine<nLineCount; ++nLine ) + if (nLine == 0) { - if (nLine == 0) + EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo( nParaIndex ); + if (aBulletInfo.bVisible) { - EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo( nParaIndex ); - if (aBulletInfo.bVisible) - { - //in bullet or numbering; - nBulletLen = aBulletInfo.aText.getLength(); - } + //in bullet or numbering; + nBulletLen = aBulletInfo.aText.getLength(); + } + } + sal_Int32 nLineLen = rCacheTF.GetLineLen(nParaIndex, nLine); + if (nLine == 0) + nCurIndex += nLineLen - nBulletLen; + else + nCurIndex += nLineLen; + if( nCurIndex > nIndex ) + { + if (nLine ==0) + { + aResult.SegmentStart = 0; + aResult.SegmentEnd = nCurIndex; + aResult.SegmentText = GetTextRange( aResult.SegmentStart, aResult.SegmentEnd + nBulletLen); + break; } - sal_Int32 nLineLen = rCacheTF.GetLineLen(nParaIndex, nLine); - if (nLine == 0) - nCurIndex += nLineLen - nBulletLen; else - nCurIndex += nLineLen; - if( nCurIndex > nIndex ) { - if (nLine ==0) - { - aResult.SegmentStart = 0; - aResult.SegmentEnd = nCurIndex; - aResult.SegmentText = GetTextRange( aResult.SegmentStart, aResult.SegmentEnd + nBulletLen); - break; - } - else - { - aResult.SegmentStart = nCurIndex - nLineLen; - aResult.SegmentEnd = nCurIndex; - //aResult.SegmentText = GetTextRange( aResult.SegmentStart, aResult.SegmentEnd ); - aResult.SegmentText = GetTextRange( aResult.SegmentStart + nBulletLen, aResult.SegmentEnd + nBulletLen); - break; - } + aResult.SegmentStart = nCurIndex - nLineLen; + aResult.SegmentEnd = nCurIndex; + //aResult.SegmentText = GetTextRange( aResult.SegmentStart, aResult.SegmentEnd ); + aResult.SegmentText = GetTextRange( aResult.SegmentStart + nBulletLen, aResult.SegmentEnd + nBulletLen); + break; } } - break; } - default: - aResult = OCommonAccessibleText::getTextAtIndex( nIndex, aTextType ); - break; - } /* end of switch( aTextType ) */ + break; + } + default: + aResult = OCommonAccessibleText::getTextAtIndex( nIndex, aTextType ); + break; + } /* end of switch( aTextType ) */ - return aResult; - } + return aResult; +} - css::accessibility::TextSegment SAL_CALL AccessibleEditableTextPara::getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) - { - SolarMutexGuard aGuard; +css::accessibility::TextSegment SAL_CALL AccessibleEditableTextPara::getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) +{ + SolarMutexGuard aGuard; - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getTextBeforeIndex: paragraph index value overflow"); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getTextBeforeIndex: paragraph index value overflow"); - css::accessibility::TextSegment aResult; - aResult.SegmentStart = -1; - aResult.SegmentEnd = -1; - i18n::Boundary aBoundary; - switch( aTextType ) + css::accessibility::TextSegment aResult; + aResult.SegmentStart = -1; + aResult.SegmentEnd = -1; + i18n::Boundary aBoundary; + switch( aTextType ) + { + // Not yet handled by OCommonAccessibleText. Missing + // implGetAttributeRunBoundary() method there + case AccessibleTextType::ATTRIBUTE_RUN: { - // Not yet handled by OCommonAccessibleText. Missing - // implGetAttributeRunBoundary() method there - case AccessibleTextType::ATTRIBUTE_RUN: - { - const sal_Int32 nTextLen = GetTextForwarder().GetTextLen( GetParagraphIndex() ); - sal_Int32 nStartIndex, nEndIndex; + const sal_Int32 nTextLen = GetTextForwarder().GetTextLen( GetParagraphIndex() ); + sal_Int32 nStartIndex, nEndIndex; - if( nIndex == nTextLen ) + if( nIndex == nTextLen ) + { + // #i17014# Special-casing one-behind-the-end character + if( nIndex > 0 && + GetAttributeRun(nStartIndex, nEndIndex, nIndex-1) ) { - // #i17014# Special-casing one-behind-the-end character - if( nIndex > 0 && - GetAttributeRun(nStartIndex, nEndIndex, nIndex-1) ) + aResult.SegmentText = GetTextRange(nStartIndex, nEndIndex); + aResult.SegmentStart = nStartIndex; + aResult.SegmentEnd = nEndIndex; + } + } + else + { + if( GetAttributeRun(nStartIndex, nEndIndex, nIndex) ) + { + // already at the left border? If not, query + // one index further left + if( nStartIndex > 0 && + GetAttributeRun(nStartIndex, nEndIndex, nStartIndex-1) ) { aResult.SegmentText = GetTextRange(nStartIndex, nEndIndex); aResult.SegmentStart = nStartIndex; aResult.SegmentEnd = nEndIndex; } } - else + } + break; + } + case AccessibleTextType::LINE: + { + SvxTextForwarder& rCacheTF = GetTextForwarder(); + sal_Int32 nParaIndex = GetParagraphIndex(); + + CheckPosition(nIndex); + + sal_Int32 nLine, nLineCount=rCacheTF.GetLineCount( nParaIndex ); + //the problem is that rCacheTF.GetLineLen() will include the bullet length. But for the bullet line, + //the text value doesn't contain the bullet characters. all of the bullet and numbering info are exposed + //by the IAText::attributes(). So here must do special support for bullet line. + sal_Int32 nCurIndex=0, nLastIndex=0, nCurLineLen=0; + sal_Int32 nLastLineLen = 0, nBulletLen = 0; + // get the line before the line the index points into + for( nLine=0, nCurIndex=0; nLine<nLineCount; ++nLine ) + { + nLastIndex = nCurIndex; + if (nLine == 0) { - if( GetAttributeRun(nStartIndex, nEndIndex, nIndex) ) + EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(nParaIndex); + if (aBulletInfo.bVisible) { - // already at the left border? If not, query - // one index further left - if( nStartIndex > 0 && - GetAttributeRun(nStartIndex, nEndIndex, nStartIndex-1) ) - { - aResult.SegmentText = GetTextRange(nStartIndex, nEndIndex); - aResult.SegmentStart = nStartIndex; - aResult.SegmentEnd = nEndIndex; - } + //in bullet or numbering; + nBulletLen = aBulletInfo.aText.getLength(); } } - break; - } - case AccessibleTextType::LINE: - { - SvxTextForwarder& rCacheTF = GetTextForwarder(); - sal_Int32 nParaIndex = GetParagraphIndex(); - - CheckPosition(nIndex); + if (nLine == 1) + nLastLineLen = nCurLineLen - nBulletLen; + else + nLastLineLen = nCurLineLen; + nCurLineLen = rCacheTF.GetLineLen( nParaIndex, nLine); + //nCurIndex += nCurLineLen; + if (nLine == 0) + nCurIndex += nCurLineLen - nBulletLen; + else + nCurIndex += nCurLineLen; - sal_Int32 nLine, nLineCount=rCacheTF.GetLineCount( nParaIndex ); - //the problem is that rCacheTF.GetLineLen() will include the bullet length. But for the bullet line, - //the text value doesn't contain the bullet characters. all of the bullet and numbering info are exposed - //by the IAText::attributes(). So here must do special support for bullet line. - sal_Int32 nCurIndex=0, nLastIndex=0, nCurLineLen=0; - sal_Int32 nLastLineLen = 0, nBulletLen = 0; - // get the line before the line the index points into - for( nLine=0, nCurIndex=0; nLine<nLineCount; ++nLine ) + //if( nCurIndex > nIndex && + //nLastIndex > nCurLineLen ) + if (nCurIndex > nIndex) { - nLastIndex = nCurIndex; if (nLine == 0) { - EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(nParaIndex); - if (aBulletInfo.bVisible) - { - //in bullet or numbering; - nBulletLen = aBulletInfo.aText.getLength(); - } + break; + } + else if (nLine == 1) + { + aResult.SegmentStart = 0; + aResult.SegmentEnd = nLastIndex; + aResult.SegmentText = GetTextRange( aResult.SegmentStart, aResult.SegmentEnd + nBulletLen); + break; } - if (nLine == 1) - nLastLineLen = nCurLineLen - nBulletLen; - else - nLastLineLen = nCurLineLen; - nCurLineLen = rCacheTF.GetLineLen( nParaIndex, nLine); - //nCurIndex += nCurLineLen; - if (nLine == 0) - nCurIndex += nCurLineLen - nBulletLen; else - nCurIndex += nCurLineLen; - - //if( nCurIndex > nIndex && - //nLastIndex > nCurLineLen ) - if (nCurIndex > nIndex) { - if (nLine == 0) - { - break; - } - else if (nLine == 1) - { - aResult.SegmentStart = 0; - aResult.SegmentEnd = nLastIndex; - aResult.SegmentText = GetTextRange( aResult.SegmentStart, aResult.SegmentEnd + nBulletLen); - break; - } - else - { - //aResult.SegmentStart = nLastIndex - nCurLineLen; - aResult.SegmentStart = nLastIndex - nLastLineLen; - aResult.SegmentEnd = nLastIndex; - aResult.SegmentText = GetTextRange( aResult.SegmentStart + nBulletLen, aResult.SegmentEnd + nBulletLen); - break; - } + //aResult.SegmentStart = nLastIndex - nCurLineLen; + aResult.SegmentStart = nLastIndex - nLastLineLen; + aResult.SegmentEnd = nLastIndex; + aResult.SegmentText = GetTextRange( aResult.SegmentStart + nBulletLen, aResult.SegmentEnd + nBulletLen); + break; } } - - break; } - case AccessibleTextType::WORD: - { - nIndex = SkipField( nIndex, false); - OUString sText( implGetText() ); - sal_Int32 nLength = sText.getLength(); - // get word at index - implGetWordBoundary( sText, aBoundary, nIndex ); + break; + } + case AccessibleTextType::WORD: + { + nIndex = SkipField( nIndex, false); + OUString sText( implGetText() ); + sal_Int32 nLength = sText.getLength(); + // get word at index + implGetWordBoundary( sText, aBoundary, nIndex ); - //sal_Int32 curWordStart = aBoundary.startPos; - //sal_Int32 preWordStart = curWordStart; - sal_Int32 curWordStart , preWordStart; - if( aBoundary.startPos == -1 || aBoundary.startPos > nIndex) - curWordStart = preWordStart = nIndex; - else - curWordStart = preWordStart = aBoundary.startPos; - // get previous word + //sal_Int32 curWordStart = aBoundary.startPos; + //sal_Int32 preWordStart = curWordStart; + sal_Int32 curWordStart , preWordStart; + if( aBoundary.startPos == -1 || aBoundary.startPos > nIndex) + curWordStart = preWordStart = nIndex; + else + curWordStart = preWordStart = aBoundary.startPos; - bool bWord = false; + // get previous word - //while ( preWordStart > 0 && aBoundary.startPos == curWordStart) - while ( (preWordStart >= 0 && !bWord ) || ( aBoundary.endPos > curWordStart ) ) - { - preWordStart--; - bWord = implGetWordBoundary( sText, aBoundary, preWordStart ); - } - if ( bWord && implIsValidBoundary( aBoundary, nLength ) ) - { - aResult.SegmentText = sText.copy( aBoundary.startPos, aBoundary.endPos - aBoundary.startPos ); - aResult.SegmentStart = aBoundary.startPos; - aResult.SegmentEnd = aBoundary.endPos; - ExtendByField( aResult ); - } + bool bWord = false; + + //while ( preWordStart > 0 && aBoundary.startPos == curWordStart) + while ( (preWordStart >= 0 && !bWord ) || ( aBoundary.endPos > curWordStart ) ) + { + preWordStart--; + bWord = implGetWordBoundary( sText, aBoundary, preWordStart ); } - break; - case AccessibleTextType::CHARACTER: + if ( bWord && implIsValidBoundary( aBoundary, nLength ) ) { - nIndex = SkipField( nIndex, false); - aResult = OCommonAccessibleText::getTextBeforeIndex( nIndex, aTextType ); + aResult.SegmentText = sText.copy( aBoundary.startPos, aBoundary.endPos - aBoundary.startPos ); + aResult.SegmentStart = aBoundary.startPos; + aResult.SegmentEnd = aBoundary.endPos; ExtendByField( aResult ); - break; } - default: - aResult = OCommonAccessibleText::getTextBeforeIndex( nIndex, aTextType ); - break; - } /* end of switch( aTextType ) */ + } + break; + case AccessibleTextType::CHARACTER: + { + nIndex = SkipField( nIndex, false); + aResult = OCommonAccessibleText::getTextBeforeIndex( nIndex, aTextType ); + ExtendByField( aResult ); + break; + } + default: + aResult = OCommonAccessibleText::getTextBeforeIndex( nIndex, aTextType ); + break; + } /* end of switch( aTextType ) */ - return aResult; - } + return aResult; +} - css::accessibility::TextSegment SAL_CALL AccessibleEditableTextPara::getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) - { - SolarMutexGuard aGuard; +css::accessibility::TextSegment SAL_CALL AccessibleEditableTextPara::getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) +{ + SolarMutexGuard aGuard; - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getTextBehindIndex: paragraph index value overflow"); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getTextBehindIndex: paragraph index value overflow"); - css::accessibility::TextSegment aResult; - aResult.SegmentStart = -1; - aResult.SegmentEnd = -1; - i18n::Boundary aBoundary; - switch( aTextType ) + css::accessibility::TextSegment aResult; + aResult.SegmentStart = -1; + aResult.SegmentEnd = -1; + i18n::Boundary aBoundary; + switch( aTextType ) + { + case AccessibleTextType::ATTRIBUTE_RUN: { - case AccessibleTextType::ATTRIBUTE_RUN: - { - sal_Int32 nStartIndex, nEndIndex; + sal_Int32 nStartIndex, nEndIndex; - if( GetAttributeRun(nStartIndex, nEndIndex, nIndex) ) + if( GetAttributeRun(nStartIndex, nEndIndex, nIndex) ) + { + // already at the right border? + if( nEndIndex < GetTextLen() ) { - // already at the right border? - if( nEndIndex < GetTextLen() ) + if( GetAttributeRun(nStartIndex, nEndIndex, nEndIndex) ) { - if( GetAttributeRun(nStartIndex, nEndIndex, nEndIndex) ) - { - aResult.SegmentText = GetTextRange(nStartIndex, nEndIndex); - aResult.SegmentStart = nStartIndex; - aResult.SegmentEnd = nEndIndex; - } + aResult.SegmentText = GetTextRange(nStartIndex, nEndIndex); + aResult.SegmentStart = nStartIndex; + aResult.SegmentEnd = nEndIndex; } } - break; } + break; + } - case AccessibleTextType::LINE: - { - SvxTextForwarder& rCacheTF = GetTextForwarder(); - sal_Int32 nParaIndex = GetParagraphIndex(); + case AccessibleTextType::LINE: + { + SvxTextForwarder& rCacheTF = GetTextForwarder(); + sal_Int32 nParaIndex = GetParagraphIndex(); - CheckPosition(nIndex); + CheckPosition(nIndex); - sal_Int32 nLine, nLineCount = rCacheTF.GetLineCount( nParaIndex ); - sal_Int32 nCurIndex; - //the problem is that rCacheTF.GetLineLen() will include the bullet length. But for the bullet line, - //the text value doesn't contain the bullet characters. all of the bullet and numbering info are exposed - //by the IAText::attributes(). So here must do special support for bullet line. - sal_Int32 nBulletLen = 0; - // get the line after the line the index points into - for( nLine=0, nCurIndex=0; nLine<nLineCount; ++nLine ) + sal_Int32 nLine, nLineCount = rCacheTF.GetLineCount( nParaIndex ); + sal_Int32 nCurIndex; + //the problem is that rCacheTF.GetLineLen() will include the bullet length. But for the bullet line, + //the text value doesn't contain the bullet characters. all of the bullet and numbering info are exposed + //by the IAText::attributes(). So here must do special support for bullet line. + sal_Int32 nBulletLen = 0; + // get the line after the line the index points into + for( nLine=0, nCurIndex=0; nLine<nLineCount; ++nLine ) + { + if (nLine == 0) { - if (nLine == 0) - { - EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(nParaIndex); - if (aBulletInfo.bVisible) - { - //in bullet or numbering; - nBulletLen = aBulletInfo.aText.getLength(); - } - } - sal_Int32 nLineLen = rCacheTF.GetLineLen( nParaIndex, nLine); - - if (nLine == 0) - nCurIndex += nLineLen - nBulletLen; - else - nCurIndex += nLineLen; - - if( nCurIndex > nIndex && - nLine < nLineCount-1 ) + EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo(nParaIndex); + if (aBulletInfo.bVisible) { - aResult.SegmentStart = nCurIndex; - aResult.SegmentEnd = nCurIndex + rCacheTF.GetLineLen( nParaIndex, nLine+1); - aResult.SegmentText = GetTextRange( aResult.SegmentStart + nBulletLen, aResult.SegmentEnd + nBulletLen); - break; + //in bullet or numbering; + nBulletLen = aBulletInfo.aText.getLength(); } } + sal_Int32 nLineLen = rCacheTF.GetLineLen( nParaIndex, nLine); - break; - } - case AccessibleTextType::WORD: - { - nIndex = SkipField( nIndex, true); - OUString sText( implGetText() ); - sal_Int32 nLength = sText.getLength(); - - // get word at index - bool bWord = implGetWordBoundary( sText, aBoundary, nIndex ); + if (nLine == 0) + nCurIndex += nLineLen - nBulletLen; + else + nCurIndex += nLineLen; - // real current world - sal_Int32 nextWord = nIndex; - //if( nIndex >= aBoundary.startPos && nIndex <= aBoundary.endPos ) - if( nIndex <= aBoundary.endPos ) + if( nCurIndex > nIndex && + nLine < nLineCount-1 ) { - nextWord = aBoundary.endPos; - if (nextWord < sText.getLength() && sText[nextWord] == u' ') nextWord++; - bWord = implGetWordBoundary( sText, aBoundary, nextWord ); + aResult.SegmentStart = nCurIndex; + aResult.SegmentEnd = nCurIndex + rCacheTF.GetLineLen( nParaIndex, nLine+1); + aResult.SegmentText = GetTextRange( aResult.SegmentStart + nBulletLen, aResult.SegmentEnd + nBulletLen); + break; } + } - if ( bWord && implIsValidBoundary( aBoundary, nLength ) ) - { - aResult.SegmentText = sText.copy( aBoundary.startPos, aBoundary.endPos - aBoundary.startPos ); - aResult.SegmentStart = aBoundary.startPos; - aResult.SegmentEnd = aBoundary.endPos; + break; + } + case AccessibleTextType::WORD: + { + nIndex = SkipField( nIndex, true); + OUString sText( implGetText() ); + sal_Int32 nLength = sText.getLength(); - // If the end position of aBoundary is inside a field, extend the result to the end of the field + // get word at index + bool bWord = implGetWordBoundary( sText, aBoundary, nIndex ); - ExtendByField( aResult ); - } + // real current world + sal_Int32 nextWord = nIndex; + //if( nIndex >= aBoundary.startPos && nIndex <= aBoundary.endPos ) + if( nIndex <= aBoundary.endPos ) + { + nextWord = aBoundary.endPos; + if (nextWord < sText.getLength() && sText[nextWord] == u' ') nextWord++; + bWord = implGetWordBoundary( sText, aBoundary, nextWord ); } - break; - case AccessibleTextType::CHARACTER: + if ( bWord && implIsValidBoundary( aBoundary, nLength ) ) { - nIndex = SkipField( nIndex, true); - aResult = OCommonAccessibleText::getTextBehindIndex( nIndex, aTextType ); + aResult.SegmentText = sText.copy( aBoundary.startPos, aBoundary.endPos - aBoundary.startPos ); + aResult.SegmentStart = aBoundary.startPos; + aResult.SegmentEnd = aBoundary.endPos; + + // If the end position of aBoundary is inside a field, extend the result to the end of the field + ExtendByField( aResult ); - break; } - default: - aResult = OCommonAccessibleText::getTextBehindIndex( nIndex, aTextType ); - break; - } /* end of switch( aTextType ) */ + } + break; - return aResult; - } + case AccessibleTextType::CHARACTER: + { + nIndex = SkipField( nIndex, true); + aResult = OCommonAccessibleText::getTextBehindIndex( nIndex, aTextType ); + ExtendByField( aResult ); + break; + } + default: + aResult = OCommonAccessibleText::getTextBehindIndex( nIndex, aTextType ); + break; + } /* end of switch( aTextType ) */ - sal_Bool SAL_CALL AccessibleEditableTextPara::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) - { - SolarMutexGuard aGuard; + return aResult; +} - try - { - SvxEditViewForwarder& rCacheVF = GetEditViewForwarder( true ); - GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs +sal_Bool SAL_CALL AccessibleEditableTextPara::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) +{ + SolarMutexGuard aGuard; - bool aRetVal; + try + { + SvxEditViewForwarder& rCacheVF = GetEditViewForwarder( true ); + GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::copyText: index value overflow"); + bool aRetVal; - CheckRange(nStartIndex, nEndIndex); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::copyText: index value overflow"); - //Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet - sal_Int32 nBulletLen = 0; - EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); - if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) - nBulletLen = aBulletInfo.aText.getLength(); - // save current selection - ESelection aOldSelection; + CheckRange(nStartIndex, nEndIndex); - rCacheVF.GetSelection( aOldSelection ); - //rCacheVF.SetSelection( MakeSelection(nStartIndex, nEndIndex) ); - rCacheVF.SetSelection( MakeSelection(nStartIndex + nBulletLen, nEndIndex + nBulletLen) ); - aRetVal = rCacheVF.Copy(); - rCacheVF.SetSelection( aOldSelection ); // restore + //Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet + sal_Int32 nBulletLen = 0; + EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); + if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) + nBulletLen = aBulletInfo.aText.getLength(); + // save current selection + ESelection aOldSelection; - return aRetVal; - } - catch (const uno::RuntimeException&) - { - return false; - } - } + rCacheVF.GetSelection( aOldSelection ); + //rCacheVF.SetSelection( MakeSelection(nStartIndex, nEndIndex) ); + rCacheVF.SetSelection( MakeSelection(nStartIndex + nBulletLen, nEndIndex + nBulletLen) ); + aRetVal = rCacheVF.Copy(); + rCacheVF.SetSelection( aOldSelection ); // restore - sal_Bool SAL_CALL AccessibleEditableTextPara::scrollSubstringTo( sal_Int32, sal_Int32, AccessibleScrollType ) + return aRetVal; + } + catch (const uno::RuntimeException&) { return false; } +} - // XAccessibleEditableText - sal_Bool SAL_CALL AccessibleEditableTextPara::cutText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) - { +sal_Bool SAL_CALL AccessibleEditableTextPara::scrollSubstringTo( sal_Int32, sal_Int32, AccessibleScrollType ) +{ + return false; +} - SolarMutexGuard aGuard; +// XAccessibleEditableText +sal_Bool SAL_CALL AccessibleEditableTextPara::cutText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) +{ - try - { - SvxEditViewForwarder& rCacheVF = GetEditViewForwarder( true ); - SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs + SolarMutexGuard aGuard; - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::cutText: index value overflow"); + try + { + SvxEditViewForwarder& rCacheVF = GetEditViewForwarder( true ); + SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs - CheckRange(nStartIndex, nEndIndex); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::cutText: index value overflow"); - // Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet - sal_Int32 nBulletLen = 0; - EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); - if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) - nBulletLen = aBulletInfo.aText.getLength(); - ESelection aSelection = MakeSelection (nStartIndex + nBulletLen, nEndIndex + nBulletLen); - //if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) ) - if( !rCacheTF.IsEditable( aSelection ) ) - return false; // non-editable area selected + CheckRange(nStartIndex, nEndIndex); - // don't save selection, might become invalid after cut! - //rCacheVF.SetSelection( MakeSelection(nStartIndex, nEndIndex) ); - rCacheVF.SetSelection( aSelection ); + // Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet + sal_Int32 nBulletLen = 0; + EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); + if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) + nBulletLen = aBulletInfo.aText.getLength(); + ESelection aSelection = MakeSelection (nStartIndex + nBulletLen, nEndIndex + nBulletLen); + //if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) ) + if( !rCacheTF.IsEditable( aSelection ) ) + return false; // non-editable area selected - return rCacheVF.Cut(); - } - catch (const uno::RuntimeException&) - { - return false; - } - } + // don't save selection, might become invalid after cut! + //rCacheVF.SetSelection( MakeSelection(nStartIndex, nEndIndex) ); + rCacheVF.SetSelection( aSelection ); - sal_Bool SAL_CALL AccessibleEditableTextPara::pasteText( sal_Int32 nIndex ) + return rCacheVF.Cut(); + } + catch (const uno::RuntimeException&) { + return false; + } +} - SolarMutexGuard aGuard; +sal_Bool SAL_CALL AccessibleEditableTextPara::pasteText( sal_Int32 nIndex ) +{ - try - { - SvxEditViewForwarder& rCacheVF = GetEditViewForwarder( true ); - SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs + SolarMutexGuard aGuard; - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::pasteText: index value overflow"); + try + { + SvxEditViewForwarder& rCacheVF = GetEditViewForwarder( true ); + SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs - CheckPosition(nIndex); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::pasteText: index value overflow"); - // Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet - sal_Int32 nBulletLen = 0; - EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); - if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) - nBulletLen = aBulletInfo.aText.getLength(); - if( !rCacheTF.IsEditable( MakeSelection(nIndex + nBulletLen) ) ) - return false; // non-editable area selected + CheckPosition(nIndex); - // #104400# set empty selection (=> cursor) to given index - //rCacheVF.SetSelection( MakeCursor(nIndex) ); - rCacheVF.SetSelection( MakeCursor(nIndex + nBulletLen) ); + // Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet + sal_Int32 nBulletLen = 0; + EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); + if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) + nBulletLen = aBulletInfo.aText.getLength(); + if( !rCacheTF.IsEditable( MakeSelection(nIndex + nBulletLen) ) ) + return false; // non-editable area selected - return rCacheVF.Paste(); - } - catch (const uno::RuntimeException&) - { - return false; - } - } + // #104400# set empty selection (=> cursor) to given index + //rCacheVF.SetSelection( MakeCursor(nIndex) ); + rCacheVF.SetSelection( MakeCursor(nIndex + nBulletLen) ); - sal_Bool SAL_CALL AccessibleEditableTextPara::deleteText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) + return rCacheVF.Paste(); + } + catch (const uno::RuntimeException&) { + return false; + } +} - SolarMutexGuard aGuard; +sal_Bool SAL_CALL AccessibleEditableTextPara::deleteText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) +{ - try - { - // #102710# Request edit view when doing changes - // AccessibleEmptyEditSource relies on this behaviour - GetEditViewForwarder( true ); - SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs + SolarMutexGuard aGuard; - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::deleteText: index value overflow"); + try + { + // #102710# Request edit view when doing changes + // AccessibleEmptyEditSource relies on this behaviour + GetEditViewForwarder( true ); + SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs - CheckRange(nStartIndex, nEndIndex); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::deleteText: index value overflow"); - // Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet - sal_Int32 nBulletLen = 0; - EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); - if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) - nBulletLen = aBulletInfo.aText.getLength(); - ESelection aSelection = MakeSelection (nStartIndex + nBulletLen, nEndIndex + nBulletLen); + CheckRange(nStartIndex, nEndIndex); - //if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) ) - if( !rCacheTF.IsEditable( aSelection ) ) - return false; // non-editable area selected + // Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet + sal_Int32 nBulletLen = 0; + EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); + if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) + nBulletLen = aBulletInfo.aText.getLength(); + ESelection aSelection = MakeSelection (nStartIndex + nBulletLen, nEndIndex + nBulletLen); - //sal_Bool bRet = rCacheTF.Delete( MakeSelection(nStartIndex, nEndIndex) ); - bool bRet = rCacheTF.Delete( aSelection ); + //if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) ) + if( !rCacheTF.IsEditable( aSelection ) ) + return false; // non-editable area selected - GetEditSource().UpdateData(); + //sal_Bool bRet = rCacheTF.Delete( MakeSelection(nStartIndex, nEndIndex) ); + bool bRet = rCacheTF.Delete( aSelection ); - return bRet; - } - catch (const uno::RuntimeException&) - { - return false; - } - } + GetEditSource().UpdateData(); - sal_Bool SAL_CALL AccessibleEditableTextPara::insertText( const OUString& sText, sal_Int32 nIndex ) + return bRet; + } + catch (const uno::RuntimeException&) { + return false; + } +} - SolarMutexGuard aGuard; +sal_Bool SAL_CALL AccessibleEditableTextPara::insertText( const OUString& sText, sal_Int32 nIndex ) +{ - try - { - // #102710# Request edit view when doing changes - // AccessibleEmptyEditSource relies on this behaviour - GetEditViewForwarder( true ); - SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs + SolarMutexGuard aGuard; - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::insertText: index value overflow"); + try + { + // #102710# Request edit view when doing changes + // AccessibleEmptyEditSource relies on this behaviour + GetEditViewForwarder( true ); + SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs - CheckPosition(nIndex); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::insertText: index value overflow"); - // Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet - sal_Int32 nBulletLen = 0; - EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); - if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) - nBulletLen = aBulletInfo.aText.getLength(); + CheckPosition(nIndex); - if( !rCacheTF.IsEditable( MakeSelection(nIndex + nBulletLen) ) ) - return false; // non-editable area selected + // Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet + sal_Int32 nBulletLen = 0; + EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); + if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) + nBulletLen = aBulletInfo.aText.getLength(); - // #104400# insert given text at empty selection (=> cursor) - bool bRet = rCacheTF.InsertText( sText, MakeCursor(nIndex + nBulletLen) ); + if( !rCacheTF.IsEditable( MakeSelection(nIndex + nBulletLen) ) ) + return false; // non-editable area selected - rCacheTF.QuickFormatDoc(); - GetEditSource().UpdateData(); + // #104400# insert given text at empty selection (=> cursor) + bool bRet = rCacheTF.InsertText( sText, MakeCursor(nIndex + nBulletLen) ); - return bRet; - } - catch (const uno::RuntimeException&) - { - return false; - } - } + rCacheTF.QuickFormatDoc(); + GetEditSource().UpdateData(); - sal_Bool SAL_CALL AccessibleEditableTextPara::replaceText( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const OUString& sReplacement ) + return bRet; + } + catch (const uno::RuntimeException&) { + return false; + } +} - SolarMutexGuard aGuard; +sal_Bool SAL_CALL AccessibleEditableTextPara::replaceText( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const OUString& sReplacement ) +{ - try - { - // #102710# Request edit view when doing changes - // AccessibleEmptyEditSource relies on this behaviour - GetEditViewForwarder( true ); - SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs + SolarMutexGuard aGuard; - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::replaceText: index value overflow"); + try + { + // #102710# Request edit view when doing changes + // AccessibleEmptyEditSource relies on this behaviour + GetEditViewForwarder( true ); + SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs - CheckRange(nStartIndex, nEndIndex); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::replaceText: index value overflow"); - // Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet - sal_Int32 nBulletLen = 0; - EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); - if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) - nBulletLen = aBulletInfo.aText.getLength(); - ESelection aSelection = MakeSelection (nStartIndex + nBulletLen, nEndIndex + nBulletLen); + CheckRange(nStartIndex, nEndIndex); - //if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) ) - if( !rCacheTF.IsEditable( aSelection ) ) - return false; // non-editable area selected + // Because bullet may occupy one or more characters, the TextAdapter will include bullet to calculate the selection. Add offset to handle bullet + sal_Int32 nBulletLen = 0; + EBulletInfo aBulletInfo = GetTextForwarder().GetBulletInfo(GetParagraphIndex()); + if( aBulletInfo.nParagraph != EE_PARA_MAX && aBulletInfo.bVisible ) + nBulletLen = aBulletInfo.aText.getLength(); + ESelection aSelection = MakeSelection (nStartIndex + nBulletLen, nEndIndex + nBulletLen); - // insert given text into given range => replace - //sal_Bool bRet = rCacheTF.InsertText( sReplacement, MakeSelection(nStartIndex, nEndIndex) ); - bool bRet = rCacheTF.InsertText( sReplacement, aSelection ); + //if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) ) + if( !rCacheTF.IsEditable( aSelection ) ) + return false; // non-editable area selected - rCacheTF.QuickFormatDoc(); - GetEditSource().UpdateData(); + // insert given text into given range => replace + //sal_Bool bRet = rCacheTF.InsertText( sReplacement, MakeSelection(nStartIndex, nEndIndex) ); + bool bRet = rCacheTF.InsertText( sReplacement, aSelection ); - return bRet; - } - catch (const uno::RuntimeException&) - { - return false; - } - } + rCacheTF.QuickFormatDoc(); + GetEditSource().UpdateData(); - sal_Bool SAL_CALL AccessibleEditableTextPara::setAttributes( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const uno::Sequence< beans::PropertyValue >& aAttributeSet ) + return bRet; + } + catch (const uno::RuntimeException&) { + return false; + } +} - SolarMutexGuard aGuard; +sal_Bool SAL_CALL AccessibleEditableTextPara::setAttributes( sal_Int32 nStartIndex, sal_Int32 nEndIndex, const uno::Sequence< beans::PropertyValue >& aAttributeSet ) +{ - try - { - // #102710# Request edit view when doing changes - // AccessibleEmptyEditSource relies on this behaviour - GetEditViewForwarder( true ); - SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs - sal_Int32 nPara = GetParagraphIndex(); + SolarMutexGuard aGuard; + + try + { + // #102710# Request edit view when doing changes + // AccessibleEmptyEditSource relies on this behaviour + GetEditViewForwarder( true ); + SvxAccessibleTextAdapter& rCacheTF = GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs + sal_Int32 nPara = GetParagraphIndex(); - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::setAttributes: index value overflow"); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::setAttributes: index value overflow"); - CheckRange(nStartIndex, nEndIndex); + CheckRange(nStartIndex, nEndIndex); - if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) ) - return false; // non-editable area selected + if( !rCacheTF.IsEditable( MakeSelection(nStartIndex, nEndIndex) ) ) + return false; // non-editable area selected - // do the indices span the whole paragraph? Then use the outliner map - // TODO: hold it as a member? - rtl::Reference< SvxAccessibleTextPropertySet > xPropSet( new SvxAccessibleTextPropertySet( &GetEditSource(), - 0 == nStartIndex && - rCacheTF.GetTextLen(nPara) == nEndIndex ? - ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() : - ImplGetSvxTextPortionSvxPropertySet() ) ); + // do the indices span the whole paragraph? Then use the outliner map + // TODO: hold it as a member? + rtl::Reference< SvxAccessibleTextPropertySet > xPropSet( new SvxAccessibleTextPropertySet( &GetEditSource(), + 0 == nStartIndex && + rCacheTF.GetTextLen(nPara) == nEndIndex ? + ImplGetSvxUnoOutlinerTextCursorSvxPropertySet() : + ImplGetSvxTextPortionSvxPropertySet() ) ); - xPropSet->SetSelection( MakeSelection(nStartIndex, nEndIndex) ); + xPropSet->SetSelection( MakeSelection(nStartIndex, nEndIndex) ); - // convert from PropertyValue to Any - for(const beans::PropertyValue& rProp : aAttributeSet) + // convert from PropertyValue to Any + for(const beans::PropertyValue& rProp : aAttributeSet) + { + try { - try - { - xPropSet->setPropertyValue(rProp.Name, rProp.Value); - } - catch (const uno::Exception&) - { - TOOLS_WARN_EXCEPTION( "dbaccess", "AccessibleEditableTextPara::setAttributes exception in setPropertyValue"); - } + xPropSet->setPropertyValue(rProp.Name, rProp.Value); } + catch (const uno::Exception&) + { + TOOLS_WARN_EXCEPTION( "dbaccess", "AccessibleEditableTextPara::setAttributes exception in setPropertyValue"); + } + } - rCacheTF.QuickFormatDoc(); - GetEditSource().UpdateData(); + rCacheTF.QuickFormatDoc(); + GetEditSource().UpdateData(); - return true; - } - catch (const uno::RuntimeException&) - { - return false; - } + return true; } - - sal_Bool SAL_CALL AccessibleEditableTextPara::setText( const OUString& sText ) + catch (const uno::RuntimeException&) { - - SolarMutexGuard aGuard; - - return replaceText(0, getCharacterCount(), sText); + return false; } +} - // XAccessibleTextAttributes - uno::Sequence< beans::PropertyValue > SAL_CALL AccessibleEditableTextPara::getDefaultAttributes( - const uno::Sequence< OUString >& rRequestedAttributes ) - { - SolarMutexGuard aGuard; +sal_Bool SAL_CALL AccessibleEditableTextPara::setText( const OUString& sText ) +{ - GetTextForwarder(); + SolarMutexGuard aGuard; - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getCharacterAttributes: index value overflow"); + return replaceText(0, getCharacterCount(), sText); +} - // get XPropertySetInfo for paragraph attributes and - // character attributes that span all the paragraphs text. - rtl::Reference< SvxAccessibleTextPropertySet > xPropSet( new SvxAccessibleTextPropertySet( &GetEditSource(), - ImplGetSvxCharAndParaPropertiesSet() ) ); - xPropSet->SetSelection( MakeSelection( 0, GetTextLen() ) ); - uno::Reference< beans::XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo(); - if (!xPropSetInfo.is()) - throw uno::RuntimeException(u"Cannot query XPropertySetInfo"_ustr, - uno::Reference< uno::XInterface > - ( static_cast< XAccessible* > (this) ) ); // disambiguate hierarchy - - // build sequence of available properties to check - uno::Sequence< beans::Property > aProperties; - if (const sal_Int32 nLenReqAttr = rRequestedAttributes.getLength()) - { - aProperties.realloc( nLenReqAttr ); - beans::Property *pProperties = aProperties.getArray(); - sal_Int32 nCurLen = 0; - for (const OUString& rRequestedAttribute : rRequestedAttributes) +// XAccessibleTextAttributes +uno::Sequence< beans::PropertyValue > SAL_CALL AccessibleEditableTextPara::getDefaultAttributes( + const uno::Sequence< OUString >& rRequestedAttributes ) +{ + SolarMutexGuard aGuard; + + GetTextForwarder(); + + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getCharacterAttributes: index value overflow"); + + // get XPropertySetInfo for paragraph attributes and + // character attributes that span all the paragraphs text. + rtl::Reference< SvxAccessibleTextPropertySet > xPropSet( new SvxAccessibleTextPropertySet( &GetEditSource(), + ImplGetSvxCharAndParaPropertiesSet() ) ); + xPropSet->SetSelection( MakeSelection( 0, GetTextLen() ) ); + uno::Reference< beans::XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo(); + if (!xPropSetInfo.is()) + throw uno::RuntimeException(u"Cannot query XPropertySetInfo"_ustr, + uno::Reference< uno::XInterface > + ( static_cast< XAccessible* > (this) ) ); // disambiguate hierarchy + + // build sequence of available properties to check + uno::Sequence< beans::Property > aProperties; + if (const sal_Int32 nLenReqAttr = rRequestedAttributes.getLength()) + { + aProperties.realloc( nLenReqAttr ); + beans::Property *pProperties = aProperties.getArray(); + sal_Int32 nCurLen = 0; + for (const OUString& rRequestedAttribute : rRequestedAttributes) + { + beans::Property aProp; + try { - beans::Property aProp; - try - { - aProp = xPropSetInfo->getPropertyByName( rRequestedAttribute ); - } - catch (const beans::UnknownPropertyException&) - { - continue; - } - pProperties[nCurLen++] = std::move(aProp); + aProp = xPropSetInfo->getPropertyByName( rRequestedAttribute ); + } + catch (const beans::UnknownPropertyException&) + { + continue; } - aProperties.realloc( nCurLen ); + pProperties[nCurLen++] = std::move(aProp); } - else - aProperties = xPropSetInfo->getProperties(); + aProperties.realloc( nCurLen ); + } + else + aProperties = xPropSetInfo->getProperties(); - // build resulting sequence - uno::Sequence< beans::PropertyValue > aOutSequence( aProperties.getLength() ); - beans::PropertyValue* pOutSequence = aOutSequence.getArray(); - sal_Int32 nOutLen = 0; - for (const beans::Property& rProperty : aProperties) + // build resulting sequence + uno::Sequence< beans::PropertyValue > aOutSequence( aProperties.getLength() ); + beans::PropertyValue* pOutSequence = aOutSequence.getArray(); + sal_Int32 nOutLen = 0; + for (const beans::Property& rProperty : aProperties) + { + // calling implementation functions: + // _getPropertyState and _getPropertyValue (see below) to provide + // the proper paragraph number when retrieving paragraph attributes + PropertyState eState = xPropSet->_getPropertyState( rProperty.Name, mnParagraphIndex ); + if ( eState == PropertyState_AMBIGUOUS_VALUE ) { - // calling implementation functions: - // _getPropertyState and _getPropertyValue (see below) to provide - // the proper paragraph number when retrieving paragraph attributes - PropertyState eState = xPropSet->_getPropertyState( rProperty.Name, mnParagraphIndex ); - if ( eState == PropertyState_AMBIGUOUS_VALUE ) - { - OSL_FAIL( "ambiguous property value encountered" ); - } + OSL_FAIL( "ambiguous property value encountered" ); + } - //if (eState == PropertyState_DIRECT_VALUE) - // per definition all paragraph properties and all character - // properties spanning the whole paragraph should be returned - // and declared as default value - { - pOutSequence->Name = rProperty.Name; - pOutSequence->Handle = rProperty.Handle; - pOutSequence->Value = xPropSet->_getPropertyValue( rProperty.Name, mnParagraphIndex ); - pOutSequence->State = PropertyState_DEFAULT_VALUE; + //if (eState == PropertyState_DIRECT_VALUE) + // per definition all paragraph properties and all character + // properties spanning the whole paragraph should be returned + // and declared as default value + { + pOutSequence->Name = rProperty.Name; + pOutSequence->Handle = rProperty.Handle; + pOutSequence->Value = xPropSet->_getPropertyValue( rProperty.Name, mnParagraphIndex ); + pOutSequence->State = PropertyState_DEFAULT_VALUE; - ++pOutSequence; - ++nOutLen; - } + ++pOutSequence; + ++nOutLen; } - aOutSequence.realloc( nOutLen ); - - return aOutSequence; } + aOutSequence.realloc( nOutLen ); + return aOutSequence; +} - uno::Sequence< beans::PropertyValue > SAL_CALL AccessibleEditableTextPara::getRunAttributes( - sal_Int32 nIndex, - const uno::Sequence< OUString >& rRequestedAttributes ) - { - SolarMutexGuard aGuard; +uno::Sequence< beans::PropertyValue > SAL_CALL AccessibleEditableTextPara::getRunAttributes( + sal_Int32 nIndex, + const uno::Sequence< OUString >& rRequestedAttributes ) +{ - GetTextForwarder(); + SolarMutexGuard aGuard; - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::getCharacterAttributes: index value overflow"); + GetTextForwarder(); - if( getCharacterCount() > 0 ) - CheckIndex(nIndex); - else - CheckPosition(nIndex); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::getCharacterAttributes: index value overflow"); - rtl::Reference< SvxAccessibleTextPropertySet > xPropSet( new SvxAccessibleTextPropertySet( &GetEditSource(), - ImplGetSvxCharAndParaPropertiesSet() ) ); - xPropSet->SetSelection( MakeSelection( nIndex ) ); - uno::Reference< beans::XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo(); - if (!xPropSetInfo.is()) - throw uno::RuntimeException(u"Cannot query XPropertySetInfo"_ustr, - uno::Reference< uno::XInterface > - ( static_cast< XAccessible* > (this) ) ); // disambiguate hierarchy - - // build sequence of available properties to check - uno::Sequence< beans::Property > aProperties; - if (const sal_Int32 nLenReqAttr = rRequestedAttributes.getLength()) + if( getCharacterCount() > 0 ) + CheckIndex(nIndex); + else + CheckPosition(nIndex); + + rtl::Reference< SvxAccessibleTextPropertySet > xPropSet( new SvxAccessibleTextPropertySet( &GetEditSource(), + ImplGetSvxCharAndParaPropertiesSet() ) ); + xPropSet->SetSelection( MakeSelection( nIndex ) ); + uno::Reference< beans::XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo(); + if (!xPropSetInfo.is()) + throw uno::RuntimeException(u"Cannot query XPropertySetInfo"_ustr, + uno::Reference< uno::XInterface > + ( static_cast< XAccessible* > (this) ) ); // disambiguate hierarchy + + // build sequence of available properties to check + uno::Sequence< beans::Property > aProperties; + if (const sal_Int32 nLenReqAttr = rRequestedAttributes.getLength()) + { + aProperties.realloc( nLenReqAttr ); + beans::Property *pProperties = aProperties.getArray(); + sal_Int32 nCurLen = 0; + for (const OUString& rRequestedAttribute : rRequestedAttributes) { - aProperties.realloc( nLenReqAttr ); - beans::Property *pProperties = aProperties.getArray(); - sal_Int32 nCurLen = 0; - for (const OUString& rRequestedAttribute : rRequestedAttributes) + beans::Property aProp; + try { - beans::Property aProp; - try - { - aProp = xPropSetInfo->getPropertyByName( rRequestedAttribute ); - } - catch (const beans::UnknownPropertyException&) - { - continue; - } - pProperties[ nCurLen++ ] = std::move(aProp); + aProp = xPropSetInfo->getPropertyByName( rRequestedAttribute ); } - aProperties.realloc( nCurLen ); - } - else - aProperties = xPropSetInfo->getProperties(); - - // build resulting sequence - uno::Sequence< beans::PropertyValue > aOutSequence( aProperties.getLength() ); - beans::PropertyValue* pOutSequence = aOutSequence.getArray(); - sal_Int32 nOutLen = 0; - for (const beans::Property& rProperty : aProperties) - { - // calling 'regular' functions that will operate on the selection - PropertyState eState = xPropSet->getPropertyState( rProperty.Name ); - if (eState == PropertyState_DIRECT_VALUE) + catch (const beans::UnknownPropertyException&) { - pOutSequence->Name = rProperty.Name; - pOutSequence->Handle = rProperty.Handle; - pOutSequence->Value = xPropSet->getPropertyValue( rProperty.Name ); - pOutSequence->State = eState; - - ++pOutSequence; - ++nOutLen; + continue; } + pProperties[ nCurLen++ ] = std::move(aProp); } - aOutSequence.realloc( nOutLen ); - - return aOutSequence; + aProperties.realloc( nCurLen ); } + else + aProperties = xPropSetInfo->getProperties(); - // XAccessibleHypertext - ::sal_Int32 SAL_CALL AccessibleEditableTextPara::getHyperLinkCount( ) + // build resulting sequence + uno::Sequence< beans::PropertyValue > aOutSequence( aProperties.getLength() ); + beans::PropertyValue* pOutSequence = aOutSequence.getArray(); + sal_Int32 nOutLen = 0; + for (const beans::Property& rProperty : aProperties) { - SvxAccessibleTextAdapter& rT = GetTextForwarder(); - const sal_Int32 nPara = GetParagraphIndex(); - - std::vector<EFieldInfo> aFieldInfos = rT.GetFieldInfo( nPara ); - sal_Int32 nHyperLinks = 0; - sal_Int32 nFields = aFieldInfos.size(); - for (sal_Int32 n = 0; n < nFields; ++n) + // calling 'regular' functions that will operate on the selection + PropertyState eState = xPropSet->getPropertyState( rProperty.Name ); + if (eState == PropertyState_DIRECT_VALUE) { - if ( dynamic_cast<const SvxURLField* >(aFieldInfos[n].pFieldItem->GetField() ) != nullptr) - nHyperLinks++; + pOutSequence->Name = rProperty.Name; + pOutSequence->Handle = rProperty.Handle; + pOutSequence->Value = xPropSet->getPropertyValue( rProperty.Name ); + pOutSequence->State = eState; + + ++pOutSequence; + ++nOutLen; } - return nHyperLinks; } + aOutSequence.realloc( nOutLen ); + + return aOutSequence; +} - css::uno::Reference< css::accessibility::XAccessibleHyperlink > SAL_CALL AccessibleEditableTextPara::getHyperLink( ::sal_Int32 nLinkIndex ) +// XAccessibleHypertext +::sal_Int32 SAL_CALL AccessibleEditableTextPara::getHyperLinkCount( ) +{ + SvxAccessibleTextAdapter& rT = GetTextForwarder(); + const sal_Int32 nPara = GetParagraphIndex(); + + std::vector<EFieldInfo> aFieldInfos = rT.GetFieldInfo( nPara ); + sal_Int32 nHyperLinks = 0; + sal_Int32 nFields = aFieldInfos.size(); + for (sal_Int32 n = 0; n < nFields; ++n) { - rtl::Reference< AccessibleHyperlink > xRef; + if ( dynamic_cast<const SvxURLField* >(aFieldInfos[n].pFieldItem->GetField() ) != nullptr) + nHyperLinks++; + } + return nHyperLinks; +} - SvxAccessibleTextAdapter& rT = GetTextForwarder(); - const sal_Int32 nPara = GetParagraphIndex(); +css::uno::Reference< css::accessibility::XAccessibleHyperlink > SAL_CALL AccessibleEditableTextPara::getHyperLink( ::sal_Int32 nLinkIndex ) +{ + rtl::Reference< AccessibleHyperlink > xRef; + + SvxAccessibleTextAdapter& rT = GetTextForwarder(); + const sal_Int32 nPara = GetParagraphIndex(); - sal_Int32 nHyperLink = 0; - for (const EFieldInfo& rField : rT.GetFieldInfo( nPara )) + sal_Int32 nHyperLink = 0; + for (const EFieldInfo& rField : rT.GetFieldInfo( nPara )) + { + if ( dynamic_cast<const SvxURLField* >(rField.pFieldItem->GetField()) != nullptr ) { - if ( dynamic_cast<const SvxURLField* >(rField.pFieldItem->GetField()) != nullptr ) + if ( nHyperLink == nLinkIndex ) { - if ( nHyperLink == nLinkIndex ) - { - sal_Int32 nEEStart = rField.aPosition.nIndex; + sal_Int32 nEEStart = rField.aPosition.nIndex; - // Translate EE Index to accessible index - sal_Int32 nStart = rT.CalcEditEngineIndex( nPara, nEEStart ); - sal_Int32 nEnd = nStart + rField.aCurrentText.getLength(); - xRef = new AccessibleHyperlink( rT, new SvxFieldItem( *rField.pFieldItem ), nStart, nEnd, rField.aCurrentText ); - break; - } - nHyperLink++; + // Translate EE Index to accessible index + sal_Int32 nStart = rT.CalcEditEngineIndex( nPara, nEEStart ); + sal_Int32 nEnd = nStart + rField.aCurrentText.getLength(); + xRef = new AccessibleHyperlink( rT, new SvxFieldItem( *rField.pFieldItem ), nStart, nEnd, rField.aCurrentText ); + break; } + nHyperLink++; } - - return xRef; } - ::sal_Int32 SAL_CALL AccessibleEditableTextPara::getHyperLinkIndex( ::sal_Int32 nCharIndex ) - { - const sal_Int32 nPara = GetParagraphIndex(); - SvxAccessibleTextAdapter& rT = GetTextForwarder(); + return xRef; +} - const sal_Int32 nEEIndex = rT.CalcEditEngineIndex( nPara, nCharIndex ); - sal_Int32 nHLIndex = -1; //i123620 - sal_Int32 nHyperLink = 0; - for (const EFieldInfo & rField : rT.GetFieldInfo( nPara )) +::sal_Int32 SAL_CALL AccessibleEditableTextPara::getHyperLinkIndex( ::sal_Int32 nCharIndex ) +{ + const sal_Int32 nPara = GetParagraphIndex(); + SvxAccessibleTextAdapter& rT = GetTextForwarder(); + + const sal_Int32 nEEIndex = rT.CalcEditEngineIndex( nPara, nCharIndex ); + sal_Int32 nHLIndex = -1; //i123620 + sal_Int32 nHyperLink = 0; + for (const EFieldInfo & rField : rT.GetFieldInfo( nPara )) + { + if ( dynamic_cast<const SvxURLField* >( rField.pFieldItem->GetField() ) != nullptr) { - if ( dynamic_cast<const SvxURLField* >( rField.pFieldItem->GetField() ) != nullptr) + if ( rField.aPosition.nIndex == nEEIndex ) { - if ( rField.aPosition.nIndex == nEEIndex ) - { - nHLIndex = nHyperLink; - break; - } - nHyperLink++; + nHLIndex = nHyperLink; + break; } + nHyperLink++; } - - return nHLIndex; } - // XAccessibleMultiLineText - sal_Int32 SAL_CALL AccessibleEditableTextPara::getLineNumberAtIndex( sal_Int32 nIndex ) - { + return nHLIndex; +} - sal_Int32 nRes = -1; - sal_Int32 nPara = GetParagraphIndex(); +// XAccessibleMultiLineText +sal_Int32 SAL_CALL AccessibleEditableTextPara::getLineNumberAtIndex( sal_Int32 nIndex ) +{ - SvxTextForwarder &rCacheTF = GetTextForwarder(); - const bool bValidPara = 0 <= nPara && nPara < rCacheTF.GetParagraphCount(); - DBG_ASSERT( bValidPara, "getLineNumberAtIndex: current paragraph index out of range" ); - if (bValidPara) - { - // we explicitly allow for the index to point at the character right behind the text - if (0 > nIndex || nIndex > rCacheTF.GetTextLen( nPara )) - throw lang::IndexOutOfBoundsException(); - nRes = rCacheTF.GetLineNumberAtIndex( nPara, nIndex ); - } - return nRes; - } + sal_Int32 nRes = -1; + sal_Int32 nPara = GetParagraphIndex(); - // XAccessibleMultiLineText - css::accessibility::TextSegment SAL_CALL AccessibleEditableTextPara::getTextAtLineNumber( sal_Int32 nLineNo ) + SvxTextForwarder &rCacheTF = GetTextForwarder(); + const bool bValidPara = 0 <= nPara && nPara < rCacheTF.GetParagraphCount(); + DBG_ASSERT( bValidPara, "getLineNumberAtIndex: current paragraph index out of range" ); + if (bValidPara) { + // we explicitly allow for the index to point at the character right behind the text + if (0 > nIndex || nIndex > rCacheTF.GetTextLen( nPara )) + throw lang::IndexOutOfBoundsException(); + nRes = rCacheTF.GetLineNumberAtIndex( nPara, nIndex ); + } + return nRes; +} - css::accessibility::TextSegment aResult; - sal_Int32 nPara = GetParagraphIndex(); - SvxTextForwarder &rCacheTF = GetTextForwarder(); - const bool bValidPara = 0 <= nPara && nPara < rCacheTF.GetParagraphCount(); - DBG_ASSERT( bValidPara, "getTextAtLineNumber: current paragraph index out of range" ); - if (bValidPara) +// XAccessibleMultiLineText +css::accessibility::TextSegment SAL_CALL AccessibleEditableTextPara::getTextAtLineNumber( sal_Int32 nLineNo ) +{ + + css::accessibility::TextSegment aResult; + sal_Int32 nPara = GetParagraphIndex(); + SvxTextForwarder &rCacheTF = GetTextForwarder(); + const bool bValidPara = 0 <= nPara && nPara < rCacheTF.GetParagraphCount(); + DBG_ASSERT( bValidPara, "getTextAtLineNumber: current paragraph index out of range" ); + if (bValidPara) + { + if (0 > nLineNo || nLineNo >= rCacheTF.GetLineCount( nPara )) + throw lang::IndexOutOfBoundsException(); + sal_Int32 nStart = 0, nEnd = 0; + rCacheTF.GetLineBoundaries( nStart, nEnd, nPara, nLineNo ); + if (nStart >= 0 && nEnd >= 0) { - if (0 > nLineNo || nLineNo >= rCacheTF.GetLineCount( nPara )) - throw lang::IndexOutOfBoundsException(); - sal_Int32 nStart = 0, nEnd = 0; - rCacheTF.GetLineBoundaries( nStart, nEnd, nPara, nLineNo ); - if (nStart >= 0 && nEnd >= 0) + try { - try - { - aResult.SegmentText = getTextRange( nStart, nEnd ); - aResult.SegmentStart = nStart; - aResult.SegmentEnd = nEnd; - } - catch (const lang::IndexOutOfBoundsException&) - { - // this is not the exception that should be raised in this function ... - DBG_UNHANDLED_EXCEPTION("editeng"); - } + aResult.SegmentText = getTextRange( nStart, nEnd ); + aResult.SegmentStart = nStart; + aResult.SegmentEnd = nEnd; + } + catch (const lang::IndexOutOfBoundsException&) + { + // this is not the exception that should be raised in this function ... + DBG_UNHANDLED_EXCEPTION("editeng"); } } - return aResult; } + return aResult; +} - // XAccessibleMultiLineText - css::accessibility::TextSegment SAL_CALL AccessibleEditableTextPara::getTextAtLineWithCaret( ) - { +// XAccessibleMultiLineText +css::accessibility::TextSegment SAL_CALL AccessibleEditableTextPara::getTextAtLineWithCaret( ) +{ - css::accessibility::TextSegment aResult; - try - { - aResult = getTextAtLineNumber( getNumberOfLineWithCaret() ); - } - catch (const lang::IndexOutOfBoundsException&) - { - // this one needs to be caught since this interface does not allow for it. - } - return aResult; + css::accessibility::TextSegment aResult; + try + { + aResult = getTextAtLineNumber( getNumberOfLineWithCaret() ); } - - // XAccessibleMultiLineText - sal_Int32 SAL_CALL AccessibleEditableTextPara::getNumberOfLineWithCaret( ) + catch (const lang::IndexOutOfBoundsException&) { - - sal_Int32 nRes = -1; - try - { - nRes = getLineNumberAtIndex( getCaretPosition() ); - } - catch (const lang::IndexOutOfBoundsException&) - { - // this one needs to be caught since this interface does not allow for it. - } - return nRes; + // this one needs to be caught since this interface does not allow for it. } + return aResult; +} +// XAccessibleMultiLineText +sal_Int32 SAL_CALL AccessibleEditableTextPara::getNumberOfLineWithCaret( ) +{ - // XServiceInfo - OUString SAL_CALL AccessibleEditableTextPara::getImplementationName() + sal_Int32 nRes = -1; + try { - - return u"AccessibleEditableTextPara"_ustr; + nRes = getLineNumberAtIndex( getCaretPosition() ); } - - sal_Bool SAL_CALL AccessibleEditableTextPara::supportsService (const OUString& sServiceName) + catch (const lang::IndexOutOfBoundsException&) { - - return cppu::supportsService(this, sServiceName); + // this one needs to be caught since this interface does not allow for it. } + return nRes; +} - uno::Sequence< OUString> SAL_CALL AccessibleEditableTextPara::getSupportedServiceNames() - { - // #105185# Using correct service now - return { u"com.sun.star.text.AccessibleParagraphView"_ustr }; - } + +// XServiceInfo +OUString SAL_CALL AccessibleEditableTextPara::getImplementationName() +{ + + return u"AccessibleEditableTextPara"_ustr; +} + +sal_Bool SAL_CALL AccessibleEditableTextPara::supportsService (const OUString& sServiceName) +{ + + return cppu::supportsService(this, sServiceName); +} + +uno::Sequence< OUString> SAL_CALL AccessibleEditableTextPara::getSupportedServiceNames() +{ + // #105185# Using correct service now + return { u"com.sun.star.text.AccessibleParagraphView"_ustr }; +} } // end of namespace accessibility diff --git a/editeng/source/accessibility/AccessibleHyperlink.cxx b/editeng/source/accessibility/AccessibleHyperlink.cxx index 52f45dc44ff3..f4cb80a42d32 100644 --- a/editeng/source/accessibility/AccessibleHyperlink.cxx +++ b/editeng/source/accessibility/AccessibleHyperlink.cxx @@ -36,88 +36,88 @@ using namespace ::com::sun::star; namespace accessibility { - AccessibleHyperlink::AccessibleHyperlink( SvxAccessibleTextAdapter& r, SvxFieldItem* p, sal_Int32 nStt, sal_Int32 nEnd, const OUString& rD ) - : rTA( r ) - { - pFld.reset( p ); - nStartIdx = nStt; - nEndIdx = nEnd; - aDescription = rD; - } +AccessibleHyperlink::AccessibleHyperlink( SvxAccessibleTextAdapter& r, SvxFieldItem* p, sal_Int32 nStt, sal_Int32 nEnd, const OUString& rD ) +: rTA( r ) +{ + pFld.reset( p ); + nStartIdx = nStt; + nEndIdx = nEnd; + aDescription = rD; +} - AccessibleHyperlink::~AccessibleHyperlink() - { - } +AccessibleHyperlink::~AccessibleHyperlink() +{ +} - // XAccessibleAction - sal_Int32 SAL_CALL AccessibleHyperlink::getAccessibleActionCount() - { - return isValid() ? 1 : 0; - } +// XAccessibleAction +sal_Int32 SAL_CALL AccessibleHyperlink::getAccessibleActionCount() +{ + return isValid() ? 1 : 0; +} - sal_Bool SAL_CALL AccessibleHyperlink::doAccessibleAction( sal_Int32 nIndex ) +sal_Bool SAL_CALL AccessibleHyperlink::doAccessibleAction( sal_Int32 nIndex ) +{ + bool bRet = false; + if ( isValid() && ( nIndex == 0 ) ) { - bool bRet = false; - if ( isValid() && ( nIndex == 0 ) ) - { - rTA.FieldClicked( *pFld ); - bRet = true; - } - return bRet; + rTA.FieldClicked( *pFld ); + bRet = true; } + return bRet; +} - OUString SAL_CALL AccessibleHyperlink::getAccessibleActionDescription( sal_Int32 nIndex ) - { - OUString aDesc; +OUString SAL_CALL AccessibleHyperlink::getAccessibleActionDescription( sal_Int32 nIndex ) +{ + OUString aDesc; - if ( isValid() && ( nIndex == 0 ) ) - aDesc = aDescription; + if ( isValid() && ( nIndex == 0 ) ) + aDesc = aDescription; - return aDesc; - } + return aDesc; +} - uno::Reference< css::accessibility::XAccessibleKeyBinding > SAL_CALL AccessibleHyperlink::getAccessibleActionKeyBinding( sal_Int32 nIndex ) - { - if( !isValid() || ( nIndex != 0 ) ) - return nullptr; +uno::Reference< css::accessibility::XAccessibleKeyBinding > SAL_CALL AccessibleHyperlink::getAccessibleActionKeyBinding( sal_Int32 nIndex ) +{ + if( !isValid() || ( nIndex != 0 ) ) + return nullptr; - rtl::Reference<::comphelper::OAccessibleKeyBindingHelper> pKeyBindingHelper = new ::comphelper::OAccessibleKeyBindingHelper(); + rtl::Reference<::comphelper::OAccessibleKeyBindingHelper> pKeyBindingHelper = new ::comphelper::OAccessibleKeyBindingHelper(); - awt::KeyStroke aKeyStroke; - aKeyStroke.Modifiers = 0; - aKeyStroke.KeyCode = KEY_RETURN; - aKeyStroke.KeyChar = 0; - aKeyStroke.KeyFunc = 0; - pKeyBindingHelper->AddKeyBinding( aKeyStroke ); + awt::KeyStroke aKeyStroke; + aKeyStroke.Modifiers = 0; + aKeyStroke.KeyCode = KEY_RETURN; + aKeyStroke.KeyChar = 0; + aKeyStroke.KeyFunc = 0; + pKeyBindingHelper->AddKeyBinding( aKeyStroke ); - return pKeyBindingHelper; - } + return pKeyBindingHelper; +} - // XAccessibleHyperlink - uno::Any SAL_CALL AccessibleHyperlink::getAccessibleActionAnchor( sal_Int32 /*nIndex*/ ) - { - return uno::Any(); - } +// XAccessibleHyperlink +uno::Any SAL_CALL AccessibleHyperlink::getAccessibleActionAnchor( sal_Int32 /*nIndex*/ ) +{ + return uno::Any(); +} - uno::Any SAL_CALL AccessibleHyperlink::getAccessibleActionObject( sal_Int32 /*nIndex*/ ) - { - return uno::Any(); - } +uno::Any SAL_CALL AccessibleHyperlink::getAccessibleActionObject( sal_Int32 /*nIndex*/ ) +{ + return uno::Any(); +} - sal_Int32 SAL_CALL AccessibleHyperlink::getStartIndex() - { - return nStartIdx; - } +sal_Int32 SAL_CALL AccessibleHyperlink::getStartIndex() +{ + return nStartIdx; +} - sal_Int32 SAL_CALL AccessibleHyperlink::getEndIndex() - { - return nEndIdx; - } +sal_Int32 SAL_CALL AccessibleHyperlink::getEndIndex() +{ + return nEndIdx; +} - sal_Bool SAL_CALL AccessibleHyperlink::isValid( ) - { - return rTA.IsValid(); - } +sal_Bool SAL_CALL AccessibleHyperlink::isValid( ) +{ + return rTA.IsValid(); +} } // end of namespace accessibility diff --git a/editeng/source/accessibility/AccessibleHyperlink.hxx b/editeng/source/accessibility/AccessibleHyperlink.hxx index 7e4f36a6bb77..f996b59fee9a 100644 --- a/editeng/source/accessibility/AccessibleHyperlink.hxx +++ b/editeng/source/accessibility/AccessibleHyperlink.hxx @@ -32,32 +32,32 @@ class SvxAccessibleTextAdapter; namespace accessibility { - class AccessibleHyperlink : public ::cppu::WeakImplHelper< css::accessibility::XAccessibleHyperlink > - { - private: +class AccessibleHyperlink : public ::cppu::WeakImplHelper< css::accessibility::XAccessibleHyperlink > +{ +private: - SvxAccessibleTextAdapter& rTA; - std::unique_ptr<SvxFieldItem> pFld; - sal_Int32 nStartIdx, nEndIdx; // translated values - OUString aDescription; + SvxAccessibleTextAdapter& rTA; + std::unique_ptr<SvxFieldItem> pFld; + sal_Int32 nStartIdx, nEndIdx; // translated values + OUString aDescription; - public: - AccessibleHyperlink( SvxAccessibleTextAdapter& r, SvxFieldItem* p, sal_Int32 nStt, sal_Int32 nEnd, const OUString& rD ); - virtual ~AccessibleHyperlink() override; +public: + AccessibleHyperlink( SvxAccessibleTextAdapter& r, SvxFieldItem* p, sal_Int32 nStt, sal_Int32 nEnd, const OUString& rD ); + virtual ~AccessibleHyperlink() override; - // XAccessibleAction - virtual sal_Int32 SAL_CALL getAccessibleActionCount() override; - virtual sal_Bool SAL_CALL doAccessibleAction( sal_Int32 nIndex ) override; - virtual OUString SAL_CALL getAccessibleActionDescription( sal_Int32 nIndex ) override; - virtual css::uno::Reference< css::accessibility::XAccessibleKeyBinding > SAL_CALL getAccessibleActionKeyBinding( sal_Int32 nIndex ) override; + // XAccessibleAction + virtual sal_Int32 SAL_CALL getAccessibleActionCount() override; + virtual sal_Bool SAL_CALL doAccessibleAction( sal_Int32 nIndex ) override; + virtual OUString SAL_CALL getAccessibleActionDescription( sal_Int32 nIndex ) override; + virtual css::uno::Reference< css::accessibility::XAccessibleKeyBinding > SAL_CALL getAccessibleActionKeyBinding( sal_Int32 nIndex ) override; - // XAccessibleHyperlink - virtual css::uno::Any SAL_CALL getAccessibleActionAnchor( sal_Int32 nIndex ) override; - virtual css::uno::Any SAL_CALL getAccessibleActionObject( sal_Int32 nIndex ) override; - virtual sal_Int32 SAL_CALL getStartIndex() override; - virtual sal_Int32 SAL_CALL getEndIndex() override; - virtual sal_Bool SAL_CALL isValid() override; - }; + // XAccessibleHyperlink + virtual css::uno::Any SAL_CALL getAccessibleActionAnchor( sal_Int32 nIndex ) override; + virtual css::uno::Any SAL_CALL getAccessibleActionObject( sal_Int32 nIndex ) override; + virtual sal_Int32 SAL_CALL getStartIndex() override; + virtual sal_Int32 SAL_CALL getEndIndex() override; + virtual sal_Bool SAL_CALL isValid() override; +}; } // end of namespace accessibility diff --git a/editeng/source/accessibility/AccessibleImageBullet.cxx b/editeng/source/accessibility/AccessibleImageBullet.cxx index 5870e3300c95..b0a195e71c82 100644 --- a/editeng/source/accessibility/AccessibleImageBullet.cxx +++ b/editeng/source/accessibility/AccessibleImageBullet.cxx @@ -49,468 +49,468 @@ using namespace ::com::sun::star::accessibility; namespace accessibility { - AccessibleImageBullet::AccessibleImageBullet ( uno::Reference< XAccessible > xParent ) : - mnParagraphIndex( 0 ), - mnIndexInParent( 0 ), - 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()) +AccessibleImageBullet::AccessibleImageBullet ( uno::Reference< XAccessible > xParent ) : + mnParagraphIndex( 0 ), + mnIndexInParent( 0 ), + 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()) +{ + try { - try - { - // Create the state set. - mnStateSet = 0; - - // these are always on - mnStateSet |= AccessibleStateType::VISIBLE; - mnStateSet |= AccessibleStateType::SHOWING; - mnStateSet |= AccessibleStateType::ENABLED; - mnStateSet |= AccessibleStateType::SENSITIVE; - } - catch( const uno::Exception& ) {} + // Create the state set. + mnStateSet = 0; + + // these are always on + mnStateSet |= AccessibleStateType::VISIBLE; + mnStateSet |= AccessibleStateType::SHOWING; + mnStateSet |= AccessibleStateType::ENABLED; + mnStateSet |= AccessibleStateType::SENSITIVE; } + catch( const uno::Exception& ) {} +} - AccessibleImageBullet::~AccessibleImageBullet() - { +AccessibleImageBullet::~AccessibleImageBullet() +{ - // sign off from event notifier - if( getNotifierClientId() != -1 ) + // sign off from event notifier + if( getNotifierClientId() != -1 ) + { + try { - try - { - ::comphelper::AccessibleEventNotifier::revokeClient( getNotifierClientId() ); - } - catch( const uno::Exception& ) {} + ::comphelper::AccessibleEventNotifier::revokeClient( getNotifierClientId() ); } + catch( const uno::Exception& ) {} } +} - uno::Reference< XAccessibleContext > SAL_CALL AccessibleImageBullet::getAccessibleContext( ) - { +uno::Reference< XAccessibleContext > SAL_CALL AccessibleImageBullet::getAccessibleContext( ) +{ - // We implement the XAccessibleContext interface in the same object - return uno::Reference< XAccessibleContext > ( this ); - } + // We implement the XAccessibleContext interface in the same object + return uno::Reference< XAccessibleContext > ( this ); +} - sal_Int64 SAL_CALL AccessibleImageBullet::getAccessibleChildCount() - { +sal_Int64 SAL_CALL AccessibleImageBullet::getAccessibleChildCount() +{ - return 0; - } + return 0; +} - uno::Reference< XAccessible > SAL_CALL AccessibleImageBullet::getAccessibleChild( sal_Int64 ) - { - throw lang::IndexOutOfBoundsException(u"No children available"_ustr, - getXWeak() ); - } +uno::Reference< XAccessible > SAL_CALL AccessibleImageBullet::getAccessibleChild( sal_Int64 ) +{ + throw lang::IndexOutOfBoundsException(u"No children available"_ustr, + getXWeak() ); +} - uno::Reference< XAccessible > SAL_CALL AccessibleImageBullet::getAccessibleParent() - { +uno::Reference< XAccessible > SAL_CALL AccessibleImageBullet::getAccessibleParent() +{ - return mxParent; - } + return mxParent; +} - sal_Int64 SAL_CALL AccessibleImageBullet::getAccessibleIndexInParent() - { - - return mnIndexInParent; - } +sal_Int64 SAL_CALL AccessibleImageBullet::getAccessibleIndexInParent() +{ - sal_Int16 SAL_CALL AccessibleImageBullet::getAccessibleRole() - { + return mnIndexInParent; +} - return AccessibleRole::GRAPHIC; - } +sal_Int16 SAL_CALL AccessibleImageBullet::getAccessibleRole() +{ - OUString SAL_CALL AccessibleImageBullet::getAccessibleDescription() - { - // Get the string from the resource for the specified id. - return EditResId(RID_SVXSTR_A11Y_IMAGEBULLET_DESCRIPTION); - } + return AccessibleRole::GRAPHIC; +} - OUString SAL_CALL AccessibleImageBullet::getAccessibleName() - { - // Get the string from the resource for the specified id. - return EditResId(RID_SVXSTR_A11Y_IMAGEBULLET_NAME); - } +OUString SAL_CALL AccessibleImageBullet::getAccessibleDescription() +{ + // Get the string from the resource for the specified id. + return EditResId(RID_SVXSTR_A11Y_IMAGEBULLET_DESCRIPTION); +} - uno::Reference< XAccessibleRelationSet > SAL_CALL AccessibleImageBullet::getAccessibleRelationSet() - { +OUString SAL_CALL AccessibleImageBullet::getAccessibleName() +{ + // Get the string from the resource for the specified id. + return EditResId(RID_SVXSTR_A11Y_IMAGEBULLET_NAME); +} - // no relations, therefore empty - return uno::Reference< XAccessibleRelationSet >(); - } +uno::Reference< XAccessibleRelationSet > SAL_CALL AccessibleImageBullet::getAccessibleRelationSet() +{ - sal_Int64 SAL_CALL AccessibleImageBullet::getAccessibleStateSet() - { - SolarMutexGuard aGuard; + // no relations, therefore empty + return uno::Reference< XAccessibleRelationSet >(); +} - // Create a copy of the state set and return it. +sal_Int64 SAL_CALL AccessibleImageBullet::getAccessibleStateSet() +{ + SolarMutexGuard aGuard; - return mnStateSet; - } + // Create a copy of the state set and return it. - lang::Locale SAL_CALL AccessibleImageBullet::getLocale() - { + return mnStateSet; +} - SolarMutexGuard aGuard; +lang::Locale SAL_CALL AccessibleImageBullet::getLocale() +{ - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleImageBullet::getLocale: paragraph index value overflow"); + SolarMutexGuard aGuard; - // return locale of first character in the paragraph - return LanguageTag(GetTextForwarder().GetLanguage( GetParagraphIndex(), 0 )).getLocale(); - } + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleImageBullet::getLocale: paragraph index value overflow"); - void SAL_CALL AccessibleImageBullet::addAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) - { + // return locale of first character in the paragraph + return LanguageTag(GetTextForwarder().GetLanguage( GetParagraphIndex(), 0 )).getLocale(); +} - if( getNotifierClientId() != -1 ) - ::comphelper::AccessibleEventNotifier::addEventListener( getNotifierClientId(), xListener ); - } +void SAL_CALL AccessibleImageBullet::addAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) +{ - void SAL_CALL AccessibleImageBullet::removeAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) - { + if( getNotifierClientId() != -1 ) + ::comphelper::AccessibleEventNotifier::addEventListener( getNotifierClientId(), xListener ); +} - if( getNotifierClientId() == -1 ) - return; +void SAL_CALL AccessibleImageBullet::removeAccessibleEventListener( const uno::Reference< XAccessibleEventListener >& xListener ) +{ - 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 ); - } - } + if( getNotifierClientId() == -1 ) + return; - sal_Bool SAL_CALL AccessibleImageBullet::containsPoint( const awt::Point& rPoint ) + 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 ); + } +} - SolarMutexGuard aGuard; +sal_Bool SAL_CALL AccessibleImageBullet::containsPoint( const awt::Point& rPoint ) +{ - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::contains: index value overflow"); + SolarMutexGuard aGuard; - awt::Rectangle aTmpRect = implGetBounds(); - tools::Rectangle aRect( Point(aTmpRect.X, aTmpRect.Y), Size(aTmpRect.Width, aTmpRect.Height) ); - Point aPoint( rPoint.X, rPoint.Y ); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::contains: index value overflow"); - return aRect.Contains( aPoint ); - } + awt::Rectangle aTmpRect = implGetBounds(); + tools::Rectangle aRect( Point(aTmpRect.X, aTmpRect.Y), Size(aTmpRect.Width, aTmpRect.Height) ); + Point aPoint( rPoint.X, rPoint.Y ); - uno::Reference< XAccessible > SAL_CALL AccessibleImageBullet::getAccessibleAtPoint( const awt::Point& /*aPoint*/ ) - { + return aRect.Contains( aPoint ); +} - // as we have no children, empty reference - return uno::Reference< XAccessible >(); - } +uno::Reference< XAccessible > SAL_CALL AccessibleImageBullet::getAccessibleAtPoint( const awt::Point& /*aPoint*/ ) +{ - awt::Rectangle SAL_CALL AccessibleImageBullet::getBounds( ) - { - SolarMutexGuard aGuard; + // as we have no children, empty reference + return uno::Reference< XAccessible >(); +} - return implGetBounds(); - } - awt::Rectangle AccessibleImageBullet::implGetBounds( ) - { +awt::Rectangle SAL_CALL AccessibleImageBullet::getBounds( ) +{ + SolarMutexGuard aGuard; - DBG_ASSERT(GetParagraphIndex() >= 0, - "AccessibleEditableTextPara::implGetBounds: index value overflow"); + return implGetBounds(); +} +awt::Rectangle AccessibleImageBullet::implGetBounds( ) +{ - SvxTextForwarder& rCacheTF = GetTextForwarder(); - EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo( GetParagraphIndex() ); - tools::Rectangle aParentRect = rCacheTF.GetParaBounds( GetParagraphIndex() ); + DBG_ASSERT(GetParagraphIndex() >= 0, + "AccessibleEditableTextPara::implGetBounds: index value overflow"); - if( aBulletInfo.nParagraph != EE_PARA_MAX && - aBulletInfo.bVisible && - aBulletInfo.nType == SVX_NUM_BITMAP ) - { - tools::Rectangle aRect = aBulletInfo.aBounds; + SvxTextForwarder& rCacheTF = GetTextForwarder(); + EBulletInfo aBulletInfo = rCacheTF.GetBulletInfo( GetParagraphIndex() ); + tools::Rectangle aParentRect = rCacheTF.GetParaBounds( GetParagraphIndex() ); - // subtract paragraph position (bullet pos is absolute in EditEngine/Outliner) - aRect.Move( -aParentRect.Left(), -aParentRect.Top() ); + if( aBulletInfo.nParagraph != EE_PARA_MAX && + aBulletInfo.bVisible && + aBulletInfo.nType == SVX_NUM_BITMAP ) + { + tools::Rectangle aRect = aBulletInfo.aBounds; - // convert to screen coordinates - tools::Rectangle aScreenRect = AccessibleEditableTextPara::LogicToPixel( aRect, - rCacheTF.GetMapMode(), - GetViewForwarder() ); + // subtract paragraph position (bullet pos is absolute in EditEngine/Outliner) + aRect.Move( -aParentRect.Left(), -aParentRect.Top() ); - // offset from shape/cell - Point aOffset = maEEOffset; + // convert to screen coordinates + tools::Rectangle aScreenRect = AccessibleEditableTextPara::LogicToPixel( aRect, + rCacheTF.GetMapMode(), + GetViewForwarder() ); - return awt::Rectangle( aScreenRect.Left() + aOffset.X(), - aScreenRect.Top() + aOffset.Y(), - aScreenRect.GetSize().Width(), - aScreenRect.GetSize().Height() ); - } + // offset from shape/cell + Point aOffset = maEEOffset; - return awt::Rectangle(); + return awt::Rectangle( aScreenRect.Left() + aOffset.X(), + aScreenRect.Top() + aOffset.Y(), + aScreenRect.GetSize().Width(), + aScreenRect.GetSize().Height() ); } - awt::Point SAL_CALL AccessibleImageBullet::getLocation( ) - { + return awt::Rectangle(); +} - SolarMutexGuard aGuard; +awt::Point SAL_CALL AccessibleImageBullet::getLocation( ) +{ - awt::Rectangle aRect = implGetBounds(); + SolarMutexGuard aGuard; - return awt::Point( aRect.X, aRect.Y ); - } + awt::Rectangle aRect = implGetBounds(); - awt::Point SAL_CALL AccessibleImageBullet::getLocationOnScreen( ) - { + return awt::Point( aRect.X, aRect.Y ); +} + +awt::Point SAL_CALL AccessibleImageBullet::getLocationOnScreen( ) +{ - SolarMutexGuard aGuard; + SolarMutexGuard aGuard; - // relate us to parent - uno::Reference< XAccessible > xParent = getAccessibleParent(); - if( xParent.is() ) + // relate us to parent + uno::Reference< XAccessible > xParent = getAccessibleParent(); + if( xParent.is() ) + { + uno::Reference< XAccessibleComponent > xParentComponent( xParent, uno::UNO_QUERY ); + if( xParentComponent.is() ) { - uno::Reference< XAccessibleComponent > xParentComponent( xParent, uno::UNO_QUERY ); - if( xParentComponent.is() ) - { - awt::Point aRefPoint = xParentComponent->getLocationOnScreen(); - awt::Point aPoint = getLocation(); - aPoint.X += aRefPoint.X; - aPoint.Y += aRefPoint.Y; - - return aPoint; - } - } + awt::Point aRefPoint = xParentComponent->getLocationOnScreen(); + awt::Point aPoint = getLocation(); + aPoint.X += aRefPoint.X; + aPoint.Y += aRefPoint.Y; - throw uno::RuntimeException(u"Cannot access parent"_ustr, - uno::Reference< uno::XInterface > - ( static_cast< XAccessible* > (this) ) ); // disambiguate hierarchy + return aPoint; + } } - awt::Size SAL_CALL AccessibleImageBullet::getSize( ) - { + throw uno::RuntimeException(u"Cannot access parent"_ustr, + uno::Reference< uno::XInterface > + ( static_cast< XAccessible* > (this) ) ); // disambiguate hierarchy +} - SolarMutexGuard aGuard; +awt::Size SAL_CALL AccessibleImageBullet::getSize( ) +{ - awt::Rectangle aRect = implGetBounds(); + SolarMutexGuard aGuard; - return awt::Size( aRect.Width, aRect.Height ); - } + awt::Rectangle aRect = implGetBounds(); - void SAL_CALL AccessibleImageBullet::grabFocus( ) - { + return awt::Size( aRect.Width, aRect.Height ); +} - throw uno::RuntimeException(u"Not focusable"_ustr, - uno::Reference< uno::XInterface > - ( static_cast< XAccessible* > (this) ) ); // disambiguate hierarchy - } +void SAL_CALL AccessibleImageBullet::grabFocus( ) +{ - sal_Int32 SAL_CALL AccessibleImageBullet::getForeground( ) - { + throw uno::RuntimeException(u"Not focusable"_ustr, + uno::Reference< uno::XInterface > + ( static_cast< XAccessible* > (this) ) ); // disambiguate hierarchy +} - // #104444# Added to XAccessibleComponent interface - svtools::ColorConfig aColorConfig; - Color nColor = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor; - return static_cast<sal_Int32>(nColor); - } +sal_Int32 SAL_CALL AccessibleImageBullet::getForeground( ) +{ - sal_Int32 SAL_CALL AccessibleImageBullet::getBackground( ) - { + // #104444# Added to XAccessibleComponent interface + svtools::ColorConfig aColorConfig; + Color nColor = aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor; + return static_cast<sal_Int32>(nColor); +} - // #104444# Added to XAccessibleComponent interface - Color aColor( Application::GetSettings().GetStyleSettings().GetWindowColor() ); +sal_Int32 SAL_CALL AccessibleImageBullet::getBackground( ) +{ - // the background is transparent - aColor.SetAlpha(0); + // #104444# Added to XAccessibleComponent interface + Color aColor( Application::GetSettings().GetStyleSettings().GetWindowColor() ); - return static_cast<sal_Int32>( aColor ); - } + // the background is transparent + aColor.SetAlpha(0); - OUString SAL_CALL AccessibleImageBullet::getImplementationName() - { + return static_cast<sal_Int32>( aColor ); +} - return u"AccessibleImageBullet"_ustr; - } +OUString SAL_CALL AccessibleImageBullet::getImplementationName() +{ - sal_Bool SAL_CALL AccessibleImageBullet::supportsService (const OUString& sServiceName) - { + return u"AccessibleImageBullet"_ustr; +} - return cppu::supportsService(this, sServiceName); - } +sal_Bool SAL_CALL AccessibleImageBullet::supportsService (const OUString& sServiceName) +{ - uno::Sequence< OUString > SAL_CALL AccessibleImageBullet::getSupportedServiceNames() - { - return { u"com.sun.star.accessibility.AccessibleContext"_ustr }; - } + return cppu::supportsService(this, sServiceName); +} - void AccessibleImageBullet::SetIndexInParent( sal_Int32 nIndex ) - { +uno::Sequence< OUString > SAL_CALL AccessibleImageBullet::getSupportedServiceNames() +{ + return { u"com.sun.star.accessibility.AccessibleContext"_ustr }; +} - mnIndexInParent = nIndex; - } +void AccessibleImageBullet::SetIndexInParent( sal_Int32 nIndex ) +{ - void AccessibleImageBullet::SetEEOffset( const Point& rOffset ) - { + mnIndexInParent = nIndex; +} - maEEOffset = rOffset; - } +void AccessibleImageBullet::SetEEOffset( const Point& rOffset ) +{ - void AccessibleImageBullet::Dispose() - { + maEEOffset = rOffset; +} - int nClientId( getNotifierClientId() ); +void AccessibleImageBullet::Dispose() +{ - // #108212# drop all references before notifying dispose - mxParent = nullptr; - mnNotifierClientId = -1; - mpEditSource = nullptr; + int nClientId( getNotifierClientId() ); - // notify listeners - if( nClientId != -1 ) + // #108212# drop all references before notifying dispose + mxParent = nullptr; + mnNotifierClientId = -1; + mpEditSource = nullptr; + + // notify listeners + if( nClientId != -1 ) + { + try { - try - { - uno::Reference < XAccessibleContext > xThis = getAccessibleContext(); - - // #106234# Delegate to EventNotifier - ::comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( nClientId, xThis ); - } - catch( const uno::Exception& ) {} + uno::Reference < XAccessibleContext > xThis = getAccessibleContext(); + + // #106234# Delegate to EventNotifier + ::comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( nClientId, xThis ); } + catch( const uno::Exception& ) {} } +} - void AccessibleImageBullet::SetEditSource( SvxEditSource* pEditSource ) - { +void AccessibleImageBullet::SetEditSource( SvxEditSource* pEditSource ) +{ - mpEditSource = pEditSource; + mpEditSource = pEditSource; - if( !mpEditSource ) - { - // going defunc - UnSetState( AccessibleStateType::SHOWING ); - UnSetState( AccessibleStateType::VISIBLE ); - SetState( AccessibleStateType::INVALID ); - SetState( AccessibleStateType::DEFUNC ); + if( !mpEditSource ) + { + // going defunc + UnSetState( AccessibleStateType::SHOWING ); + UnSetState( AccessibleStateType::VISIBLE ); + SetState( AccessibleStateType::INVALID ); + SetState( AccessibleStateType::DEFUNC ); - Dispose(); - } + Dispose(); } +} - void AccessibleImageBullet::FireEvent(const sal_Int16 nEventId, const uno::Any& rNewValue, const uno::Any& rOldValue ) const - { +void AccessibleImageBullet::FireEvent(const sal_Int16 nEventId, const uno::Any& rNewValue, const uno::Any& rOldValue ) const +{ - uno::Reference < XAccessibleContext > xThis( const_cast< AccessibleImageBullet* > (this)->getAccessibleContext() ); + uno::Reference < XAccessibleContext > xThis( const_cast< AccessibleImageBullet* > (this)->getAccessibleContext() ); - AccessibleEventObject aEvent(xThis, nEventId, rNewValue, rOldValue, -1); + AccessibleEventObject aEvent(xThis, nEventId, rNewValue, rOldValue, -1); - // #106234# Delegate to EventNotifier - ::comphelper::AccessibleEventNotifier::addEvent( getNotifierClientId(), - aEvent ); - } + // #106234# Delegate to EventNotifier + ::comphelper::AccessibleEventNotifier::addEvent( getNotifierClientId(), + aEvent ); +} - void AccessibleImageBullet::SetState( const sal_Int64 nStateId ) +void AccessibleImageBullet::SetState( const sal_Int64 nStateId ) +{ + if( !(mnStateSet & nStateId) ) { - if( !(mnStateSet & nStateId) ) - { - mnStateSet |= nStateId; - FireEvent( AccessibleEventId::STATE_CHANGED, uno::Any( nStateId ) ); - } + mnStateSet |= nStateId; + FireEvent( AccessibleEventId::STATE_CHANGED, uno::Any( nStateId ) ); } +} - void AccessibleImageBullet::UnSetState( const sal_Int64 nStateId ) +void AccessibleImageBullet::UnSetState( const sal_Int64 nStateId ) +{ + if( mnStateSet & nStateId ) { - if( mnStateSet & nStateId ) - { - mnStateSet &= ~nStateId; - FireEvent( AccessibleEventId::STATE_CHANGED, uno::Any(), uno::Any( nStateId ) ); - } + mnStateSet &= ~nStateId; + FireEvent( AccessibleEventId::STATE_CHANGED, uno::Any(), uno::Any( nStateId ) ); } +} - void AccessibleImageBullet::SetParagraphIndex( sal_Int32 nIndex ) - { +void AccessibleImageBullet::SetParagraphIndex( sal_Int32 nIndex ) +{ - uno::Any aOldDesc; - uno::Any aOldName; + uno::Any aOldDesc; + uno::Any aOldName; - try - { - aOldDesc <<= getAccessibleDescription(); - aOldName <<= getAccessibleName(); - } - catch( const uno::Exception& ) {} // optional behaviour + try + { + aOldDesc <<= getAccessibleDescription(); + aOldName <<= getAccessibleName(); + } + catch( const uno::Exception& ) {} // optional behaviour - sal_Int32 nOldIndex = mnParagraphIndex; + sal_Int32 nOldIndex = mnParagraphIndex; - mnParagraphIndex = nIndex; + mnParagraphIndex = nIndex; - try + try + { + if( nOldIndex != nIndex ) { - if( nOldIndex != nIndex ) - { - // index and therefore description changed - FireEvent( AccessibleEventId::DESCRIPTION_CHANGED, uno::Any( getAccessibleDescription() ), aOldDesc ); - FireEvent( AccessibleEventId::NAME_CHANGED, uno::Any( getAccessibleName() ), aOldName ); - } + // index and therefore description changed + FireEvent( AccessibleEventId::DESCRIPTION_CHANGED, uno::Any( getAccessibleDescription() ), aOldDesc ); + FireEvent( AccessibleEventId::NAME_CHANGED, uno::Any( getAccessibleName() ), aOldName ); } - catch( const uno::Exception& ) {} // optional behaviour } + catch( const uno::Exception& ) {} // optional behaviour +} - SvxEditSource& AccessibleImageBullet::GetEditSource() const - { - - if( !mpEditSource ) - throw uno::RuntimeException(u"No edit source, object is defunct"_ustr, - cppu::getXWeak - ( const_cast< AccessibleImageBullet* > (this) ) ); // disambiguate hierarchy - return *mpEditSource; - } +SvxEditSource& AccessibleImageBullet::GetEditSource() const +{ - SvxTextForwarder& AccessibleImageBullet::GetTextForwarder() const - { + if( !mpEditSource ) + throw uno::RuntimeException(u"No edit source, object is defunct"_ustr, + cppu::getXWeak + ( const_cast< AccessibleImageBullet* > (this) ) ); // disambiguate hierarchy + return *mpEditSource; +} - SvxEditSource& rEditSource = GetEditSource(); - SvxTextForwarder* pTextForwarder = rEditSource.GetTextForwarder(); +SvxTextForwarder& AccessibleImageBullet::GetTextForwarder() const +{ - if( !pTextForwarder ) - throw uno::RuntimeException(u"Unable to fetch text forwarder, object is defunct"_ustr, - cppu::getXWeak - ( const_cast< AccessibleImageBullet* > (this) ) ); // disambiguate hierarchy + SvxEditSource& rEditSource = GetEditSource(); + SvxTextForwarder* pTextForwarder = rEditSource.GetTextForwarder(); - if( !pTextForwarder->IsValid() ) - throw uno::RuntimeException(u"Text forwarder is invalid, object is defunct"_ustr, - cppu::getXWeak - ( const_cast< AccessibleImageBullet* > (this) ) ); // disambiguate hierarchy - return *pTextForwarder; - } + if( !pTextForwarder ) + throw uno::RuntimeException(u"Unable to fetch text forwarder, object is defunct"_ustr, + cppu::getXWeak + ( const_cast< AccessibleImageBullet* > (this) ) ); // disambiguate hierarchy - SvxViewForwarder& AccessibleImageBullet::GetViewForwarder() const - { + if( !pTextForwarder->IsValid() ) + throw uno::RuntimeException(u"Text forwarder is invalid, object is defunct"_ustr, + cppu::getXWeak + ( const_cast< AccessibleImageBullet* > (this) ) ); // disambiguate hierarchy + return *pTextForwarder; +} - SvxEditSource& rEditSource = GetEditSource(); - SvxViewForwarder* pViewForwarder = rEditSource.GetViewForwarder(); +SvxViewForwarder& AccessibleImageBullet::GetViewForwarder() const +{ - if( !pViewForwarder ) - { - throw uno::RuntimeException(u"Unable to fetch view forwarder, object is defunct"_ustr, - cppu::getXWeak - ( const_cast< AccessibleImageBullet* > (this) ) ); // disambiguate hierarchy - } + SvxEditSource& rEditSource = GetEditSource(); + SvxViewForwarder* pViewForwarder = rEditSource.GetViewForwarder(); - if( !pViewForwarder->IsValid() ) - throw uno::RuntimeException(u"View forwarder is invalid, object is defunct"_ustr, - cppu::getXWeak - ( const_cast< AccessibleImageBullet* > (this) ) ); // disambiguate hierarchy - return *pViewForwarder; + if( !pViewForwarder ) + { + throw uno::RuntimeException(u"Unable to fetch view forwarder, object is defunct"_ustr, + cppu::getXWeak + ( const_cast< AccessibleImageBullet* > (this) ) ); // disambiguate hierarchy } + if( !pViewForwarder->IsValid() ) + throw uno::RuntimeException(u"View forwarder is invalid, object is defunct"_ustr, + cppu::getXWeak + ( const_cast< AccessibleImageBullet* > (this) ) ); // disambiguate hierarchy + return *pViewForwarder; +} + } // end of namespace accessibility diff --git a/editeng/source/accessibility/AccessibleParaManager.cxx b/editeng/source/accessibility/AccessibleParaManager.cxx index aae8c5817f36..01b358a9a9e9 100644 --- a/editeng/source/accessibility/AccessibleParaManager.cxx +++ b/editeng/source/accessibility/AccessibleParaManager.cxx @@ -39,364 +39,365 @@ using namespace ::com::sun::star::accessibility; namespace accessibility { - AccessibleParaManager::AccessibleParaManager() : - maChildren(1), - mnChildStates( 0 ), - maEEOffset( 0, 0 ), - mnFocusedChild( -1 ), - mbActive( false ) - { - } - AccessibleParaManager::~AccessibleParaManager() - { - // owner is responsible for possible child death - } +AccessibleParaManager::AccessibleParaManager() : + maChildren(1), + mnChildStates( 0 ), + maEEOffset( 0, 0 ), + mnFocusedChild( -1 ), + mbActive( false ) +{ +} - void AccessibleParaManager::SetAdditionalChildStates( sal_Int64 nChildStates ) - { - mnChildStates = nChildStates; - } +AccessibleParaManager::~AccessibleParaManager() +{ + // owner is responsible for possible child death +} - void AccessibleParaManager::SetNum( sal_Int32 nNumParas ) - { - if( o3tl::make_unsigned(nNumParas) < maChildren.size() ) - Release( nNumParas, maChildren.size() ); +void AccessibleParaManager::SetAdditionalChildStates( sal_Int64 nChildStates ) +{ + mnChildStates = nChildStates; +} - maChildren.resize( nNumParas ); +void AccessibleParaManager::SetNum( sal_Int32 nNumParas ) +{ + if( o3tl::make_unsigned(nNumParas) < maChildren.size() ) + Release( nNumParas, maChildren.size() ); - if( mnFocusedChild >= nNumParas ) - mnFocusedChild = -1; - } + maChildren.resize( nNumParas ); - sal_Int32 AccessibleParaManager::GetNum() const - { - size_t nSize = maChildren.size(); - if (nSize > SAL_MAX_INT32) - { - SAL_WARN( "editeng", "AccessibleParaManager::GetNum - overflow " << nSize); - return SAL_MAX_INT32; - } - return static_cast<sal_Int32>(nSize); - } + if( mnFocusedChild >= nNumParas ) + mnFocusedChild = -1; +} - AccessibleParaManager::VectorOfChildren::iterator AccessibleParaManager::begin() +sal_Int32 AccessibleParaManager::GetNum() const +{ + size_t nSize = maChildren.size(); + if (nSize > SAL_MAX_INT32) { - return maChildren.begin(); + SAL_WARN( "editeng", "AccessibleParaManager::GetNum - overflow " << nSize); + return SAL_MAX_INT32; } + return static_cast<sal_Int32>(nSize); +} + +AccessibleParaManager::VectorOfChildren::iterator AccessibleParaManager::begin() +{ + return maChildren.begin(); +} + +AccessibleParaManager::VectorOfChildren::iterator AccessibleParaManager::end() +{ + return maChildren.end(); +} - AccessibleParaManager::VectorOfChildren::iterator AccessibleParaManager::end() +void AccessibleParaManager::FireEvent( sal_Int32 nPara, + const sal_Int16 nEventId ) const +{ + DBG_ASSERT( 0 <= nPara && maChildren.size() > o3tl::make_unsigned(nPara), + "AccessibleParaManager::FireEvent: invalid index" ); + + if( 0 <= nPara && maChildren.size() > o3tl::make_unsigned(nPara) ) { - return maChildren.end(); + auto aChild( GetChild( nPara ).first.get() ); + if( aChild.is() ) + aChild->FireEvent( nEventId ); } +} - void AccessibleParaManager::FireEvent( sal_Int32 nPara, - const sal_Int16 nEventId ) const - { - DBG_ASSERT( 0 <= nPara && maChildren.size() > o3tl::make_unsigned(nPara), - "AccessibleParaManager::FireEvent: invalid index" ); +bool AccessibleParaManager::IsReferencable( + rtl::Reference<AccessibleEditableTextPara> const & aChild) +{ + return aChild.is(); +} - if( 0 <= nPara && maChildren.size() > o3tl::make_unsigned(nPara) ) - { - auto aChild( GetChild( nPara ).first.get() ); - if( aChild.is() ) - aChild->FireEvent( nEventId ); - } - } +bool AccessibleParaManager::IsReferencable( sal_Int32 nChild ) const +{ + assert(0 <= nChild && maChildren.size() > o3tl::make_unsigned(nChild) + && "AccessibleParaManager::IsReferencable: invalid index"); - bool AccessibleParaManager::IsReferencable( - rtl::Reference<AccessibleEditableTextPara> const & aChild) + if( 0 <= nChild && maChildren.size() > o3tl::make_unsigned(nChild) ) { - return aChild.is(); + // retrieve hard reference from weak one + return IsReferencable( GetChild( nChild ).first.get() ); } - - bool AccessibleParaManager::IsReferencable( sal_Int32 nChild ) const + else { - assert(0 <= nChild && maChildren.size() > o3tl::make_unsigned(nChild) - && "AccessibleParaManager::IsReferencable: invalid index"); - - if( 0 <= nChild && maChildren.size() > o3tl::make_unsigned(nChild) ) - { - // retrieve hard reference from weak one - return IsReferencable( GetChild( nChild ).first.get() ); - } - else - { - return false; - } + return false; } +} - AccessibleParaManager::WeakChild AccessibleParaManager::GetChild( sal_Int32 nParagraphIndex ) const - { - DBG_ASSERT( 0 <= nParagraphIndex && maChildren.size() > o3tl::make_unsigned(nParagraphIndex), - "AccessibleParaManager::GetChild: invalid index" ); +AccessibleParaManager::WeakChild AccessibleParaManager::GetChild( sal_Int32 nParagraphIndex ) const +{ + DBG_ASSERT( 0 <= nParagraphIndex && maChildren.size() > o3tl::make_unsigned(nParagraphIndex), + "AccessibleParaManager::GetChild: invalid index" ); - if( 0 <= nParagraphIndex && maChildren.size() > o3tl::make_unsigned(nParagraphIndex) ) - { - return maChildren[ nParagraphIndex ]; - } - else - { - return WeakChild(); - } + if( 0 <= nParagraphIndex && maChildren.size() > o3tl::make_unsigned(nParagraphIndex) ) + { + return maChildren[ nParagraphIndex ]; } - - bool AccessibleParaManager::HasCreatedChild( sal_Int32 nParagraphIndex ) const + else { - if( 0 <= nParagraphIndex && maChildren.size() > o3tl::make_unsigned(nParagraphIndex) ) - { - auto const & rChild = maChildren[ nParagraphIndex ]; - return rChild.second.Width != 0 || rChild.second.Height != 0; - } - else - return false; + return WeakChild(); } +} - AccessibleParaManager::Child AccessibleParaManager::CreateChild( sal_Int32 nChild, - const uno::Reference< XAccessible >& xFrontEnd, - SvxEditSourceAdapter& rEditSource, - sal_Int32 nParagraphIndex ) +bool AccessibleParaManager::HasCreatedChild( sal_Int32 nParagraphIndex ) const +{ + if( 0 <= nParagraphIndex && maChildren.size() > o3tl::make_unsigned(nParagraphIndex) ) { - DBG_ASSERT( 0 <= nParagraphIndex && maChildren.size() > o3tl::make_unsigned(nParagraphIndex), - "AccessibleParaManager::CreateChild: invalid index" ); + auto const & rChild = maChildren[ nParagraphIndex ]; + return rChild.second.Width != 0 || rChild.second.Height != 0; + } + else + return false; +} - if( 0 <= nParagraphIndex && maChildren.size() > o3tl::make_unsigned(nParagraphIndex) ) - { - // retrieve hard reference from weak one - auto aChild( GetChild( nParagraphIndex ).first.get() ); +AccessibleParaManager::Child AccessibleParaManager::CreateChild( sal_Int32 nChild, + const uno::Reference< XAccessible >& xFrontEnd, + SvxEditSourceAdapter& rEditSource, + sal_Int32 nParagraphIndex ) +{ + DBG_ASSERT( 0 <= nParagraphIndex && maChildren.size() > o3tl::make_unsigned(nParagraphIndex), + "AccessibleParaManager::CreateChild: invalid index" ); - if( !IsReferencable( nParagraphIndex ) ) - { - // there is no hard reference available, create object then - // #i27138# - aChild = new AccessibleEditableTextPara(xFrontEnd, this); + if( 0 <= nParagraphIndex && maChildren.size() > o3tl::make_unsigned(nParagraphIndex) ) + { + // retrieve hard reference from weak one + auto aChild( GetChild( nParagraphIndex ).first.get() ); - InitChild( *aChild, rEditSource, nChild, nParagraphIndex ); + if( !IsReferencable( nParagraphIndex ) ) + { + // there is no hard reference available, create object then + // #i27138# + aChild = new AccessibleEditableTextPara(xFrontEnd, this); - maChildren[ nParagraphIndex ] = WeakChild( aChild, aChild->getBounds() ); - } + InitChild( *aChild, rEditSource, nChild, nParagraphIndex ); - return Child( aChild.get(), GetChild( nParagraphIndex ).second ); - } - else - { - return Child(); + maChildren[ nParagraphIndex ] = WeakChild( aChild, aChild->getBounds() ); } - } - - void AccessibleParaManager::SetEEOffset( const Point& rOffset ) - { - maEEOffset = rOffset; - MemFunAdapter< const Point& > aAdapter( &::accessibility::AccessibleEditableTextPara::SetEEOffset, rOffset ); - std::for_each( begin(), end(), aAdapter ); + return Child( aChild.get(), GetChild( nParagraphIndex ).second ); } - - void AccessibleParaManager::SetActive( bool bActive ) + else { - mbActive = bActive; - - if( bActive ) - { - SetState( AccessibleStateType::ACTIVE ); - SetState( AccessibleStateType::EDITABLE ); - } - else - { - UnSetState( AccessibleStateType::ACTIVE ); - UnSetState( AccessibleStateType::EDITABLE ); - } + return Child(); } +} - void AccessibleParaManager::SetFocus( sal_Int32 nChild ) - { - if( mnFocusedChild != -1 ) - UnSetState( mnFocusedChild, AccessibleStateType::FOCUSED ); +void AccessibleParaManager::SetEEOffset( const Point& rOffset ) +{ + maEEOffset = rOffset; - mnFocusedChild = nChild; + MemFunAdapter< const Point& > aAdapter( &::accessibility::AccessibleEditableTextPara::SetEEOffset, rOffset ); + std::for_each( begin(), end(), aAdapter ); +} - if( mnFocusedChild != -1 ) - SetState( mnFocusedChild, AccessibleStateType::FOCUSED ); - } +void AccessibleParaManager::SetActive( bool bActive ) +{ + mbActive = bActive; - void AccessibleParaManager::InitChild( AccessibleEditableTextPara& rChild, - SvxEditSourceAdapter& rEditSource, - sal_Int32 nChild, - sal_Int32 nParagraphIndex ) const + if( bActive ) + { + SetState( AccessibleStateType::ACTIVE ); + SetState( AccessibleStateType::EDITABLE ); + } + else { - rChild.SetEditSource( &rEditSource ); - rChild.SetIndexInParent( nChild ); - rChild.SetParagraphIndex( nParagraphIndex ); + UnSetState( AccessibleStateType::ACTIVE ); + UnSetState( AccessibleStateType::EDITABLE ); + } +} - rChild.SetEEOffset( maEEOffset ); +void AccessibleParaManager::SetFocus( sal_Int32 nChild ) +{ + if( mnFocusedChild != -1 ) + UnSetState( mnFocusedChild, AccessibleStateType::FOCUSED ); - if( mbActive ) - { - rChild.SetState( AccessibleStateType::ACTIVE ); - rChild.SetState( AccessibleStateType::EDITABLE ); - } + mnFocusedChild = nChild; - if( mnFocusedChild == nParagraphIndex ) - rChild.SetState( AccessibleStateType::FOCUSED ); + if( mnFocusedChild != -1 ) + SetState( mnFocusedChild, AccessibleStateType::FOCUSED ); +} - // add states passed from outside - for (int i=0; i<63; i++) - { - sal_Int64 nState = sal_Int64(1) << i; - if ( nState & mnChildStates ) - rChild.SetState( nState ); - } - } +void AccessibleParaManager::InitChild( AccessibleEditableTextPara& rChild, + SvxEditSourceAdapter& rEditSource, + sal_Int32 nChild, + sal_Int32 nParagraphIndex ) const +{ + rChild.SetEditSource( &rEditSource ); + rChild.SetIndexInParent( nChild ); + rChild.SetParagraphIndex( nParagraphIndex ); - void AccessibleParaManager::SetState( sal_Int32 nChild, const sal_Int64 nStateId ) - { - MemFunAdapter< const sal_Int64 > aFunc( &AccessibleEditableTextPara::SetState, - nStateId ); - aFunc( GetChild(nChild) ); - } + rChild.SetEEOffset( maEEOffset ); - void AccessibleParaManager::SetState( const sal_Int64 nStateId ) + if( mbActive ) { - std::for_each( begin(), end(), - MemFunAdapter< const sal_Int64 >( &AccessibleEditableTextPara::SetState, - nStateId ) ); + rChild.SetState( AccessibleStateType::ACTIVE ); + rChild.SetState( AccessibleStateType::EDITABLE ); } - void AccessibleParaManager::UnSetState( sal_Int32 nChild, const sal_Int64 nStateId ) - { - MemFunAdapter< const sal_Int64 > aFunc( &AccessibleEditableTextPara::UnSetState, - nStateId ); - aFunc( GetChild(nChild) ); - } + if( mnFocusedChild == nParagraphIndex ) + rChild.SetState( AccessibleStateType::FOCUSED ); - void AccessibleParaManager::UnSetState( const sal_Int64 nStateId ) + // add states passed from outside + for (int i=0; i<63; i++) { - std::for_each( begin(), end(), - MemFunAdapter< const sal_Int64 >( &AccessibleEditableTextPara::UnSetState, - nStateId ) ); + sal_Int64 nState = sal_Int64(1) << i; + if ( nState & mnChildStates ) + rChild.SetState( nState ); } +} - namespace { +void AccessibleParaManager::SetState( sal_Int32 nChild, const sal_Int64 nStateId ) +{ + MemFunAdapter< const sal_Int64 > aFunc( &AccessibleEditableTextPara::SetState, + nStateId ); + aFunc( GetChild(nChild) ); +} - // not generic yet, no arguments... - class AccessibleParaManager_DisposeChildren - { - public: - AccessibleParaManager_DisposeChildren() {} - void operator()( ::accessibility::AccessibleEditableTextPara& rPara ) - { - rPara.Dispose(); - } - }; +void AccessibleParaManager::SetState( const sal_Int64 nStateId ) +{ + std::for_each( begin(), end(), + MemFunAdapter< const sal_Int64 >( &AccessibleEditableTextPara::SetState, + nStateId ) ); +} - } +void AccessibleParaManager::UnSetState( sal_Int32 nChild, const sal_Int64 nStateId ) +{ + MemFunAdapter< const sal_Int64 > aFunc( &AccessibleEditableTextPara::UnSetState, + nStateId ); + aFunc( GetChild(nChild) ); +} - void AccessibleParaManager::Dispose() - { - AccessibleParaManager_DisposeChildren aFunctor; +void AccessibleParaManager::UnSetState( const sal_Int64 nStateId ) +{ + std::for_each( begin(), end(), + MemFunAdapter< const sal_Int64 >( &AccessibleEditableTextPara::UnSetState, + nStateId ) ); +} + +namespace { - std::for_each( begin(), end(), - WeakChildAdapter< AccessibleParaManager_DisposeChildren > (aFunctor) ); +// not generic yet, no arguments... +class AccessibleParaManager_DisposeChildren +{ +public: + AccessibleParaManager_DisposeChildren() {} + void operator()( ::accessibility::AccessibleEditableTextPara& rPara ) + { + rPara.Dispose(); } +}; - namespace { +} - // not generic yet, too many method arguments... - class StateChangeEvent - { - public: - StateChangeEvent( const sal_Int16 nEventId, - const uno::Any& rNewValue, - const uno::Any& rOldValue ) : - mnEventId( nEventId ), - mrNewValue( rNewValue ), - mrOldValue( rOldValue ) {} - void operator()( ::accessibility::AccessibleEditableTextPara const & rPara ) - { - rPara.FireEvent( mnEventId, mrNewValue, mrOldValue ); - } +void AccessibleParaManager::Dispose() +{ + AccessibleParaManager_DisposeChildren aFunctor; - private: - const sal_Int16 mnEventId; - const uno::Any& mrNewValue; - const uno::Any& mrOldValue; - }; + std::for_each( begin(), end(), + WeakChildAdapter< AccessibleParaManager_DisposeChildren > (aFunctor) ); +} - } +namespace { - void AccessibleParaManager::FireEvent( sal_Int32 nStartPara, - sal_Int32 nEndPara, - const sal_Int16 nEventId, - const uno::Any& rNewValue, - const uno::Any& rOldValue ) const +// not generic yet, too many method arguments... +class StateChangeEvent +{ +public: + StateChangeEvent( const sal_Int16 nEventId, + const uno::Any& rNewValue, + const uno::Any& rOldValue ) : + mnEventId( nEventId ), + mrNewValue( rNewValue ), + mrOldValue( rOldValue ) {} + void operator()( ::accessibility::AccessibleEditableTextPara const & rPara ) { - DBG_ASSERT( 0 <= nStartPara && 0 <= nEndPara && - maChildren.size() > o3tl::make_unsigned(nStartPara) && - maChildren.size() >= o3tl::make_unsigned(nEndPara) && - nEndPara >= nStartPara, "AccessibleParaManager::FireEvent: invalid index" ); + rPara.FireEvent( mnEventId, mrNewValue, mrOldValue ); + } +private: + const sal_Int16 mnEventId; + const uno::Any& mrNewValue; + const uno::Any& mrOldValue; +}; - if( 0 <= nStartPara && 0 <= nEndPara && +} + +void AccessibleParaManager::FireEvent( sal_Int32 nStartPara, + sal_Int32 nEndPara, + const sal_Int16 nEventId, + const uno::Any& rNewValue, + const uno::Any& rOldValue ) const +{ + DBG_ASSERT( 0 <= nStartPara && 0 <= nEndPara && maChildren.size() > o3tl::make_unsigned(nStartPara) && maChildren.size() >= o3tl::make_unsigned(nEndPara) && - nEndPara >= nStartPara ) - { - VectorOfChildren::const_iterator front = maChildren.begin(); - VectorOfChildren::const_iterator back = front; + nEndPara >= nStartPara, "AccessibleParaManager::FireEvent: invalid index" ); + - std::advance( front, nStartPara ); - std::advance( back, nEndPara ); + if( 0 <= nStartPara && 0 <= nEndPara && + maChildren.size() > o3tl::make_unsigned(nStartPara) && + maChildren.size() >= o3tl::make_unsigned(nEndPara) && + nEndPara >= nStartPara ) + { + VectorOfChildren::const_iterator front = maChildren.begin(); + VectorOfChildren::const_iterator back = front; - StateChangeEvent aFunctor( nEventId, rNewValue, rOldValue ); + std::advance( front, nStartPara ); + std::advance( back, nEndPara ); - std::for_each( front, back, AccessibleParaManager::WeakChildAdapter< StateChangeEvent >( aFunctor ) ); - } + StateChangeEvent aFunctor( nEventId, rNewValue, rOldValue ); + + std::for_each( front, back, AccessibleParaManager::WeakChildAdapter< StateChangeEvent >( aFunctor ) ); } +} - namespace { +namespace { - class ReleaseChild +class ReleaseChild +{ +public: + AccessibleParaManager::WeakChild operator()( const AccessibleParaManager::WeakChild& rPara ) { - public: - AccessibleParaManager::WeakChild operator()( const AccessibleParaManager::WeakChild& rPara ) - { - AccessibleParaManager::ShutdownPara( rPara ); - - // clear reference - return AccessibleParaManager::WeakChild(); - } - }; + AccessibleParaManager::ShutdownPara( rPara ); + // clear reference + return AccessibleParaManager::WeakChild(); } +}; - void AccessibleParaManager::Release( sal_Int32 nStartPara, sal_Int32 nEndPara ) - { - DBG_ASSERT( 0 <= nStartPara && 0 <= nEndPara && - maChildren.size() > o3tl::make_unsigned(nStartPara) && - maChildren.size() >= o3tl::make_unsigned(nEndPara), - "AccessibleParaManager::Release: invalid index" ); +} - if( 0 <= nStartPara && 0 <= nEndPara && +void AccessibleParaManager::Release( sal_Int32 nStartPara, sal_Int32 nEndPara ) +{ + DBG_ASSERT( 0 <= nStartPara && 0 <= nEndPara && maChildren.size() > o3tl::make_unsigned(nStartPara) && - maChildren.size() >= o3tl::make_unsigned(nEndPara) ) - { - VectorOfChildren::iterator front = maChildren.begin(); - VectorOfChildren::iterator back = front; + maChildren.size() >= o3tl::make_unsigned(nEndPara), + "AccessibleParaManager::Release: invalid index" ); - std::advance( front, nStartPara ); - std::advance( back, nEndPara ); + if( 0 <= nStartPara && 0 <= nEndPara && + maChildren.size() > o3tl::make_unsigned(nStartPara) && + maChildren.size() >= o3tl::make_unsigned(nEndPara) ) + { + VectorOfChildren::iterator front = maChildren.begin(); + VectorOfChildren::iterator back = front; - std::transform( front, back, front, ReleaseChild() ); - } + std::advance( front, nStartPara ); + std::advance( back, nEndPara ); + + std::transform( front, back, front, ReleaseChild() ); } +} - void AccessibleParaManager::ShutdownPara( const WeakChild& rChild ) - { - auto aChild( rChild.first.get() ); +void AccessibleParaManager::ShutdownPara( const WeakChild& rChild ) +{ + auto aChild( rChild.first.get() ); - if( IsReferencable( aChild ) ) - aChild->SetEditSource( nullptr ); - } + if( IsReferencable( aChild ) ) + aChild->SetEditSource( nullptr ); +} } diff --git a/editeng/source/accessibility/AccessibleSelectionBase.cxx b/editeng/source/accessibility/AccessibleSelectionBase.cxx index e70b61840822..2d2dd9de3339 100644 --- a/editeng/source/accessibility/AccessibleSelectionBase.cxx +++ b/editeng/source/accessibility/AccessibleSelectionBase.cxx @@ -26,66 +26,67 @@ using namespace ::com::sun::star::accessibility; namespace accessibility { - // - AccessibleSelectionBase - +// - AccessibleSelectionBase - - AccessibleSelectionBase::AccessibleSelectionBase() - { - } +AccessibleSelectionBase::AccessibleSelectionBase() +{ +} - AccessibleSelectionBase::~AccessibleSelectionBase() - { - } +AccessibleSelectionBase::~AccessibleSelectionBase() +{ +} - void SAL_CALL AccessibleSelectionBase::selectAccessibleChild( sal_Int64 nChildIndex ) - { - ::osl::MutexGuard aGuard( implGetMutex() ); - OCommonAccessibleSelection::selectAccessibleChild( nChildIndex ); - } +void SAL_CALL AccessibleSelectionBase::selectAccessibleChild( sal_Int64 nChildIndex ) +{ + ::osl::MutexGuard aGuard( implGetMutex() ); + OCommonAccessibleSelection::selectAccessibleChild( nChildIndex ); +} - sal_Bool SAL_CALL AccessibleSelectionBase::isAccessibleChildSelected( sal_Int64 nChildIndex ) - { - ::osl::MutexGuard aGuard( implGetMutex() ); - return OCommonAccessibleSelection::isAccessibleChildSelected( nChildIndex ); - } +sal_Bool SAL_CALL AccessibleSelectionBase::isAccessibleChildSelected( sal_Int64 nChildIndex ) +{ + ::osl::MutexGuard aGuard( implGetMutex() ); + return OCommonAccessibleSelection::isAccessibleChildSelected( nChildIndex ); +} - void SAL_CALL AccessibleSelectionBase::clearAccessibleSelection( ) - { - ::osl::MutexGuard aGuard( implGetMutex() ); - OCommonAccessibleSelection::clearAccessibleSelection(); - } +void SAL_CALL AccessibleSelectionBase::clearAccessibleSelection( ) +{ + ::osl::MutexGuard aGuard( implGetMutex() ); + OCommonAccessibleSelection::clearAccessibleSelection(); +} - void SAL_CALL AccessibleSelectionBase::selectAllAccessibleChildren( ) - { - ::osl::MutexGuard aGuard( implGetMutex() ); - OCommonAccessibleSelection::selectAllAccessibleChildren(); - } +void SAL_CALL AccessibleSelectionBase::selectAllAccessibleChildren( ) +{ + ::osl::MutexGuard aGuard( implGetMutex() ); + OCommonAccessibleSelection::selectAllAccessibleChildren(); +} - sal_Int64 SAL_CALL AccessibleSelectionBase::getSelectedAccessibleChildCount( ) - { - ::osl::MutexGuard aGuard( implGetMutex() ); - return OCommonAccessibleSelection::getSelectedAccessibleChildCount(); - } +sal_Int64 SAL_CALL AccessibleSelectionBase::getSelectedAccessibleChildCount( ) +{ + ::osl::MutexGuard aGuard( implGetMutex() ); + return OCommonAccessibleSelection::getSelectedAccessibleChildCount(); +} - uno::Reference< XAccessible > SAL_CALL AccessibleSelectionBase::getSelectedAccessibleChild( sal_Int64 nSelectedChildIndex ) - { - ::osl::MutexGuard aGuard( implGetMutex() ); - return OCommonAccessibleSelection::getSelectedAccessibleChild( nSelectedChildIndex ); - } +uno::Reference< XAccessible > SAL_CALL AccessibleSelectionBase::getSelectedAccessibleChild( sal_Int64 nSelectedChildIndex ) +{ + ::osl::MutexGuard aGuard( implGetMutex() ); + return OCommonAccessibleSelection::getSelectedAccessibleChild( nSelectedChildIndex ); +} + +void SAL_CALL AccessibleSelectionBase::deselectAccessibleChild( sal_Int64 nSelectedChildIndex ) +{ + ::osl::MutexGuard aGuard( implGetMutex() ); + OCommonAccessibleSelection::deselectAccessibleChild( nSelectedChildIndex ); +} - void SAL_CALL AccessibleSelectionBase::deselectAccessibleChild( sal_Int64 nSelectedChildIndex ) - { - ::osl::MutexGuard aGuard( implGetMutex() ); - OCommonAccessibleSelection::deselectAccessibleChild( nSelectedChildIndex ); - } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/editeng/source/accessibility/AccessibleStaticTextBase.cxx b/editeng/source/accessibility/AccessibleStaticTextBase.cxx index 9dd2a3483a93..4525a421dc29 100644 --- a/editeng/source/accessibility/AccessibleStaticTextBase.cxx +++ b/editeng/source/accessibility/AccessibleStaticTextBase.cxx @@ -59,897 +59,898 @@ using namespace ::com::sun::star::accessibility; namespace accessibility { - typedef std::vector< beans::PropertyValue > PropertyValueVector; - namespace { +typedef std::vector< beans::PropertyValue > PropertyValueVector; - class PropertyValueEqualFunctor - { - const beans::PropertyValue& m_rPValue; +namespace { - public: - explicit PropertyValueEqualFunctor(const beans::PropertyValue& rPValue) - : m_rPValue(rPValue) - {} - bool operator() ( const beans::PropertyValue& rhs ) const - { - return ( m_rPValue.Name == rhs.Name && m_rPValue.Value == rhs.Value ); - } - }; +class PropertyValueEqualFunctor +{ + const beans::PropertyValue& m_rPValue; +public: + explicit PropertyValueEqualFunctor(const beans::PropertyValue& rPValue) + : m_rPValue(rPValue) + {} + bool operator() ( const beans::PropertyValue& rhs ) const + { + return ( m_rPValue.Name == rhs.Name && m_rPValue.Value == rhs.Value ); } +}; - sal_Unicode const cNewLine(0x0a); +} +sal_Unicode const cNewLine(0x0a); - // Static Helper +// Static Helper - static ESelection MakeSelection( sal_Int32 nStartPara, sal_Int32 nStartIndex, - sal_Int32 nEndPara, sal_Int32 nEndIndex ) - { - DBG_ASSERT(nStartPara >= 0 && - nStartIndex >= 0 && - nEndPara >= 0 && - nEndIndex >= 0, - "AccessibleStaticTextBase_Impl::MakeSelection: index value overflow"); - return ESelection(nStartPara, nStartIndex, nEndPara, nEndIndex); - } +static ESelection MakeSelection( sal_Int32 nStartPara, sal_Int32 nStartIndex, + sal_Int32 nEndPara, sal_Int32 nEndIndex ) +{ + DBG_ASSERT(nStartPara >= 0 && + nStartIndex >= 0 && + nEndPara >= 0 && + nEndIndex >= 0, + "AccessibleStaticTextBase_Impl::MakeSelection: index value overflow"); + return ESelection(nStartPara, nStartIndex, nEndPara, nEndIndex); +} - // AccessibleStaticTextBase_Impl declaration +// AccessibleStaticTextBase_Impl declaration - /** AccessibleStaticTextBase_Impl - This class implements the AccessibleStaticTextBase - functionality, mainly by forwarding the calls to an aggregated - AccessibleEditableTextPara. As this is a therefore non-trivial - adapter, factoring out the common functionality from - AccessibleEditableTextPara might be a profitable future task. - */ - class AccessibleStaticTextBase_Impl - { - friend class AccessibleStaticTextBase; - public: +/** AccessibleStaticTextBase_Impl - // receive pointer to our frontend class and view window - AccessibleStaticTextBase_Impl(); + This class implements the AccessibleStaticTextBase + functionality, mainly by forwarding the calls to an aggregated + AccessibleEditableTextPara. As this is a therefore non-trivial + adapter, factoring out the common functionality from + AccessibleEditableTextPara might be a profitable future task. + */ +class AccessibleStaticTextBase_Impl +{ + friend class AccessibleStaticTextBase; +public: - void SetEditSource( std::unique_ptr< SvxEditSource > && pEditSource ); + // receive pointer to our frontend class and view window + AccessibleStaticTextBase_Impl(); - void SetEventSource( const uno::Reference< XAccessible >& rInterface ) - { - mpThis = rInterface.get(); - } + void SetEditSource( std::unique_ptr< SvxEditSource > && pEditSource ); - void SetOffset( const Point& ); + void SetEventSource( const uno::Reference< XAccessible >& rInterface ) + { + mpThis = rInterface.get(); + } - void Dispose(); + void SetOffset( const Point& ); - AccessibleEditableTextPara& GetParagraph( sal_Int32 nPara ) const; - sal_Int32 GetParagraphCount() const; + void Dispose(); - EPaM Index2Internal( sal_Int32 nFlatIndex ) const - { + AccessibleEditableTextPara& GetParagraph( sal_Int32 nPara ) const; + sal_Int32 GetParagraphCount() const; - return ImpCalcInternal( nFlatIndex, false ); - } + EPaM Index2Internal( sal_Int32 nFlatIndex ) const + { - EPaM Range2Internal( sal_Int32 nFlatIndex ) const - { + return ImpCalcInternal( nFlatIndex, false ); + } - return ImpCalcInternal( nFlatIndex, true ); - } + EPaM Range2Internal( sal_Int32 nFlatIndex ) const + { + + return ImpCalcInternal( nFlatIndex, true ); + } - sal_Int32 Internal2Index( EPaM nEEIndex ) const; + sal_Int32 Internal2Index( EPaM nEEIndex ) const; - void CorrectTextSegment( TextSegment& aTextSegment, - int nPara ) const; + void CorrectTextSegment( TextSegment& aTextSegment, + int nPara ) const; - bool SetSelection( sal_Int32 nStartPara, sal_Int32 nStartIndex, - sal_Int32 nEndPara, sal_Int32 nEndIndex ); - bool CopyText( sal_Int32 nStartPara, sal_Int32 nStartIndex, + bool SetSelection( sal_Int32 nStartPara, sal_Int32 nStartIndex, sal_Int32 nEndPara, sal_Int32 nEndIndex ); + bool CopyText( sal_Int32 nStartPara, sal_Int32 nStartIndex, + sal_Int32 nEndPara, sal_Int32 nEndIndex ); - tools::Rectangle GetParagraphBoundingBox() const; - bool RemoveLineBreakCount( sal_Int32& rIndex ); + tools::Rectangle GetParagraphBoundingBox() const; + bool RemoveLineBreakCount( sal_Int32& rIndex ); - private: +private: - EPaM ImpCalcInternal( sal_Int32 nFlatIndex, bool bExclusive ) const; + EPaM ImpCalcInternal( sal_Int32 nFlatIndex, bool bExclusive ) const; - // our frontend class (the one implementing the actual - // interface). That's not necessarily the one containing the impl - // pointer. Note that this is not an uno::Reference to prevent ref-counting cycles and leaks. - XAccessible* mpThis; + // our frontend class (the one implementing the actual + // interface). That's not necessarily the one containing the impl + // pointer. Note that this is not an uno::Reference to prevent ref-counting cycles and leaks. + XAccessible* mpThis; - // implements our functionality, we're just an adapter (guarded by solar mutex) - mutable rtl::Reference<AccessibleEditableTextPara> mxTextParagraph; + // implements our functionality, we're just an adapter (guarded by solar mutex) + mutable rtl::Reference<AccessibleEditableTextPara> mxTextParagraph; - // a wrapper for the text forwarders (guarded by solar mutex) - mutable SvxEditSourceAdapter maEditSource; - }; + // a wrapper for the text forwarders (guarded by solar mutex) + mutable SvxEditSourceAdapter maEditSource; +}; - // AccessibleStaticTextBase_Impl implementation +// AccessibleStaticTextBase_Impl implementation - AccessibleStaticTextBase_Impl::AccessibleStaticTextBase_Impl() - : mpThis(nullptr) - , mxTextParagraph(new AccessibleEditableTextPara(nullptr)) - { +AccessibleStaticTextBase_Impl::AccessibleStaticTextBase_Impl() + : mpThis(nullptr) + , mxTextParagraph(new AccessibleEditableTextPara(nullptr)) +{ - // TODO: this is still somewhat of a hack, all the more since - // now the maTextParagraph has an empty parent reference set - } + // TODO: this is still somewhat of a hack, all the more since + // now the maTextParagraph has an empty parent reference set +} - void AccessibleStaticTextBase_Impl::SetEditSource( std::unique_ptr< SvxEditSource > && pEditSource ) - { +void AccessibleStaticTextBase_Impl::SetEditSource( std::unique_ptr< SvxEditSource > && pEditSource ) +{ - maEditSource.SetEditSource( std::move(pEditSource) ); - if( mxTextParagraph.is() ) - mxTextParagraph->SetEditSource( &maEditSource ); - } + maEditSource.SetEditSource( std::move(pEditSource) ); + if( mxTextParagraph.is() ) + mxTextParagraph->SetEditSource( &maEditSource ); +} - void AccessibleStaticTextBase_Impl::SetOffset( const Point& rPoint ) - { - if( mxTextParagraph.is() ) - mxTextParagraph->SetEEOffset( rPoint ); - } +void AccessibleStaticTextBase_Impl::SetOffset( const Point& rPoint ) +{ + if( mxTextParagraph.is() ) + mxTextParagraph->SetEEOffset( rPoint ); +} - void AccessibleStaticTextBase_Impl::Dispose() - { +void AccessibleStaticTextBase_Impl::Dispose() +{ - // we're the owner of the paragraph, so destroy it, too - if( mxTextParagraph.is() ) - mxTextParagraph->Dispose(); + // we're the owner of the paragraph, so destroy it, too + if( mxTextParagraph.is() ) + mxTextParagraph->Dispose(); - // drop references - mpThis = nullptr; - mxTextParagraph.clear(); - } + // drop references + mpThis = nullptr; + mxTextParagraph.clear(); +} - AccessibleEditableTextPara& AccessibleStaticTextBase_Impl::GetParagraph( sal_Int32 nPara ) const - { +AccessibleEditableTextPara& AccessibleStaticTextBase_Impl::GetParagraph( sal_Int32 nPara ) const +{ - if( !mxTextParagraph.is() ) - throw lang::DisposedException (u"object has been already disposed"_ustr, mpThis ); + if( !mxTextParagraph.is() ) + throw lang::DisposedException (u"object has been already disposed"_ustr, mpThis ); - // TODO: Have a different method on AccessibleEditableTextPara - // that does not care about state changes - mxTextParagraph->SetParagraphIndex( nPara ); + // TODO: Have a different method on AccessibleEditableTextPara + // that does not care about state changes + mxTextParagraph->SetParagraphIndex( nPara ); - return *mxTextParagraph; - } + return *mxTextParagraph; +} - sal_Int32 AccessibleStaticTextBase_Impl::GetParagraphCount() const - { +sal_Int32 AccessibleStaticTextBase_Impl::GetParagraphCount() const +{ - if( !mxTextParagraph.is() ) - return 0; - else - return mxTextParagraph->GetTextForwarder().GetParagraphCount(); - } + if( !mxTextParagraph.is() ) + return 0; + else + return mxTextParagraph->GetTextForwarder().GetParagraphCount(); +} - sal_Int32 AccessibleStaticTextBase_Impl::Internal2Index(EPaM nEEIndex) const +sal_Int32 AccessibleStaticTextBase_Impl::Internal2Index(EPaM nEEIndex) const +{ + // XXX checks for overflow and returns maximum if so + sal_Int32 aRes(0); + for(sal_Int32 i=0; i<nEEIndex.nPara; ++i) { - // XXX checks for overflow and returns maximum if so - sal_Int32 aRes(0); - for(sal_Int32 i=0; i<nEEIndex.nPara; ++i) - { - sal_Int32 nCount = GetParagraph(i).getCharacterCount(); - if (SAL_MAX_INT32 - aRes > nCount) - return SAL_MAX_INT32; - aRes += nCount; - } - - if (SAL_MAX_INT32 - aRes > nEEIndex.nIndex) + sal_Int32 nCount = GetParagraph(i).getCharacterCount(); + if (SAL_MAX_INT32 - aRes > nCount) return SAL_MAX_INT32; - return aRes + nEEIndex.nIndex; + aRes += nCount; } - void AccessibleStaticTextBase_Impl::CorrectTextSegment( TextSegment& aTextSegment, - int nPara ) const - { - // Keep 'invalid' values at the TextSegment - if( aTextSegment.SegmentStart != -1 && - aTextSegment.SegmentEnd != -1 ) - { - // #112814# Correct TextSegment by paragraph offset - sal_Int32 nOffset(0); - int i; - for(i=0; i<nPara; ++i) - nOffset += GetParagraph(i).getCharacterCount(); - - aTextSegment.SegmentStart += nOffset; - aTextSegment.SegmentEnd += nOffset; - } - } + if (SAL_MAX_INT32 - aRes > nEEIndex.nIndex) + return SAL_MAX_INT32; + return aRes + nEEIndex.nIndex; +} - EPaM AccessibleStaticTextBase_Impl::ImpCalcInternal(sal_Int32 nFlatIndex, bool bExclusive) const +void AccessibleStaticTextBase_Impl::CorrectTextSegment( TextSegment& aTextSegment, + int nPara ) const +{ + // Keep 'invalid' values at the TextSegment + if( aTextSegment.SegmentStart != -1 && + aTextSegment.SegmentEnd != -1 ) { + // #112814# Correct TextSegment by paragraph offset + sal_Int32 nOffset(0); + int i; + for(i=0; i<nPara; ++i) + nOffset += GetParagraph(i).getCharacterCount(); - if( nFlatIndex < 0 ) - throw lang::IndexOutOfBoundsException(u"AccessibleStaticTextBase_Impl::Index2Internal: character index out of bounds"_ustr, - mpThis); - // gratuitously accepting larger indices here, AccessibleEditableTextPara will throw eventually + aTextSegment.SegmentStart += nOffset; + aTextSegment.SegmentEnd += nOffset; + } +} - sal_Int32 nCurrPara, nCurrIndex, nParas, nCurrCount; - for( nCurrPara=0, nParas=GetParagraphCount(), nCurrCount=0, nCurrIndex=0; nCurrPara<nParas; ++nCurrPara ) - { - nCurrCount = GetParagraph( nCurrPara ).getCharacterCount(); - nCurrIndex += nCurrCount; - if( nCurrIndex >= nFlatIndex ) - { - // check overflow - DBG_ASSERT(nCurrPara >= 0 && - nFlatIndex - nCurrIndex + nCurrCount >= 0, - "AccessibleStaticTextBase_Impl::Index2Internal: index value overflow"); +EPaM AccessibleStaticTextBase_Impl::ImpCalcInternal(sal_Int32 nFlatIndex, bool bExclusive) const +{ - return EPaM(nCurrPara, nFlatIndex - nCurrIndex + nCurrCount); - } - } + if( nFlatIndex < 0 ) + throw lang::IndexOutOfBoundsException(u"AccessibleStaticTextBase_Impl::Index2Internal: character index out of bounds"_ustr, + mpThis); + // gratuitously accepting larger indices here, AccessibleEditableTextPara will throw eventually - // #102170# Allow one-past the end for ranges - if( bExclusive && nCurrIndex == nFlatIndex ) + sal_Int32 nCurrPara, nCurrIndex, nParas, nCurrCount; + for( nCurrPara=0, nParas=GetParagraphCount(), nCurrCount=0, nCurrIndex=0; nCurrPara<nParas; ++nCurrPara ) + { + nCurrCount = GetParagraph( nCurrPara ).getCharacterCount(); + nCurrIndex += nCurrCount; + if( nCurrIndex >= nFlatIndex ) { // check overflow - DBG_ASSERT(nCurrPara > 0 && + DBG_ASSERT(nCurrPara >= 0 && nFlatIndex - nCurrIndex + nCurrCount >= 0, "AccessibleStaticTextBase_Impl::Index2Internal: index value overflow"); - return EPaM(nCurrPara - 1, nFlatIndex - nCurrIndex + nCurrCount); + return EPaM(nCurrPara, nFlatIndex - nCurrIndex + nCurrCount); } - - // not found? Out of bounds - throw lang::IndexOutOfBoundsException(u"AccessibleStaticTextBase_Impl::Index2Internal: character index out of bounds"_ustr, - mpThis); } - bool AccessibleStaticTextBase_Impl::SetSelection( sal_Int32 nStartPara, sal_Int32 nStartIndex, - sal_Int32 nEndPara, sal_Int32 nEndIndex ) + // #102170# Allow one-past the end for ranges + if( bExclusive && nCurrIndex == nFlatIndex ) { + // check overflow + DBG_ASSERT(nCurrPara > 0 && + nFlatIndex - nCurrIndex + nCurrCount >= 0, + "AccessibleStaticTextBase_Impl::Index2Internal: index value overflow"); - if( !mxTextParagraph.is() ) - return false; - - try - { - SvxEditViewForwarder& rCacheVF = mxTextParagraph->GetEditViewForwarder( true ); - return rCacheVF.SetSelection( MakeSelection(nStartPara, nStartIndex, nEndPara, nEndIndex) ); - } - catch( const uno::RuntimeException& ) - { - return false; - } + return EPaM(nCurrPara - 1, nFlatIndex - nCurrIndex + nCurrCount); } - bool AccessibleStaticTextBase_Impl::CopyText( sal_Int32 nStartPara, sal_Int32 nStartIndex, + // not found? Out of bounds + throw lang::IndexOutOfBoundsException(u"AccessibleStaticTextBase_Impl::Index2Internal: character index out of bounds"_ustr, + mpThis); +} + +bool AccessibleStaticTextBase_Impl::SetSelection( sal_Int32 nStartPara, sal_Int32 nStartIndex, sal_Int32 nEndPara, sal_Int32 nEndIndex ) +{ + + if( !mxTextParagraph.is() ) + return false; + + try { + SvxEditViewForwarder& rCacheVF = mxTextParagraph->GetEditViewForwarder( true ); + return rCacheVF.SetSelection( MakeSelection(nStartPara, nStartIndex, nEndPara, nEndIndex) ); + } + catch( const uno::RuntimeException& ) + { + return false; + } +} - if( !mxTextParagraph.is() ) - return false; +bool AccessibleStaticTextBase_Impl::CopyText( sal_Int32 nStartPara, sal_Int32 nStartIndex, + sal_Int32 nEndPara, sal_Int32 nEndIndex ) +{ - try - { - SvxEditViewForwarder& rCacheVF = mxTextParagraph->GetEditViewForwarder( true ); - mxTextParagraph->GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs - bool aRetVal; + if( !mxTextParagraph.is() ) + return false; - // save current selection - ESelection aOldSelection; + try + { + SvxEditViewForwarder& rCacheVF = mxTextParagraph->GetEditViewForwarder( true ); + mxTextParagraph->GetTextForwarder(); // MUST be after GetEditViewForwarder(), see method docs + bool aRetVal; - rCacheVF.GetSelection( aOldSelection ); - rCacheVF.SetSelection( MakeSelection(nStartPara, nStartIndex, nEndPara, nEndIndex) ); - aRetVal = rCacheVF.Copy(); - rCacheVF.SetSelection( aOldSelection ); // restore + // save current selection + ESelection aOldSelection; - return aRetVal; - } - catch( const uno::RuntimeException& ) - { - return false; - } + rCacheVF.GetSelection( aOldSelection ); + rCacheVF.SetSelection( MakeSelection(nStartPara, nStartIndex, nEndPara, nEndIndex) ); + aRetVal = rCacheVF.Copy(); + rCacheVF.SetSelection( aOldSelection ); // restore + + return aRetVal; + } + catch( const uno::RuntimeException& ) + { + return false; } +} - tools::Rectangle AccessibleStaticTextBase_Impl::GetParagraphBoundingBox() const +tools::Rectangle AccessibleStaticTextBase_Impl::GetParagraphBoundingBox() const +{ + tools::Rectangle aRect; + if( mxTextParagraph.is() ) { - tools::Rectangle aRect; - if( mxTextParagraph.is() ) - { - awt::Rectangle aAwtRect = mxTextParagraph->getBounds(); - aRect = tools::Rectangle( Point( aAwtRect.X, aAwtRect.Y ), Size( aAwtRect.Width, aAwtRect.Height ) ); - } - else - { - aRect.SetEmpty(); - } - return aRect; + awt::Rectangle aAwtRect = mxTextParagraph->getBounds(); + aRect = tools::Rectangle( Point( aAwtRect.X, aAwtRect.Y ), Size( aAwtRect.Width, aAwtRect.Height ) ); } - //the input argument is the index(including "\n" ) in the string. - //the function will calculate the actual index(not including "\n") in the string. - //and return true if the index is just at a "\n" - bool AccessibleStaticTextBase_Impl::RemoveLineBreakCount( sal_Int32& rIndex ) + else { - // get the total char number inside the cell. - sal_Int32 i, nCount, nParas; - for( i=0, nCount=0, nParas=GetParagraphCount(); i<nParas; ++i ) - nCount += GetParagraph(i).getCharacterCount(); - nCount = nCount + (nParas-1); - if( nCount == 0 && rIndex == 0) return false; + aRect.SetEmpty(); + } + return aRect; +} +//the input argument is the index(including "\n" ) in the string. +//the function will calculate the actual index(not including "\n") in the string. +//and return true if the index is just at a "\n" +bool AccessibleStaticTextBase_Impl::RemoveLineBreakCount( sal_Int32& rIndex ) +{ + // get the total char number inside the cell. + sal_Int32 i, nCount, nParas; + for( i=0, nCount=0, nParas=GetParagraphCount(); i<nParas; ++i ) + nCount += GetParagraph(i).getCharacterCount(); + nCount = nCount + (nParas-1); + if( nCount == 0 && rIndex == 0) return false; - sal_Int32 nCurrPara, nCurrCount; - sal_Int32 nLineBreakPos = 0, nLineBreakCount = 0; - sal_Int32 nParaCount = GetParagraphCount(); - for ( nCurrCount = 0, nCurrPara = 0; nCurrPara < nParaCount; nCurrPara++ ) + sal_Int32 nCurrPara, nCurrCount; + sal_Int32 nLineBreakPos = 0, nLineBreakCount = 0; + sal_Int32 nParaCount = GetParagraphCount(); + for ( nCurrCount = 0, nCurrPara = 0; nCurrPara < nParaCount; nCurrPara++ ) + { + nCurrCount += GetParagraph( nCurrPara ).getCharacterCount(); + nLineBreakPos = nCurrCount++; + if ( rIndex == nLineBreakPos ) { - nCurrCount += GetParagraph( nCurrPara ).getCharacterCount(); - nLineBreakPos = nCurrCount++; - if ( rIndex == nLineBreakPos ) + rIndex -= (++nLineBreakCount);//(++nLineBreakCount); + if ( rIndex < 0) { - rIndex -= (++nLineBreakCount);//(++nLineBreakCount); - if ( rIndex < 0) - { - rIndex = 0; - } - //if the index is at the last position of the last paragraph - //there is no "\n" , so we should increase rIndex by 1 and return false. - if ( (nCurrPara+1) == nParaCount ) - { - rIndex++; - return false; - } - else - { - return true; - } + rIndex = 0; } - else if ( rIndex < nLineBreakPos ) + //if the index is at the last position of the last paragraph + //there is no "\n" , so we should increase rIndex by 1 and return false. + if ( (nCurrPara+1) == nParaCount ) { - rIndex -= nLineBreakCount; + rIndex++; return false; } else { - nLineBreakCount++; + return true; } } - return false; + else if ( rIndex < nLineBreakPos ) + { + rIndex -= nLineBreakCount; + return false; + } + else + { + nLineBreakCount++; + } } + return false; +} - // AccessibleStaticTextBase implementation +// AccessibleStaticTextBase implementation - AccessibleStaticTextBase::AccessibleStaticTextBase( std::unique_ptr< SvxEditSource > && pEditSource ) : - mpImpl( new AccessibleStaticTextBase_Impl() ) - { - SolarMutexGuard aGuard; +AccessibleStaticTextBase::AccessibleStaticTextBase( std::unique_ptr< SvxEditSource > && pEditSource ) : + mpImpl( new AccessibleStaticTextBase_Impl() ) +{ + SolarMutexGuard aGuard; - SetEditSource( std::move(pEditSource) ); - } + SetEditSource( std::move(pEditSource) ); +} - AccessibleStaticTextBase::~AccessibleStaticTextBase() - { - } +AccessibleStaticTextBase::~AccessibleStaticTextBase() +{ +} - void AccessibleStaticTextBase::SetEditSource( std::unique_ptr< SvxEditSource > && pEditSource ) - { - // precondition: solar mutex locked - DBG_TESTSOLARMUTEX(); +void AccessibleStaticTextBase::SetEditSource( std::unique_ptr< SvxEditSource > && pEditSource ) +{ + // precondition: solar mutex locked + DBG_TESTSOLARMUTEX(); - mpImpl->SetEditSource( std::move(pEditSource) ); - } + mpImpl->SetEditSource( std::move(pEditSource) ); +} - void AccessibleStaticTextBase::SetEventSource( const uno::Reference< XAccessible >& rInterface ) - { - mpImpl->SetEventSource( rInterface ); +void AccessibleStaticTextBase::SetEventSource( const uno::Reference< XAccessible >& rInterface ) +{ + mpImpl->SetEventSource( rInterface ); - } +} - void AccessibleStaticTextBase::SetOffset( const Point& rPoint ) - { - // precondition: solar mutex locked - DBG_TESTSOLARMUTEX(); +void AccessibleStaticTextBase::SetOffset( const Point& rPoint ) +{ + // precondition: solar mutex locked + DBG_TESTSOLARMUTEX(); - mpImpl->SetOffset( rPoint ); - } + mpImpl->SetOffset( rPoint ); +} - void AccessibleStaticTextBase::Dispose() - { - mpImpl->Dispose(); +void AccessibleStaticTextBase::Dispose() +{ + mpImpl->Dispose(); - } +} - // XAccessibleContext - sal_Int64 AccessibleStaticTextBase::getAccessibleChildCount() - { - // no children at all - return 0; - } +// XAccessibleContext +sal_Int64 AccessibleStaticTextBase::getAccessibleChildCount() +{ + // no children at all + return 0; +} - uno::Reference< XAccessible > AccessibleStaticTextBase::getAccessibleChild( sal_Int64 /*i*/ ) - { - // no children at all - return uno::Reference< XAccessible >(); - } +uno::Reference< XAccessible > AccessibleStaticTextBase::getAccessibleChild( sal_Int64 /*i*/ ) +{ + // no children at all + return uno::Reference< XAccessible >(); +} + +uno::Reference< XAccessible > AccessibleStaticTextBase::getAccessibleAtPoint( const awt::Point& /*_aPoint*/ ) +{ + // no children at all + return uno::Reference< XAccessible >(); +} - uno::Reference< XAccessible > AccessibleStaticTextBase::getAccessibleAtPoint( const awt::Point& /*_aPoint*/ ) +// XAccessibleText +sal_Int32 SAL_CALL AccessibleStaticTextBase::getCaretPosition() +{ + SolarMutexGuard aGuard; + + sal_Int32 i, nPos, nParas; + for( i=0, nPos=-1, nParas=mpImpl->GetParagraphCount(); i<nParas; ++i ) { - // no children at all - return uno::Reference< XAccessible >(); + if( (nPos=mpImpl->GetParagraph(i).getCaretPosition()) != -1 ) + return nPos; } - // XAccessibleText - sal_Int32 SAL_CALL AccessibleStaticTextBase::getCaretPosition() - { - SolarMutexGuard aGuard; + return nPos; +} - sal_Int32 i, nPos, nParas; - for( i=0, nPos=-1, nParas=mpImpl->GetParagraphCount(); i<nParas; ++i ) - { - if( (nPos=mpImpl->GetParagraph(i).getCaretPosition()) != -1 ) - return nPos; - } +sal_Bool SAL_CALL AccessibleStaticTextBase::setCaretPosition( sal_Int32 nIndex ) +{ + return setSelection(nIndex, nIndex); +} - return nPos; - } +sal_Unicode SAL_CALL AccessibleStaticTextBase::getCharacter( sal_Int32 nIndex ) +{ + SolarMutexGuard aGuard; - sal_Bool SAL_CALL AccessibleStaticTextBase::setCaretPosition( sal_Int32 nIndex ) - { - return setSelection(nIndex, nIndex); - } + EPaM aPos(mpImpl->Index2Internal(nIndex)); - sal_Unicode SAL_CALL AccessibleStaticTextBase::getCharacter( sal_Int32 nIndex ) - { - SolarMutexGuard aGuard; + return mpImpl->GetParagraph( aPos.nPara ).getCharacter( aPos.nIndex ); +} - EPaM aPos(mpImpl->Index2Internal(nIndex)); +uno::Sequence< beans::PropertyValue > SAL_CALL AccessibleStaticTextBase::getCharacterAttributes( sal_Int32 nIndex, const css::uno::Sequence< OUString >& aRequestedAttributes ) +{ + SolarMutexGuard aGuard; - return mpImpl->GetParagraph( aPos.nPara ).getCharacter( aPos.nIndex ); - } + //get the actual index without "\n" + mpImpl->RemoveLineBreakCount( nIndex ); - uno::Sequence< beans::PropertyValue > SAL_CALL AccessibleStaticTextBase::getCharacterAttributes( sal_Int32 nIndex, const css::uno::Sequence< OUString >& aRequestedAttributes ) - { - SolarMutexGuard aGuard; + EPaM aPos(mpImpl->Index2Internal(nIndex)); - //get the actual index without "\n" - mpImpl->RemoveLineBreakCount( nIndex ); + return mpImpl->GetParagraph( aPos.nPara ).getCharacterAttributes( aPos.nIndex, aRequestedAttributes ); +} - EPaM aPos(mpImpl->Index2Internal(nIndex)); +awt::Rectangle SAL_CALL AccessibleStaticTextBase::getCharacterBounds( sal_Int32 nIndex ) +{ + SolarMutexGuard aGuard; - return mpImpl->GetParagraph( aPos.nPara ).getCharacterAttributes( aPos.nIndex, aRequestedAttributes ); - } + // #108900# Allow ranges for nIndex, as one-past-the-end + // values are now legal, too. + EPaM aPos(mpImpl->Range2Internal(nIndex)); - awt::Rectangle SAL_CALL AccessibleStaticTextBase::getCharacterBounds( sal_Int32 nIndex ) - { - SolarMutexGuard aGuard; + // #i70916# Text in spread sheet cells return the wrong extents + AccessibleEditableTextPara& rPara = mpImpl->GetParagraph( aPos.nPara ); + awt::Rectangle aParaBounds( rPara.getBounds() ); + awt::Rectangle aBounds( rPara.getCharacterBounds( aPos.nIndex ) ); + aBounds.X += aParaBounds.X; + aBounds.Y += aParaBounds.Y; - // #108900# Allow ranges for nIndex, as one-past-the-end - // values are now legal, too. - EPaM aPos(mpImpl->Range2Internal(nIndex)); + return aBounds; +} - // #i70916# Text in spread sheet cells return the wrong extents - AccessibleEditableTextPara& rPara = mpImpl->GetParagraph( aPos.nPara ); - awt::Rectangle aParaBounds( rPara.getBounds() ); - awt::Rectangle aBounds( rPara.getCharacterBounds( aPos.nIndex ) ); - aBounds.X += aParaBounds.X; - aBounds.Y += aParaBounds.Y; +sal_Int32 SAL_CALL AccessibleStaticTextBase::getCharacterCount() +{ + SolarMutexGuard aGuard; - return aBounds; - } + sal_Int32 i, nCount, nParas; + for( i=0, nCount=0, nParas=mpImpl->GetParagraphCount(); i<nParas; ++i ) + nCount += mpImpl->GetParagraph(i).getCharacterCount(); + //count on the number of "\n" which equals number of paragraphs decrease 1. + nCount = nCount + (nParas-1); + return nCount; +} + +sal_Int32 SAL_CALL AccessibleStaticTextBase::getIndexAtPoint( const awt::Point& rPoint ) +{ + SolarMutexGuard aGuard; - sal_Int32 SAL_CALL AccessibleStaticTextBase::getCharacterCount() + const sal_Int32 nParas( mpImpl->GetParagraphCount() ); + sal_Int32 nIndex; + int i; + for( i=0; i<nParas; ++i ) { - SolarMutexGuard aGuard; + // TODO: maybe exploit the fact that paragraphs are + // ordered vertically for early exit - sal_Int32 i, nCount, nParas; - for( i=0, nCount=0, nParas=mpImpl->GetParagraphCount(); i<nParas; ++i ) - nCount += mpImpl->GetParagraph(i).getCharacterCount(); - //count on the number of "\n" which equals number of paragraphs decrease 1. - nCount = nCount + (nParas-1); - return nCount; + // #i70916# Text in spread sheet cells return the wrong extents + AccessibleEditableTextPara& rPara = mpImpl->GetParagraph( i ); + awt::Rectangle aParaBounds( rPara.getBounds() ); + awt::Point aPoint( rPoint ); + aPoint.X -= aParaBounds.X; + aPoint.Y -= aParaBounds.Y; + + // #112814# Use correct index offset + if ( ( nIndex = rPara.getIndexAtPoint( aPoint ) ) != -1 ) + return mpImpl->Internal2Index(EPaM(i, nIndex)); } - sal_Int32 SAL_CALL AccessibleStaticTextBase::getIndexAtPoint( const awt::Point& rPoint ) - { - SolarMutexGuard aGuard; + return -1; +} - const sal_Int32 nParas( mpImpl->GetParagraphCount() ); - sal_Int32 nIndex; - int i; - for( i=0; i<nParas; ++i ) - { - // TODO: maybe exploit the fact that paragraphs are - // ordered vertically for early exit - - // #i70916# Text in spread sheet cells return the wrong extents - AccessibleEditableTextPara& rPara = mpImpl->GetParagraph( i ); - awt::Rectangle aParaBounds( rPara.getBounds() ); - awt::Point aPoint( rPoint ); - aPoint.X -= aParaBounds.X; - aPoint.Y -= aParaBounds.Y; - - // #112814# Use correct index offset - if ( ( nIndex = rPara.getIndexAtPoint( aPoint ) ) != -1 ) - return mpImpl->Internal2Index(EPaM(i, nIndex)); - } +OUString SAL_CALL AccessibleStaticTextBase::getSelectedText() +{ + SolarMutexGuard aGuard; - return -1; - } + sal_Int32 nStart( getSelectionStart() ); + sal_Int32 nEnd( getSelectionEnd() ); - OUString SAL_CALL AccessibleStaticTextBase::getSelectedText() - { - SolarMutexGuard aGuard; + // #104481# Return the empty string for 'no selection' + if( nStart < 0 || nEnd < 0 ) + return OUString(); - sal_Int32 nStart( getSelectionStart() ); - sal_Int32 nEnd( getSelectionEnd() ); + return getTextRange( nStart, nEnd ); +} - // #104481# Return the empty string for 'no selection' - if( nStart < 0 || nEnd < 0 ) - return OUString(); +sal_Int32 SAL_CALL AccessibleStaticTextBase::getSelectionStart() +{ + SolarMutexGuard aGuard; - return getTextRange( nStart, nEnd ); + sal_Int32 i, nPos, nParas; + for( i=0, nPos=-1, nParas=mpImpl->GetParagraphCount(); i<nParas; ++i ) + { + if( (nPos=mpImpl->GetParagraph(i).getSelectionStart()) != -1 ) + return nPos; } - sal_Int32 SAL_CALL AccessibleStaticTextBase::getSelectionStart() - { - SolarMutexGuard aGuard; + return nPos; +} - sal_Int32 i, nPos, nParas; - for( i=0, nPos=-1, nParas=mpImpl->GetParagraphCount(); i<nParas; ++i ) - { - if( (nPos=mpImpl->GetParagraph(i).getSelectionStart()) != -1 ) - return nPos; - } +sal_Int32 SAL_CALL AccessibleStaticTextBase::getSelectionEnd() +{ + SolarMutexGuard aGuard; - return nPos; + sal_Int32 i, nPos, nParas; + for( i=0, nPos=-1, nParas=mpImpl->GetParagraphCount(); i<nParas; ++i ) + { + if( (nPos=mpImpl->GetParagraph(i).getSelectionEnd()) != -1 ) + return nPos; } - sal_Int32 SAL_CALL AccessibleStaticTextBase::getSelectionEnd() - { - SolarMutexGuard aGuard; + return nPos; +} - sal_Int32 i, nPos, nParas; - for( i=0, nPos=-1, nParas=mpImpl->GetParagraphCount(); i<nParas; ++i ) - { - if( (nPos=mpImpl->GetParagraph(i).getSelectionEnd()) != -1 ) - return nPos; - } +sal_Bool SAL_CALL AccessibleStaticTextBase::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) +{ + SolarMutexGuard aGuard; - return nPos; - } + EPaM aStartIndex(mpImpl->Range2Internal(nStartIndex)); + EPaM aEndIndex(mpImpl->Range2Internal(nEndIndex)); - sal_Bool SAL_CALL AccessibleStaticTextBase::setSelection( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) - { - SolarMutexGuard aGuard; + return mpImpl->SetSelection( aStartIndex.nPara, aStartIndex.nIndex, + aEndIndex.nPara, aEndIndex.nIndex ); +} - EPaM aStartIndex(mpImpl->Range2Internal(nStartIndex)); - EPaM aEndIndex(mpImpl->Range2Internal(nEndIndex)); +OUString SAL_CALL AccessibleStaticTextBase::getText() +{ + SolarMutexGuard aGuard; - return mpImpl->SetSelection( aStartIndex.nPara, aStartIndex.nIndex, - aEndIndex.nPara, aEndIndex.nIndex ); - } + sal_Int32 i, nParas; + OUStringBuffer aRes; + for( i=0, nParas=mpImpl->GetParagraphCount(); i<nParas; ++i ) + aRes.append(mpImpl->GetParagraph(i).getText()); - OUString SAL_CALL AccessibleStaticTextBase::getText() - { - SolarMutexGuard aGuard; + return aRes.makeStringAndClear(); +} - sal_Int32 i, nParas; - OUStringBuffer aRes; - for( i=0, nParas=mpImpl->GetParagraphCount(); i<nParas; ++i ) - aRes.append(mpImpl->GetParagraph(i).getText()); +OUString SAL_CALL AccessibleStaticTextBase::getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) +{ + SolarMutexGuard aGuard; - return aRes.makeStringAndClear(); + if( nStartIndex > nEndIndex ) + std::swap(nStartIndex, nEndIndex); + //if startindex equals endindex we will get nothing. So return an empty string directly. + if ( nStartIndex == nEndIndex ) + { + return OUString(); + } + bool bStart = mpImpl->RemoveLineBreakCount( nStartIndex ); + //if the start index is just at a "\n", we need to begin from the next char + if ( bStart ) + { + nStartIndex++; + } + //we need to find out whether the previous position of the current endindex is at "\n" or not + //if yes we need to mark it and add "\n" at the end of the result + sal_Int32 nTemp = nEndIndex - 1; + bool bEnd = mpImpl->RemoveLineBreakCount( nTemp ); + bool bTemp = mpImpl->RemoveLineBreakCount( nEndIndex ); + //if the below condition is true it indicates an empty paragraph with just a "\n" + //so we need to set one "\n" flag to avoid duplication. + if ( bStart && bEnd && ( nStartIndex == nEndIndex) ) + { + bEnd = false; } + //if the current endindex is at a "\n", we need to increase endindex by 1 to make sure + //the char before "\n" is included. Because string returned by this function will not include + //the char at the endindex. + if ( bTemp ) + { + nEndIndex++; + } + OUStringBuffer aRes; + EPaM aStartIndex(mpImpl->Range2Internal(nStartIndex)); + EPaM aEndIndex(mpImpl->Range2Internal(nEndIndex)); - OUString SAL_CALL AccessibleStaticTextBase::getTextRange( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) + // #102170# Special case: start and end paragraph are identical + if( aStartIndex.nPara == aEndIndex.nPara ) { - SolarMutexGuard aGuard; + //we don't return the string directly now for that we have to do some further process for "\n" + aRes = mpImpl->GetParagraph( aStartIndex.nPara ).getTextRange( aStartIndex.nIndex, aEndIndex.nIndex ); + } + else + { + sal_Int32 i( aStartIndex.nPara ); + aRes = mpImpl->GetParagraph(i).getTextRange( aStartIndex.nIndex, + mpImpl->GetParagraph(i).getCharacterCount()/*-1*/); + ++i; - if( nStartIndex > nEndIndex ) - std::swap(nStartIndex, nEndIndex); - //if startindex equals endindex we will get nothing. So return an empty string directly. - if ( nStartIndex == nEndIndex ) + // paragraphs inbetween are fully included + for( ; i<aEndIndex.nPara; ++i ) { - return OUString(); + aRes.append(OUStringChar(cNewLine) + mpImpl->GetParagraph(i).getText()); } - bool bStart = mpImpl->RemoveLineBreakCount( nStartIndex ); - //if the start index is just at a "\n", we need to begin from the next char - if ( bStart ) - { - nStartIndex++; - } - //we need to find out whether the previous position of the current endindex is at "\n" or not - //if yes we need to mark it and add "\n" at the end of the result - sal_Int32 nTemp = nEndIndex - 1; - bool bEnd = mpImpl->RemoveLineBreakCount( nTemp ); - bool bTemp = mpImpl->RemoveLineBreakCount( nEndIndex ); - //if the below condition is true it indicates an empty paragraph with just a "\n" - //so we need to set one "\n" flag to avoid duplication. - if ( bStart && bEnd && ( nStartIndex == nEndIndex) ) - { - bEnd = false; - } - //if the current endindex is at a "\n", we need to increase endindex by 1 to make sure - //the char before "\n" is included. Because string returned by this function will not include - //the char at the endindex. - if ( bTemp ) - { - nEndIndex++; - } - OUStringBuffer aRes; - EPaM aStartIndex(mpImpl->Range2Internal(nStartIndex)); - EPaM aEndIndex(mpImpl->Range2Internal(nEndIndex)); - // #102170# Special case: start and end paragraph are identical - if( aStartIndex.nPara == aEndIndex.nPara ) + if( i<=aEndIndex.nPara ) { - //we don't return the string directly now for that we have to do some further process for "\n" - aRes = mpImpl->GetParagraph( aStartIndex.nPara ).getTextRange( aStartIndex.nIndex, aEndIndex.nIndex ); - } - else - { - sal_Int32 i( aStartIndex.nPara ); - aRes = mpImpl->GetParagraph(i).getTextRange( aStartIndex.nIndex, - mpImpl->GetParagraph(i).getCharacterCount()/*-1*/); - ++i; - - // paragraphs inbetween are fully included - for( ; i<aEndIndex.nPara; ++i ) + //if the below condition is matched it means that endindex is at mid of the last paragraph + //we need to add a "\n" before we add the last part of the string. + if ( !bEnd && aEndIndex.nIndex ) { - aRes.append(OUStringChar(cNewLine) + mpImpl->GetParagraph(i).getText()); + aRes.append(cNewLine); } - - if( i<=aEndIndex.nPara ) - { - //if the below condition is matched it means that endindex is at mid of the last paragraph - //we need to add a "\n" before we add the last part of the string. - if ( !bEnd && aEndIndex.nIndex ) - { - aRes.append(cNewLine); - } - aRes.append(mpImpl->GetParagraph(i).getTextRange( 0, aEndIndex.nIndex )); - } - } - //According to the flag we marked before, we have to add "\n" at the beginning - //or at the end of the result string. - if ( bStart ) - { - aRes.insert(0, OUStringChar(cNewLine)); + aRes.append(mpImpl->GetParagraph(i).getTextRange( 0, aEndIndex.nIndex )); } - if ( bEnd ) - { - aRes.append(OUStringChar(cNewLine)); - } - return aRes.makeStringAndClear(); } + //According to the flag we marked before, we have to add "\n" at the beginning + //or at the end of the result string. + if ( bStart ) + { + aRes.insert(0, OUStringChar(cNewLine)); + } + if ( bEnd ) + { + aRes.append(OUStringChar(cNewLine)); + } + return aRes.makeStringAndClear(); +} + +css::accessibility::TextSegment SAL_CALL AccessibleStaticTextBase::getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) +{ + SolarMutexGuard aGuard; + + bool bLineBreak = mpImpl->RemoveLineBreakCount( nIndex ); + EPaM aPos(mpImpl->Range2Internal(nIndex)); + + css::accessibility::TextSegment aResult; - css::accessibility::TextSegment SAL_CALL AccessibleStaticTextBase::getTextAtIndex( sal_Int32 nIndex, sal_Int16 aTextType ) + if( AccessibleTextType::PARAGRAPH == aTextType ) { - SolarMutexGuard aGuard; + // #106393# Special casing one behind last paragraph is + // not necessary, since then, we return the content and + // boundary of that last paragraph. Range2Internal is + // tolerant against that, and returns the last paragraph + // in aPos.nPara. - bool bLineBreak = mpImpl->RemoveLineBreakCount( nIndex ); - EPaM aPos(mpImpl->Range2Internal(nIndex)); + // retrieve full text of the paragraph + aResult.SegmentText = mpImpl->GetParagraph( aPos.nPara ).getText(); - css::accessibility::TextSegment aResult; + // #112814# Adapt the start index with the paragraph offset + aResult.SegmentStart = mpImpl->Internal2Index(EPaM(aPos.nPara, 0)); + aResult.SegmentEnd = aResult.SegmentStart + aResult.SegmentText.getLength(); + } + else if ( AccessibleTextType::ATTRIBUTE_RUN == aTextType ) + { + SvxAccessibleTextAdapter& rTextForwarder = mpImpl->GetParagraph( aPos.nIndex ).GetTextForwarder(); + sal_Int32 nStartIndex, nEndIndex; + if ( rTextForwarder.GetAttributeRun( nStartIndex, nEndIndex, aPos.nPara, aPos.nIndex, true ) ) + { + aResult.SegmentText = getTextRange( nStartIndex, nEndIndex ); + aResult.SegmentStart = nStartIndex; + aResult.SegmentEnd = nEndIndex; + } + } + else + { + // No special handling required, forward to wrapped class + aResult = mpImpl->GetParagraph( aPos.nPara ).getTextAtIndex( aPos.nIndex, aTextType ); - if( AccessibleTextType::PARAGRAPH == aTextType ) + // #112814# Adapt the start index with the paragraph offset + mpImpl->CorrectTextSegment( aResult, aPos.nPara ); + if ( bLineBreak ) { - // #106393# Special casing one behind last paragraph is - // not necessary, since then, we return the content and - // boundary of that last paragraph. Range2Internal is - // tolerant against that, and returns the last paragraph - // in aPos.nPara. + aResult.SegmentText = OUString(cNewLine); + } + } + + return aResult; +} + +css::accessibility::TextSegment SAL_CALL AccessibleStaticTextBase::getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) +{ + SolarMutexGuard aGuard; - // retrieve full text of the paragraph + sal_Int32 nOldIdx = nIndex; + bool bLineBreak = mpImpl->RemoveLineBreakCount( nIndex ); + EPaM aPos(mpImpl->Range2Internal(nIndex)); + + css::accessibility::TextSegment aResult; + + if( AccessibleTextType::PARAGRAPH == aTextType ) + { + if( aPos.nIndex == mpImpl->GetParagraph( aPos.nPara ).getCharacterCount() ) + { + // #103589# Special casing one behind the last paragraph aResult.SegmentText = mpImpl->GetParagraph( aPos.nPara ).getText(); // #112814# Adapt the start index with the paragraph offset aResult.SegmentStart = mpImpl->Internal2Index(EPaM(aPos.nPara, 0)); - aResult.SegmentEnd = aResult.SegmentStart + aResult.SegmentText.getLength(); } - else if ( AccessibleTextType::ATTRIBUTE_RUN == aTextType ) + else if( aPos.nPara > 0 ) { - SvxAccessibleTextAdapter& rTextForwarder = mpImpl->GetParagraph( aPos.nIndex ).GetTextForwarder(); - sal_Int32 nStartIndex, nEndIndex; - if ( rTextForwarder.GetAttributeRun( nStartIndex, nEndIndex, aPos.nPara, aPos.nIndex, true ) ) - { - aResult.SegmentText = getTextRange( nStartIndex, nEndIndex ); - aResult.SegmentStart = nStartIndex; - aResult.SegmentEnd = nEndIndex; - } - } - else - { - // No special handling required, forward to wrapped class - aResult = mpImpl->GetParagraph( aPos.nPara ).getTextAtIndex( aPos.nIndex, aTextType ); + aResult.SegmentText = mpImpl->GetParagraph( aPos.nPara - 1 ).getText(); // #112814# Adapt the start index with the paragraph offset - mpImpl->CorrectTextSegment( aResult, aPos.nPara ); - if ( bLineBreak ) - { - aResult.SegmentText = OUString(cNewLine); - } + aResult.SegmentStart = mpImpl->Internal2Index(EPaM(aPos.nPara - 1, 0)); } - return aResult; + aResult.SegmentEnd = aResult.SegmentStart + aResult.SegmentText.getLength(); } - - css::accessibility::TextSegment SAL_CALL AccessibleStaticTextBase::getTextBeforeIndex( sal_Int32 nIndex, sal_Int16 aTextType ) + else { - SolarMutexGuard aGuard; + // No special handling required, forward to wrapped class + aResult = mpImpl->GetParagraph( aPos.nPara ).getTextBeforeIndex( aPos.nIndex, aTextType ); - sal_Int32 nOldIdx = nIndex; - bool bLineBreak = mpImpl->RemoveLineBreakCount( nIndex ); - EPaM aPos(mpImpl->Range2Internal(nIndex)); + // #112814# Adapt the start index with the paragraph offset + mpImpl->CorrectTextSegment( aResult, aPos.nPara ); + if ( bLineBreak && (nOldIdx-1) >= 0) + { + aResult = getTextAtIndex( nOldIdx-1, aTextType ); + } + } - css::accessibility::TextSegment aResult; + return aResult; +} - if( AccessibleTextType::PARAGRAPH == aTextType ) - { - if( aPos.nIndex == mpImpl->GetParagraph( aPos.nPara ).getCharacterCount() ) - { - // #103589# Special casing one behind the last paragraph - aResult.SegmentText = mpImpl->GetParagraph( aPos.nPara ).getText(); +css::accessibility::TextSegment SAL_CALL AccessibleStaticTextBase::getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) +{ + SolarMutexGuard aGuard; - // #112814# Adapt the start index with the paragraph offset - aResult.SegmentStart = mpImpl->Internal2Index(EPaM(aPos.nPara, 0)); - } - else if( aPos.nPara > 0 ) - { - aResult.SegmentText = mpImpl->GetParagraph( aPos.nPara - 1 ).getText(); + sal_Int32 nTemp = nIndex+1; + bool bLineBreak = mpImpl->RemoveLineBreakCount( nTemp ); + mpImpl->RemoveLineBreakCount( nIndex ); + EPaM aPos(mpImpl->Range2Internal(nIndex)); - // #112814# Adapt the start index with the paragraph offset - aResult.SegmentStart = mpImpl->Internal2Index(EPaM(aPos.nPara - 1, 0)); - } + css::accessibility::TextSegment aResult; - aResult.SegmentEnd = aResult.SegmentStart + aResult.SegmentText.getLength(); - } - else + if( AccessibleTextType::PARAGRAPH == aTextType ) + { + // Special casing one behind the last paragraph is not + // necessary, this case is invalid here for + // getTextBehindIndex + if( aPos.nPara + 1 < mpImpl->GetParagraphCount() ) { - // No special handling required, forward to wrapped class - aResult = mpImpl->GetParagraph( aPos.nPara ).getTextBeforeIndex( aPos.nIndex, aTextType ); + aResult.SegmentText = mpImpl->GetParagraph( aPos.nPara + 1 ).getText(); // #112814# Adapt the start index with the paragraph offset - mpImpl->CorrectTextSegment( aResult, aPos.nPara ); - if ( bLineBreak && (nOldIdx-1) >= 0) - { - aResult = getTextAtIndex( nOldIdx-1, aTextType ); - } + aResult.SegmentStart = mpImpl->Internal2Index(EPaM(aPos.nPara + 1, 0)); + aResult.SegmentEnd = aResult.SegmentStart + aResult.SegmentText.getLength(); } - - return aResult; } - - css::accessibility::TextSegment SAL_CALL AccessibleStaticTextBase::getTextBehindIndex( sal_Int32 nIndex, sal_Int16 aTextType ) + else { - SolarMutexGuard aGuard; + // No special handling required, forward to wrapped class + aResult = mpImpl->GetParagraph( aPos.nPara ).getTextBehindIndex( aPos.nIndex, aTextType ); - sal_Int32 nTemp = nIndex+1; - bool bLineBreak = mpImpl->RemoveLineBreakCount( nTemp ); - mpImpl->RemoveLineBreakCount( nIndex ); - EPaM aPos(mpImpl->Range2Internal(nIndex)); - - css::accessibility::TextSegment aResult; - - if( AccessibleTextType::PARAGRAPH == aTextType ) + // #112814# Adapt the start index with the paragraph offset + mpImpl->CorrectTextSegment( aResult, aPos.nPara ); + if ( bLineBreak ) { - // Special casing one behind the last paragraph is not - // necessary, this case is invalid here for - // getTextBehindIndex - if( aPos.nPara + 1 < mpImpl->GetParagraphCount() ) - { - aResult.SegmentText = mpImpl->GetParagraph( aPos.nPara + 1 ).getText(); - - // #112814# Adapt the start index with the paragraph offset - aResult.SegmentStart = mpImpl->Internal2Index(EPaM(aPos.nPara + 1, 0)); - aResult.SegmentEnd = aResult.SegmentStart + aResult.SegmentText.getLength(); - } + aResult.SegmentText = OUStringChar(cNewLine) + aResult.SegmentText; } - else - { - // No special handling required, forward to wrapped class - aResult = mpImpl->GetParagraph( aPos.nPara ).getTextBehindIndex( aPos.nIndex, aTextType ); + } - // #112814# Adapt the start index with the paragraph offset - mpImpl->CorrectTextSegment( aResult, aPos.nPara ); - if ( bLineBreak ) - { - aResult.SegmentText = OUStringChar(cNewLine) + aResult.SegmentText; - } - } + return aResult; +} - return aResult; - } +sal_Bool SAL_CALL AccessibleStaticTextBase::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) +{ + SolarMutexGuard aGuard; - sal_Bool SAL_CALL AccessibleStaticTextBase::copyText( sal_Int32 nStartIndex, sal_Int32 nEndIndex ) - { - SolarMutexGuard aGuard; + if( nStartIndex > nEndIndex ) + std::swap(nStartIndex, nEndIndex); - if( nStartIndex > nEndIndex ) - std::swap(nStartIndex, nEndIndex); + EPaM aStartIndex(mpImpl->Range2Internal(nStartIndex)); + EPaM aEndIndex(mpImpl->Range2Internal(nEndIndex)); - EPaM aStartIndex(mpImpl->Range2Internal(nStartIndex)); - EPaM aEndIndex(mpImpl->Range2Internal(nEndIndex)); + return mpImpl->CopyText( aStartIndex.nPara, aStartIndex.nIndex, + aEndIndex.nPara, aEndIndex.nIndex ); +} - return mpImpl->CopyText( aStartIndex.nPara, aStartIndex.nIndex, - aEndIndex.nPara, aEndIndex.nIndex ); - } +sal_Bool SAL_CALL AccessibleStaticTextBase::scrollSubstringTo( sal_Int32, sal_Int32, AccessibleScrollType ) +{ + return false; +} - sal_Bool SAL_CALL AccessibleStaticTextBase::scrollSubstringTo( sal_Int32, sal_Int32, AccessibleScrollType ) - { - return false; - } +// XAccessibleTextAttributes +uno::Sequence< beans::PropertyValue > AccessibleStaticTextBase::getDefaultAttributes( const uno::Sequence< OUString >& RequestedAttributes ) +{ + // get the intersection of the default attributes of all paragraphs - // XAccessibleTextAttributes - uno::Sequence< beans::PropertyValue > AccessibleStaticTextBase::getDefaultAttributes( const uno::Sequence< OUString >& RequestedAttributes ) - { - // get the intersection of the default attributes of all paragraphs + SolarMutexGuard aGuard; - SolarMutexGuard aGuard; + PropertyValueVector aDefAttrVec( + comphelper::sequenceToContainer<PropertyValueVector>(mpImpl->GetParagraph( 0 ).getDefaultAttributes( RequestedAttributes )) ); - PropertyValueVector aDefAttrVec( - comphelper::sequenceToContainer<PropertyValueVector>(mpImpl->GetParagraph( 0 ).getDefaultAttributes( RequestedAttributes )) ); + const sal_Int32 nParaCount = mpImpl->GetParagraphCount(); + for ( sal_Int32 nPara = 1; nPara < nParaCount; ++nPara ) + { + uno::Sequence< beans::PropertyValue > aSeq = mpImpl->GetParagraph( nPara ).getDefaultAttributes( RequestedAttributes ); + PropertyValueVector aIntersectionVec; - const sal_Int32 nParaCount = mpImpl->GetParagraphCount(); - for ( sal_Int32 nPara = 1; nPara < nParaCount; ++nPara ) + for ( const auto& rDefAttr : aDefAttrVec ) { - uno::Sequence< beans::PropertyValue > aSeq = mpImpl->GetParagraph( nPara ).getDefaultAttributes( RequestedAttributes ); - PropertyValueVector aIntersectionVec; - - for ( const auto& rDefAttr : aDefAttrVec ) - { - auto it = std::find_if(aSeq.begin(), aSeq.end(), PropertyValueEqualFunctor(rDefAttr)); - if (it != aSeq.end()) - aIntersectionVec.push_back(*it); - } + auto it = std::find_if(aSeq.begin(), aSeq.end(), PropertyValueEqualFunctor(rDefAttr)); + if (it != aSeq.end()) + aIntersectionVec.push_back(*it); + } - aDefAttrVec.swap( aIntersectionVec ); + aDefAttrVec.swap( aIntersectionVec ); - if ( aDefAttrVec.empty() ) - { - break; - } + if ( aDefAttrVec.empty() ) + { + break; } - - return comphelper::containerToSequence(aDefAttrVec); } - uno::Sequence< beans::PropertyValue > SAL_CALL AccessibleStaticTextBase::getRunAttributes( sal_Int32 nIndex, const uno::Sequence< OUString >& RequestedAttributes ) - { - // get those default attributes of the paragraph, which are not part - // of the intersection of all paragraphs and add them to the run attributes + return comphelper::containerToSequence(aDefAttrVec); +} + +uno::Sequence< beans::PropertyValue > SAL_CALL AccessibleStaticTextBase::getRunAttributes( sal_Int32 nIndex, const uno::Sequence< OUString >& RequestedAttributes ) +{ + // get those default attributes of the paragraph, which are not part + // of the intersection of all paragraphs and add them to the run attributes - SolarMutexGuard aGuard; + SolarMutexGuard aGuard; - EPaM aPos(mpImpl->Index2Internal(nIndex)); - AccessibleEditableTextPara& rPara = mpImpl->GetParagraph( aPos.nPara ); - uno::Sequence< beans::PropertyValue > aDefAttrSeq = rPara.getDefaultAttributes( RequestedAttributes ); - uno::Sequence< beans::PropertyValue > aRunAttrSeq = rPara.getRunAttributes( aPos.nIndex, RequestedAttributes ); - uno::Sequence< beans::PropertyValue > aIntersectionSeq = getDefaultAttributes( RequestedAttributes ); - PropertyValueVector aDiffVec; + EPaM aPos(mpImpl->Index2Internal(nIndex)); + AccessibleEditableTextPara& rPara = mpImpl->GetParagraph( aPos.nPara ); + uno::Sequence< beans::PropertyValue > aDefAttrSeq = rPara.getDefaultAttributes( RequestedAttributes ); + uno::Sequence< beans::PropertyValue > aRunAttrSeq = rPara.getRunAttributes( aPos.nIndex, RequestedAttributes ); + uno::Sequence< beans::PropertyValue > aIntersectionSeq = getDefaultAttributes( RequestedAttributes ); + PropertyValueVector aDiffVec; - for (auto& defAttr : aDefAttrSeq) + for (auto& defAttr : aDefAttrSeq) + { + bool bNone = std::none_of(aIntersectionSeq.begin(), aIntersectionSeq.end(), + PropertyValueEqualFunctor(defAttr)); + if (bNone && defAttr.Handle != 0) { - bool bNone = std::none_of(aIntersectionSeq.begin(), aIntersectionSeq.end(), - PropertyValueEqualFunctor(defAttr)); - if (bNone && defAttr.Handle != 0) - { - aDiffVec.push_back(defAttr); - } + aDiffVec.push_back(defAttr); } - - return comphelper::concatSequences(aRunAttrSeq, aDiffVec); } - tools::Rectangle AccessibleStaticTextBase::GetParagraphBoundingBox() const - { - return mpImpl->GetParagraphBoundingBox(); - } + return comphelper::concatSequences(aRunAttrSeq, aDiffVec); +} + +tools::Rectangle AccessibleStaticTextBase::GetParagraphBoundingBox() const +{ + return mpImpl->GetParagraphBoundingBox(); +} } // end of namespace accessibility |