4acf20322a255707ce1c8a78cbfa6a3e19509518
[platform/core/uifw/at-spi2-atk.git] / spi-common / spi-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, 2002 Sun Microsystems Inc.,
6  * Copyright 2001, 2002 Ximian, Inc.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23
24 /* stateset.c : implements the StateSet interface */
25
26 #include <config.h>
27 #include <stdio.h>
28 #include "spi-stateset.h"
29 #include "bitarray.h"
30
31
32 static Accessibility_StateType *accessible_state_types = NULL;
33 static AtkStateType *atk_state_types = NULL;
34
35
36 static gboolean
37 spi_init_state_type_tables (void)
38 {
39   gint i;
40
41   if (accessible_state_types || atk_state_types)
42     return FALSE;
43   if (!accessible_state_types)
44     accessible_state_types = g_new (Accessibility_StateType, ATK_STATE_LAST_DEFINED);
45   if (!atk_state_types)
46     atk_state_types = g_new (AtkStateType, Accessibility_STATE_LAST_DEFINED);
47   g_return_val_if_fail (accessible_state_types, FALSE);
48   g_return_val_if_fail (atk_state_types, FALSE);
49   
50   for (i = 0; i < Accessibility_STATE_LAST_DEFINED; i++)
51     {
52       atk_state_types[i] = ATK_STATE_INVALID;
53     }
54
55   for (i=0; i < ATK_STATE_LAST_DEFINED; i++)
56     {
57       accessible_state_types[i] = Accessibility_STATE_INVALID;  
58     }
59
60   accessible_state_types[ATK_STATE_ACTIVE] = Accessibility_STATE_ACTIVE;
61   atk_state_types[Accessibility_STATE_ACTIVE] = ATK_STATE_ACTIVE;
62   accessible_state_types[ATK_STATE_ARMED] = Accessibility_STATE_ARMED;
63   atk_state_types[Accessibility_STATE_ARMED] = ATK_STATE_ARMED;
64   accessible_state_types[ATK_STATE_BUSY] = Accessibility_STATE_BUSY;
65   atk_state_types[Accessibility_STATE_BUSY] = ATK_STATE_BUSY;
66   accessible_state_types[ATK_STATE_CHECKED] = Accessibility_STATE_CHECKED;
67   atk_state_types[Accessibility_STATE_CHECKED] = ATK_STATE_CHECKED;
68   accessible_state_types[ATK_STATE_DEFUNCT] = Accessibility_STATE_DEFUNCT;
69   atk_state_types[Accessibility_STATE_DEFUNCT] = ATK_STATE_DEFUNCT;
70   accessible_state_types[ATK_STATE_EDITABLE] = Accessibility_STATE_EDITABLE;
71   atk_state_types[Accessibility_STATE_EDITABLE] = ATK_STATE_EDITABLE;  
72   accessible_state_types[ATK_STATE_ENABLED] = Accessibility_STATE_ENABLED;
73   atk_state_types[Accessibility_STATE_ENABLED] = ATK_STATE_ENABLED;  
74   accessible_state_types[ATK_STATE_EXPANDABLE] = Accessibility_STATE_EXPANDABLE;
75   atk_state_types[Accessibility_STATE_EXPANDABLE] = ATK_STATE_EXPANDABLE;
76   accessible_state_types[ATK_STATE_EXPANDED] = Accessibility_STATE_EXPANDED;
77   atk_state_types[Accessibility_STATE_EXPANDED] = ATK_STATE_EXPANDED;
78   accessible_state_types[ATK_STATE_FOCUSABLE] = Accessibility_STATE_FOCUSABLE;
79   atk_state_types[Accessibility_STATE_FOCUSABLE] = ATK_STATE_FOCUSABLE;
80   accessible_state_types[ATK_STATE_FOCUSED] = Accessibility_STATE_FOCUSED;
81   atk_state_types[Accessibility_STATE_FOCUSED] = ATK_STATE_FOCUSED;
82   accessible_state_types[ATK_STATE_HORIZONTAL] = Accessibility_STATE_HORIZONTAL;
83   atk_state_types[Accessibility_STATE_HORIZONTAL] = ATK_STATE_HORIZONTAL;
84   accessible_state_types[ATK_STATE_ICONIFIED] = Accessibility_STATE_ICONIFIED;
85   atk_state_types[Accessibility_STATE_ICONIFIED] = ATK_STATE_ICONIFIED;
86   accessible_state_types[ATK_STATE_MODAL] = Accessibility_STATE_MODAL;
87   atk_state_types[Accessibility_STATE_MODAL] = ATK_STATE_MODAL;
88   accessible_state_types[ATK_STATE_MULTI_LINE] = Accessibility_STATE_MULTI_LINE;
89   atk_state_types[Accessibility_STATE_MULTI_LINE] = ATK_STATE_MULTI_LINE;
90   accessible_state_types[ATK_STATE_MULTISELECTABLE] = Accessibility_STATE_MULTISELECTABLE;
91   atk_state_types[Accessibility_STATE_MULTISELECTABLE] = ATK_STATE_MULTISELECTABLE;
92   accessible_state_types[ATK_STATE_OPAQUE] = Accessibility_STATE_OPAQUE;
93   atk_state_types[Accessibility_STATE_OPAQUE] = ATK_STATE_OPAQUE;
94   accessible_state_types[ATK_STATE_PRESSED] = Accessibility_STATE_PRESSED;
95   atk_state_types[Accessibility_STATE_PRESSED] = ATK_STATE_PRESSED;
96   accessible_state_types[ATK_STATE_RESIZABLE] = Accessibility_STATE_RESIZABLE;
97   atk_state_types[Accessibility_STATE_RESIZABLE] = ATK_STATE_RESIZABLE;
98   accessible_state_types[ATK_STATE_SELECTABLE] = Accessibility_STATE_SELECTABLE;
99   atk_state_types[Accessibility_STATE_SELECTABLE] = ATK_STATE_SELECTABLE;
100   accessible_state_types[ATK_STATE_SELECTED] = Accessibility_STATE_SELECTED;
101   atk_state_types[Accessibility_STATE_SELECTED] = ATK_STATE_SELECTED;
102   accessible_state_types[ATK_STATE_SENSITIVE] = Accessibility_STATE_SENSITIVE;
103   atk_state_types[Accessibility_STATE_SENSITIVE] = ATK_STATE_SENSITIVE;
104   accessible_state_types[ATK_STATE_SHOWING] = Accessibility_STATE_SHOWING;
105   atk_state_types[Accessibility_STATE_SHOWING] = ATK_STATE_SHOWING;
106   accessible_state_types[ATK_STATE_SINGLE_LINE] = Accessibility_STATE_SINGLE_LINE;
107   atk_state_types[Accessibility_STATE_SINGLE_LINE] = ATK_STATE_SINGLE_LINE;
108   accessible_state_types[ATK_STATE_STALE] = Accessibility_STATE_STALE;
109   atk_state_types[Accessibility_STATE_STALE] = ATK_STATE_STALE;
110   accessible_state_types[ATK_STATE_TRANSIENT] = Accessibility_STATE_TRANSIENT;
111   atk_state_types[Accessibility_STATE_TRANSIENT] = ATK_STATE_TRANSIENT;
112   accessible_state_types[ATK_STATE_VERTICAL] = Accessibility_STATE_VERTICAL;
113   atk_state_types[Accessibility_STATE_VERTICAL] = ATK_STATE_VERTICAL;
114   accessible_state_types[ATK_STATE_VISIBLE] = Accessibility_STATE_VISIBLE;
115   atk_state_types[Accessibility_STATE_VISIBLE] = ATK_STATE_VISIBLE;
116   accessible_state_types[ATK_STATE_MANAGES_DESCENDANTS] = Accessibility_STATE_MANAGES_DESCENDANTS;
117   atk_state_types[Accessibility_STATE_MANAGES_DESCENDANTS] = ATK_STATE_MANAGES_DESCENDANTS;
118   accessible_state_types[ATK_STATE_INDETERMINATE] = Accessibility_STATE_INDETERMINATE;
119   atk_state_types[Accessibility_STATE_INDETERMINATE] = ATK_STATE_INDETERMINATE;
120   accessible_state_types[ATK_STATE_TRUNCATED] = Accessibility_STATE_TRUNCATED;
121   atk_state_types[Accessibility_STATE_TRUNCATED] = ATK_STATE_TRUNCATED;
122   accessible_state_types[ATK_STATE_REQUIRED] = Accessibility_STATE_REQUIRED;
123   atk_state_types[Accessibility_STATE_REQUIRED] = ATK_STATE_REQUIRED;
124   accessible_state_types[ATK_STATE_INVALID_ENTRY] = Accessibility_STATE_INVALID_ENTRY;
125   atk_state_types[Accessibility_STATE_INVALID_ENTRY] = ATK_STATE_INVALID_ENTRY;
126   accessible_state_types[ATK_STATE_SUPPORTS_AUTOCOMPLETION] = Accessibility_STATE_SUPPORTS_AUTOCOMPLETION;
127   atk_state_types[Accessibility_STATE_SUPPORTS_AUTOCOMPLETION] = ATK_STATE_SUPPORTS_AUTOCOMPLETION;
128   accessible_state_types[ATK_STATE_SELECTABLE_TEXT] = Accessibility_STATE_SELECTABLE_TEXT;
129   atk_state_types[Accessibility_STATE_SELECTABLE_TEXT] = ATK_STATE_SELECTABLE_TEXT;
130   accessible_state_types[ATK_STATE_DEFAULT] = Accessibility_STATE_IS_DEFAULT;
131   atk_state_types[Accessibility_STATE_IS_DEFAULT] = ATK_STATE_DEFAULT;
132   accessible_state_types[ATK_STATE_VISITED] = Accessibility_STATE_VISITED;
133   atk_state_types[Accessibility_STATE_VISITED] = ATK_STATE_VISITED;
134
135
136   return TRUE;
137 }
138
139 static inline AtkState
140 state_spi_to_atk (Accessibility_StateType state)
141 {
142   guint idx = state;
143   if (idx < Accessibility_STATE_LAST_DEFINED)
144     return atk_state_types [idx];
145   else
146     return ATK_STATE_INVALID;
147 }
148
149 AtkState
150 spi_atk_state_from_spi_state (Accessibility_StateType state)
151 {
152   spi_init_state_type_tables ();
153   return state_spi_to_atk (state);
154 }
155
156 AtkStateSet *
157 spi_state_set_cache_from_sequence (const GArray *seq)
158 {
159   int i;
160   AtkStateSet *set;
161   AtkStateType *states;
162
163   spi_init_state_type_tables ();
164   
165   states = g_newa (AtkStateType, seq->len);
166   for (i = 0; i < seq->len; i++)
167     states [i] = state_spi_to_atk (g_array_index (seq, dbus_int32_t, i));
168
169   set = atk_state_set_new ();
170   atk_state_set_add_states (set, states, seq->len);
171
172   g_array_free (seq, TRUE);
173   return set;
174 }
175
176 void
177 spi_atk_state_to_dbus_array (AtkObject * object, dbus_uint32_t * array)
178 {
179   AtkStateSet *set = atk_object_ref_state_set (object);
180   int i;
181
182   array[0] = 0;
183   array[1] = 0;
184   if (!set)
185     return;
186   spi_init_state_type_tables ();
187
188   g_assert (ATK_STATE_LAST_DEFINED <= 64);
189   for (i = 0; i < ATK_STATE_LAST_DEFINED; i++)
190     {
191       if (atk_state_set_contains_state (set, i))
192         {
193           int a = accessible_state_types[i];
194           g_assert (a < 64);
195           BITARRAY_SET (array, a);
196         }
197     }
198   g_object_unref (set);
199 }