Initial commit
[atksocket-atkplug-example:mainline.git] / plug / ta-plug-accessible.c
1 /*
2  * Copyright (C) 2011 Igalia S.L.
3  * Authors: Mario Sanchez Prada <msanchez@igalia.com>
4  *
5  * Based on a C# example written in C# by Mike Gorse:
6  * http://mgorse.freeshell.org/plug-socket-test.tar.gz
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of version 3 of the GNU General Public
10  * License as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public
18  * License along with this program; if not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  *
22  */
23 #include "ta-plug-accessible.h"
24
25 #include <atk/atk.h>
26 #include <glib.h>
27 #include <gtk/gtk.h>
28
29 struct _TaPlugAccessiblePrivate {
30   GtkWidget *widget;
31 };
32
33 #define TA_PLUG_ACCESSIBLE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), TA_TYPE_PLUG_ACCESSIBLE, TaPlugAccessiblePrivate))
34
35 G_DEFINE_TYPE (TaPlugAccessible, ta_plug_accessible, ATK_TYPE_PLUG);
36
37 static void ta_plug_accessible_initialize (AtkObject *object, gpointer data)
38 {
39   g_return_if_fail (TA_IS_PLUG_ACCESSIBLE (object));
40
41   TaPlugAccessible *plug = NULL;
42   TaPlugAccessiblePrivate *priv = NULL;
43
44   ATK_OBJECT_CLASS(ta_plug_accessible_parent_class)->initialize(object, data);
45
46   plug = TA_PLUG_ACCESSIBLE (object);
47   priv = TA_PLUG_ACCESSIBLE_GET_PRIVATE(plug);
48   priv->widget = NULL;
49   if (GTK_IS_WIDGET (data))
50     priv->widget = GTK_WIDGET (data);
51 }
52
53 static const gchar *ta_plug_accessible_get_name (AtkObject *object)
54 {
55   g_return_val_if_fail(ATK_IS_OBJECT (object), NULL);
56   return "The Plug";
57 }
58
59 static AtkRole ta_plug_accessible_get_role (AtkObject *object)
60 {
61   g_return_val_if_fail(ATK_IS_OBJECT (object), ATK_ROLE_UNKNOWN);
62   return ATK_ROLE_PANEL;
63 }
64
65 static gint ta_plug_accessible_get_n_children (AtkObject *object)
66 {
67   g_return_val_if_fail (TA_IS_PLUG_ACCESSIBLE (object), 0);
68
69   TaPlugAccessible *plug = NULL;
70   TaPlugAccessiblePrivate *priv = NULL;
71   GList *children = NULL;
72   GList *item = NULL;
73   gint n_children = 0;
74
75   plug = TA_PLUG_ACCESSIBLE (object);
76   priv = TA_PLUG_ACCESSIBLE_GET_PRIVATE(plug);
77
78   if (!priv->widget)
79     return 0;
80
81   if (!GTK_IS_CONTAINER (priv->widget))
82     return 0;
83
84   children = gtk_container_get_children (GTK_CONTAINER (priv->widget));
85   n_children = g_list_length (children);
86   g_list_free (children);
87
88   return n_children;
89 }
90
91 static AtkObject *ta_plug_accessible_ref_child (AtkObject *object, gint i)
92 {
93   g_return_val_if_fail (TA_IS_PLUG_ACCESSIBLE (object), NULL);
94
95   TaPlugAccessible *plug = NULL;
96   TaPlugAccessiblePrivate *priv = NULL;
97   GList *children = NULL;
98   GList *item = NULL;
99   gint n_children = 0;
100   GtkWidget *child = NULL;
101   AtkObject *axChild = NULL;
102
103   plug = TA_PLUG_ACCESSIBLE (object);
104   priv = TA_PLUG_ACCESSIBLE_GET_PRIVATE(plug);
105
106   if (!priv->widget)
107     return NULL;
108
109   if (!GTK_IS_CONTAINER (priv->widget))
110     return NULL;
111
112   children = gtk_container_get_children (GTK_CONTAINER (priv->widget));
113   if (i < 0 || i >= g_list_length (children))
114     return NULL;
115
116   child = GTK_WIDGET (g_list_nth_data (children, i));
117   if (!child)
118     return NULL;
119
120   g_list_free (children);
121
122   axChild = gtk_widget_get_accessible (child);
123   return g_object_ref (axChild);
124 }
125
126 static void ta_plug_accessible_dispose (GObject *object)
127 {
128   TaPlugAccessible *plug = NULL;
129   TaPlugAccessiblePrivate *priv = NULL;
130
131   plug = TA_PLUG_ACCESSIBLE (object);
132   priv = TA_PLUG_ACCESSIBLE_GET_PRIVATE(plug);
133
134   if (priv->widget)
135     {
136       g_object_unref (priv->widget);
137       priv->widget = NULL;
138     }
139
140   G_OBJECT_CLASS(ta_plug_accessible_parent_class)->dispose(object);
141 }
142
143 static void ta_plug_accessible_class_init (TaPlugAccessibleClass *klass)
144 {
145   GObjectClass *g_object_class = G_OBJECT_CLASS(klass);
146   AtkObjectClass *atk_object_class = NULL;
147
148   g_object_class->dispose = ta_plug_accessible_dispose;
149
150   atk_object_class = ATK_OBJECT_CLASS (klass);
151   atk_object_class->initialize = ta_plug_accessible_initialize;
152   atk_object_class->get_name = ta_plug_accessible_get_name;
153   atk_object_class->get_role = ta_plug_accessible_get_role;
154   atk_object_class->get_n_children = ta_plug_accessible_get_n_children;
155   atk_object_class->get_index_in_parent = NULL;
156   atk_object_class->ref_child = ta_plug_accessible_ref_child;
157
158   g_type_class_add_private(g_object_class, sizeof(TaPlugAccessiblePrivate));
159 }
160
161 static void ta_plug_accessible_init(TaPlugAccessible *plug)
162 {
163 }
164
165 AtkObject *ta_plug_accessible_new ()
166 {
167   return ATK_OBJECT (g_object_new(TA_TYPE_PLUG_ACCESSIBLE, 0));
168 }