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 /* stateset.c : implements the StateSet interface */
27 #include <libspi/stateset.h>
30 static Accessibility_StateType *accessible_state_types = NULL;
31 static AtkStateType *atk_state_types = NULL;
35 spi_init_state_type_tables (void)
39 g_return_val_if_fail (accessible_state_types, FALSE);
40 g_return_val_if_fail (atk_state_types, FALSE);
42 accessible_state_types = g_new (Accessibility_StateType, ATK_STATE_LAST_DEFINED);
43 atk_state_types = g_new (AtkStateType, ATK_STATE_LAST_DEFINED);
45 for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
47 atk_state_types[i] = ATK_STATE_INVALID;
48 accessible_state_types[i] = Accessibility_STATE_INVALID;
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;
62 types[ATK_STATE_DEFUNCT] = Accessibility_STATE_DEFUNCT;
64 accessible_state_types[ATK_STATE_EDITABLE] = Accessibility_STATE_EDITABLE;
65 atk_state_types[Accessibility_STATE_EDITABLE] = ATK_STATE_EDITABLE;
67 types[ATK_STATE_ENABLED] = Accessibility_STATE_ENABLED;
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;
104 types[ATK_STATE_STALE] = Accessibility_STATE_STALE;
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;
119 atk_state_set_from_servant (PortableServer_Servant servant)
121 SpiBase *base = SPI_BASE (bonobo_object_from_servant(servant));
123 g_return_val_if_fail (base, NULL);
124 return ATK_STATE_SET(base->gobj);
130 atk_state_set_from_accessibility_state_set (Accessibility_StateSet set, CORBA_Environment *ev)
132 AtkStateType *states, *tmp;
135 Accessibility_StateSeq *seq;
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);
151 spi_state_set_new (AtkStateSet *obj)
153 SpiStateSet *new_set = g_object_new (SPI_STATE_SET_TYPE, NULL);
154 spi_base_construct (SPI_BASE (new_set), G_OBJECT (obj));
161 impl_contains (PortableServer_Servant servant,
162 const Accessibility_StateType state,
163 CORBA_Environment * ev)
165 AtkStateSet *set = atk_state_set_from_servant (servant);
167 g_return_val_if_fail (set, FALSE);
168 return (CORBA_boolean)
169 atk_state_set_contains_state (set, atk_state_types[state]);
175 impl_add(PortableServer_Servant servant,
176 const Accessibility_StateType state,
177 CORBA_Environment * ev)
179 AtkStateSet *set = atk_state_set_from_servant (servant);
181 g_return_if_fail (set);
182 atk_state_set_add_state (set, atk_state_types[state]);
188 impl_remove (PortableServer_Servant servant,
189 const Accessibility_StateType state,
190 CORBA_Environment * ev)
192 AtkStateSet *set = atk_state_set_from_servant (servant);
194 g_return_if_fail (set);
195 atk_state_set_remove_state (set, atk_state_types[state]);
201 impl_equals (PortableServer_Servant servant,
202 const Accessibility_StateSet stateSet,
203 CORBA_Environment * ev)
205 AtkStateSet *set = atk_state_set_from_servant (servant);
206 AtkStateSet *set2, *return_set;
209 g_return_val_if_fail (set, FALSE);
211 set2 = atk_state_set_from_accessibility_state_set (stateSet, ev);
212 g_return_val_if_fail (set2, FALSE);
214 return_set = atk_state_set_xor_sets (set, set2);
215 g_object_unref (G_OBJECT(set2));
219 atk_state_set_is_empty (return_set);
220 g_object_unref (return_set);
229 static Accessibility_StateSet
230 impl_compare (PortableServer_Servant servant,
231 const Accessibility_StateSet
233 CORBA_Environment * ev)
235 AtkStateSet *set = atk_state_set_from_servant (servant);
237 g_return_val_if_fail (set, CORBA_OBJECT_NIL);
244 impl_isEmpty (PortableServer_Servant servant,
245 CORBA_Environment * ev)
247 AtkStateSet *set = atk_state_set_from_servant (servant);
249 g_return_val_if_fail (set, TRUE);
250 return (CORBA_boolean)
251 atk_state_set_is_empty (set);
256 static Accessibility_StateSeq *
257 impl_getStates (PortableServer_Servant servant,
258 CORBA_Environment * ev)
260 AtkStateSet *set = atk_state_set_from_servant (servant);
261 GSList *states = NULL;
264 Accessibility_StateSeq *rv;
266 g_return_val_if_fail (set, CORBA_OBJECT_NIL);
268 /* Argh-- this is bad!!! */
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);
327 rv = Accessibility_StateSeq__alloc ();
328 rv->_length = rv->_maximum = g_slist_length (states);
329 rv->_buffer = Accessibility_StateSeq_allocbuf (rv->_length);
333 rv->_buffer[i++] = (Accessibility_StateType) tmp->data;
336 g_slist_free (states);
343 spi_state_set_class_init (SpiStateSetClass *klass)
345 POA_Accessibility_StateSet__epv *epv = &klass->epv;
347 epv->contains = impl_contains;
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;
358 spi_state_set_init (SpiStateSet *set)
363 BONOBO_TYPE_FUNC_FULL (SpiStateSet,
364 Accessibility_StateSet,