]> Pileus Git - ~andy/gtk/blob - modules/other/gail/tests/testcombo.c
ca47eab61d433b307d4c7020c40e43fb2beb931c
[~andy/gtk] / modules / other / gail / tests / testcombo.c
1 #include <gtk/gtk.h>
2 #include "testlib.h"
3
4 static void _test_selection (AtkObject *obj);
5 static void _check_combo_box (AtkObject *obj);
6 static void _check_children (AtkObject *obj);
7 static gint _open_combo_list (gpointer data);
8 static gint _close_combo_list (gpointer data);
9
10 #define NUM_VALID_ROLES 1
11
12 static void _check_children (AtkObject *obj)
13 {
14   gint n_children, i, j;
15   AtkObject *child;
16   AtkObject *grand_child;
17   AtkObject *parent;
18
19   n_children = atk_object_get_n_accessible_children (obj);
20
21   if (n_children > 1)
22   {
23     g_print ("*** Unexpected number of children for combo box: %d\n", 
24              n_children);
25     return;
26   }
27   if (n_children == 2)
28   {
29     child = atk_object_ref_accessible_child (obj, 1);
30     g_return_if_fail (atk_object_get_role (child) == ATK_ROLE_TEXT);
31     parent = atk_object_get_parent (child);
32     j = atk_object_get_index_in_parent (child);
33     if (j != 1)
34      g_print ("*** inconsistency between parent and children %d %d ***\n",
35               1, j);       
36     g_object_unref (G_OBJECT (child));
37   }
38
39   child = atk_object_ref_accessible_child (obj, 0);
40   g_return_if_fail (atk_object_get_role (child) == ATK_ROLE_LIST);
41   parent = atk_object_get_parent (child);
42   j = atk_object_get_index_in_parent (child);
43   if (j != 0)
44      g_print ("*** inconsistency between parent and children %d %d ***\n",
45               0, j);       
46
47   n_children = atk_object_get_n_accessible_children (child);
48   for (i = 0; i < n_children; i++)
49   {
50     G_CONST_RETURN gchar *name;
51
52     grand_child = atk_object_ref_accessible_child (child, i);
53     name = atk_object_get_name (grand_child);
54     g_print ("Index: %d Name: %s\n", i, name ? name : "<NULL>");
55     g_object_unref (G_OBJECT (grand_child));
56   }
57   g_object_unref (G_OBJECT (child));
58 }
59   
60 static void _test_selection (AtkObject *obj)
61 {
62   gint count;
63   gint n_children;
64   AtkObject *list;
65
66   count = atk_selection_get_selection_count (ATK_SELECTION (obj));
67   g_return_if_fail (count == 0);
68
69   list = atk_object_ref_accessible_child (obj, 0);
70   n_children = atk_object_get_n_accessible_children (list); 
71   g_object_unref (G_OBJECT (list));
72
73   atk_selection_add_selection (ATK_SELECTION (obj), n_children - 1);
74   count = atk_selection_get_selection_count (ATK_SELECTION (obj));
75   g_return_if_fail (count == 1);
76   g_return_if_fail (atk_selection_is_child_selected (ATK_SELECTION (obj),
77                      n_children - 1));  
78   atk_selection_add_selection (ATK_SELECTION (obj), 0);
79   count = atk_selection_get_selection_count (ATK_SELECTION (obj));
80   g_return_if_fail (count == 1);
81   g_return_if_fail (atk_selection_is_child_selected (ATK_SELECTION (obj), 0));
82   atk_selection_clear_selection (ATK_SELECTION (obj));
83   count = atk_selection_get_selection_count (ATK_SELECTION (obj));
84   g_return_if_fail (count == 0);
85 }
86
87 static void _check_combo_box (AtkObject *obj)
88 {
89   static gboolean done = FALSE;
90   static gboolean done_selection = FALSE;
91   AtkRole role;
92
93   role = atk_object_get_role (obj);
94
95   if (role == ATK_ROLE_FRAME)
96   {
97     AtkRole roles[NUM_VALID_ROLES];
98     AtkObject *combo_obj;
99
100     if (done_selection)
101       return;
102
103     roles[0] = ATK_ROLE_COMBO_BOX;
104
105     combo_obj = find_object_by_role (obj, roles, NUM_VALID_ROLES);
106
107     if (combo_obj)
108     {
109       if (!done_selection)
110       {
111         done_selection = TRUE;
112       }
113       if (g_getenv ("TEST_ACCESSIBLE_COMBO_NOEDIT") != NULL)
114       {
115         GtkWidget *combo;
116         GtkEntry *entry;
117
118         combo = gtk_accessible_get_widget (GTK_ACCESSIBLE (combo_obj));
119         entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo)));
120         gtk_editable_set_editable (GTK_EDITABLE (entry), FALSE);
121       }
122       _check_children (combo_obj);
123       _test_selection (combo_obj);
124     }
125
126     return;
127   }
128   if (role != ATK_ROLE_COMBO_BOX)
129     return;
130
131   g_print ("*** Start ComboBox ***\n");
132   _check_children (obj);
133  
134   if (!done)
135   {
136     g_idle_add ((GSourceFunc)_open_combo_list, obj);
137     done = TRUE;
138   }
139   else
140       return;
141   g_print ("*** End ComboBox ***\n");
142 }
143
144 static gint _open_combo_list (gpointer data)
145 {
146   AtkObject *obj = ATK_OBJECT (data);
147
148   g_print ("_open_combo_list\n");
149   atk_action_do_action (ATK_ACTION (obj), 0);
150
151   g_timeout_add (5000, _close_combo_list, obj);
152   return FALSE;
153 }
154
155 static gint _close_combo_list (gpointer data)
156 {
157   AtkObject *obj = ATK_OBJECT (data);
158
159   gint count;
160   gint n_children;
161   AtkObject *list;
162
163   count = atk_selection_get_selection_count (ATK_SELECTION (obj));
164   g_return_val_if_fail (count == 0, FALSE);
165
166   list = atk_object_ref_accessible_child (obj, 0);
167   n_children = atk_object_get_n_accessible_children (list); 
168   g_object_unref (G_OBJECT (list));
169
170   atk_selection_add_selection (ATK_SELECTION (obj), n_children - 1);
171
172   atk_action_do_action (ATK_ACTION (obj), 0);
173
174   return FALSE;
175 }
176
177 static void
178 _create_event_watcher (void)
179 {
180   atk_add_focus_tracker (_check_combo_box);
181 }
182
183 int
184 gtk_module_init(gint argc, char* argv[])
185 {
186   g_print("testcombo Module loaded\n");
187
188   _create_event_watcher();
189
190   return 0;
191 }