1 /* ATK - Accessibility Toolkit
2 * Copyright 2001 Sun Microsystems Inc.
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.
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.
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.
20 #include <glib-object.h>
22 #include "atkobject.h"
23 #include "atkstateset.h"
25 #define ATK_STATE(state_enum) ((AtkStateMask)(1 << ((guint64)(state_enum)%64)))
27 struct _AtkRealStateSet
34 typedef struct _AtkRealStateSet AtkRealStateSet
;
36 static void atk_state_set_class_init (AtkStateSetClass
*klass
);
39 atk_state_set_get_type (void)
41 static GType type
= 0;
45 static const GTypeInfo typeInfo
=
47 sizeof (AtkStateSetClass
),
49 (GBaseFinalizeFunc
) NULL
,
50 (GClassInitFunc
) atk_state_set_class_init
,
51 (GClassFinalizeFunc
) NULL
,
53 sizeof (AtkRealStateSet
),
55 (GInstanceInitFunc
) NULL
,
57 type
= g_type_register_static (G_TYPE_OBJECT
, "AtkStateSet", &typeInfo
, 0) ;
63 atk_state_set_class_init (AtkStateSetClass
*klass
)
69 * return values: a new #AtkStateSet
71 * Creates a new empty state set.
74 atk_state_set_new (void)
76 return (AtkStateSet
*) g_object_new (ATK_TYPE_STATE_SET
, NULL
);
80 * atk_state_set_is_empty
81 * @type: a #AtkStateType
82 * return values: %TRUE if @set has no states set
84 * Checks whether the state set is empty, i.e. has no states set.
87 atk_state_set_is_empty (AtkStateSet
*set
)
89 AtkRealStateSet
*real_set
;
90 g_return_val_if_fail (set
!= NULL
, FALSE
);
91 g_return_val_if_fail (ATK_IS_STATE_SET (set
), FALSE
);
93 real_set
= (AtkRealStateSet
*)set
;
102 * atk_state_set_add_state
103 * @set: a #AtkStateSet
104 * @type: a #AtkStateType
105 * return values: %TRUE if the state for @type is not already in @set.
107 * Add a new state for the specified type to the current state set if
108 * it is not already present
111 atk_state_set_add_state (AtkStateSet
*set
,
114 AtkRealStateSet
*real_set
;
115 g_return_val_if_fail (set
!= NULL
, FALSE
);
116 g_return_val_if_fail (ATK_IS_STATE_SET (set
), FALSE
);
118 real_set
= (AtkRealStateSet
*)set
;
120 if (real_set
->state
& ATK_STATE (type
))
124 real_set
->state
|= ATK_STATE (type
);
129 * atk_state_set_add_states
130 * @set: a #AtkStateSet
131 * @types: a array of #AtkStateType
132 * @n_types: The number of elements in the array
134 * Add the states for the specified types to the current state set
137 atk_state_set_add_states (AtkStateSet
*set
,
141 AtkRealStateSet
*real_set
;
143 g_return_if_fail (set
!= NULL
);
144 g_return_if_fail (ATK_IS_STATE_SET (set
));
146 real_set
= (AtkRealStateSet
*)set
;
148 for (i
= 0; i
< n_types
; i
++)
150 real_set
->state
|= ATK_STATE (types
[i
]);
155 * atk_state_set_clear_states
156 * @set: a #AtkStateSet
158 * Removes all states from the state set.
161 atk_state_set_clear_states (AtkStateSet
*set
)
163 AtkRealStateSet
*real_set
;
164 g_return_if_fail (set
!= NULL
);
165 g_return_if_fail (ATK_IS_STATE_SET (set
));
167 real_set
= (AtkRealStateSet
*)set
;
173 * atk_state_set_contains_state
174 * @set: a #AtkStateSet
175 * @type: a #AtkStateType
176 * return values: %TRUE if @type is the state type is in @set.
178 * Checks whether the state for the specified type is in the specified set.
181 atk_state_set_contains_state (AtkStateSet
*set
,
184 AtkRealStateSet
*real_set
;
185 g_return_val_if_fail (set
!= NULL
, FALSE
);
186 g_return_val_if_fail (ATK_IS_STATE_SET (set
), FALSE
);
188 real_set
= (AtkRealStateSet
*)set
;
190 if (real_set
->state
& ATK_STATE (type
))
197 * atk_state_set_contains_states
198 * @set: a #AtkStateSet
199 * @types: a array of #AtkStateType
200 * @n_types: The number of elements in the array
201 * return values: %TRUE if all the states for @type are in @set.
203 * Checks whether the states for all the specified types are in the
207 atk_state_set_contains_states (AtkStateSet
*set
,
211 AtkRealStateSet
*real_set
;
213 g_return_val_if_fail (set
!= NULL
, FALSE
);
214 g_return_val_if_fail (ATK_IS_STATE_SET (set
), FALSE
);
216 real_set
= (AtkRealStateSet
*)set
;
218 for (i
= 0; i
< n_types
; i
++)
220 if (!(real_set
->state
& ATK_STATE (types
[i
])))
227 * atk_state_set_remove_state
228 * @set: a #AtkStateSet
230 * return values: %TRUE if @type was the state type is in @set.
232 * Removes the state for the specified type from the state set.
235 atk_state_set_remove_state (AtkStateSet
*set
,
238 AtkRealStateSet
*real_set
;
239 g_return_val_if_fail (set
!= NULL
, FALSE
);
240 g_return_val_if_fail (ATK_IS_STATE_SET (set
), FALSE
);
242 real_set
= (AtkRealStateSet
*)set
;
244 if (real_set
->state
& ATK_STATE (type
))
246 real_set
->state
^= ATK_STATE (type
);
254 * atk_state_set_and_sets
255 * @set: a #AtkStateSet
256 * @compare_set: another #AtkStateSet
257 * return values: a new #AtkStateSet which is the intersection of the two sets.
259 * Constructs the intersection of the two sets, returning NULL if the
260 * intersection is empty.
263 atk_state_set_and_sets (AtkStateSet
*set
,
264 AtkStateSet
*compare_set
)
266 AtkRealStateSet
*real_set
, *real_compare_set
;
267 AtkStateSet
*return_set
= NULL
;
270 g_return_val_if_fail (set
!= NULL
, FALSE
);
271 g_return_val_if_fail (ATK_IS_STATE_SET (set
), FALSE
);
272 g_return_val_if_fail (compare_set
!= NULL
, FALSE
);
273 g_return_val_if_fail (ATK_IS_STATE_SET (compare_set
), FALSE
);
275 real_set
= (AtkRealStateSet
*)set
;
276 real_compare_set
= (AtkRealStateSet
*)compare_set
;
278 state
= real_set
->state
& real_compare_set
->state
;
281 return_set
= atk_state_set_new();
282 ((AtkRealStateSet
*) return_set
)->state
= state
;
288 * atk_state_set_or_sets
289 * @set: a #AtkStateSet
290 * @compare_set: another #AtkStateSet
291 * return values: a new #AtkStateSet which is the union of the two sets.
293 * Constructs the union of the two sets.
296 atk_state_set_or_sets (AtkStateSet
*set
,
297 AtkStateSet
*compare_set
)
299 AtkRealStateSet
*real_set
, *real_compare_set
;
300 AtkStateSet
*return_set
= NULL
;
303 g_return_val_if_fail (set
!= NULL
, FALSE
);
304 g_return_val_if_fail (ATK_IS_STATE_SET (set
), FALSE
);
305 g_return_val_if_fail (compare_set
!= NULL
, FALSE
);
306 g_return_val_if_fail (ATK_IS_STATE_SET (compare_set
), FALSE
);
308 real_set
= (AtkRealStateSet
*)set
;
309 real_compare_set
= (AtkRealStateSet
*)compare_set
;
311 state
= real_set
->state
| real_compare_set
->state
;
313 return_set
= atk_state_set_new();
314 ((AtkRealStateSet
*) return_set
)->state
= state
;
320 * atk_state_set_xor_sets
321 * @set: a #AtkStateSet
322 * @compare_set: another #AtkStateSet
323 * return values: a new #AtkStateSet which contains the states which are in exactly one of ht two sets.
325 * Constructs the xor of the two sets, returing NULL is empty. The set returned by this operation contains the4 sattes in exactly one of the two sets.
328 atk_state_set_xor_sets (AtkStateSet
*set
,
329 AtkStateSet
*compare_set
)
331 AtkRealStateSet
*real_set
, *real_compare_set
;
332 AtkStateSet
*return_set
= NULL
;
333 AtkState state
, state1
, state2
;
335 g_return_val_if_fail (set
!= NULL
, FALSE
);
336 g_return_val_if_fail (ATK_IS_STATE_SET (set
), FALSE
);
337 g_return_val_if_fail (compare_set
!= NULL
, FALSE
);
338 g_return_val_if_fail (ATK_IS_STATE_SET (compare_set
), FALSE
);
340 real_set
= (AtkRealStateSet
*)set
;
341 real_compare_set
= (AtkRealStateSet
*)compare_set
;
343 state1
= real_set
->state
& (~real_compare_set
->state
);
344 state2
= (~real_set
->state
) & real_compare_set
->state
;
345 state
= state1
| state2
;
349 return_set
= atk_state_set_new();
350 ((AtkRealStateSet
*) return_set
)->state
= state
;