]> Pileus Git - ~andy/gtk/blob - tests/testtreesort.c
allow cancel to happen.
[~andy/gtk] / tests / testtreesort.c
1 #include <gtk/gtk.h>
2
3 #include "../gtk/gtktreedatalist.h"
4
5
6 typedef struct _ListSort ListSort;
7 struct _ListSort
8 {
9   const gchar *word_1;
10   const gchar *word_2;
11   const gchar *word_3;
12   const gchar *word_4;
13   gint number_1;
14 };
15
16 static ListSort data[] =
17 {
18   { "Apples", "Transmogrify long word to demonstrate weirdness", "Exculpatory", "Gesundheit", 30 },
19   { "Oranges", "Wicker", "Adamantine", "Convivial", 10 },
20   { "Bovine Spongiform Encephilopathy", "Sleazebucket", "Mountaineer", "Pander", 40 },
21   { "Foot and Mouth", "Lampshade", "Skim Milk\nFull Milk", "Viewless", 20 },
22   { "Blood,\nsweat,\ntears", "The Man", "Horses", "Muckety-Muck", 435 },
23   { "Rare Steak", "Siam", "Watchdog", "Xantippe" , 99999 },
24   { "SIGINT", "Rabbit Breath", "Alligator", "Bloodstained", 4123 },
25   { "Google", "Chrysanthemums", "Hobnob", "Leapfrog", 1 },
26   { "Technology fibre optic", "Turtle", "Academe", "Lonely", 3 },
27   { "Freon", "Harpes", "Quidditch", "Reagan", 6},
28   { "Transposition", "Fruit Basket", "Monkey Wort", "Glogg", 54 },
29   { "Fern", "Glasnost and Perestroika", "Latitude", "Bomberman!!!", 2 },
30   {NULL, }
31 };
32
33 static ListSort childdata[] =
34 {
35   { "Heineken", "Nederland", "Wanda de vis", "Electronische post", 2},
36   { "Hottentottententententoonstelling", "Rotterdam", "Ionentransport", "Palm", 45},
37   { "Fruitvlieg", "Eigenfrequentie", "Supernoodles", "Ramen", 2002},
38   { "Gereedschapskist", "Stelsel van lineaire vergelijkingen", "Tulpen", "Badlaken", 1311},
39   { "Stereoinstallatie", "Rood tapijt", "Het periodieke systeem der elementen", "Laaste woord", 200},
40   {NULL, }
41 };
42   
43
44 enum
45 {
46   WORD_COLUMN_1 = 0,
47   WORD_COLUMN_2,
48   WORD_COLUMN_3,
49   WORD_COLUMN_4,
50   NUMBER_COLUMN_1,
51   NUM_COLUMNS
52 };
53
54 gboolean
55 select_func (GtkTreeSelection  *selection,
56              GtkTreeModel      *model,
57              GtkTreePath       *path,
58              gboolean           path_currently_selected,
59              gpointer           data)
60 {
61   if (gtk_tree_path_get_depth (path) > 1)
62     return TRUE;
63   return FALSE;
64 }
65
66 int
67 main (int argc, char *argv[])
68 {
69   GtkWidget *window;
70   GtkWidget *vbox;
71   GtkWidget *scrolled_window;
72   GtkWidget *tree_view;
73   GtkTreeStore *model;
74   GtkTreeModel *smodel = NULL;
75   GtkTreeModel *ssmodel = NULL;
76   GtkCellRenderer *renderer;
77   GtkTreeViewColumn *column;
78   GtkTreeIter iter;
79   gint i;
80
81   GtkWidget *window2, *vbox2, *scrolled_window2, *tree_view2;
82   GtkWidget *window3, *vbox3, *scrolled_window3, *tree_view3;
83
84   gtk_init (&argc, &argv);
85
86   /**
87    * First window - Just a GtkTreeStore
88    */
89
90   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
91   gtk_window_set_title (GTK_WINDOW (window), "Words, words, words - Window 1");
92   gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_main_quit, NULL);
93   vbox = gtk_vbox_new (FALSE, 8);
94   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
95   gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("Jonathan and Kristian's list of cool words. (And Anders' cool list of numbers) \n\nThis is just a GtkTreeStore"), FALSE, FALSE, 0);
96   gtk_container_add (GTK_CONTAINER (window), vbox);
97
98   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
99   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
100   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
101   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
102
103   model = gtk_tree_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
104
105 /*
106   smodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model));
107   ssmodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (smodel));
108 */
109   tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
110   gtk_tree_selection_set_select_function (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)), select_func, NULL, NULL);
111   /* 12 iters now, 12 later... */
112   for (i = 0; data[i].word_1 != NULL; i++)
113     {
114       gint k;
115       GtkTreeIter child_iter;
116
117
118       gtk_tree_store_prepend (GTK_TREE_STORE (model), &iter, NULL);
119       gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
120                           WORD_COLUMN_1, data[i].word_1,
121                           WORD_COLUMN_2, data[i].word_2,
122                           WORD_COLUMN_3, data[i].word_3,
123                           WORD_COLUMN_4, data[i].word_4,
124                           NUMBER_COLUMN_1, data[i].number_1,
125                           -1);
126
127       gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter);
128       gtk_tree_store_set (GTK_TREE_STORE (model), &child_iter,
129                           WORD_COLUMN_1, data[i].word_1,
130                           WORD_COLUMN_2, data[i].word_2,
131                           WORD_COLUMN_3, data[i].word_3,
132                           WORD_COLUMN_4, data[i].word_4,
133                           NUMBER_COLUMN_1, data[i].number_1,
134                           -1);
135
136       for (k = 0; childdata[k].word_1 != NULL; k++)
137         {
138           gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter);
139           gtk_tree_store_set (GTK_TREE_STORE (model), &child_iter,
140                               WORD_COLUMN_1, childdata[k].word_1,
141                               WORD_COLUMN_2, childdata[k].word_2,
142                               WORD_COLUMN_3, childdata[k].word_3,
143                               WORD_COLUMN_4, childdata[k].word_4,
144                               NUMBER_COLUMN_1, childdata[k].number_1,
145                               -1);
146
147         }
148
149     }
150   
151   smodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model));
152   ssmodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (smodel));
153
154   g_object_unref (G_OBJECT (model));
155   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
156
157   renderer = gtk_cell_renderer_text_new ();
158   column = gtk_tree_view_column_new_with_attributes ("First Word", renderer,
159                                                      "text", WORD_COLUMN_1,
160                                                      NULL);
161   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
162   gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_1);
163
164   renderer = gtk_cell_renderer_text_new ();
165   column = gtk_tree_view_column_new_with_attributes ("Second Word", renderer,
166                                                      "text", WORD_COLUMN_2,
167                                                      NULL);
168   gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_2);
169   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
170
171   renderer = gtk_cell_renderer_text_new ();
172   column = gtk_tree_view_column_new_with_attributes ("Third Word", renderer,
173                                                      "text", WORD_COLUMN_3,
174                                                      NULL);
175   gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_3);
176   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
177
178   renderer = gtk_cell_renderer_text_new ();
179   column = gtk_tree_view_column_new_with_attributes ("Fourth Word", renderer,
180                                                      "text", WORD_COLUMN_4,
181                                                      NULL);
182   gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_4);
183   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
184   
185   renderer = gtk_cell_renderer_text_new ();
186   column = gtk_tree_view_column_new_with_attributes ("First Number", renderer,
187                                                      "text", NUMBER_COLUMN_1,
188                                                      NULL);
189   gtk_tree_view_column_set_sort_column_id (column, NUMBER_COLUMN_1);
190   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
191
192   /*  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (smodel),
193                                         WORD_COLUMN_1,
194                                         GTK_SORT_ASCENDING);*/
195
196   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
197   gtk_window_set_default_size (GTK_WINDOW (window), 400, 400);
198   gtk_widget_show_all (window);
199
200   /**
201    * Second window - GtkTreeModelSort wrapping the GtkTreeStore
202    */
203
204   if (smodel)
205     {
206       window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
207       gtk_window_set_title (GTK_WINDOW (window2), 
208                             "Words, words, words - window 2");
209       gtk_signal_connect (GTK_OBJECT (window2), "destroy", gtk_main_quit, NULL);
210       vbox2 = gtk_vbox_new (FALSE, 8);
211       gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
212       gtk_box_pack_start (GTK_BOX (vbox2), 
213                           gtk_label_new ("Jonathan and Kristian's list of words.\n\nA GtkTreeModelSort wrapping the GtkTreeStore of window 1"),
214                           FALSE, FALSE, 0);
215       gtk_container_add (GTK_CONTAINER (window2), vbox2);
216       
217       scrolled_window2 = gtk_scrolled_window_new (NULL, NULL);
218       gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window2),
219                                            GTK_SHADOW_ETCHED_IN);
220       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window2),
221                                       GTK_POLICY_AUTOMATIC,
222                                       GTK_POLICY_AUTOMATIC);
223       gtk_box_pack_start (GTK_BOX (vbox2), scrolled_window2, TRUE, TRUE, 0);
224       
225       
226       tree_view2 = gtk_tree_view_new_with_model (smodel);
227       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view2), TRUE);
228       
229       
230       renderer = gtk_cell_renderer_text_new ();
231       column = gtk_tree_view_column_new_with_attributes ("First Word", renderer,
232                                                          "text", WORD_COLUMN_1,
233                                                          NULL);
234       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column);
235       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_1);
236       
237       renderer = gtk_cell_renderer_text_new ();
238       column = gtk_tree_view_column_new_with_attributes ("Second Word", renderer,
239                                                          "text", WORD_COLUMN_2,
240                                                          NULL);
241       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_2);
242       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column);
243       
244       renderer = gtk_cell_renderer_text_new ();
245       column = gtk_tree_view_column_new_with_attributes ("Third Word", renderer,
246                                                          "text", WORD_COLUMN_3,
247                                                          NULL);
248       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_3);
249       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column);
250       
251       renderer = gtk_cell_renderer_text_new ();
252       column = gtk_tree_view_column_new_with_attributes ("Fourth Word", renderer,
253                                                          "text", WORD_COLUMN_4,
254                                                          NULL);
255       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_4);
256       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column);
257       
258       /*      gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (smodel),
259                                                (GtkTreeIterCompareFunc)gtk_tree_data_list_compare_func,
260                                                NULL, NULL);
261       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (smodel),
262                                             WORD_COLUMN_1,
263                                             GTK_SORT_DESCENDING);*/
264       
265       
266       gtk_container_add (GTK_CONTAINER (scrolled_window2), tree_view2);
267       gtk_window_set_default_size (GTK_WINDOW (window2), 400, 400);
268       gtk_widget_show_all (window2);
269     }
270   
271   /**
272    * Third window - GtkTreeModelSort wrapping the GtkTreeModelSort which
273    * is wrapping the GtkTreeStore.
274    */
275   
276   if (ssmodel)
277     {
278       window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
279       gtk_window_set_title (GTK_WINDOW (window3), 
280                             "Words, words, words - Window 3");
281       gtk_signal_connect (GTK_OBJECT (window3), "destroy", gtk_main_quit, NULL);
282       vbox3 = gtk_vbox_new (FALSE, 8);
283       gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
284       gtk_box_pack_start (GTK_BOX (vbox3), 
285                           gtk_label_new ("Jonathan and Kristian's list of words.\n\nA GtkTreeModelSort wrapping the GtkTreeModelSort of window 2"),
286                           FALSE, FALSE, 0);
287       gtk_container_add (GTK_CONTAINER (window3), vbox3);
288       
289       scrolled_window3 = gtk_scrolled_window_new (NULL, NULL);
290       gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window3),
291                                            GTK_SHADOW_ETCHED_IN);
292       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window3),
293                                       GTK_POLICY_AUTOMATIC,
294                                       GTK_POLICY_AUTOMATIC);
295       gtk_box_pack_start (GTK_BOX (vbox3), scrolled_window3, TRUE, TRUE, 0);
296       
297       
298       tree_view3 = gtk_tree_view_new_with_model (ssmodel);
299       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view3), TRUE);
300       
301       renderer = gtk_cell_renderer_text_new ();
302       column = gtk_tree_view_column_new_with_attributes ("First Word", renderer,
303                                                          "text", WORD_COLUMN_1,
304                                                          NULL);
305       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column);
306       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_1);
307       
308       renderer = gtk_cell_renderer_text_new ();
309       column = gtk_tree_view_column_new_with_attributes ("Second Word", renderer,
310                                                          "text", WORD_COLUMN_2,
311                                                          NULL);
312       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_2);
313       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column);
314       
315       renderer = gtk_cell_renderer_text_new ();
316       column = gtk_tree_view_column_new_with_attributes ("Third Word", renderer,
317                                                          "text", WORD_COLUMN_3,
318                                                          NULL);
319       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_3);
320       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column);
321       
322       renderer = gtk_cell_renderer_text_new ();
323       column = gtk_tree_view_column_new_with_attributes ("Fourth Word", renderer,
324                                                          "text", WORD_COLUMN_4,
325                                                          NULL);
326       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_4);
327       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column);
328       
329       /*      gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (ssmodel),
330                                                (GtkTreeIterCompareFunc)gtk_tree_data_list_compare_func,
331                                                NULL, NULL);
332       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (ssmodel),
333                                             WORD_COLUMN_1,
334                                             GTK_SORT_ASCENDING);*/
335       
336       gtk_container_add (GTK_CONTAINER (scrolled_window3), tree_view3);
337       gtk_window_set_default_size (GTK_WINDOW (window3), 400, 400);
338       gtk_widget_show_all (window3);
339     }
340
341   for (i = 0; data[i].word_1 != NULL; i++)
342     {
343       gint k;
344       
345       gtk_tree_store_prepend (GTK_TREE_STORE (model), &iter, NULL);
346       gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
347                           WORD_COLUMN_1, data[i].word_1,
348                           WORD_COLUMN_2, data[i].word_2,
349                           WORD_COLUMN_3, data[i].word_3,
350                           WORD_COLUMN_4, data[i].word_4,
351                           -1);
352       for (k = 0; childdata[k].word_1 != NULL; k++)
353         {
354           GtkTreeIter child_iter;
355           
356           gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter);
357           gtk_tree_store_set (GTK_TREE_STORE (model), &child_iter,
358                               WORD_COLUMN_1, childdata[k].word_1,
359                               WORD_COLUMN_2, childdata[k].word_2,
360                               WORD_COLUMN_3, childdata[k].word_3,
361                               WORD_COLUMN_4, childdata[k].word_4,
362                               -1);
363         }
364     }
365
366   gtk_main ();
367   
368   return 0;
369 }