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
select_func(GtkTreeSelection * selection,GtkTreeModel * model,GtkTreePath * path,gboolean path_currently_selected,gpointer data)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
switch_search_method(GtkWidget * button,gpointer tree_view)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
main(int argc,char * argv[])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_vbox_new (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_vbox_new (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_vbox_new (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 }
418