libspi/stateset.c libspi/stateset.h libspi/Makefile.am:
[platform/core/uifw/at-spi2-atk.git] / libspi / stateset.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 /* stateset.c : implements the StateSet interface */
24
25 #include <config.h>
26 #include <stdio.h>
27 #include <libspi/stateset.h>
28
29
30 static Accessibility_StateType *accessible_state_types = NULL;
31 static AtkStateType *atk_state_types = NULL;
32
33
34 static gboolean
35 spi_init_state_type_tables (void)
36 {
37   gint i;
38
39   g_return_val_if_fail (accessible_state_types, FALSE);
40   g_return_val_if_fail (atk_state_types, FALSE);
41   
42   accessible_state_types = g_new (Accessibility_StateType, ATK_STATE_LAST_DEFINED);
43   atk_state_types = g_new (AtkStateType, ATK_STATE_LAST_DEFINED);
44
45   for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
46     {
47       atk_state_types[i] = ATK_STATE_INVALID;
48       accessible_state_types[i] = Accessibility_STATE_INVALID;
49     }
50
51   accessible_state_types[ATK_STATE_INVALID] = Accessibility_STATE_INVALID;
52   atk_state_types [Accessibility_STATE_INVALID] = ATK_STATE_INVALID;
53   accessible_state_types[ATK_STATE_ACTIVE] = Accessibility_STATE_ACTIVE;
54   atk_state_types[Accessibility_STATE_ACTIVE] = ATK_STATE_ACTIVE;
55   accessible_state_types[ATK_STATE_ARMED] = Accessibility_STATE_ARMED;
56   atk_state_types[Accessibility_STATE_ARMED] = ATK_STATE_ARMED;
57   accessible_state_types[ATK_STATE_BUSY] = Accessibility_STATE_BUSY;
58   atk_state_types[Accessibility_STATE_BUSY] = ATK_STATE_BUSY;
59   accessible_state_types[ATK_STATE_CHECKED] = Accessibility_STATE_CHECKED;
60   atk_state_types[Accessibility_STATE_CHECKED] = ATK_STATE_CHECKED;
61   /*
62     types[ATK_STATE_DEFUNCT] = Accessibility_STATE_DEFUNCT;
63   */
64   accessible_state_types[ATK_STATE_EDITABLE] = Accessibility_STATE_EDITABLE;
65   atk_state_types[Accessibility_STATE_EDITABLE] = ATK_STATE_EDITABLE;  
66   /*
67     types[ATK_STATE_ENABLED] = Accessibility_STATE_ENABLED;
68   */
69   accessible_state_types[ATK_STATE_EXPANDABLE] = Accessibility_STATE_EXPANDABLE;
70   atk_state_types[Accessibility_STATE_EXPANDABLE] = ATK_STATE_EXPANDABLE;
71   accessible_state_types[ATK_STATE_EXPANDED] = Accessibility_STATE_EXPANDED;
72   atk_state_types[Accessibility_STATE_EXPANDED] = ATK_STATE_EXPANDED;
73   accessible_state_types[ATK_STATE_FOCUSABLE] = Accessibility_STATE_FOCUSABLE;
74   atk_state_types[Accessibility_STATE_FOCUSABLE] = ATK_STATE_FOCUSABLE;
75   accessible_state_types[ATK_STATE_FOCUSED] = Accessibility_STATE_FOCUSED;
76   atk_state_types[Accessibility_STATE_FOCUSED] = ATK_STATE_FOCUSED;
77   accessible_state_types[ATK_STATE_HORIZONTAL] = Accessibility_STATE_HORIZONTAL;
78   atk_state_types[Accessibility_STATE_HORIZONTAL] = ATK_STATE_HORIZONTAL;
79   accessible_state_types[ATK_STATE_ICONIFIED] = Accessibility_STATE_ICONIFIED;
80   atk_state_types[Accessibility_STATE_ICONIFIED] = ATK_STATE_ICONIFIED;
81   accessible_state_types[ATK_STATE_MODAL] = Accessibility_STATE_MODAL;
82   atk_state_types[Accessibility_STATE_MODAL] = ATK_STATE_MODAL;
83   accessible_state_types[ATK_STATE_MULTI_LINE] = Accessibility_STATE_MULTI_LINE;
84   atk_state_types[Accessibility_STATE_MULTI_LINE] = ATK_STATE_MULTI_LINE;
85   accessible_state_types[ATK_STATE_MULTISELECTABLE] = Accessibility_STATE_MULTISELECTABLE;
86   atk_state_types[Accessibility_STATE_MULTISELECTABLE] = ATK_STATE_MULTISELECTABLE;
87   accessible_state_types[ATK_STATE_OPAQUE] = Accessibility_STATE_OPAQUE;
88   atk_state_types[Accessibility_STATE_OPAQUE] = ATK_STATE_OPAQUE;
89   accessible_state_types[ATK_STATE_PRESSED] = Accessibility_STATE_PRESSED;
90   atk_state_types[Accessibility_STATE_PRESSED] = ATK_STATE_PRESSED;
91   accessible_state_types[ATK_STATE_RESIZABLE] = Accessibility_STATE_RESIZABLE;
92   atk_state_types[Accessibility_STATE_RESIZABLE] = ATK_STATE_RESIZABLE;
93   accessible_state_types[ATK_STATE_SELECTABLE] = Accessibility_STATE_SELECTABLE;
94   atk_state_types[Accessibility_STATE_SELECTABLE] = ATK_STATE_SELECTABLE;
95   accessible_state_types[ATK_STATE_SELECTED] = Accessibility_STATE_SELECTED;
96   atk_state_types[Accessibility_STATE_SELECTED] = ATK_STATE_SELECTED;
97   accessible_state_types[ATK_STATE_SENSITIVE] = Accessibility_STATE_SENSITIVE;
98   atk_state_types[Accessibility_STATE_SENSITIVE] = ATK_STATE_SENSITIVE;
99   accessible_state_types[ATK_STATE_SHOWING] = Accessibility_STATE_SHOWING;
100   atk_state_types[Accessibility_STATE_SHOWING] = ATK_STATE_SHOWING;
101   accessible_state_types[ATK_STATE_SINGLE_LINE] = Accessibility_STATE_SINGLE_LINE;
102   atk_state_types[Accessibility_STATE_SINGLE_LINE] = ATK_STATE_SINGLE_LINE;
103   /*
104     types[ATK_STATE_STALE] = Accessibility_STATE_STALE;
105   */
106   accessible_state_types[ATK_STATE_TRANSIENT] = Accessibility_STATE_TRANSIENT;
107   atk_state_types[Accessibility_STATE_TRANSIENT] = ATK_STATE_TRANSIENT;
108   accessible_state_types[ATK_STATE_VERTICAL] = Accessibility_STATE_VERTICAL;
109   atk_state_types[Accessibility_STATE_VERTICAL] = ATK_STATE_VERTICAL;
110   accessible_state_types[ATK_STATE_VISIBLE] = Accessibility_STATE_VISIBLE;
111   atk_state_types[Accessibility_STATE_VISIBLE] = ATK_STATE_VISIBLE;
112
113   return TRUE;
114 }
115
116
117
118 static AtkStateSet *
119 atk_state_set_from_servant (PortableServer_Servant servant)
120 {
121   SpiBase *base = SPI_BASE (bonobo_object_from_servant(servant));
122
123   g_return_val_if_fail (base, NULL);
124   return  ATK_STATE_SET(base->gobj);
125 }
126
127
128
129 static AtkStateSet *
130 atk_state_set_from_accessibility_state_set (Accessibility_StateSet set, CORBA_Environment *ev)
131 {
132   AtkStateType *states, *tmp;
133   AtkStateSet *rv;
134   gint i;
135   Accessibility_StateSeq *seq;
136   
137   seq = Accessibility_StateSet_getStates (set, ev);
138   states = tmp = g_new (AtkStateType, seq->_length);
139   for (i = 0; i < seq->_length; i++)
140     *tmp++ = atk_state_types[seq->_buffer[i]];
141   rv = atk_state_set_new ();
142   atk_state_set_add_states (rv, states, seq->_length);
143   CORBA_free (seq);
144   g_free (states);
145   return rv;
146 }
147
148
149
150 SpiStateSet *
151 spi_state_set_new (AtkStateSet *obj)
152 {
153   SpiStateSet *new_set = g_object_new (SPI_STATE_SET_TYPE, NULL);
154   spi_base_construct (SPI_BASE (new_set), G_OBJECT (obj));
155   return new_set;
156 }
157
158
159
160 static CORBA_boolean
161 impl_contains (PortableServer_Servant servant,
162                const Accessibility_StateType state,
163                CORBA_Environment * ev)
164 {
165   AtkStateSet *set = atk_state_set_from_servant (servant);
166
167   g_return_val_if_fail (set, FALSE);
168   return (CORBA_boolean)
169     atk_state_set_contains_state (set, atk_state_types[state]);
170 }
171
172
173
174 static void 
175 impl_add(PortableServer_Servant servant,
176     const Accessibility_StateType state,
177     CORBA_Environment * ev)
178 {
179   AtkStateSet *set = atk_state_set_from_servant (servant);
180
181   g_return_if_fail (set);
182   atk_state_set_add_state (set, atk_state_types[state]);
183 }
184
185
186
187 static void 
188 impl_remove (PortableServer_Servant servant,
189              const Accessibility_StateType state,
190              CORBA_Environment * ev)
191 {
192   AtkStateSet *set = atk_state_set_from_servant (servant);
193
194   g_return_if_fail (set);
195   atk_state_set_remove_state (set, atk_state_types[state]);
196 }
197
198
199
200 static CORBA_boolean
201 impl_equals (PortableServer_Servant servant,
202              const Accessibility_StateSet stateSet,
203              CORBA_Environment * ev)
204 {
205   AtkStateSet *set = atk_state_set_from_servant (servant);
206   AtkStateSet *set2, *return_set;
207   CORBA_boolean rv;
208   
209   g_return_val_if_fail (set, FALSE);
210
211   set2 = atk_state_set_from_accessibility_state_set (stateSet, ev);
212   g_return_val_if_fail (set2, FALSE);
213
214   return_set = atk_state_set_xor_sets (set, set2);
215   g_object_unref (G_OBJECT(set2));
216   if (return_set)
217     {
218       rv = (CORBA_boolean)
219         atk_state_set_is_empty (return_set);
220       g_object_unref (return_set);
221     }
222   else
223     rv = FALSE;
224   return rv;
225 }
226
227
228
229 static Accessibility_StateSet
230 impl_compare (PortableServer_Servant servant,
231               const Accessibility_StateSet
232               compareState,
233               CORBA_Environment * ev)
234 {
235   AtkStateSet *set = atk_state_set_from_servant (servant);
236
237   g_return_val_if_fail (set, CORBA_OBJECT_NIL);
238
239 }
240
241
242
243 static CORBA_boolean
244 impl_isEmpty (PortableServer_Servant servant,
245               CORBA_Environment * ev)
246 {
247   AtkStateSet *set = atk_state_set_from_servant (servant);
248
249   g_return_val_if_fail (set, TRUE);
250   return (CORBA_boolean)
251     atk_state_set_is_empty (set);
252 }
253
254
255
256 static Accessibility_StateSeq *
257 impl_getStates (PortableServer_Servant servant,
258                 CORBA_Environment * ev)
259 {
260   AtkStateSet *set = atk_state_set_from_servant (servant);
261   GSList *states = NULL;
262   GSList *tmp;
263   gint i = 0;
264   Accessibility_StateSeq *rv;
265   
266   g_return_val_if_fail (set, CORBA_OBJECT_NIL);
267
268   /* Argh-- this is bad!!! */
269
270   if (atk_state_set_contains_state (set, ATK_STATE_ACTIVE))
271     states = g_slist_append (states, (gpointer) Accessibility_STATE_ACTIVE);
272   if (atk_state_set_contains_state (set, ATK_STATE_ARMED))
273     states = g_slist_append (states, (gpointer) Accessibility_STATE_ARMED);
274   if (atk_state_set_contains_state (set, ATK_STATE_BUSY))
275     states = g_slist_append (states, (gpointer) Accessibility_STATE_BUSY);
276   if (atk_state_set_contains_state (set, ATK_STATE_CHECKED))
277     states = g_slist_append (states, (gpointer) Accessibility_STATE_CHECKED);
278   if (atk_state_set_contains_state (set, ATK_STATE_DEFUNCT))
279     states = g_slist_append (states, (gpointer) Accessibility_STATE_DEFUNCT);
280   if (atk_state_set_contains_state (set, ATK_STATE_EDITABLE))
281     states = g_slist_append (states, (gpointer) Accessibility_STATE_EDITABLE);
282   if (atk_state_set_contains_state (set, ATK_STATE_ENABLED))
283     states = g_slist_append (states, (gpointer) Accessibility_STATE_ENABLED);
284   if (atk_state_set_contains_state (set, ATK_STATE_EXPANDABLE))
285     states = g_slist_append (states, (gpointer) Accessibility_STATE_EXPANDABLE);
286   if (atk_state_set_contains_state (set, ATK_STATE_EXPANDED))
287     states = g_slist_append (states, (gpointer) Accessibility_STATE_EXPANDED);
288   if (atk_state_set_contains_state (set, ATK_STATE_FOCUSABLE))
289     states = g_slist_append (states, (gpointer) Accessibility_STATE_FOCUSABLE);
290   if (atk_state_set_contains_state (set, ATK_STATE_FOCUSED))
291     states = g_slist_append (states, (gpointer) Accessibility_STATE_FOCUSED);
292   if (atk_state_set_contains_state (set, ATK_STATE_HORIZONTAL))
293     states = g_slist_append (states, (gpointer) Accessibility_STATE_HORIZONTAL);
294   if (atk_state_set_contains_state (set, ATK_STATE_ICONIFIED))
295     states = g_slist_append (states, (gpointer) Accessibility_STATE_ICONIFIED);
296   if (atk_state_set_contains_state (set, ATK_STATE_MODAL))
297     states = g_slist_append (states, (gpointer) Accessibility_STATE_MODAL);
298   if (atk_state_set_contains_state (set, ATK_STATE_MULTI_LINE))
299     states = g_slist_append (states, (gpointer) Accessibility_STATE_MULTI_LINE);
300   if (atk_state_set_contains_state (set, ATK_STATE_MULTISELECTABLE))
301     states = g_slist_append (states, (gpointer) Accessibility_STATE_MULTISELECTABLE);
302   if (atk_state_set_contains_state (set, ATK_STATE_OPAQUE))
303     states = g_slist_append (states, (gpointer) Accessibility_STATE_OPAQUE);
304   if (atk_state_set_contains_state (set, ATK_STATE_PRESSED))
305     states = g_slist_append (states, (gpointer) Accessibility_STATE_PRESSED);
306   if (atk_state_set_contains_state (set, ATK_STATE_RESIZABLE))
307     states = g_slist_append (states, (gpointer) Accessibility_STATE_RESIZABLE);
308   if (atk_state_set_contains_state (set, ATK_STATE_SELECTABLE))
309     states = g_slist_append (states, (gpointer) Accessibility_STATE_SELECTABLE);
310   if (atk_state_set_contains_state (set, ATK_STATE_SELECTED))
311     states = g_slist_append (states, (gpointer) Accessibility_STATE_SELECTED);
312   if (atk_state_set_contains_state (set, ATK_STATE_SENSITIVE))
313     states = g_slist_append (states, (gpointer) Accessibility_STATE_SENSITIVE);
314   if (atk_state_set_contains_state (set, ATK_STATE_SHOWING))
315     states = g_slist_append (states, (gpointer) Accessibility_STATE_SHOWING);
316   if (atk_state_set_contains_state (set, ATK_STATE_SINGLE_LINE))
317     states = g_slist_append (states, (gpointer) Accessibility_STATE_SINGLE_LINE);
318   if (atk_state_set_contains_state (set, ATK_STATE_STALE))
319     states = g_slist_append (states, (gpointer) Accessibility_STATE_STALE);
320   if (atk_state_set_contains_state (set, ATK_STATE_TRANSIENT))
321     states = g_slist_append (states, (gpointer) Accessibility_STATE_TRANSIENT);
322   if (atk_state_set_contains_state (set, ATK_STATE_VERTICAL))
323     states = g_slist_append (states, (gpointer) Accessibility_STATE_VERTICAL);
324   if (atk_state_set_contains_state (set, ATK_STATE_VISIBLE))
325     states = g_slist_append (states, (gpointer) Accessibility_STATE_VISIBLE);
326
327   rv = Accessibility_StateSeq__alloc ();
328   rv->_length = rv->_maximum = g_slist_length (states);
329   rv->_buffer = Accessibility_StateSeq_allocbuf (rv->_length);
330   tmp = states;
331   while (tmp)
332     {
333       rv->_buffer[i++] = (Accessibility_StateType) tmp->data;
334       tmp = tmp->next;
335     }
336   g_slist_free (states);
337   return rv;
338 }
339
340
341
342 static void
343 spi_state_set_class_init (SpiStateSetClass *klass)
344 {
345   POA_Accessibility_StateSet__epv *epv = &klass->epv;
346
347   epv->contains = impl_contains;
348   epv->add = impl_add;
349   epv->remove = impl_remove;
350   epv->equals = impl_equals;
351   epv->compare = impl_compare;
352   epv->isEmpty = impl_isEmpty;
353   epv->getStates = impl_getStates;  
354 }
355
356
357 static void
358 spi_state_set_init (SpiStateSet *set)
359 {
360 }
361
362
363 BONOBO_TYPE_FUNC_FULL (SpiStateSet,
364                        Accessibility_StateSet,
365                        SPI_TYPE_BASE,
366                        spi_state_set);