/* 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
#include
#include
#include "gtkhtml.h"
#include "htmlengine.h"
#include "html.h"
#include "object.h"
#include "utils.h"
static void html_a11y_class_init (HTMLA11YClass *klass);
static void html_a11y_init (HTMLA11Y *a11y_paragraph);
static void atk_component_interface_init (AtkComponentIface *iface);
static AtkObject* html_a11y_get_parent (AtkObject *accessible);
static gint html_a11y_get_index_in_parent (AtkObject *accessible);
static AtkStateSet * html_a11y_ref_state_set (AtkObject *accessible);
static gint html_a11y_get_n_children (AtkObject *accessible);
static AtkObject * html_a11y_ref_child (AtkObject *accessible, gint index);
static AtkObjectClass *parent_class = NULL;
GType
html_a11y_get_type (void)
{
static GType type = 0;
if (!type) {
static const GTypeInfo tinfo = {
sizeof (HTMLA11YClass),
NULL, /* base init */
NULL, /* base finalize */
(GClassInitFunc) html_a11y_class_init, /* class init */
NULL, /* class finalize */
NULL, /* class data */
sizeof (HTMLA11Y), /* instance size */
0, /* nb preallocs */
(GInstanceInitFunc) html_a11y_init, /* instance init */
NULL /* value table */
};
static const GInterfaceInfo atk_component_info = {
(GInterfaceInitFunc) atk_component_interface_init,
(GInterfaceFinalizeFunc) NULL,
NULL
};
type = g_type_register_static (ATK_TYPE_OBJECT, "HTMLA11Y", &tinfo, 0);
g_type_add_interface_static (type, ATK_TYPE_COMPONENT, &atk_component_info);
}
return type;
}
static void
atk_component_interface_init (AtkComponentIface *iface)
{
g_return_if_fail (iface != NULL);
iface->get_extents = html_a11y_get_extents;
iface->get_size = html_a11y_get_size;
/* FIX2
iface->add_focus_handler = gail_widget_add_focus_handler;
iface->get_extents = gail_widget_get_extents;
iface->get_layer = gail_widget_get_layer;
iface->grab_focus = gail_widget_grab_focus;
iface->remove_focus_handler = gail_widget_remove_focus_handler;
iface->set_extents = gail_widget_set_extents;
iface->set_position = gail_widget_set_position;
iface->set_size = gail_widget_set_size;
*/
}
static void
html_a11y_finalize (GObject *obj)
{
G_OBJECT_CLASS (parent_class)->finalize (obj);
}
static void
html_a11y_initialize (AtkObject *obj, gpointer data)
{
/* printf ("html_a11y_initialize\n"); */
g_object_set_data (G_OBJECT (obj), HTML_ID, data);
if (ATK_OBJECT_CLASS (parent_class)->initialize)
ATK_OBJECT_CLASS (parent_class)->initialize (obj, data);
}
static void
html_a11y_class_init (HTMLA11YClass *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_initialize;
atk_class->get_parent = html_a11y_get_parent;
atk_class->get_index_in_parent = html_a11y_get_index_in_parent;
atk_class->ref_state_set = html_a11y_ref_state_set;
atk_class->get_n_children = html_a11y_get_n_children;
atk_class->ref_child = html_a11y_ref_child;
gobject_class->finalize = html_a11y_finalize;
}
static void
html_a11y_init (HTMLA11Y *a11y_paragraph)
{
}
static HTMLObject *
get_parent_html (AtkObject *accessible)
{
HTMLObject *obj;
obj = HTML_A11Y_HTML (accessible);
return obj ? obj->parent : NULL;
}
static AtkObject*
html_a11y_get_parent (AtkObject *accessible)
{
AtkObject *parent, *p;
parent = accessible->accessible_parent;
if (parent != NULL)
g_return_val_if_fail (ATK_IS_OBJECT (parent), NULL);
else {
HTMLObject *parent_obj;
parent_obj = get_parent_html (accessible);
if (parent_obj) {
parent = html_utils_get_accessible (parent_obj, NULL);
if ((p = html_a11y_get_parent(parent)) != NULL) {
atk_object_set_parent(parent, p);
}
}
}
/* printf ("html_a11y_get_parent resolve to %p\n", parent); */
return parent;
}
static gint
html_a11y_get_index_in_parent (AtkObject *accessible)
{
HTMLObject *obj;
gint index = -1;
obj = HTML_A11Y_HTML (accessible);
if (obj && obj->parent) {
index = html_object_get_child_index (obj->parent, obj);
}
/* printf ("html_a11y_get_index_in_parent resolve to %d\n", index); */
return index;
}
static AtkStateSet *
html_a11y_ref_state_set (AtkObject *accessible)
{
AtkStateSet *state_set = NULL;
if (ATK_OBJECT_CLASS (parent_class)->ref_state_set)
state_set = ATK_OBJECT_CLASS (parent_class)->ref_state_set (accessible);
if (!state_set)
state_set = atk_state_set_new ();
atk_state_set_add_state (state_set, ATK_STATE_VISIBLE);
atk_state_set_add_state (state_set, ATK_STATE_ENABLED);
atk_state_set_add_state (state_set, ATK_STATE_SHOWING);
/* printf ("html_a11y_ref_state_set resolves to %p\n", state_set); */
return state_set;
}
static gint
html_a11y_get_n_children (AtkObject *accessible)
{
HTMLObject *parent;
gint n_children = 0;
AtkStateSet * ss;
ss = html_a11y_ref_state_set (accessible);
if (atk_state_set_contains_state (ss, ATK_STATE_DEFUNCT)) {
g_object_unref (ss);
return 0;
}
g_object_unref (ss);
parent = HTML_A11Y_HTML (accessible);
if (parent) {
n_children = html_object_get_n_children (parent);
}
/* printf ("html_a11y_get_n_children resolves to %d\n", n_children); */
return n_children;
}
static AtkObject *
html_a11y_ref_child (AtkObject *accessible, gint index)
{
HTMLObject *parent, *child;
AtkObject *accessible_child = NULL;
AtkStateSet * ss;
ss = html_a11y_ref_state_set(accessible);
if (atk_state_set_contains_state (ss, ATK_STATE_DEFUNCT)) {
g_object_unref (ss);
return NULL;
}
g_object_unref (ss);
parent = HTML_A11Y_HTML (accessible);
if (parent) {
child = html_object_get_child (parent, index);
if (child) {
accessible_child = html_utils_get_accessible (child, accessible);
if (accessible_child)
g_object_ref (accessible_child);
}
}
/* printf ("html_a11y_ref_child %d resolves to %p\n", index, accessible_child); */
return accessible_child;
}
GtkHTMLA11Y *
html_a11y_get_gtkhtml_parent (HTMLA11Y *a11y)
{
GtkHTMLA11Y *gtkhtml_a11y = NULL;
AtkObject *obj = ATK_OBJECT (a11y);
while (obj) {
obj = atk_object_get_parent (obj);
if (G_IS_GTK_HTML_A11Y (obj)) {
gtkhtml_a11y = GTK_HTML_A11Y (obj);
break;
}
}
return gtkhtml_a11y;
}
GtkHTMLA11Y *
html_a11y_get_top_gtkhtml_parent (HTMLA11Y *a11y)
{
GtkHTMLA11Y *gtkhtml_a11y;
GtkHTML *gtkhtml;
gtkhtml_a11y = html_a11y_get_gtkhtml_parent (a11y);
g_return_val_if_fail (gtkhtml_a11y, NULL);
gtkhtml = GTK_HTML_A11Y_GTKHTML (gtkhtml_a11y);
g_return_val_if_fail (gtkhtml, NULL);
gtkhtml = gtk_html_get_top_html (gtkhtml);
return (GtkHTMLA11Y *)gtk_widget_get_accessible (GTK_WIDGET (gtkhtml));
}
void
html_a11y_get_extents (AtkComponent *component, gint *x, gint *y, gint *width, gint *height, AtkCoordType coord_type)
{
HTMLObject *obj = HTML_A11Y_HTML (component);
GtkHTMLA11Y *top_html_a11y;
HTMLEngine *top_engine;
gint ax, ay;
g_return_if_fail (obj);
top_html_a11y = html_a11y_get_top_gtkhtml_parent (HTML_A11Y (component));
g_return_if_fail (top_html_a11y);
atk_component_get_extents (ATK_COMPONENT (top_html_a11y), x, y, width, height, coord_type);
html_object_calc_abs_position (obj, &ax, &ay);
*x += ax;
*y += ay - obj->ascent;
*width = obj->width;
*height = obj->ascent + obj->descent;
/* scroll window */
top_engine = GTK_HTML_A11Y_GTKHTML (top_html_a11y)->engine;
*x -= top_engine->x_offset;
*y -= top_engine->y_offset;
}
void
html_a11y_get_size (AtkComponent *component, gint *width, gint *height)
{
HTMLObject *obj = HTML_A11Y_HTML (component);
g_return_if_fail (obj);
*width = obj->width;
*height = obj->ascent + obj->descent;
}
AtkObject *
html_a11y_new (HTMLObject *html_obj, AtkRole role)
{
GObject *object;
AtkObject *accessible;
object = g_object_new (G_TYPE_HTML_A11Y, NULL);
accessible = ATK_OBJECT (object);
atk_object_initialize (accessible, html_obj);
accessible->role = role;
return accessible;
}