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