Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/LibreOffice/vcl/unx/gtk3/a11y/   (Office von Apache Version 25.8.3.2©)  Datei vom 5.10.2025 mit Größe 8 kB image not shown  

Quelle  atktablecell.cxx   Sprache: 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/.
 */


#include "atkwrapper.hxx"

#include <com/sun/star/accessibility/XAccessibleTable.hpp>
#include <com/sun/star/accessibility/XAccessibleTableSelection.hpp>
#include <sal/log.hxx>

static css::uno::Reference<css::accessibility::XAccessibleContext>
getContext(AtkTableCell* pTableCell)
{
    AtkObjectWrapper* pWrap = ATK_OBJECT_WRAPPER(pTableCell);
    if (pWrap)
    {
        return pWrap->mpContext;
    }

    return css::uno::Reference<css::accessibility::XAccessibleContext>();
}

static css::uno::Reference<css::accessibility::XAccessibleTable>
getTableParent(AtkTableCell* pTableCell)
{
    AtkObject* pParent = atk_object_get_parent(ATK_OBJECT(pTableCell));
    AtkObjectWrapper* pWrap = ATK_OBJECT_WRAPPER(pParent);
    if (pWrap)
    {
        if (!pWrap->mpTable.is())
        {
            pWrap->mpTable.set(pWrap->mpContext, css::uno::UNO_QUERY);
        }

        return pWrap->mpTable;
    }

    return css::uno::Reference<css::accessibility::XAccessibleTable>();
}

extern "C" {

static int tablecell_wrapper_get_column_span(AtkTableCell* cell)
{
    int nColumnExtent = -1;
    try
    {
        css::uno::Reference<css::accessibility::XAccessibleContext> xContext = getContext(cell);
        if (!xContext.is())
            return -1;

        css::uno::Reference<css::accessibility::XAccessibleTable> xTable = getTableParent(cell);
        if (xTable.is())
        {
            const sal_Int64 nChildIndex = xContext->getAccessibleIndexInParent();
            const sal_Int32 nRow = xTable->getAccessibleRow(nChildIndex);
            const sal_Int32 nColumn = xTable->getAccessibleColumn(nChildIndex);
            nColumnExtent = xTable->getAccessibleColumnExtentAt(nRow, nColumn);
        }
    }
    catch (const css::uno::Exception&)
    {
        g_warning("Exception in tablecell_wrapper_get_column_span");
    }

    return nColumnExtent;
}

static GPtrArray* tablecell_wrapper_get_column_header_cells(AtkTableCell* cell)
{
    GPtrArray* pHeaderCells = g_ptr_array_new();
    try
    {
        css::uno::Reference<css::accessibility::XAccessibleContext> xContext = getContext(cell);
        if (!xContext.is())
            return pHeaderCells;

        css::uno::Reference<css::accessibility::XAccessibleTable> xTable = getTableParent(cell);
        if (xTable.is())
        {
            const sal_Int64 nChildIndex = xContext->getAccessibleIndexInParent();
            const sal_Int32 nCol = xTable->getAccessibleColumn(nChildIndex);
            css::uno::Reference<css::accessibility::XAccessibleTable> xHeaders
                = xTable->getAccessibleColumnHeaders();
            if (!xHeaders.is())
                return pHeaderCells;

            for (sal_Int32 nRow = 0; nRow < xHeaders->getAccessibleRowCount(); nRow++)
            {
                css::uno::Reference<css::accessibility::XAccessible> xCell
                    = xHeaders->getAccessibleCellAt(nRow, nCol);
                AtkObject* pCell = atk_object_wrapper_ref(xCell);
                g_ptr_array_add(pHeaderCells, pCell);
            }
        }
    }
    catch (const css::uno::Exception&)
    {
        g_warning("Exception in tablecell_wrapper_get_column_header_cells");
    }

    return pHeaderCells;
}

static gboolean tablecell_wrapper_get_position(AtkTableCell* cell, gint* row, gint* column)
{
    try
    {
        css::uno::Reference<css::accessibility::XAccessibleContext> xContext = getContext(cell);
        if (!xContext.is())
            return false;

        css::uno::Reference<css::accessibility::XAccessibleTable> xTable = getTableParent(cell);
        if (xTable.is())
        {
            const sal_Int64 nChildIndex = xContext->getAccessibleIndexInParent();
            *row = xTable->getAccessibleRow(nChildIndex);
            *column = xTable->getAccessibleColumn(nChildIndex);
            return true;
        }
    }
    catch (const css::uno::Exception&)
    {
        g_warning("Exception in tablecell_wrapper_get_position()");
    }

    return false;
}

static gint tablecell_wrapper_get_row_span(AtkTableCell* cell)
{
    int nRowExtent = -1;
    try
    {
        css::uno::Reference<css::accessibility::XAccessibleContext> xContext = getContext(cell);
        if (!xContext.is())
            return -1;

        css::uno::Reference<css::accessibility::XAccessibleTable> xTable = getTableParent(cell);
        if (xTable.is())
        {
            const sal_Int64 nChildIndex = xContext->getAccessibleIndexInParent();
            const sal_Int32 nRow = xTable->getAccessibleRow(nChildIndex);
            const sal_Int32 nColumn = xTable->getAccessibleColumn(nChildIndex);
            nRowExtent = xTable->getAccessibleRowExtentAt(nRow, nColumn);
        }
    }
    catch (const css::uno::Exception&)
    {
        g_warning("Exception in tablecell_wrapper_get_row_span");
    }

    return nRowExtent;
}

static GPtrArray* tablecell_wrapper_get_row_header_cells(AtkTableCell* cell)
{
    GPtrArray* pHeaderCells = g_ptr_array_new();
    try
    {
        css::uno::Reference<css::accessibility::XAccessibleContext> xContext = getContext(cell);
        if (!xContext.is())
            return pHeaderCells;

        css::uno::Reference<css::accessibility::XAccessibleTable> xTable = getTableParent(cell);
        if (xTable.is())
        {
            const sal_Int64 nChildIndex = xContext->getAccessibleIndexInParent();
            const sal_Int32 nRow = xTable->getAccessibleRow(nChildIndex);
            css::uno::Reference<css::accessibility::XAccessibleTable> xHeaders
                = xTable->getAccessibleRowHeaders();
            if (!xHeaders.is())
                return pHeaderCells;

            for (sal_Int32 nCol = 0; nCol < xHeaders->getAccessibleColumnCount(); nCol++)
            {
                css::uno::Reference<css::accessibility::XAccessible> xCell
                    = xHeaders->getAccessibleCellAt(nRow, nCol);
                AtkObject* pCell = atk_object_wrapper_ref(xCell);
                g_ptr_array_add(pHeaderCells, pCell);
            }
        }
    }
    catch (const css::uno::Exception&)
    {
        g_warning("Exception in tablecell_wrapper_get_row_header_cells");
    }

    return pHeaderCells;
}

static gboolean tablecell_wrapper_get_row_column_span(AtkTableCell* cell, gint* row, gint* column,
                                                      gint* row_span, gint* column_span)
{
    try
    {
        css::uno::Reference<css::accessibility::XAccessibleContext> xContext = getContext(cell);
        if (!xContext.is())
            return -1;

        css::uno::Reference<css::accessibility::XAccessibleTable> xTable = getTableParent(cell);
        if (xTable.is())
        {
            const sal_Int64 nChildIndex = xContext->getAccessibleIndexInParent();
            const sal_Int32 nRow = xTable->getAccessibleRow(nChildIndex);
            const sal_Int32 nColumn = xTable->getAccessibleColumn(nChildIndex);
            *row = nRow;
            *column = nColumn;
            *row_span = xTable->getAccessibleRowExtentAt(nRow, nColumn);
            *column_span = xTable->getAccessibleColumnExtentAt(nRow, nColumn);
            return true;
        }
    }
    catch (const css::uno::Exception&)
    {
        g_warning("Exception in tablecell_wrapper_get_row_column_span");
    }

    return false;
}

static AtkObject* tablecell_wrapper_get_table(AtkTableCell* cell)
{
    try
    {
        css::uno::Reference<css::accessibility::XAccessibleContext> xContext = getContext(cell);
        if (!xContext.is())
            return nullptr;

        css::uno::Reference<css::accessibility::XAccessible> xParent
            = getContext(cell)->getAccessibleParent();
        if (!xParent.is())
            return nullptr;

        return atk_object_wrapper_ref(xParent);
    }

    catch (const css::uno::Exception&)
    {
        g_warning("Exception in tablecell_wrapper_get_table()");
    }

    return nullptr;
}

// extern "C"

void tablecellIfaceInit(gpointer iface_, gpointer)
{
    auto const iface = static_cast<AtkTableCellIface*>(iface_);
    g_return_if_fail(iface != nullptr);

    iface->get_column_span = tablecell_wrapper_get_column_span;
    iface->get_column_header_cells = tablecell_wrapper_get_column_header_cells;
    iface->get_position = tablecell_wrapper_get_position;
    iface->get_row_span = tablecell_wrapper_get_row_span;
    iface->get_row_header_cells = tablecell_wrapper_get_row_header_cells;
    iface->get_row_column_span = tablecell_wrapper_get_row_column_span;
    iface->get_table = tablecell_wrapper_get_table;
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Messung V0.5
C=99 H=97 G=97

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.