accessibility/source/standard/vclxaccessibleedit.cxx | 59 ++++++++++++++++++- include/vcl/texteng.hxx | 2 include/vcl/vclmedit.hxx | 2 vcl/source/edit/texteng.cxx | 20 ++++++ vcl/unx/gtk/a11y/atktext.cxx | 18 ++++- vcl/unx/gtk/a11y/atktextattributes.cxx | 6 + 6 files changed, 100 insertions(+), 7 deletions(-)
New commits: commit c5b71538e9cd7854f502d20c36396176a49bef2b Author: Tamás Zolnai <zolnaitamas2...@gmail.com> Date: Sun Dec 4 00:03:24 2016 +0000 tdf#93430: Cannot get accessible text attributes for 'Not in dictionary' entry Squashed from two commits: tdf#93430: Get run attributes of text objects .. which are not paragraphs. Note: For some reason in character attributes sequence we have a wrong Any value for "CharPosture" property. Signed-off-by: Tamás Zolnai <tamas.zol...@collabora.com> Reviewed-on: https://gerrit.libreoffice.org/31591 (cherry picked from commit 17773e1a8dd6e97f57db111819338c418f819cef) tdf#93430: Cannot get accessible text attributes for 'Not in dictionary' entry Reviewed-on: https://gerrit.libreoffice.org/31778 Reviewed-by: Tamás Zolnai <tamas.zol...@collabora.com> Tested-by: Tamás Zolnai <tamas.zol...@collabora.com> (cherry picked from commit e0d8c3821b8fa1e7d00f7b4a7d007f9cb5c592a5) Reviewed-on: https://gerrit.libreoffice.org/31792 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Tamás Zolnai <tamas.zol...@collabora.com> tdf#93430: Return the right offsets for runs MultiLineEdit is a special control which can have more text portions with different text attributes. Reviewed-on: https://gerrit.libreoffice.org/31813 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Tamás Zolnai <tamas.zol...@collabora.com> (cherry picked from commit 8d52045853cecb716138d51b8b6ad0272a86af86) Change-Id: Ia45526c01cc381d3d6a1b56dbf4f03fdd38a0989 Reviewed-on: https://gerrit.libreoffice.org/31804 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/accessibility/source/standard/vclxaccessibleedit.cxx b/accessibility/source/standard/vclxaccessibleedit.cxx index 9ef0025..f36ee0b 100644 --- a/accessibility/source/standard/vclxaccessibleedit.cxx +++ b/accessibility/source/standard/vclxaccessibleedit.cxx @@ -30,12 +30,17 @@ #include <com/sun/star/accessibility/AccessibleEventId.hpp> #include <com/sun/star/accessibility/AccessibleRole.hpp> #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp> +#include <com/sun/star/accessibility/AccessibleTextType.hpp> #include <cppuhelper/typeprovider.hxx> #include <comphelper/sequence.hxx> #include <comphelper/string.hxx> #include <vcl/svapp.hxx> #include <vcl/window.hxx> #include <vcl/edit.hxx> +#include <vcl/vclmedit.hxx> +#include <vcl/textdata.hxx> +#include <vcl/txtattr.hxx> +#include <vcl/xtextedt.hxx> #include <sot/exchange.hxx> #include <sot/formats.hxx> @@ -305,8 +310,46 @@ sal_Unicode VCLXAccessibleEdit::getCharacter( sal_Int32 nIndex ) throw (IndexOut Sequence< PropertyValue > VCLXAccessibleEdit::getCharacterAttributes( sal_Int32 nIndex, const Sequence< OUString >& aRequestedAttributes ) throw (IndexOutOfBoundsException, RuntimeException, std::exception) { OExternalLockGuard aGuard( this ); + Sequence< PropertyValue > aProperties = VCLXAccessibleTextComponent::getCharacterAttributes( nIndex, aRequestedAttributes ); - return VCLXAccessibleTextComponent::getCharacterAttributes( nIndex, aRequestedAttributes ); + // Handle multiline edit character properties + VclPtr<VclMultiLineEdit> pMulitLineEdit = GetAsDynamic< VclMultiLineEdit >(); + if ( pMulitLineEdit ) + { + ExtTextEngine* pTextEngine = pMulitLineEdit->GetTextEngine(); + TextPaM aCursor( 0, nIndex ); + const TextAttribFontColor* pFontColor = static_cast<const TextAttribFontColor* >(pTextEngine->FindAttrib( aCursor, TEXTATTR_FONTCOLOR )); + if ( pFontColor ) + { + for (PropertyValue& aValue : aProperties ) + { + if (aValue.Name == "CharColor") + { + aValue.Value = css::uno::makeAny(static_cast< sal_Int32 >(COLORDATA_RGB(pFontColor->GetColor().GetColor()))); + break; + } + } + } + } + + // Set default character color if it is not set yet to a valid value + for (PropertyValue& aValue : aProperties ) + { + if (aValue.Name == "CharColor") + { + if ( aValue.Value == sal_Int32(-1) ) + { + OutputDevice* pDev = Application::GetDefaultDevice(); + if ( pDev ) + { + aValue.Value = css::uno::makeAny(static_cast< sal_Int32 >(pDev->GetSettings().GetStyleSettings().GetFieldTextColor().GetColor())); + } + } + break; + } + } + + return aProperties; } @@ -434,6 +477,20 @@ css::accessibility::TextSegment VCLXAccessibleEdit::getTextAtIndex( sal_Int32 nI { OExternalLockGuard aGuard( this ); + // Override general text component behavior: MultiLineEdit can have more text portions + if ( aTextType == AccessibleTextType::ATTRIBUTE_RUN ) + { + VclPtr<VclMultiLineEdit> pMulitLineEdit = GetAsDynamic< VclMultiLineEdit >(); + if ( pMulitLineEdit ) + { + ExtTextEngine* pTextEngine = pMulitLineEdit->GetTextEngine(); + TextPaM aCursor( 0, nIndex ); + TextSegment aResult; + pTextEngine->GetTextPortionRange( aCursor, aResult.SegmentStart, aResult.SegmentEnd ); + return aResult; + } + } + return VCLXAccessibleTextComponent::getTextAtIndex( nIndex, aTextType ); } diff --git a/include/vcl/texteng.hxx b/include/vcl/texteng.hxx index 3a5c3c9..1a49733 100644 --- a/include/vcl/texteng.hxx +++ b/include/vcl/texteng.hxx @@ -262,6 +262,8 @@ public: sal_Int32 GetTextLen( sal_uInt32 nParagraph ) const; long GetTextHeight( sal_uInt32 nParagraph ) const; + void GetTextPortionRange(const TextPaM& rPaM, sal_Int32& nStart, sal_Int32& nEnd); + sal_uInt16 GetLineCount( sal_uInt32 nParagraph ) const; sal_Int32 GetLineLen( sal_uInt32 nParagraph, sal_uInt16 nLine ) const; diff --git a/include/vcl/vclmedit.hxx b/include/vcl/vclmedit.hxx index de13e6f..768dda4 100644 --- a/include/vcl/vclmedit.hxx +++ b/include/vcl/vclmedit.hxx @@ -32,6 +32,8 @@ class ExtTextView; class VCL_DLLPUBLIC VclMultiLineEdit : public Edit { + friend class VCLXAccessibleEdit; + private: ImpVclMEdit* pImpVclMEdit; diff --git a/vcl/source/edit/texteng.cxx b/vcl/source/edit/texteng.cxx index df1de5b..1a91f99 100644 --- a/vcl/source/edit/texteng.cxx +++ b/vcl/source/edit/texteng.cxx @@ -1223,6 +1223,26 @@ long TextEngine::CalcTextWidth( sal_uInt32 nPara, sal_Int32 nPortionStart, sal_I return nWidth; } +void TextEngine::GetTextPortionRange(const TextPaM& rPaM, sal_Int32& nStart, sal_Int32& nEnd) +{ + nStart = 0; + nEnd = 0; + TEParaPortion* pParaPortion = mpTEParaPortions->GetObject( rPaM.GetPara() ); + for ( size_t i = 0; i < pParaPortion->GetTextPortions().size(); ++i ) + { + TETextPortion* pTextPortion = pParaPortion->GetTextPortions()[ i ]; + if (nStart + pTextPortion->GetLen() > rPaM.GetIndex()) + { + nEnd = nStart + pTextPortion->GetLen(); + return; + } + else + { + nStart += pTextPortion->GetLen(); + } + } +} + sal_uInt16 TextEngine::GetLineCount( sal_uInt32 nParagraph ) const { DBG_ASSERT( nParagraph < mpTEParaPortions->Count(), "GetLineCount: Out of range" ); diff --git a/vcl/unx/gtk/a11y/atktext.cxx b/vcl/unx/gtk/a11y/atktext.cxx index 5c662a7..425b335 100644 --- a/vcl/unx/gtk/a11y/atktext.cxx +++ b/vcl/unx/gtk/a11y/atktext.cxx @@ -494,12 +494,20 @@ text_wrapper_get_run_attributes( AtkText *text, css::uno::Reference<css::accessibility::XAccessibleText> pText = getText( text ); - css::uno::Reference<css::accessibility::XAccessibleTextAttributes> - pTextAttributes = getTextAttributes( text ); - if( pText.is() && pTextAttributes.is() ) + if( pText.is()) { - uno::Sequence< beans::PropertyValue > aAttributeList = - pTextAttributes->getRunAttributes( offset, uno::Sequence< OUString > () ); + uno::Sequence< beans::PropertyValue > aAttributeList; + + css::uno::Reference<css::accessibility::XAccessibleTextAttributes> + pTextAttributes = getTextAttributes( text ); + if(pTextAttributes.is()) // Text attributes are available for paragraphs only + { + aAttributeList = pTextAttributes->getRunAttributes( offset, uno::Sequence< OUString > () ); + } + else // For other text objects use character attributes + { + aAttributeList = pText->getCharacterAttributes( offset, uno::Sequence< OUString > () ); + } pSet = attribute_set_new_from_property_values( aAttributeList, true, text ); // #i100938# diff --git a/vcl/unx/gtk/a11y/atktextattributes.cxx b/vcl/unx/gtk/a11y/atktextattributes.cxx index b7857d0..43d6d9c 100644 --- a/vcl/unx/gtk/a11y/atktextattributes.cxx +++ b/vcl/unx/gtk/a11y/atktextattributes.cxx @@ -301,7 +301,11 @@ FontSlant2Style(const uno::Any& rAny) { const gchar * value = nullptr; - switch( rAny.get<awt::FontSlant>() ) + awt::FontSlant aFontSlant; + if(!(rAny >>= aFontSlant)) + return nullptr; + + switch( aFontSlant ) { case awt::FontSlant_NONE: value = "normal";
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits