Started fixing IDL docs.
[platform/core/uifw/at-spi2-atk.git] / libspi / accessible.c
1 /*
2  * AT-SPI - Assistive Technology Service Provider Interface
3  * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
4  *
5  * Copyright 2001 Sun Microsystems Inc.
6  *
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.
11  *
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.
16  *
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.
21  */
22
23 /* accessible.c: the core of the accessibility implementation */
24
25 #include <config.h>
26 #include <stdio.h>
27 #include <libspi/libspi.h>
28
29 /* Our parent Gtk object type  */
30 #define PARENT_TYPE BONOBO_TYPE_OBJECT
31
32 /* A pointer to our parent object class */
33 static GObjectClass *spi_accessible_parent_class;
34
35 /*
36  * Implemented GObject::finalize
37  */
38 static void
39 spi_accessible_object_finalize (GObject *object)
40 {
41         SpiAccessible *accessible = SPI_ACCESSIBLE (object);
42
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;
47
48         printf("atko freed, calling parent finalize\n");
49         spi_accessible_parent_class->finalize (object);
50 }
51
52 /*
53  * CORBA Accessibility::Accessible::get_name method implementation
54  */
55 static CORBA_char *
56 impl_accessibility_accessible_get_name (PortableServer_Servant servant,
57                                         CORBA_Environment     *ev)
58 {
59   CORBA_char * retval;
60   SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
61   retval = (CORBA_char *) atk_object_get_name (accessible->atko);
62   if (retval )
63     retval = CORBA_string_dup (retval);
64   else
65     retval = CORBA_string_dup ("");
66
67   return retval;
68 }
69
70 /*
71  * CORBA Accessibility::Accessible::set_name method implementation
72  */
73 static void
74 impl_accessibility_accessible_set_name (PortableServer_Servant servant,
75                                         const CORBA_char      *name,
76                                         CORBA_Environment     *ev)
77 {
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);
81 }
82
83 /*
84  * CORBA Accessibility::Accessible::get_description method implementation
85  */
86 static CORBA_char *
87 impl_accessibility_accessible_get_description (PortableServer_Servant servant,
88                                                CORBA_Environment     *ev)
89 {
90   CORBA_char * retval;
91   SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
92   retval = CORBA_string_dup (atk_object_get_description (accessible->atko));
93   if (retval )
94     retval = CORBA_string_dup (retval);
95   else
96     retval = CORBA_string_dup ("");
97
98   return retval;
99 }
100
101 /*
102  * CORBA Accessibility::Accessible::set_description method implementation
103  */
104 static void
105 impl_accessibility_accessible_set_description (PortableServer_Servant servant,
106                                                const CORBA_char      *name,
107                                                CORBA_Environment     *ev)
108 {
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);
112 }
113
114 /*
115  * CORBA Accessibility::Accessible::get_parent method implementation
116  */
117 static Accessibility_Accessible
118 impl_accessibility_accessible_get_parent (PortableServer_Servant servant,
119                                           CORBA_Environment     *ev)
120 {
121   Accessibility_Accessible retval;
122   SpiAccessible *accessible = SPI_ACCESSIBLE (bonobo_object_from_servant (servant));
123   AtkObject     *parent;
124
125   parent = atk_object_get_parent (accessible->atko);
126   retval = BONOBO_OBJREF (spi_accessible_new (parent));
127
128   printf ("SpiAccessible get_parent called\n");
129
130   return CORBA_Object_duplicate (retval, ev);
131 }
132
133 /*
134  * CORBA Accessibility::Accessible::get_IndexInParent method implementation
135  */
136 static CORBA_long
137 impl_accessibility_accessible_get_index_in_parent (PortableServer_Servant servant,
138                                                    CORBA_Environment     *ev)
139 {
140   CORBA_long retval;
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");
144   return retval;
145 }
146
147 /*
148  * CORBA Accessibility::Accessible::get_childCount method implementation
149  */
150 static CORBA_long
151 impl_accessibility_accessible_get_child_count (PortableServer_Servant servant,
152                                                CORBA_Environment     *ev)
153 {
154   CORBA_long retval;
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);
158   return retval;
159 }
160
161 /*
162  * CORBA Accessibility::Accessible::getChildAtIndex method implementation
163  */
164 static Accessibility_Accessible
165 impl_accessibility_accessible_get_child_at_index (PortableServer_Servant servant,
166                                                   const CORBA_long      index,
167                                                   CORBA_Environment     *ev)
168 {
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);
175 }
176
177 /*
178  * CORBA Accessibility::Accessible::getState method implementation
179  */
180 static Accessibility_StateSet
181 impl_accessibility_accessible_get_state (PortableServer_Servant servant,
182                                          CORBA_Environment     *ev)
183 {
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;
191 }
192
193 /*
194  * CORBA Accessibility::Accessible::getRelationSet method implementation
195  */
196 static Accessibility_RelationSet *
197 impl_accessibility_accessible_get_relation_set (PortableServer_Servant servant,
198                                                 CORBA_Environment     *ev)
199 {
200   Accessibility_RelationSet *retval;
201   gint n_relations;
202   gint i;
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);
208           
209   for (i=0; i<n_relations; ++i)
210     {
211       retval->_buffer[i] =
212               CORBA_Object_duplicate (bonobo_object_corba_objref (
213                       BONOBO_OBJECT (spi_relation_new (atk_relation_set_get_relation (relation_set, i)))),
214                                       ev);
215     }
216   
217   printf ("SpiAccessible get_relation_set.\n");
218   return retval;
219 }
220
221 /*
222  * CORBA Accessibility::Accessible::getRole method implementation
223  */
224 static Accessibility_Role
225 impl_accessibility_accessible_get_role (PortableServer_Servant servant,
226                                         CORBA_Environment     *ev)
227 {
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;
234 }
235
236 static void
237 spi_accessible_class_init (SpiAccessibleClass *klass)
238 {
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);
242
243         object_class->finalize = spi_accessible_object_finalize;
244
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;
249
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;
254
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;
258 }
259
260 static void
261 spi_accessible_init (SpiAccessible *accessible)
262 {
263 }
264
265 BONOBO_TYPE_FUNC_FULL (SpiAccessible,
266                        Accessibility_Accessible,
267                        PARENT_TYPE,
268                        spi_accessible);
269
270 SpiAccessible *
271 spi_accessible_new (AtkObject *o)
272 {
273     SpiAccessible *retval = g_object_new (SPI_ACCESSIBLE_TYPE, NULL);
274     CORBA_Environment ev;
275     CORBA_exception_init (&ev);
276     g_object_ref (o);
277     retval->atko = ATK_OBJECT (o);
278
279     /* aggregate appropriate SPI interfaces based on ATK interfaces */
280
281     if (ATK_IS_ACTION (o))
282       {
283         bonobo_object_add_interface (bonobo_object (retval),
284                                      BONOBO_OBJECT (spi_action_interface_new (o)));
285       }
286
287     if (ATK_IS_COMPONENT (o))
288       {
289         bonobo_object_add_interface (bonobo_object (retval),
290                                      BONOBO_OBJECT (spi_component_interface_new (o)));
291       }
292
293     if (ATK_IS_EDITABLE_TEXT (o))
294       {
295         bonobo_object_add_interface (bonobo_object (retval),
296                                      BONOBO_OBJECT(spi_editable_text_interface_new (o)));
297       }
298
299     else if (ATK_IS_HYPERTEXT (o))
300       {
301         bonobo_object_add_interface (bonobo_object (retval),
302                                      BONOBO_OBJECT (spi_hypertext_interface_new (o)));
303       }
304
305     else if (ATK_IS_TEXT (o))
306       {
307         bonobo_object_add_interface (bonobo_object (retval),
308                                      BONOBO_OBJECT (spi_text_interface_new (o)));
309       }
310
311     if (ATK_IS_IMAGE (o))
312       {
313         bonobo_object_add_interface (bonobo_object (retval),
314                                      BONOBO_OBJECT (spi_image_interface_new (o)));
315       }
316
317     if (ATK_IS_SELECTION (o))
318       {
319         bonobo_object_add_interface (bonobo_object (retval),
320                                      BONOBO_OBJECT (spi_selection_interface_new (o)));
321       }
322
323     if (ATK_IS_TABLE (o))
324       {
325         bonobo_object_add_interface (bonobo_object (retval),
326                                      BONOBO_OBJECT (spi_table_interface_new (o)));
327       }
328
329     if (ATK_IS_VALUE (o))
330       {
331         bonobo_object_add_interface (bonobo_object (retval),
332                                      BONOBO_OBJECT (spi_value_interface_new (o)));
333       }
334
335     return retval;
336 }