office-gobmx/accessibility/inc/extended/AccessibleGridControlTableBase.hxx
Michael Weghorn 18aed6fc4f tdf#156473 a11y: Use actual row/col index/count in grid control header
The row header bar of a grid control is a table with
just one column, containing a row header cell for
each of the rows in the table holding the actual data.
Likewise, a column header bar just has one row.

This was previously incorrectly reported on the a11y layer,
as could e.g. be seen in Accerciser with the sample macro
from tdf#156473.

Also make the `AccessibleGridControlCell` ctor pass the
`_nColumnRowId` as what it actually is (a row index
in case of a row header cell, a column index in case
of a column header cell) instead of always as a row
index, and then having special handling for that
elsewhere again
(s. `AccessibleGridControlCell::getAccessibleName`).

Also move an assert from
`AccessibleGridControlCell::getAccessibleName` to
the ctor and check the indices there.

With this in place, the row and column header bars
for the example from tdf#156473 now report the correct
amount of rows and columns, and the row/column header
cells report the correct row and column indices.

Change-Id: I29f71ac46b6d841e26d68ca01bd05ba9412aed13
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/155224
Tested-by: Jenkins
Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
2023-08-03 16:53:58 +02:00

175 lines
6.9 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/AccessibleGridControlBase.hxx>
#include <cppuhelper/implbase1.hxx>
#include <com/sun/star/accessibility/XAccessibleTable.hpp>
namespace accessibility {
typedef ::cppu::ImplHelper1 < css::accessibility::XAccessibleTable >
AccessibleGridControlTableImplHelper;
/** The Grid Control accessible table objects inherit from this base class. It
implements basic functionality for the XAccessibleTable interface.
Grid COntrol table objects are: the data table, the column header bar and the
row header bar. */
class AccessibleGridControlTableBase :
public GridControlAccessibleElement,
public AccessibleGridControlTableImplHelper
{
public:
/** Constructor sets specified name and description.
@param rxParent XAccessible interface of the parent object.
@param rTable The Table control.
@param eObjType Type of table control object */
AccessibleGridControlTableBase(
const css::uno::Reference< css::accessibility::XAccessible >& rxParent,
::vcl::table::IAccessibleTable& rTable,
::vcl::table::AccessibleTableControlObjType eObjType );
protected:
virtual ~AccessibleGridControlTableBase() override = default;
public:
// XAccessibleContext
/** @return The count of visible children. */
virtual sal_Int64 SAL_CALL getAccessibleChildCount() override;
/** @return The role of this object (a table). */
virtual sal_Int16 SAL_CALL getAccessibleRole() override;
/* Derived classes have to implement:
- getAccessibleChild,
- getAccessibleIndexInParent. */
// XAccessibleComponent
/* Derived classes have to implement:
- getAccessibleAt,
- grabFocus. */
// XAccessibleTable
/** @return The number of used rows in the table (0 = empty table). */
virtual sal_Int32 SAL_CALL getAccessibleRowCount() override;
/** @return The number of used columns in the table (0 = empty table). */
virtual sal_Int32 SAL_CALL getAccessibleColumnCount() override;
/** @return The row extent of the specified cell (always 1). */
virtual sal_Int32 SAL_CALL
getAccessibleRowExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) override;
/** @return The column extent of the specified cell (always 1). */
virtual sal_Int32 SAL_CALL
getAccessibleColumnExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) override;
/** @return The caption cell of the table (not supported). */
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL
getAccessibleCaption() override;
/** @return The summary object of the table (not supported). */
virtual css::uno::Reference< css::accessibility::XAccessible > SAL_CALL
getAccessibleSummary() override;
/** @return The child index of the specified cell. */
virtual sal_Int64 SAL_CALL getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn ) override;
/** @return The row index of the specified child cell. */
virtual sal_Int32 SAL_CALL getAccessibleRow( sal_Int64 nChildIndex ) override;
/** @return The column index of the specified child cell. */
virtual sal_Int32 SAL_CALL getAccessibleColumn( sal_Int64 nChildIndex ) override;
/* Derived classes have to implement:
- getAccessibleRowDescription,
- getAccessibleColumnDescription,
- getAccessibleRowHeaders,
- getAccessibleColumnHeaders,
- getSelectedAccessibleRows,
- getSelectedAccessibleColumns,
- isAccessibleRowSelected,
- isAccessibleColumnSelected,
- getAccessibleCellAt,
- isAccessibleSelected. */
// XInterface
/** Queries for a new interface. */
css::uno::Any SAL_CALL queryInterface( const css::uno::Type& rType ) override;
/** Acquires the object (calls acquire() on base class). */
virtual void SAL_CALL acquire() noexcept override;
/** Releases the object (calls release() on base class). */
virtual void SAL_CALL release() noexcept override;
// XTypeProvider
/** @return a sequence of possible types (received from base classes). */
virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes() override;
/** @return a unique implementation ID. */
virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override;
protected:
// internal helper methods
/** @attention This method requires locked mutex's and a living object.
@return The row index of the specified cell index. */
sal_Int32 implGetRow( sal_Int64 nChildIndex );
/** @attention This method requires locked mutex's and a living object.
@return The column index of the specified cell index. */
sal_Int32 implGetColumn( sal_Int64 nChildIndex );
/** Fills a sequence with sorted indexes of completely selected rows.
@attention This method requires locked mutex's and a living object.
@param rSeq Out-parameter that takes the sorted row index list. */
void implGetSelectedRows( css::uno::Sequence< sal_Int32 >& rSeq );
/** @attention This method requires locked mutex's and a living object.
@throws <type>IndexOutOfBoundsException</type>
If the specified row index is invalid. */
void ensureIsValidRow( sal_Int32 nRow );
/** @attention This method requires locked mutex's and a living object.
@throws <type>IndexOutOfBoundsException</type>
If the specified column index is invalid. */
void ensureIsValidColumn( sal_Int32 nColumn );
/** @attention This method requires locked mutex's and a living object.
@throws <type>IndexOutOfBoundsException</type>
If the specified cell address is invalid. */
void ensureIsValidAddress( sal_Int32 nRow, sal_Int32 nColumn );
/** @attention This method requires locked mutex's and a living object.
@throws <type>IndexOutOfBoundsException</type>
If the specified child index is invalid. */
void ensureIsValidIndex( sal_Int64 nChildIndex );
};
} // namespace accessibility
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */