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