2 * AT-SPI - Assistive Technology Service Provider Interface
3 * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
5 * Copyright 2001 Sun Microsystems Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library 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 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 * Boston, MA 02111-1307, USA.
23 /* accessible.c: the core of the accessibility implementation */
27 #include <libspi/libspi.h>
29 /* Our parent Gtk object type */
30 #define PARENT_TYPE BONOBO_TYPE_OBJECT
32 /* A pointer to our parent object class */
33 static GObjectClass *spi_accessible_parent_class;
36 * Implemented GObject::finalize
39 spi_accessible_object_finalize (GObject *object)
41 SpiAccessible *accessible = SPI_ACCESSIBLE (object);
43 printf("spi_accessible_object_finalize called\n");
44 ATK_OBJECT (accessible->atko); /* assertion */
45 g_object_unref (G_OBJECT(accessible->atko));
46 accessible->atko = NULL;
48 printf("atko freed, calling parent finalize\n");
49 spi_accessible_parent_class->finalize (object);
53 * CORBA Accessibility::Accessible::get_name method implementation
56 impl_accessibility_accessible_get_name (PortableServer_Servant servant,
57 CORBA_Environment *ev)
60 SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
61 retval = (CORBA_char *) atk_object_get_name (accessible->atko);
63 retval = CORBA_string_dup (retval);
65 retval = CORBA_string_dup ("");
71 * CORBA Accessibility::Accessible::set_name method implementation
74 impl_accessibility_accessible_set_name (PortableServer_Servant servant,
75 const CORBA_char *name,
76 CORBA_Environment *ev)
78 SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
79 atk_object_set_name (accessible->atko, name);
80 printf ("SpiAccessible set_name called: %s\n", name);
84 * CORBA Accessibility::Accessible::get_description method implementation
87 impl_accessibility_accessible_get_description (PortableServer_Servant servant,
88 CORBA_Environment *ev)
91 SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
92 retval = CORBA_string_dup (atk_object_get_description (accessible->atko));
94 retval = CORBA_string_dup (retval);
96 retval = CORBA_string_dup ("");
102 * CORBA Accessibility::Accessible::set_description method implementation
105 impl_accessibility_accessible_set_description (PortableServer_Servant servant,
106 const CORBA_char *name,
107 CORBA_Environment *ev)
109 SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
110 atk_object_set_description (accessible->atko, name);
111 printf ("SpiAccessible set_description called: %s\n", name);
115 * CORBA Accessibility::Accessible::get_parent method implementation
117 static Accessibility_Accessible
118 impl_accessibility_accessible_get_parent (PortableServer_Servant servant,
119 CORBA_Environment *ev)
121 Accessibility_Accessible retval;
122 SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
125 parent = atk_object_get_parent (accessible->atko);
126 retval = BONOBO_OBJREF (spi_accessible_new (parent));
128 printf ("SpiAccessible get_parent called\n");
130 return CORBA_Object_duplicate (retval, ev);
134 * CORBA Accessibility::Accessible::get_IndexInParent method implementation
137 impl_accessibility_accessible_get_index_in_parent (PortableServer_Servant servant,
138 CORBA_Environment *ev)
141 SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
142 retval = (CORBA_long) atk_object_get_index_in_parent (accessible->atko);
143 printf ("SpiAccessible get_index_in_parent called\n");
148 * CORBA Accessibility::Accessible::get_childCount method implementation
151 impl_accessibility_accessible_get_child_count (PortableServer_Servant servant,
152 CORBA_Environment *ev)
155 SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
156 retval = (CORBA_long) atk_object_get_n_accessible_children (accessible->atko);
157 printf ("SpiAccessible get_childCount called: %d\n", (int) retval);
162 * CORBA Accessibility::Accessible::getChildAtIndex method implementation
164 static Accessibility_Accessible
165 impl_accessibility_accessible_get_child_at_index (PortableServer_Servant servant,
166 const CORBA_long index,
167 CORBA_Environment *ev)
169 Accessibility_Accessible retval;
170 SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
171 AtkObject *child = atk_object_ref_accessible_child (accessible->atko, (gint) index);
172 retval = BONOBO_OBJREF (spi_accessible_new (child));
173 printf ("SpiAccessible get_child_at_index called.\n");
174 return CORBA_Object_duplicate (retval, ev);
178 * CORBA Accessibility::Accessible::getState method implementation
180 static Accessibility_StateSet
181 impl_accessibility_accessible_get_state (PortableServer_Servant servant,
182 CORBA_Environment *ev)
184 Accessibility_StateSet retval;
185 /* SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
186 AtkStateSet *state = atk_object_ref_state_set (accessible->atko); */
187 retval = CORBA_OBJECT_NIL;
188 printf ("SpiAccessible get_state.\n");
189 /* TODO: implement the bonobo stateset class */
190 return (Accessibility_StateSet) retval;
194 * CORBA Accessibility::Accessible::getRelationSet method implementation
196 static Accessibility_RelationSet *
197 impl_accessibility_accessible_get_relation_set (PortableServer_Servant servant,
198 CORBA_Environment *ev)
200 Accessibility_RelationSet *retval;
203 SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
204 AtkRelationSet *relation_set = atk_object_ref_relation_set (accessible->atko);
205 n_relations = atk_relation_set_get_n_relations (relation_set);
206 retval = CORBA_sequence_Accessibility_Relation__alloc ();
207 CORBA_sequence_Accessibility_Relation_allocbuf (n_relations);
209 for (i=0; i<n_relations; ++i)
212 CORBA_Object_duplicate (bonobo_object_corba_objref (
213 BONOBO_OBJECT (spi_relation_new (atk_relation_set_get_relation (relation_set, i)))),
217 printf ("SpiAccessible get_relation_set.\n");
222 * CORBA Accessibility::Accessible::getRole method implementation
224 static Accessibility_Role
225 impl_accessibility_accessible_get_role (PortableServer_Servant servant,
226 CORBA_Environment *ev)
228 Accessibility_Role retval;
229 SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
230 AtkRole role = atk_object_get_role (accessible->atko);
231 retval = role; /* relies on ability to cast these back and forth */
232 printf ("SpiAccessible get_role.\n");
233 return (Accessibility_Role) retval;
237 spi_accessible_class_init (SpiAccessibleClass *klass)
239 GObjectClass * object_class = (GObjectClass *) klass;
240 POA_Accessibility_Accessible__epv *epv = &klass->epv;
241 spi_accessible_parent_class = g_type_class_peek_parent (klass);
243 object_class->finalize = spi_accessible_object_finalize;
245 epv->_get_name = impl_accessibility_accessible_get_name;
246 epv->_set_name = impl_accessibility_accessible_set_name;
247 epv->_get_description = impl_accessibility_accessible_get_description;
248 epv->_set_description = impl_accessibility_accessible_set_description;
250 epv->_get_parent = impl_accessibility_accessible_get_parent;
251 epv->_get_childCount = impl_accessibility_accessible_get_child_count;
252 epv->getChildAtIndex = impl_accessibility_accessible_get_child_at_index;
253 epv->getIndexInParent = impl_accessibility_accessible_get_index_in_parent;
255 epv->getRelationSet = impl_accessibility_accessible_get_relation_set;
256 epv->getState = impl_accessibility_accessible_get_state;
257 epv->getRole = impl_accessibility_accessible_get_role;
261 spi_accessible_init (SpiAccessible *accessible)
265 BONOBO_TYPE_FUNC_FULL (SpiAccessible,
266 Accessibility_Accessible,
271 spi_accessible_new (AtkObject *o)
273 SpiAccessible *retval = g_object_new (SPI_ACCESSIBLE_TYPE, NULL);
274 CORBA_Environment ev;
275 CORBA_exception_init (&ev);
277 retval->atko = ATK_OBJECT (o);
279 /* aggregate appropriate SPI interfaces based on ATK interfaces */
281 if (ATK_IS_ACTION (o))
283 bonobo_object_add_interface (bonobo_object (retval),
284 BONOBO_OBJECT (spi_action_interface_new (o)));
287 if (ATK_IS_COMPONENT (o))
289 bonobo_object_add_interface (bonobo_object (retval),
290 BONOBO_OBJECT (spi_component_interface_new (o)));
293 if (ATK_IS_EDITABLE_TEXT (o))
295 bonobo_object_add_interface (bonobo_object (retval),
296 BONOBO_OBJECT(spi_editable_text_interface_new (o)));
299 else if (ATK_IS_HYPERTEXT (o))
301 bonobo_object_add_interface (bonobo_object (retval),
302 BONOBO_OBJECT (spi_hypertext_interface_new (o)));
305 else if (ATK_IS_TEXT (o))
307 bonobo_object_add_interface (bonobo_object (retval),
308 BONOBO_OBJECT (spi_text_interface_new (o)));
311 if (ATK_IS_IMAGE (o))
313 bonobo_object_add_interface (bonobo_object (retval),
314 BONOBO_OBJECT (spi_image_interface_new (o)));
317 if (ATK_IS_SELECTION (o))
319 bonobo_object_add_interface (bonobo_object (retval),
320 BONOBO_OBJECT (spi_selection_interface_new (o)));
323 if (ATK_IS_TABLE (o))
325 bonobo_object_add_interface (bonobo_object (retval),
326 BONOBO_OBJECT (spi_table_interface_new (o)));
329 if (ATK_IS_VALUE (o))
331 bonobo_object_add_interface (bonobo_object (retval),
332 BONOBO_OBJECT (spi_value_interface_new (o)));