/* This file is part of the GtkHTML library.
*
* Copyright 2002 Ximian, Inc.
*
* Author: Radek Doulik
*
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include
#include
#include "htmltable.h"
#include "htmltablecell.h"
#include "gtkhtml.h"
#include "htmlengine.h"
#include "html.h"
#include "object.h"
#include "table.h"
#include "utils.h"
static void html_a11y_table_class_init (HTMLA11YTableClass *klass);
static void html_a11y_table_init (HTMLA11YTable *a11y_table);
static void atk_table_interface_init (AtkTableIface *iface);
static AtkObject * html_a11y_table_ref_at (AtkTable *table, gint row, gint column);
static gint html_a11y_table_get_index_at (AtkTable *table, gint row, gint column);
static gint html_a11y_table_get_column_at_index (AtkTable *table, gint index);
static gint html_a11y_table_get_row_at_index (AtkTable *table, gint index);
static gint html_a11y_table_get_n_columns (AtkTable *table);
static gint html_a11y_table_get_n_rows (AtkTable *table);
static gint html_a11y_table_get_column_extent_at (AtkTable *table, gint row, gint column);
static gint html_a11y_table_get_row_extent_at (AtkTable *table, gint row, gint column);
static AtkObject * html_a11y_table_get_column_header (AtkTable *table, gint column);
static AtkObject * html_a11y_table_get_row_header (AtkTable *table, gint row);
static AtkObjectClass *parent_class = NULL;
GType
html_a11y_table_get_type (void)
{
static GType type = 0;
if (!type) {
static const GTypeInfo tinfo = {
sizeof (HTMLA11YTableClass),
NULL, /* base init */
NULL, /* base finalize */
(GClassInitFunc) html_a11y_table_class_init, /* class init */
NULL, /* class finalize */
NULL, /* class data */
sizeof (HTMLA11YTable), /* instance size */
0, /* nb preallocs */
(GInstanceInitFunc) html_a11y_table_init, /* instance init */
NULL /* value table */
};
static const GInterfaceInfo atk_table_info = {
(GInterfaceInitFunc) atk_table_interface_init,
(GInterfaceFinalizeFunc) NULL,
NULL
};
type = g_type_register_static (G_TYPE_HTML_A11Y, "HTMLA11YTable", &tinfo, 0);
g_type_add_interface_static (type, ATK_TYPE_TABLE, &atk_table_info);
}
return type;
}
static void
atk_table_interface_init (AtkTableIface *iface)
{
g_return_if_fail (iface != NULL);
iface->ref_at = html_a11y_table_ref_at;
iface->get_index_at = html_a11y_table_get_index_at;
iface->get_column_at_index = html_a11y_table_get_column_at_index;
iface->get_row_at_index = html_a11y_table_get_row_at_index;
iface->get_n_columns = html_a11y_table_get_n_columns;
iface->get_n_rows = html_a11y_table_get_n_rows;
iface->get_column_extent_at = html_a11y_table_get_column_extent_at;
iface->get_row_extent_at = html_a11y_table_get_row_extent_at;
iface->get_column_header = html_a11y_table_get_column_header;
iface->get_row_header = html_a11y_table_get_row_header;
}
static void
html_a11y_table_finalize (GObject *obj)
{
G_OBJECT_CLASS (parent_class)->finalize (obj);
}
static void
html_a11y_table_initialize (AtkObject *obj, gpointer data)
{
/* printf ("html_a11y_table_initialize\n"); */
if (ATK_OBJECT_CLASS (parent_class)->initialize)
ATK_OBJECT_CLASS (parent_class)->initialize (obj, data);
}
static void
html_a11y_table_class_init (HTMLA11YTableClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
AtkObjectClass *atk_class = ATK_OBJECT_CLASS (klass);
parent_class = g_type_class_peek_parent (klass);
atk_class->initialize = html_a11y_table_initialize;
gobject_class->finalize = html_a11y_table_finalize;
}
static void
html_a11y_table_init (HTMLA11YTable *a11y_table)
{
}
AtkObject*
html_a11y_table_new (HTMLObject *html_obj)
{
GObject *object;
AtkObject *accessible;
g_return_val_if_fail (HTML_IS_TABLE (html_obj), NULL);
object = g_object_new (G_TYPE_HTML_A11Y_TABLE, NULL);
accessible = ATK_OBJECT (object);
atk_object_initialize (accessible, html_obj);
accessible->role = ATK_ROLE_TABLE;
/* printf ("created new html accessible table object\n"); */
return accessible;
}
static gboolean
is_valid (AtkObject *table)
{
GtkHTMLA11Y * htmla11y = html_a11y_get_gtkhtml_parent (HTML_A11Y (table));
GtkHTML *html = GTK_HTML_A11Y_GTKHTML (htmla11y);
AtkStateSet *ss;
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
if (!htmla11y)
return FALSE;
if (!to)
return FALSE;
if (html->engine->parsing)
return FALSE;
ss = atk_object_ref_state_set (ATK_OBJECT (htmla11y));
if (atk_state_set_contains_state (ss, ATK_STATE_DEFUNCT)) {
g_object_unref (ss);
return FALSE;
}
g_object_unref (ss);
return TRUE;
}
/*
* AtkTable interface
*/
static AtkObject *
html_a11y_table_ref_at (AtkTable *table, gint row, gint column)
{
AtkObject *accessible = NULL;
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
HTMLTableCell *cell;
if (!is_valid (ATK_OBJECT (table)))
return NULL;
g_return_val_if_fail (row < to->totalRows, NULL);
g_return_val_if_fail (column < to->totalCols, NULL);
cell = to->cells [row][column];
if (cell) {
accessible = html_utils_get_accessible (HTML_OBJECT (cell), ATK_OBJECT (table));
if (accessible)
g_object_ref (accessible);
}
return accessible;
}
static gint
html_a11y_table_get_index_at (AtkTable *table, gint row, gint column)
{
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
if (!is_valid (ATK_OBJECT (table)))
return -1;
g_return_val_if_fail (row < to->totalRows, -1);
g_return_val_if_fail (column < to->totalCols, -1);
g_return_val_if_fail (to->cells [row][column], -1);
return html_object_get_child_index (HTML_OBJECT (to), HTML_OBJECT (to->cells [row][column]));
}
static gint
html_a11y_table_get_column_at_index (AtkTable *table, gint index)
{
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
HTMLTableCell *cell;
if (!is_valid (ATK_OBJECT (table)))
return -1;
cell = HTML_TABLE_CELL (html_object_get_child (HTML_OBJECT (to), index));
return cell ? cell->col : -1;
}
static gint
html_a11y_table_get_row_at_index (AtkTable *table, gint index)
{
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
HTMLTableCell *cell;
if (!is_valid (ATK_OBJECT (table)))
return -1;
cell = HTML_TABLE_CELL (html_object_get_child (HTML_OBJECT (to), index));
return cell ? cell->row : -1;
}
static gint
html_a11y_table_get_n_columns (AtkTable *table)
{
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
if (!is_valid (ATK_OBJECT (table)))
return -1;
return to->totalCols;
}
static gint
html_a11y_table_get_n_rows (AtkTable *table)
{
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
if (!is_valid (ATK_OBJECT (table)))
return -1;
return to->totalRows;
}
static gint
html_a11y_table_get_column_extent_at (AtkTable *table, gint row, gint column)
{
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
if (!is_valid (ATK_OBJECT (table)))
return -1;
g_return_val_if_fail (row < to->totalRows, -1);
g_return_val_if_fail (column < to->totalCols, -1);
g_return_val_if_fail (to->cells [row][column], -1);
return to->cells [row][column]->cspan;
}
static gint
html_a11y_table_get_row_extent_at (AtkTable *table, gint row, gint column)
{
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
if (!is_valid (ATK_OBJECT (table)))
return -1;
g_return_val_if_fail (row < to->totalRows, -1);
g_return_val_if_fail (column < to->totalCols, -1);
g_return_val_if_fail (to->cells [row][column], -1);
return to->cells [row][column]->rspan;
}
static AtkObject *
html_a11y_table_get_column_header (AtkTable *table, gint column)
{
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
if (!is_valid (ATK_OBJECT (table)))
return NULL;
g_return_val_if_fail (column < to->totalCols, NULL);
g_return_val_if_fail (to->cells [0][column], NULL);
return to->cells [0][column]->heading
? html_utils_get_accessible (HTML_OBJECT (to->cells [0][column]), ATK_OBJECT (table)) : NULL;
}
static AtkObject *
html_a11y_table_get_row_header (AtkTable *table, gint row)
{
HTMLTable *to = HTML_TABLE (HTML_A11Y_HTML (table));
if (!is_valid (ATK_OBJECT (table)))
return NULL;
g_return_val_if_fail (row < to->totalRows, NULL);
g_return_val_if_fail (to->cells [row][0], NULL);
return to->cells [row][0]->heading
? html_utils_get_accessible (HTML_OBJECT (to->cells [row][0]), ATK_OBJECT (table)) : NULL;
}
/* unsupported calls
AtkObject*
(* get_caption) (AtkTable *table);
G_CONST_RETURN gchar*
(* get_column_description) (AtkTable *table,
gint column);
G_CONST_RETURN gchar*
(* get_row_description) (AtkTable *table,
gint row);
AtkObject* (* get_summary) (AtkTable *table);
void (* set_caption) (AtkTable *table,
AtkObject *caption);
void (* set_column_description) (AtkTable *table,
gint column,
const gchar *description);
void (* set_column_header) (AtkTable *table,
gint column,
AtkObject *header);
void (* set_row_description) (AtkTable *table,
gint row,
const gchar *description);
void (* set_row_header) (AtkTable *table,
gint row,
AtkObject *header);
void (* set_summary) (AtkTable *table,
AtkObject *accessible);
gint (* get_selected_columns) (AtkTable *table,
gint **selected);
gint (* get_selected_rows) (AtkTable *table,
gint **selected);
gboolean (* is_column_selected) (AtkTable *table,
gint column);
gboolean (* is_row_selected) (AtkTable *table,
gint row);
gboolean (* is_selected) (AtkTable *table,
gint row,
gint column);
gboolean (* add_row_selection) (AtkTable *table,
gint row);
gboolean (* remove_row_selection) (AtkTable *table,
gint row);
gboolean (* add_column_selection) (AtkTable *table,
gint column);
gboolean (* remove_column_selection) (AtkTable *table,
gint column);
*/