offapi/com/sun/star/accessibility/AccessibleStateType.idl |    6 
 vcl/qt5/QtAccessibleWidget.cxx                            |    3 
 vcl/unx/gtk3/a11y/atkwrapper.cxx                          |    1 
 winaccessibility/source/UAccCOM/MAccessible.cxx           |  114 +++++++-------
 4 files changed, 73 insertions(+), 51 deletions(-)

New commits:
commit d6c6472bbe1c90b733a4d69c4c8528f4de3750d3
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Mon Nov 13 15:53:44 2023 +0100
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Tue Nov 14 08:09:02 2023 +0100

    tdf#123864 a11y: Add new AccessibleStateType::CHECKABLE
    
    Both, AT-SPI and IAccessible2 have a CHECKABLE state
    that describes whether an item is checkable, i.e.
    whether it can be checked, i.e. whether it is possible
    that this object can have the CHECKED state.
    
    So far, LibreOffice didn't have any equivalent, and
    e.g. a checkbox that is ticked would report state
    CHECKED but not CHECKABLE, which is inconsistent.
    ("How can an object that is not checkable be checked?")
    
    For an unchecked object, the fact that it can be checked
    is unclear since that one will just have the CHECKED state
    not being present.
    
    Introduce a new a11y state, `AccessibleStateType::CHECKABLE`
    with the same semantics as in AT-SPI and IAccessible2 to
    bridge the gap.
    
    Map the state in winaccessibility (to IAccessible2),
    gtk3 and an the Qt-based VCL plugins, which are
    responsible for mapping to AT-SPI.
    
    While Qt has an equivalent state flag, it currently
    doesn't map that to AT-SPI yet.
    Pending upstream Gerrit change to implement that: [1]
    
    The gtk4 a11y API doesn't have a direct equivalent and will
    be handled separately in a following commit.
    
    Reporting the new state where applicable will be
    implemented in following commits.
    
    [1] https://codereview.qt-project.org/c/qt/qtbase/+/517844
    
    Change-Id: I6aa7fec3b3bd728a5cfedcdc8d6b66f06337f7ce
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159382
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/offapi/com/sun/star/accessibility/AccessibleStateType.idl 
b/offapi/com/sun/star/accessibility/AccessibleStateType.idl
index 099dd6510901..f5dcad22a48a 100644
--- a/offapi/com/sun/star/accessibility/AccessibleStateType.idl
+++ b/offapi/com/sun/star/accessibility/AccessibleStateType.idl
@@ -239,6 +239,12 @@ constants AccessibleStateType
     */
     const hyper COLLAPSE = 8589934592;
 
+    /** Indicates this object is checkable, i.e. it has the potential
+        to be checked.
+        See also the CHECKED state.
+    */
+    const hyper CHECKABLE = 17179869184;
+
 };
 
 }; }; }; };
diff --git a/vcl/qt5/QtAccessibleWidget.cxx b/vcl/qt5/QtAccessibleWidget.cxx
index 47eb08b7e8c7..7eadc3313834 100644
--- a/vcl/qt5/QtAccessibleWidget.cxx
+++ b/vcl/qt5/QtAccessibleWidget.cxx
@@ -578,6 +578,9 @@ void lcl_addState(QAccessible::State* state, sal_Int64 
nState)
         case AccessibleStateType::BUSY:
             state->busy = true;
             break;
+        case AccessibleStateType::CHECKABLE:
+            state->checkable = true;
+            break;
         case AccessibleStateType::CHECKED:
             state->checked = true;
             break;
diff --git a/vcl/unx/gtk3/a11y/atkwrapper.cxx b/vcl/unx/gtk3/a11y/atkwrapper.cxx
index 8caf40020d13..49b1d371ae12 100644
--- a/vcl/unx/gtk3/a11y/atkwrapper.cxx
+++ b/vcl/unx/gtk3/a11y/atkwrapper.cxx
@@ -125,6 +125,7 @@ AtkStateType mapAtkState( sal_Int64 nState )
         MAP_DIRECT( ACTIVE );
         MAP_DIRECT( ARMED );
         MAP_DIRECT( BUSY );
+        MAP_DIRECT( CHECKABLE );
         MAP_DIRECT( CHECKED );
         MAP_DIRECT( EDITABLE );
         MAP_DIRECT( ENABLED );
diff --git a/winaccessibility/source/UAccCOM/MAccessible.cxx 
b/winaccessibility/source/UAccCOM/MAccessible.cxx
index d126fc31d716..7497a2f09f7e 100644
--- a/winaccessibility/source/UAccCOM/MAccessible.cxx
+++ b/winaccessibility/source/UAccCOM/MAccessible.cxx
@@ -128,7 +128,7 @@ bool queryTableCell(XAccessible* pXAcc, XInterface** ppXI)
 }
 
 
-void lcl_addIA2State(AccessibleStates& rStates, sal_Int64 nUnoState)
+void lcl_addIA2State(AccessibleStates& rStates, sal_Int64 nUnoState, sal_Int16 
nRole)
 {
     switch (nUnoState)
     {
@@ -138,6 +138,12 @@ void lcl_addIA2State(AccessibleStates& rStates, sal_Int64 
nUnoState)
         case css::accessibility::AccessibleStateType::ARMED:
             rStates |= IA2_STATE_ARMED;
             break;
+        case css::accessibility::AccessibleStateType::CHECKABLE:
+            // STATE_SYSTEM_PRESSED is used instead of STATE_SYSTEM_CHECKED 
for these button
+            // roles (s. AccObject::GetMSAAStateFromUNO), so don't set 
CHECKABLE state for them
+            if (nRole != AccessibleRole::PUSH_BUTTON && nRole != 
AccessibleRole::TOGGLE_BUTTON)
+                rStates |= IA2_STATE_CHECKABLE;
+            break;
         case css::accessibility::AccessibleStateType::DEFUNC:
             rStates |= IA2_STATE_DEFUNCT;
             break;
@@ -2592,7 +2598,7 @@ COM_DECLSPEC_NOTHROW STDMETHODIMP 
CMAccessible::get_states(AccessibleStates __RP
     {
         sal_Int64 nUnoState = sal_Int64(1) << i;
         if (nRStateSet & nUnoState)
-            lcl_addIA2State(*states, nUnoState);
+            lcl_addIA2State(*states, nUnoState, 
m_xContext->getAccessibleRole());
     }
 
     return S_OK;
commit 74c1e23c80eef5e246acfbfdf2287b49303ecc6f
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Mon Nov 13 13:57:17 2023 +0000
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Tue Nov 14 08:08:49 2023 +0100

    wina11y: Make UNO to IA2 state mapping more explicit
    
    Rather than having one array with UNO states and one with IAccessible2
    states, map the states explicitly using a new helper function.
    
    The third array that the
    
        // maintenance the consistency, change one array, change the three all
    
    comment was referring to is potentially one of the two
    removed in
    
        commit 3d4da2347ee6ef787902e0af57e7f9635e3bd6c0
        Date:   Fri Nov 27 16:48:38 2015 +0100
    
            Remove unused data
    
    Change-Id: I5553b28c58fedab24f2adc789ad91c9889a4ef61
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/159381
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/winaccessibility/source/UAccCOM/MAccessible.cxx 
b/winaccessibility/source/UAccCOM/MAccessible.cxx
index e4b17fa43826..d126fc31d716 100644
--- a/winaccessibility/source/UAccCOM/MAccessible.cxx
+++ b/winaccessibility/source/UAccCOM/MAccessible.cxx
@@ -65,7 +65,6 @@
 
 using namespace com::sun::star::uno;
 using namespace com::sun::star::accessibility;
-using namespace com::sun::star::accessibility::AccessibleStateType;
 
 namespace {
 
@@ -128,53 +127,60 @@ bool queryTableCell(XAccessible* pXAcc, XInterface** ppXI)
     return true;
 }
 
-}
 
-// IA2 states mapping, and name
-// maintenance the consistency, change one array, change the three all
-long const IA2_STATES[] =
-{
-    IA2_STATE_ACTIVE,                   // =                    0x1;
-    IA2_STATE_ARMED,                    // =                    0x2;
-    IA2_STATE_DEFUNCT,                  // =                    0x4;
-    IA2_STATE_EDITABLE,                 // =                    0x8;
-    IA2_STATE_HORIZONTAL,               // =                    0x10;
-    IA2_STATE_ICONIFIED,                // =                    0x20;
-    IA2_STATE_INVALID_ENTRY,            // =                    0x80;
-    IA2_STATE_MANAGES_DESCENDANTS,      // =                    0x100;
-    IA2_STATE_MODAL,                    // =                    0x200;
-    IA2_STATE_MULTI_LINE,               // =                    0x400;
-    IA2_STATE_OPAQUE,                   // =                    0x800;
-    IA2_STATE_REQUIRED,                 // =                    0x2000;
-    IA2_STATE_SELECTABLE_TEXT,          // =                    0x3000;
-    IA2_STATE_SINGLE_LINE,              // =                    0x4000;
-    IA2_STATE_STALE,                    // =                    0x8000;
-    IA2_STATE_SUPPORTS_AUTOCOMPLETION,  // =                    0x10000;
-    IA2_STATE_TRANSIENT,                //=                     0x20000;
-    IA2_STATE_VERTICAL                  // =                    0x40000;
-};
+void lcl_addIA2State(AccessibleStates& rStates, sal_Int64 nUnoState)
+{
+    switch (nUnoState)
+    {
+        case css::accessibility::AccessibleStateType::ACTIVE:
+            rStates |= IA2_STATE_ACTIVE;
+            break;
+        case css::accessibility::AccessibleStateType::ARMED:
+            rStates |= IA2_STATE_ARMED;
+            break;
+        case css::accessibility::AccessibleStateType::DEFUNC:
+            rStates |= IA2_STATE_DEFUNCT;
+            break;
+        case css::accessibility::AccessibleStateType::EDITABLE:
+            rStates |= IA2_STATE_EDITABLE;
+            break;
+        case css::accessibility::AccessibleStateType::HORIZONTAL:
+            rStates |= IA2_STATE_HORIZONTAL;
+            break;
+        case css::accessibility::AccessibleStateType::ICONIFIED:
+            rStates |= IA2_STATE_ICONIFIED;
+            break;
+        case css::accessibility::AccessibleStateType::MANAGES_DESCENDANTS:
+            rStates |= IA2_STATE_MANAGES_DESCENDANTS;
+            break;
+        case css::accessibility::AccessibleStateType::MODAL:
+            rStates |= IA2_STATE_MODAL;
+            break;
+        case css::accessibility::AccessibleStateType::MULTI_LINE:
+            rStates |= IA2_STATE_MULTI_LINE;
+            break;
+        case css::accessibility::AccessibleStateType::OPAQUE:
+            rStates |= IA2_STATE_OPAQUE;
+            break;
+        case css::accessibility::AccessibleStateType::SINGLE_LINE:
+            rStates |= IA2_STATE_SINGLE_LINE;
+            break;
+        case css::accessibility::AccessibleStateType::STALE:
+            rStates |= IA2_STATE_STALE;
+            break;
+        case css::accessibility::AccessibleStateType::TRANSIENT:
+            rStates |= IA2_STATE_TRANSIENT;
+            break;
+        case css::accessibility::AccessibleStateType::VERTICAL:
+            rStates |= IA2_STATE_VERTICAL;
+            break;
+        default:
+            // no match
+            break;
+    }
+}
 
-sal_Int64 const UNO_STATES[] =
-{
-    ACTIVE,
-    ARMED,
-    DEFUNC,
-    EDITABLE,
-    HORIZONTAL,
-    ICONIFIED,
-    -1,             //IA2_STATE_INVALID_ENTRY
-    MANAGES_DESCENDANTS,
-    MODAL,
-    MULTI_LINE,
-    OPAQUE,
-    -1,             //IA2_STATE_REQUIRED
-    -1,             //IA2_STATE_SELECTABLE_TEXT
-    SINGLE_LINE,
-    STALE,
-    -1,             //IA2_STATE_SUPPORTS_AUTOCOMPLETION
-    TRANSIENT,      //IA2_STATE_TRANSIENT
-    VERTICAL
-};
+}
 
 using namespace com::sun::star::accessibility::AccessibleRole;
 
@@ -2582,13 +2588,13 @@ COM_DECLSPEC_NOTHROW STDMETHODIMP 
CMAccessible::get_states(AccessibleStates __RP
         m_xContext->getAccessibleStateSet();
 
     *states = 0x0;
-    for( std::size_t j = 0; j < SAL_N_ELEMENTS(UNO_STATES); j++ )
+    for (int i = 0; i < 63; ++i)
     {
-        if( (UNO_STATES[j] != -1) && (nRStateSet & UNO_STATES[j]) )
-        {
-            *states |= IA2_STATES[j];
-        }
+        sal_Int64 nUnoState = sal_Int64(1) << i;
+        if (nRStateSet & nUnoState)
+            lcl_addIA2State(*states, nUnoState);
     }
+
     return S_OK;
 
 

Reply via email to