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