From b815cdf1933813a6864350ea1baade0bccee9ec4 Mon Sep 17 00:00:00 2001 From: Tamás Zolnai Date: Sun, 4 Dec 2016 00:03:24 +0000 Subject: tdf#93430: Cannot get accessible text attributes for 'Not in dictionary' entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 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 Tested-by: Tamás Zolnai (cherry picked from commit e0d8c3821b8fa1e7d00f7b4a7d007f9cb5c592a5) Change-Id: Ia45526c01cc381d3d6a1b56dbf4f03fdd38a0989 aa2b4fdb582025b763d43f0f24960e2ccee708e3 Reviewed-on: https://gerrit.libreoffice.org/31792 Tested-by: Jenkins Reviewed-by: Tamás Zolnai --- .../source/standard/vclxaccessibleedit.cxx | 44 +++++++++++++++++++++- include/vcl/vclmedit.hxx | 2 + vcl/unx/gtk/a11y/atktext.cxx | 18 ++++++--- vcl/unx/gtk/a11y/atktextattributes.cxx | 6 ++- 4 files changed, 63 insertions(+), 7 deletions(-) diff --git a/accessibility/source/standard/vclxaccessibleedit.cxx b/accessibility/source/standard/vclxaccessibleedit.cxx index 432315a35aea..750ce0afb337 100644 --- a/accessibility/source/standard/vclxaccessibleedit.cxx +++ b/accessibility/source/standard/vclxaccessibleedit.cxx @@ -36,6 +36,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -304,8 +308,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 pMulitLineEdit = GetAsDynamic< VclMultiLineEdit >(); + if ( pMulitLineEdit ) + { + ExtTextEngine* pTextEngine = pMulitLineEdit->GetTextEngine(); + TextPaM aCursor( 0, nIndex ); + const TextAttribFontColor* pFontColor = static_cast(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; } diff --git a/include/vcl/vclmedit.hxx b/include/vcl/vclmedit.hxx index 84b5a6bea56c..8461413eec89 100644 --- a/include/vcl/vclmedit.hxx +++ b/include/vcl/vclmedit.hxx @@ -32,6 +32,8 @@ class TextView; class VCL_DLLPUBLIC VclMultiLineEdit : public Edit { + friend class VCLXAccessibleEdit; + private: ImpVclMEdit* pImpVclMEdit; diff --git a/vcl/unx/gtk/a11y/atktext.cxx b/vcl/unx/gtk/a11y/atktext.cxx index 14cf91606d87..fbfd0fb41e11 100644 --- a/vcl/unx/gtk/a11y/atktext.cxx +++ b/vcl/unx/gtk/a11y/atktext.cxx @@ -482,12 +482,20 @@ text_wrapper_get_run_attributes( AtkText *text, css::uno::Reference pText = getText( text ); - css::uno::Reference - 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 + 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 0620be4af6af..c31fccdbeebf 100644 --- a/vcl/unx/gtk/a11y/atktextattributes.cxx +++ b/vcl/unx/gtk/a11y/atktextattributes.cxx @@ -298,7 +298,11 @@ FontSlant2Style(const uno::Any& rAny) { const gchar * value = nullptr; - switch( rAny.get() ) + awt::FontSlant aFontSlant; + if(!(rAny >>= aFontSlant)) + return nullptr; + + switch( aFontSlant ) { case awt::FontSlant_NONE: value = "normal"; -- cgit