source: trunk/third/atk/atk/atkstateset.c @ 20776

Revision 20776, 8.4 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r20775, which included commits to RCS files with non-trunk default branches.
  • Property svn:executable set to *
Line 
1/* ATK -  Accessibility Toolkit
2 * Copyright 2001 Sun Microsystems Inc.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
18 */
19
20#include <glib-object.h>
21
22#include "atkobject.h"
23#include "atkstateset.h"
24
25#define ATK_STATE(state_enum)             ((AtkState)(1 << ((guint64)(state_enum)%64)))
26
27struct _AtkRealStateSet
28{
29  GObject parent;
30
31  AtkState state;
32};
33
34typedef struct _AtkRealStateSet      AtkRealStateSet;
35
36static void            atk_state_set_class_init       (AtkStateSetClass  *klass);
37
38GType
39atk_state_set_get_type (void)
40{
41  static GType type = 0;
42
43  if (!type)
44    {
45      static const GTypeInfo typeInfo =
46      {
47        sizeof (AtkStateSetClass),
48        (GBaseInitFunc) NULL,
49        (GBaseFinalizeFunc) NULL,
50        (GClassInitFunc) atk_state_set_class_init,
51        (GClassFinalizeFunc) NULL,
52        NULL,
53        sizeof (AtkRealStateSet),
54        0,
55        (GInstanceInitFunc) NULL,
56      } ;
57      type = g_type_register_static (G_TYPE_OBJECT, "AtkStateSet", &typeInfo, 0) ;
58    }
59  return type;
60}
61
62static void
63atk_state_set_class_init (AtkStateSetClass *klass)
64{
65}
66
67/**
68 * atk_state_set_new:
69 *
70 * Creates a new empty state set.
71 *
72 * Returns: a new #AtkStateSet
73 **/
74AtkStateSet*
75atk_state_set_new (void)
76{
77  return (AtkStateSet*) g_object_new (ATK_TYPE_STATE_SET, NULL);
78}
79
80/**
81 * atk_state_set_is_empty:
82 * @set: an #AtkStateType
83 *
84 * Checks whether the state set is empty, i.e. has no states set.
85 *
86 * Returns: %TRUE if @set has no states set, otherwise %FALSE
87 **/
88gboolean
89atk_state_set_is_empty (AtkStateSet   *set)
90{
91  AtkRealStateSet *real_set;
92  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
93
94  real_set = (AtkRealStateSet *)set;
95
96  if (real_set->state)
97    return FALSE;
98  else
99    return TRUE;
100}
101
102/**
103 * atk_state_set_add_state:
104 * @set: an #AtkStateSet
105 * @type: an #AtkStateType
106 *
107 * Add a new state for the specified type to the current state set if
108 * it is not already present.
109 *
110 * Returns: %TRUE if  the state for @type is not already in @set.
111 **/
112gboolean
113atk_state_set_add_state (AtkStateSet   *set,
114                         AtkStateType  type)
115{
116  AtkRealStateSet *real_set;
117  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
118
119  real_set = (AtkRealStateSet *)set;
120
121  if (real_set->state & ATK_STATE (type))
122    return FALSE;
123  else
124  {
125    real_set->state |= ATK_STATE (type);
126    return TRUE;
127  }
128}
129/**
130 * atk_state_set_add_states:
131 * @set: an #AtkStateSet
132 * @types: an array of #AtkStateType
133 * @n_types: The number of elements in the array
134 *
135 * Add the states for the specified types to the current state set.
136 **/
137void
138atk_state_set_add_states (AtkStateSet   *set,
139                          AtkStateType  *types,
140                          gint          n_types)
141{
142  AtkRealStateSet *real_set;
143  gint     i;
144  g_return_if_fail (ATK_IS_STATE_SET (set));
145
146  real_set = (AtkRealStateSet *)set;
147
148  for (i = 0; i < n_types; i++)
149  {
150    real_set->state |= ATK_STATE (types[i]);
151  }
152}
153
154/**
155 * atk_state_set_clear_states:
156 * @set: an #AtkStateSet
157 *
158 * Removes all states from the state set.
159 **/
160void
161atk_state_set_clear_states (AtkStateSet   *set)
162{
163  AtkRealStateSet *real_set;
164  g_return_if_fail (ATK_IS_STATE_SET (set));
165
166  real_set = (AtkRealStateSet *)set;
167
168  real_set->state = 0;
169}
170
171/**
172 * atk_state_set_contains_state:
173 * @set: an #AtkStateSet
174 * @type: an #AtkStateType
175 *
176 * Checks whether the state for the specified type is in the specified set.
177 *
178 * Returns: %TRUE if @type is the state type is in @set.
179 **/
180gboolean
181atk_state_set_contains_state (AtkStateSet   *set,
182                              AtkStateType  type)
183{
184  AtkRealStateSet *real_set;
185  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
186
187  real_set = (AtkRealStateSet *)set;
188
189  if (real_set->state & ATK_STATE (type))
190    return TRUE;
191  else
192    return FALSE;
193}
194
195/**
196 * atk_state_set_contains_states:
197 * @set: an #AtkStateSet
198 * @types: an array of #AtkStateType
199 * @n_types: The number of elements in the array
200 *
201 * Checks whether the states for all the specified types are in the
202 * specified set.
203 *
204 * Returns: %TRUE if all the states for @type are in @set.
205 **/
206gboolean
207atk_state_set_contains_states (AtkStateSet   *set,
208                               AtkStateType  *types,
209                               gint          n_types)
210{
211  AtkRealStateSet *real_set;
212  gint i;
213  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
214
215  real_set = (AtkRealStateSet *)set;
216
217  for (i = 0; i < n_types; i++)
218  {
219    if (!(real_set->state & ATK_STATE (types[i])))
220      return FALSE;
221  }
222  return TRUE;
223}
224
225/**
226 * atk_state_set_remove_state:
227 * @set: an #AtkStateSet
228 * @type: an #AtkType
229 *
230 * Removes the state for the specified type from the state set.
231 *
232 * Returns: %TRUE if @type was the state type is in @set.
233 **/
234gboolean
235atk_state_set_remove_state (AtkStateSet  *set,
236                            AtkStateType type)
237{
238  AtkRealStateSet *real_set;
239  g_return_val_if_fail (ATK_IS_STATE_SET (set), FALSE);
240
241  real_set = (AtkRealStateSet *)set;
242
243  if (real_set->state & ATK_STATE (type))
244  {
245    real_set->state ^= ATK_STATE (type);
246    return TRUE;
247  }
248  else
249    return FALSE;
250}
251
252/**
253 * atk_state_set_and_sets:
254 * @set: an #AtkStateSet
255 * @compare_set: another #AtkStateSet
256 *
257 * Constructs the intersection of the two sets, returning %NULL if the
258 * intersection is empty.
259 *
260 * Returns: a new #AtkStateSet which is the intersection of the two sets.
261 **/
262AtkStateSet*
263atk_state_set_and_sets (AtkStateSet  *set,
264                        AtkStateSet  *compare_set)
265{
266  AtkRealStateSet *real_set, *real_compare_set;
267  AtkStateSet *return_set = NULL;
268  AtkState state;
269
270  g_return_val_if_fail (ATK_IS_STATE_SET (set), NULL);
271  g_return_val_if_fail (ATK_IS_STATE_SET (compare_set), NULL);
272
273  real_set = (AtkRealStateSet *)set;
274  real_compare_set = (AtkRealStateSet *)compare_set;
275
276  state = real_set->state & real_compare_set->state;
277  if (state)
278  {
279    return_set = atk_state_set_new();
280    ((AtkRealStateSet *) return_set)->state = state;
281  }
282  return return_set;
283}
284
285/**
286 * atk_state_set_or_sets:
287 * @set: an #AtkStateSet
288 * @compare_set: another #AtkStateSet
289 *
290 * Constructs the union of the two sets.
291 *
292 * Returns: a new #AtkStateSet which is the union of the two sets,
293 * returning %NULL is empty.
294 **/
295AtkStateSet*
296atk_state_set_or_sets (AtkStateSet  *set,
297                       AtkStateSet  *compare_set)
298{
299  AtkRealStateSet *real_set, *real_compare_set;
300  AtkStateSet *return_set = NULL;
301  AtkState state;
302
303  g_return_val_if_fail (ATK_IS_STATE_SET (set), NULL);
304  g_return_val_if_fail (ATK_IS_STATE_SET (compare_set), NULL);
305
306  real_set = (AtkRealStateSet *)set;
307  real_compare_set = (AtkRealStateSet *)compare_set;
308
309  state = real_set->state | real_compare_set->state;
310
311  return_set = atk_state_set_new();
312  ((AtkRealStateSet *) return_set)->state = state;
313
314  return return_set;
315}
316
317/**
318 * atk_state_set_xor_sets:
319 * @set: an #AtkStateSet
320 * @compare_set: another #AtkStateSet
321 *
322 * Constructs the exclusive-or of the two sets, returning %NULL is empty.
323 * The set returned by this operation contains the states in exactly
324 * one of the two sets.
325 *
326 * Returns: a new #AtkStateSet which contains the states which are
327 * in exactly one of the two sets.
328 **/
329AtkStateSet*
330atk_state_set_xor_sets (AtkStateSet  *set,
331                        AtkStateSet  *compare_set)
332{
333  AtkRealStateSet *real_set, *real_compare_set;
334  AtkStateSet *return_set = NULL;
335  AtkState state, state1, state2;
336
337  g_return_val_if_fail (ATK_IS_STATE_SET (set), NULL);
338  g_return_val_if_fail (ATK_IS_STATE_SET (compare_set), NULL);
339
340  real_set = (AtkRealStateSet *)set;
341  real_compare_set = (AtkRealStateSet *)compare_set;
342
343  state1 = real_set->state & (~real_compare_set->state);
344  state2 = (~real_set->state) & real_compare_set->state;
345  state = state1 | state2;
346
347  if (state)
348  {
349    return_set = atk_state_set_new();
350    ((AtkRealStateSet *) return_set)->state = state;
351  }
352  return return_set;
353}
Note: See TracBrowser for help on using the repository browser.