]> Pileus Git - ~andy/gtk/blob - tests/testtreesort.c
Use gtk_box_new() instead gtk_[v|h]box_new()
[~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 static void
88 switch_search_method (GtkWidget *button,
89                       gpointer   tree_view)
90 {
91   if (!gtk_tree_view_get_search_entry (GTK_TREE_VIEW (tree_view)))
92     {
93       gpointer data = g_object_get_data (tree_view, "my-search-entry");
94       gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), GTK_ENTRY (data));
95     }
96   else
97     gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), NULL);
98 }
99
100 int
101 main (int argc, char *argv[])
102 {
103   GtkWidget *window;
104   GtkWidget *vbox;
105   GtkWidget *scrolled_window;
106   GtkWidget *tree_view;
107   GtkTreeStore *model;
108   GtkTreeModel *smodel = NULL;
109   GtkTreeModel *ssmodel = NULL;
110   GtkCellRenderer *renderer;
111   GtkTreeViewColumn *column;
112   GtkTreeIter iter;
113   gint i;
114
115   GtkWidget *entry, *button;
116   GtkWidget *window2, *vbox2, *scrolled_window2, *tree_view2;
117   GtkWidget *window3, *vbox3, *scrolled_window3, *tree_view3;
118
119   gtk_init (&argc, &argv);
120
121   /**
122    * First window - Just a GtkTreeStore
123    */
124
125   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
126   gtk_window_set_title (GTK_WINDOW (window), "Words, words, words - Window 1");
127   g_signal_connect (window, "destroy", gtk_main_quit, NULL);
128   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 8);
129   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
130   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);
131   gtk_container_add (GTK_CONTAINER (window), vbox);
132
133   entry = gtk_entry_new ();
134   gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
135
136   button = gtk_button_new_with_label ("Switch search method");
137   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
138
139   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
140   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
141   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
142   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
143
144   model = gtk_tree_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT);
145
146 /*
147   smodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model));
148   ssmodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (smodel));
149 */
150   tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
151
152   gtk_tree_view_set_search_entry (GTK_TREE_VIEW (tree_view), GTK_ENTRY (entry));
153   g_object_set_data (G_OBJECT (tree_view), "my-search-entry", entry);
154   g_signal_connect (button, "clicked",
155                     G_CALLBACK (switch_search_method), tree_view);
156
157  /* gtk_tree_selection_set_select_function (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)), select_func, NULL, NULL);*/
158
159   /* 12 iters now, 12 later... */
160   for (i = 0; data[i].word_1 != NULL; i++)
161     {
162       gint k;
163       GtkTreeIter child_iter;
164
165
166       gtk_tree_store_prepend (GTK_TREE_STORE (model), &iter, NULL);
167       gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
168                           WORD_COLUMN_1, data[i].word_1,
169                           WORD_COLUMN_2, data[i].word_2,
170                           WORD_COLUMN_3, data[i].word_3,
171                           WORD_COLUMN_4, data[i].word_4,
172                           NUMBER_COLUMN_1, data[i].number_1,
173                           -1);
174
175       gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter);
176       gtk_tree_store_set (GTK_TREE_STORE (model), &child_iter,
177                           WORD_COLUMN_1, data[i].word_1,
178                           WORD_COLUMN_2, data[i].word_2,
179                           WORD_COLUMN_3, data[i].word_3,
180                           WORD_COLUMN_4, data[i].word_4,
181                           NUMBER_COLUMN_1, data[i].number_1,
182                           -1);
183
184       for (k = 0; childdata[k].word_1 != NULL; k++)
185         {
186           gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter);
187           gtk_tree_store_set (GTK_TREE_STORE (model), &child_iter,
188                               WORD_COLUMN_1, childdata[k].word_1,
189                               WORD_COLUMN_2, childdata[k].word_2,
190                               WORD_COLUMN_3, childdata[k].word_3,
191                               WORD_COLUMN_4, childdata[k].word_4,
192                               NUMBER_COLUMN_1, childdata[k].number_1,
193                               -1);
194
195         }
196
197     }
198   
199   smodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (model));
200   ssmodel = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (smodel));
201   g_object_unref (model);
202
203   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
204
205   renderer = gtk_cell_renderer_text_new ();
206   column = gtk_tree_view_column_new_with_attributes ("First Word", renderer,
207                                                      "text", WORD_COLUMN_1,
208                                                      NULL);
209   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
210   gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_1);
211
212   renderer = gtk_cell_renderer_text_new ();
213   column = gtk_tree_view_column_new_with_attributes ("Second Word", renderer,
214                                                      "text", WORD_COLUMN_2,
215                                                      NULL);
216   gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_2);
217   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
218
219   renderer = gtk_cell_renderer_text_new ();
220   column = gtk_tree_view_column_new_with_attributes ("Third Word", renderer,
221                                                      "text", WORD_COLUMN_3,
222                                                      NULL);
223   gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_3);
224   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
225
226   renderer = gtk_cell_renderer_text_new ();
227   column = gtk_tree_view_column_new_with_attributes ("Fourth Word", renderer,
228                                                      "text", WORD_COLUMN_4,
229                                                      NULL);
230   gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_4);
231   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
232   
233   renderer = gtk_cell_renderer_text_new ();
234   column = gtk_tree_view_column_new_with_attributes ("First Number", renderer,
235                                                      "text", NUMBER_COLUMN_1,
236                                                      NULL);
237   gtk_tree_view_column_set_sort_column_id (column, NUMBER_COLUMN_1);
238   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
239
240   /*  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (smodel),
241                                         WORD_COLUMN_1,
242                                         GTK_SORT_ASCENDING);*/
243
244   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
245   gtk_window_set_default_size (GTK_WINDOW (window), 400, 400);
246   gtk_widget_show_all (window);
247
248   /**
249    * Second window - GtkTreeModelSort wrapping the GtkTreeStore
250    */
251
252   if (smodel)
253     {
254       window2 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
255       gtk_window_set_title (GTK_WINDOW (window2), 
256                             "Words, words, words - window 2");
257       g_signal_connect (window2, "destroy", gtk_main_quit, NULL);
258       vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 8);
259       gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
260       gtk_box_pack_start (GTK_BOX (vbox2), 
261                           gtk_label_new ("Jonathan and Kristian's list of words.\n\nA GtkTreeModelSort wrapping the GtkTreeStore of window 1"),
262                           FALSE, FALSE, 0);
263       gtk_container_add (GTK_CONTAINER (window2), vbox2);
264       
265       scrolled_window2 = gtk_scrolled_window_new (NULL, NULL);
266       gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window2),
267                                            GTK_SHADOW_ETCHED_IN);
268       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window2),
269                                       GTK_POLICY_AUTOMATIC,
270                                       GTK_POLICY_AUTOMATIC);
271       gtk_box_pack_start (GTK_BOX (vbox2), scrolled_window2, TRUE, TRUE, 0);
272       
273       
274       tree_view2 = gtk_tree_view_new_with_model (smodel);
275       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view2), TRUE);
276       
277       
278       renderer = gtk_cell_renderer_text_new ();
279       column = gtk_tree_view_column_new_with_attributes ("First Word", renderer,
280                                                          "text", WORD_COLUMN_1,
281                                                          NULL);
282       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column);
283       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_1);
284       
285       renderer = gtk_cell_renderer_text_new ();
286       column = gtk_tree_view_column_new_with_attributes ("Second Word", renderer,
287                                                          "text", WORD_COLUMN_2,
288                                                          NULL);
289       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_2);
290       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column);
291       
292       renderer = gtk_cell_renderer_text_new ();
293       column = gtk_tree_view_column_new_with_attributes ("Third Word", renderer,
294                                                          "text", WORD_COLUMN_3,
295                                                          NULL);
296       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_3);
297       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column);
298       
299       renderer = gtk_cell_renderer_text_new ();
300       column = gtk_tree_view_column_new_with_attributes ("Fourth Word", renderer,
301                                                          "text", WORD_COLUMN_4,
302                                                          NULL);
303       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_4);
304       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view2), column);
305       
306       /*      gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (smodel),
307                                                (GtkTreeIterCompareFunc)gtk_tree_data_list_compare_func,
308                                                NULL, NULL);
309       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (smodel),
310                                             WORD_COLUMN_1,
311                                             GTK_SORT_DESCENDING);*/
312       
313       
314       gtk_container_add (GTK_CONTAINER (scrolled_window2), tree_view2);
315       gtk_window_set_default_size (GTK_WINDOW (window2), 400, 400);
316       gtk_widget_show_all (window2);
317     }
318   
319   /**
320    * Third window - GtkTreeModelSort wrapping the GtkTreeModelSort which
321    * is wrapping the GtkTreeStore.
322    */
323   
324   if (ssmodel)
325     {
326       window3 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
327       gtk_window_set_title (GTK_WINDOW (window3), 
328                             "Words, words, words - Window 3");
329       g_signal_connect (window3, "destroy", gtk_main_quit, NULL);
330       vbox3 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 8);
331       gtk_container_set_border_width (GTK_CONTAINER (vbox3), 8);
332       gtk_box_pack_start (GTK_BOX (vbox3), 
333                           gtk_label_new ("Jonathan and Kristian's list of words.\n\nA GtkTreeModelSort wrapping the GtkTreeModelSort of window 2"),
334                           FALSE, FALSE, 0);
335       gtk_container_add (GTK_CONTAINER (window3), vbox3);
336       
337       scrolled_window3 = gtk_scrolled_window_new (NULL, NULL);
338       gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window3),
339                                            GTK_SHADOW_ETCHED_IN);
340       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window3),
341                                       GTK_POLICY_AUTOMATIC,
342                                       GTK_POLICY_AUTOMATIC);
343       gtk_box_pack_start (GTK_BOX (vbox3), scrolled_window3, TRUE, TRUE, 0);
344       
345       
346       tree_view3 = gtk_tree_view_new_with_model (ssmodel);
347       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view3), TRUE);
348       
349       renderer = gtk_cell_renderer_text_new ();
350       column = gtk_tree_view_column_new_with_attributes ("First Word", renderer,
351                                                          "text", WORD_COLUMN_1,
352                                                          NULL);
353       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column);
354       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_1);
355       
356       renderer = gtk_cell_renderer_text_new ();
357       column = gtk_tree_view_column_new_with_attributes ("Second Word", renderer,
358                                                          "text", WORD_COLUMN_2,
359                                                          NULL);
360       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_2);
361       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column);
362       
363       renderer = gtk_cell_renderer_text_new ();
364       column = gtk_tree_view_column_new_with_attributes ("Third Word", renderer,
365                                                          "text", WORD_COLUMN_3,
366                                                          NULL);
367       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_3);
368       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column);
369       
370       renderer = gtk_cell_renderer_text_new ();
371       column = gtk_tree_view_column_new_with_attributes ("Fourth Word", renderer,
372                                                          "text", WORD_COLUMN_4,
373                                                          NULL);
374       gtk_tree_view_column_set_sort_column_id (column, WORD_COLUMN_4);
375       gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view3), column);
376       
377       /*      gtk_tree_sortable_set_default_sort_func (GTK_TREE_SORTABLE (ssmodel),
378                                                (GtkTreeIterCompareFunc)gtk_tree_data_list_compare_func,
379                                                NULL, NULL);
380       gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (ssmodel),
381                                             WORD_COLUMN_1,
382                                             GTK_SORT_ASCENDING);*/
383       
384       gtk_container_add (GTK_CONTAINER (scrolled_window3), tree_view3);
385       gtk_window_set_default_size (GTK_WINDOW (window3), 400, 400);
386       gtk_widget_show_all (window3);
387     }
388
389   for (i = 0; data[i].word_1 != NULL; i++)
390     {
391       gint k;
392       
393       gtk_tree_store_prepend (GTK_TREE_STORE (model), &iter, NULL);
394       gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
395                           WORD_COLUMN_1, data[i].word_1,
396                           WORD_COLUMN_2, data[i].word_2,
397                           WORD_COLUMN_3, data[i].word_3,
398                           WORD_COLUMN_4, data[i].word_4,
399                           -1);
400       for (k = 0; childdata[k].word_1 != NULL; k++)
401         {
402           GtkTreeIter child_iter;
403           
404           gtk_tree_store_append (GTK_TREE_STORE (model), &child_iter, &iter);
405           gtk_tree_store_set (GTK_TREE_STORE (model), &child_iter,
406                               WORD_COLUMN_1, childdata[k].word_1,
407                               WORD_COLUMN_2, childdata[k].word_2,
408                               WORD_COLUMN_3, childdata[k].word_3,
409                               WORD_COLUMN_4, childdata[k].word_4,
410                               -1);
411         }
412     }
413
414   gtk_main ();
415   
416   return 0;
417 }