1 /* This file contains both declaration and definition of the MyAtkSelection,
2 * a GObject that implements the AtkSelectionIface interface.
5 #include <glib-object.h>
8 #include "my-atk-object.h"
9 #include "my-atk-selection.h"
11 /******************************************************************/
13 /******************************************************************/
14 static GObjectClass *parent_class_simple_selection = NULL;
16 /* Implementation of the AtkSelectionIface interface. */
18 simple_selection_add_selection (AtkSelection *selection, gint i)
20 MyAtkSelection* self = (MyAtkSelection*)selection;
21 if ((!self) || self->disposed)
26 if ((i >= 0) && (i < TEST_SELECTION_NCHILDREN))
28 /* If the child is not selected, select it and send the signal */
29 if (!self->is_selected[i])
31 self->is_selected[i] = TRUE;
32 g_signal_emit_by_name ((gpointer)self, "selection-changed");
45 simple_selection_clear_selection (AtkSelection *selection)
47 MyAtkSelection* self = (MyAtkSelection*)selection;
48 if ((!self) || self->disposed)
55 gboolean changed = FALSE;
57 for (i = 0; i < TEST_SELECTION_NCHILDREN; ++i)
59 changed |= self->is_selected[i];
60 self->is_selected[i] = FALSE;
65 g_signal_emit_by_name ((gpointer)self, "selection-changed");
73 simple_selection_ref_selection (AtkSelection *selection, gint i)
77 MyAtkSelection* self = (MyAtkSelection*)selection;
78 if ((!self) || self->disposed)
84 for (pos = 0; pos < TEST_SELECTION_NCHILDREN; ++pos)
86 if (self->is_selected[pos])
90 g_object_ref (G_OBJECT (self->child[pos]));
91 return ATK_OBJECT(self->child[pos]);
101 simple_selection_get_selection_count (AtkSelection *selection)
103 MyAtkSelection* self = (MyAtkSelection*)selection;
108 if ((!self) || self->disposed)
113 for (i = 0; i < TEST_SELECTION_NCHILDREN; ++i)
115 if (self->is_selected[i])
125 simple_selection_is_child_selected (AtkSelection *selection, gint i)
127 MyAtkSelection* self = (MyAtkSelection*)selection;
128 if ((!self) || self->disposed)
133 if ((i >= 0) && (i < TEST_SELECTION_NCHILDREN))
135 return (self->is_selected[i]);
144 simple_selection_remove_selection (AtkSelection *selection, gint i)
149 MyAtkSelection* self = (MyAtkSelection*)selection;
150 if ((!self) || self->disposed)
156 for (pos = 0; pos < TEST_SELECTION_NCHILDREN; ++pos)
158 if (self->is_selected[pos])
162 self->is_selected[pos] = FALSE;
163 g_signal_emit_by_name ((gpointer)self, "selection-changed");
174 simple_selection_select_all_selection (AtkSelection *selection)
176 MyAtkSelection* self = (MyAtkSelection*)selection;
177 if ((!self) || self->disposed)
182 if (!self->multisel_supported)
189 gboolean changed = FALSE;
191 for (i = 0; i < TEST_SELECTION_NCHILDREN; ++i)
193 changed |= !self->is_selected[i];
194 self->is_selected[i] = TRUE;
199 g_signal_emit_by_name ((gpointer)self, "selection-changed");
206 /******************************************************************/
208 simple_selection_interface_init (gpointer g_iface, gpointer iface_data)
210 AtkSelectionIface *klass = (AtkSelectionIface *)g_iface;
212 /* set up overrides here */
213 klass->add_selection =
214 (gboolean (*) (AtkSelection *selection, gint i)) simple_selection_add_selection;
216 klass->clear_selection =
217 (gboolean (*) (AtkSelection *selection)) simple_selection_clear_selection;
219 klass->ref_selection =
220 (AtkObject* (*) (AtkSelection *selection, gint i)) simple_selection_ref_selection;
222 klass->get_selection_count =
223 (gint (*) (AtkSelection *selection)) simple_selection_get_selection_count;
225 klass->is_child_selected =
226 (gboolean (*) (AtkSelection *selection, gint i)) simple_selection_is_child_selected;
228 klass->remove_selection =
229 (gboolean (*) (AtkSelection *selection, gint i)) simple_selection_remove_selection;
231 klass->select_all_selection =
232 (gboolean (*) (AtkSelection *selection)) simple_selection_select_all_selection;
236 simple_selection_instance_init (GTypeInstance *instance, gpointer g_class)
238 MyAtkSelection *self = (MyAtkSelection *)instance;
241 self->disposed = FALSE;
242 self->multisel_supported = TRUE;
243 for (i = 0; i < TEST_SELECTION_NCHILDREN; ++i)
245 self->child[i] = MY_ATK_OBJECT (g_object_new (MY_TYPE_ATK_OBJECT, NULL));
246 self->child[i]->id = i;
247 self->is_selected[i] = FALSE; /* not selected by default */
252 my_atk_selection_dispose (GObject *obj)
254 MyAtkSelection *self = (MyAtkSelection *)obj;
262 /* Make sure dispose does not run twice. */
263 self->disposed = TRUE;
265 for (i = 0; i < TEST_SELECTION_NCHILDREN; ++i)
267 g_object_unref (G_OBJECT (self->child[i]));
270 /* Chain up to the parent class */
271 G_OBJECT_CLASS (parent_class_simple_selection)->dispose (obj);
275 my_atk_selection_finalize (GObject *obj)
277 /*MyAtkSelection *self = (MyAtkSelection *)obj;
282 /* Chain up to the parent class */
283 G_OBJECT_CLASS (parent_class_simple_selection)->finalize (obj);
287 my_atk_selection_class_init (gpointer g_class, gpointer g_class_data)
289 GObjectClass *gobject_class = G_OBJECT_CLASS (g_class);
290 MyAtkSelectionClass *klass = MY_ATK_SELECTION_CLASS (g_class);
292 gobject_class->dispose = my_atk_selection_dispose;
293 gobject_class->finalize = my_atk_selection_finalize;
295 parent_class_simple_selection = g_type_class_peek_parent (klass);
299 my_atk_selection_get_type (void)
301 static GType type = 0;
304 static const GTypeInfo info =
306 sizeof (MyAtkSelectionClass),
307 NULL, /* base_init */
308 NULL, /* base_finalize */
309 my_atk_selection_class_init, /* class_init */
310 NULL, /* class_finalize */
311 NULL, /* class_data */
312 sizeof (MyAtkSelection),
314 simple_selection_instance_init /* instance_init */
317 static const GInterfaceInfo iface_info =
319 (GInterfaceInitFunc) simple_selection_interface_init, /* interface_init */
320 NULL, /* interface_finalize */
321 NULL /* interface_data */
323 type = g_type_register_static (MY_TYPE_ATK_OBJECT,
324 "MyAtkSelectionType",
326 g_type_add_interface_static (type,