summaryrefslogtreecommitdiff
path: root/toolkit/source/controls/table/AccessibleGridControlTableBase.cxx
diff options
context:
space:
mode:
authorMichael Weghorn <m.weghorn@posteo.de>2025-01-23 16:26:57 +0100
committerMichael Weghorn <m.weghorn@posteo.de>2025-01-24 07:37:59 +0100
commitd040635b8e0b74a1d6cfee175cdc64bd29c60a84 (patch)
treec1c2b60cdd34e54651a1fc1d41452055d9b18fab /toolkit/source/controls/table/AccessibleGridControlTableBase.cxx
parent6fc13fb03bc96eda65b91fd65ada26a162437404 (diff)
a11y: Move AccessibleGridControl* classes to toolkit
Move AccessibleGridControlAccess and all related classes from vcl to toolkit, as that is where the grid control that makes use of them is located. Stop using the AccessibleFactory to create the AccessibleGridControlAccess, but call the ctor directly in TableControl_Impl::getAccessible, now that the class is also in the toolkit module. Further simplificiation can happen in upcoming commits. Change-Id: Ic93796bce96916192da7cfffcf1faf00905373c7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/180668 Reviewed-by: Michael Weghorn <m.weghorn@posteo.de> Tested-by: Jenkins
Diffstat (limited to 'toolkit/source/controls/table/AccessibleGridControlTableBase.cxx')
-rw-r--r--toolkit/source/controls/table/AccessibleGridControlTableBase.cxx213
1 files changed, 213 insertions, 0 deletions
diff --git a/toolkit/source/controls/table/AccessibleGridControlTableBase.cxx b/toolkit/source/controls/table/AccessibleGridControlTableBase.cxx
new file mode 100644
index 000000000000..16614ad0b1d1
--- /dev/null
+++ b/toolkit/source/controls/table/AccessibleGridControlTableBase.cxx
@@ -0,0 +1,213 @@
+/* -*- 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 .
+ */
+
+#include <com/sun/star/accessibility/AccessibleRole.hpp>
+#include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
+#include <controls/table/AccessibleGridControlTableBase.hxx>
+#include <vcl/accessibletable.hxx>
+#include <vcl/svapp.hxx>
+#include <comphelper/sequence.hxx>
+
+using css::uno::Reference;
+using css::uno::Sequence;
+using css::uno::Any;
+
+using namespace ::com::sun::star;
+using namespace ::com::sun::star::accessibility;
+using namespace ::vcl;
+using namespace ::vcl::table;
+
+
+namespace accessibility {
+
+
+AccessibleGridControlTableBase::AccessibleGridControlTableBase(
+ const Reference< XAccessible >& rxParent,
+ IAccessibleTable& rTable,
+ AccessibleTableControlObjType eObjType ) :
+ AccessibleGridControlTableImplHelper( rxParent, rTable, eObjType )
+{
+}
+
+// XAccessibleContext ---------------------------------------------------------
+
+sal_Int64 SAL_CALL AccessibleGridControlTableBase::getAccessibleChildCount()
+{
+ SolarMutexGuard aSolarGuard;
+
+ ensureIsAlive();
+ sal_Int64 nChildren = 0;
+ if (m_eObjType == AccessibleTableControlObjType::ROWHEADERBAR)
+ nChildren = m_aTable.GetRowCount();
+ else if (m_eObjType == AccessibleTableControlObjType::TABLE)
+ nChildren = static_cast<sal_Int64>(m_aTable.GetRowCount()) * static_cast<sal_Int64>(m_aTable.GetColumnCount());
+ else if (m_eObjType == AccessibleTableControlObjType::COLUMNHEADERBAR)
+ nChildren = m_aTable.GetColumnCount();
+ return nChildren;
+}
+
+sal_Int16 SAL_CALL AccessibleGridControlTableBase::getAccessibleRole()
+{
+ SolarMutexGuard g;
+
+ ensureIsAlive();
+ return AccessibleRole::TABLE;
+}
+
+// XAccessibleTable -----------------------------------------------------------
+
+sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleRowCount()
+{
+ SolarMutexGuard aSolarGuard;
+
+ ensureIsAlive();
+
+ if (m_eObjType == AccessibleTableControlObjType::COLUMNHEADERBAR)
+ return 1;
+ return m_aTable.GetRowCount();
+}
+
+sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleColumnCount()
+{
+ SolarMutexGuard aSolarGuard;
+
+ ensureIsAlive();
+
+ if (m_eObjType == AccessibleTableControlObjType::ROWHEADERBAR)
+ return 1;
+ return m_aTable.GetColumnCount();
+}
+
+sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleRowExtentAt(
+ sal_Int32 nRow, sal_Int32 nColumn )
+{
+ SolarMutexGuard aSolarGuard;
+
+ ensureIsAlive();
+ ensureIsValidAddress( nRow, nColumn );
+ return 1; // merged cells not supported
+}
+
+sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleColumnExtentAt(
+ sal_Int32 nRow, sal_Int32 nColumn )
+{
+ SolarMutexGuard aSolarGuard;
+
+ ensureIsAlive();
+ ensureIsValidAddress( nRow, nColumn );
+ return 1; // merged cells not supported
+}
+
+Reference< XAccessible > SAL_CALL AccessibleGridControlTableBase::getAccessibleCaption()
+{
+ SolarMutexGuard g;
+
+ ensureIsAlive();
+ return nullptr; // not supported
+}
+
+Reference< XAccessible > SAL_CALL AccessibleGridControlTableBase::getAccessibleSummary()
+{
+ SolarMutexGuard g;
+
+ ensureIsAlive();
+ return nullptr; // not supported
+}
+
+sal_Int64 SAL_CALL AccessibleGridControlTableBase::getAccessibleIndex(
+ sal_Int32 nRow, sal_Int32 nColumn )
+{
+ SolarMutexGuard aSolarGuard;
+
+ ensureIsAlive();
+ ensureIsValidAddress( nRow, nColumn );
+ return static_cast<sal_Int64>(nRow) * static_cast<sal_Int64>(m_aTable.GetColumnCount()) + nColumn;
+}
+
+sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleRow( sal_Int64 nChildIndex )
+{
+ SolarMutexGuard aSolarGuard;
+
+ ensureIsAlive();
+ ensureIsValidIndex( nChildIndex );
+ return implGetRow( nChildIndex );
+}
+
+sal_Int32 SAL_CALL AccessibleGridControlTableBase::getAccessibleColumn( sal_Int64 nChildIndex )
+{
+ SolarMutexGuard aSolarGuard;
+
+ ensureIsAlive();
+ ensureIsValidIndex( nChildIndex );
+ return implGetColumn( nChildIndex );
+}
+
+// internal helper methods ----------------------------------------------------
+
+sal_Int32 AccessibleGridControlTableBase::implGetRow( sal_Int64 nChildIndex )
+{
+ sal_Int32 nColumns = getAccessibleColumnCount();
+ return nColumns ? (nChildIndex / nColumns) : 0;
+}
+
+sal_Int32 AccessibleGridControlTableBase::implGetColumn( sal_Int64 nChildIndex )
+{
+ sal_Int32 nColumns = getAccessibleColumnCount();
+ return nColumns ? (nChildIndex % nColumns) : 0;
+}
+
+void AccessibleGridControlTableBase::implGetSelectedRows( Sequence< sal_Int32 >& rSeq )
+{
+ sal_Int32 const selectionCount( m_aTable.GetSelectedRowCount() );
+ rSeq.realloc( selectionCount );
+ auto pSeq = rSeq.getArray();
+ for ( sal_Int32 i=0; i<selectionCount; ++i )
+ pSeq[i] = m_aTable.GetSelectedRowIndex(i);
+}
+
+void AccessibleGridControlTableBase::ensureIsValidRow( sal_Int32 nRow )
+{
+ if (nRow >= getAccessibleRowCount())
+ throw lang::IndexOutOfBoundsException( u"row index is invalid"_ustr, *this );
+}
+
+void AccessibleGridControlTableBase::ensureIsValidColumn( sal_Int32 nColumn )
+{
+ if (nColumn >= getAccessibleColumnCount())
+ throw lang::IndexOutOfBoundsException( u"column index is invalid"_ustr, *this );
+}
+
+void AccessibleGridControlTableBase::ensureIsValidAddress(
+ sal_Int32 nRow, sal_Int32 nColumn )
+{
+ ensureIsValidRow( nRow );
+ ensureIsValidColumn( nColumn );
+}
+
+void AccessibleGridControlTableBase::ensureIsValidIndex( sal_Int64 nChildIndex )
+{
+ if (nChildIndex >= static_cast<sal_Int64>(m_aTable.GetRowCount()) * static_cast<sal_Int64>(m_aTable.GetColumnCount()))
+ throw lang::IndexOutOfBoundsException( u"child index is invalid"_ustr, *this );
+}
+
+
+} // namespace accessibility
+
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */