accessibility/source/extended/AccessibleGridControlTable.cxx |   14 +++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

New commits:
commit 256926cace5819b0107e8d24579e05bcab9b5a7e
Author:     Michael Weghorn <m.wegh...@posteo.de>
AuthorDate: Tue Aug 1 18:12:18 2023 +0200
Commit:     Michael Weghorn <m.wegh...@posteo.de>
CommitDate: Wed Aug 2 05:09:07 2023 +0200

    tdf#156473 a11y: Don't use selection index as child index
    
    `XAccessibleSelection::getSelectedAccessibleChild` takes
    the index into the selection, not the child index, as its
    documentation (in
    `offapi/com/sun/star/accessibility/XAccessibleSelection.idl`)
    says:
    
    > @param nSelectedChildIndex
    >     This index refers only to the selected children, not to all the
    >     children of this object.  Even if all children are selected, the
    >     indices enumerating the selected children need not be the same
    >     as those enumerating all children.  If only single selection is
    >     supported the only valid value is 0.
    
    The previous handling here in
    `AccessibleGridControlTable::getSelectedAccessibleChild`
    was treating it as the child index, though. Therefore
    trying to get the selected children would break once
    any row other than the first was selected.
    
    Fix this by calculating the actual row/column index
    of the cell from the given *selection* index.
    
    This could be observed e.g. with the qt6 VCL plugin by
    querying selection from Accerciser, with the last row
    selected in the table from the tdf#156473 macro in LO
    and the corresponding table object selected in
    Accerciser's tree view of the LO a11y hierarchy:
    
    Before:
    
        In [41]: sel = acc.querySelection()
        In [42]: sel.nSelectedChildren
        Out[42]: 5
        In [43]: sel.getSelectedChild(0)
        In [44]: sel.getSelectedChild(0) == None
        Out[44]: True
    
    With the fix in place:
    
        In [48]: sel = acc.querySelection()
        In [49]: sel.nSelectedChildren
        Out[49]: 5
        In [50]: sel.getSelectedChild(0)
        Out[50]: <Atspi.Accessible object at 0x7fcaeaddb900 (AtspiAccessible at 
0x3ae4a80)>
        In [51]: sel.getSelectedChild(0).name
        Out[51]: 'C1 , R4 , '
        In [52]: sel.getSelectedChild(1).name
        Out[52]: 'C2 , R4 , '
        In [53]: sel.getSelectedChild(4).name
        Out[53]: 'Column 5 , R4 , '
    
    Change-Id: Id7d42a89b913d2ed101a9edb45dee5f3d870dbbd
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155190
    Tested-by: Jenkins
    Reviewed-by: Michael Weghorn <m.wegh...@posteo.de>

diff --git a/accessibility/source/extended/AccessibleGridControlTable.cxx 
b/accessibility/source/extended/AccessibleGridControlTable.cxx
index 579826195be2..4629a4b3ee66 100644
--- a/accessibility/source/extended/AccessibleGridControlTable.cxx
+++ b/accessibility/source/extended/AccessibleGridControlTable.cxx
@@ -253,10 +253,16 @@ AccessibleGridControlTable::getSelectedAccessibleChild( 
sal_Int64 nSelectedChild
     SolarMutexGuard aSolarGuard;
 
     ensureIsAlive();
-    if(isAccessibleChildSelected(nSelectedChildIndex))
-        return getAccessibleChild(nSelectedChildIndex);
-    else
-        return nullptr;
+    if (nSelectedChildIndex < 0 || nSelectedChildIndex >= 
getSelectedAccessibleChildCount())
+        throw lang::IndexOutOfBoundsException("Invalid index into selection", 
*this);
+
+    const sal_Int32 nColCount = getAccessibleColumnCount();
+    assert(nColCount > 0 && "Column count non-positive, but child count > 0");
+    const sal_Int32 nIndexInSelectedRowsSequence = nSelectedChildIndex / 
nColCount;
+    const Sequence<sal_Int32> aSelectedRows = getSelectedAccessibleRows();
+    const sal_Int32 nRowIndex = aSelectedRows[nIndexInSelectedRowsSequence];
+    const sal_Int32 nColIndex = nSelectedChildIndex % nColCount;
+    return getAccessibleCellAt(nRowIndex, nColIndex);
 }
 //not implemented yet, because only row selection possible
 void SAL_CALL AccessibleGridControlTable::deselectAccessibleChild(

Reply via email to