[Libreoffice-commits] core.git: Branch 'libreoffice-5-2' - accessibility/source include/vcl vcl/source vcl/unx

Tamás Zolnai zolnaitamas2000 at gmail.com
Sun Dec 11 20:54:43 UTC 2016


 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 <zolnaitamas2000 at 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.zolnai at 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.zolnai at collabora.com>
    Tested-by: Tamás Zolnai <tamas.zolnai at collabora.com>
    (cherry picked from commit e0d8c3821b8fa1e7d00f7b4a7d007f9cb5c592a5)
    
    Reviewed-on: https://gerrit.libreoffice.org/31792
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Tamás Zolnai <tamas.zolnai at 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 <ci at libreoffice.org>
    Reviewed-by: Tamás Zolnai <tamas.zolnai at collabora.com>
    (cherry picked from commit 8d52045853cecb716138d51b8b6ad0272a86af86)
    
    Change-Id: Ia45526c01cc381d3d6a1b56dbf4f03fdd38a0989
    Reviewed-on: https://gerrit.libreoffice.org/31804
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at 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";


More information about the Libreoffice-commits mailing list