office-gobmx/accessibility/inc/extended/accessibletablistbox.hxx
Michael Weghorn 29ab560c21 tdf#99609 a11y: Set proper parent for cells in tab list box
The a11y tree was broken: While the table has the cells
as children, the cells did not have the table set as parent,
but the table's header.

Since the IAccessibleTableCell implementation in
winaccessibility relies on the table being set as
the parent, this wouldn't work when moving around
within the tree view in the Expert Configuration dialog.

Fix this by setting the table as parent.

The issue could also be observed with the qt6 VCL
plugin on Linux and Accerciser.

With the table selected in Accerciser's tree view
of the a11y hierarchy, the incorrect hierarchy could be
seen using this in Accerciser's IPython console.

    In [8]: acc.childCount
    Out[8]: 48
    In [9]: acc.get_child_at_index(4).name
    Out[9]: 'Migration'
    In [10]: acc.get_child_at_index(4).parent == acc
    Out[10]: False
    In [11]: acc.get_child_at_index(4).parent.childCount
    Out[11]: 4

With the fix in place, the table's child's parent is
now the table again as expected:

    In [13]: acc.childCount
    Out[13]: 48
    In [14]: acc.get_child_at_index(4).name
    Out[14]: 'Migration'
    In [15]: acc.get_child_at_index(4).parent == acc
    Out[15]: True
    In [16]: acc.get_child_at_index(4).parent.childCount
    Out[16]: 48

NVDA on Windows now announces *something* when moving
between rows in the Expert Configuration dialog, but
it's not the correct row yet.
(That looks like another issue in winaccessibility code
that needs to be fixed separately.)

Change-Id: I400fa9811bb297ea7fd1accb0970811cdf11a119
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154670
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
2023-07-21 15:02:37 +02:00

102 lines
3.2 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#pragma once
#include <extended/AccessibleBrowseBox.hxx>
#include <cppuhelper/implbase1.hxx>
#include <vcl/accessibletableprovider.hxx>
class SvHeaderTabListBox;
namespace accessibility {
class AccessibleBrowseBoxTable;
typedef ::cppu::ImplHelper1 < css::accessibility::XAccessible
> AccessibleTabListBox_Base;
/** !!! */
class AccessibleTabListBox final
:public AccessibleBrowseBox
,public AccessibleTabListBox_Base
,public ::vcl::IAccessibleTabListBox
{
private:
VclPtr<SvHeaderTabListBox> m_pTabListBox;
public:
/** ctor()
@param rxParent XAccessible interface of the parent object.
@param rBox The HeaderTabListBox control. */
AccessibleTabListBox(
const css::uno::Reference< css::accessibility::XAccessible >& rxParent,
SvHeaderTabListBox& rBox );
// XInterface
DECLARE_XINTERFACE( )
// XTypeProvider
DECLARE_XTYPEPROVIDER( )
// XAccessibleContext -----------------------------------------------------
/** @return The count of visible children. */
virtual sal_Int64 SAL_CALL getAccessibleChildCount() override;
/** @return The XAccessible interface of the specified child. */
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL
getAccessibleChild( sal_Int64 nChildIndex ) override;
// XAccessibleContext
css::uno::Reference< css::accessibility::XAccessibleContext > SAL_CALL getAccessibleContext() override;
// IAccessibleTabListBox
virtual css::uno::Reference< css::accessibility::XAccessible >
getMyself() override
{
return this;
}
css::uno::Reference< css::accessibility::XAccessible >
getHeaderBar() override
{
return AccessibleBrowseBox::getHeaderBar( AccessibleBrowseBoxObjType::ColumnHeaderBar );
}
css::uno::Reference<css::accessibility::XAccessible> getTable() override
{
return implGetTable();
}
private:
/** dtor() */
virtual ~AccessibleTabListBox() override;
/** This method creates and returns an accessible table.
@return An AccessibleBrowseBoxTable. */
virtual rtl::Reference<AccessibleBrowseBoxTable> createAccessibleTable() override;
};
} // namespace accessibility
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */