1 /* treestoretest.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 #include "config.h"
21 #include <gtk/gtk.h>
22 #include <stdlib.h>
23 #include <string.h>
24 
25 GtkTreeStore *base_model;
26 static gint node_count = 0;
27 
28 static void
selection_changed(GtkTreeSelection * selection,GtkWidget * button)29 selection_changed (GtkTreeSelection *selection,
30 		   GtkWidget        *button)
31 {
32   if (gtk_tree_selection_get_selected (selection, NULL, NULL))
33     gtk_widget_set_sensitive (button, TRUE);
34   else
35     gtk_widget_set_sensitive (button, FALSE);
36 }
37 
38 static void
node_set(GtkTreeIter * iter)39 node_set (GtkTreeIter *iter)
40 {
41   gint n;
42   gchar *str;
43 
44   str = g_strdup_printf ("Row (<span color=\"red\">%d</span>)", node_count++);
45   gtk_tree_store_set (base_model, iter, 0, str, -1);
46   g_free (str);
47 
48   n = g_random_int_range (10000,99999);
49   if (n < 0)
50     n *= -1;
51   str = g_strdup_printf ("%d", n);
52 
53   gtk_tree_store_set (base_model, iter, 1, str, -1);
54   g_free (str);
55 }
56 
57 static void
iter_remove(GtkWidget * button,GtkTreeView * tree_view)58 iter_remove (GtkWidget *button, GtkTreeView *tree_view)
59 {
60   GtkTreeIter selected;
61   GtkTreeModel *model;
62 
63   model = gtk_tree_view_get_model (tree_view);
64 
65   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (tree_view),
66 				       NULL,
67 				       &selected))
68     {
69       if (GTK_IS_TREE_STORE (model))
70 	{
71 	  gtk_tree_store_remove (GTK_TREE_STORE (model), &selected);
72 	}
73     }
74 }
75 
76 static void
iter_insert(GtkWidget * button,GtkTreeView * tree_view)77 iter_insert (GtkWidget *button, GtkTreeView *tree_view)
78 {
79   GtkWidget *entry;
80   GtkTreeIter iter;
81   GtkTreeIter selected;
82   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
83 
84   entry = g_object_get_data (G_OBJECT (button), "user_data");
85   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
86 				       NULL,
87 				       &selected))
88     {
89       gtk_tree_store_insert (GTK_TREE_STORE (model),
90 			     &iter,
91 			     &selected,
92 			     atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
93     }
94   else
95     {
96       gtk_tree_store_insert (GTK_TREE_STORE (model),
97 			     &iter,
98 			     NULL,
99 			     atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
100     }
101 
102   node_set (&iter);
103 }
104 
105 static void
iter_change(GtkWidget * button,GtkTreeView * tree_view)106 iter_change (GtkWidget *button, GtkTreeView *tree_view)
107 {
108   GtkWidget *entry;
109   GtkTreeIter selected;
110   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
111 
112   entry = g_object_get_data (G_OBJECT (button), "user_data");
113   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
114 				       NULL, &selected))
115     {
116       gtk_tree_store_set (GTK_TREE_STORE (model),
117 			  &selected,
118 			  1,
119 			  gtk_entry_get_text (GTK_ENTRY (entry)),
120 			  -1);
121     }
122 }
123 
124 static void
iter_insert_with_values(GtkWidget * button,GtkTreeView * tree_view)125 iter_insert_with_values (GtkWidget *button, GtkTreeView *tree_view)
126 {
127   GtkWidget *entry;
128   GtkTreeIter iter;
129   GtkTreeIter selected;
130   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
131   gchar *str1, *str2;
132 
133   entry = g_object_get_data (G_OBJECT (button), "user_data");
134   str1 = g_strdup_printf ("Row (<span color=\"red\">%d</span>)", node_count++);
135   str2 = g_strdup_printf ("%d", atoi (gtk_entry_get_text (GTK_ENTRY (entry))));
136 
137   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
138 				       NULL,
139 				       &selected))
140     {
141       gtk_tree_store_insert_with_values (GTK_TREE_STORE (model),
142 					 &iter,
143 					 &selected,
144 					 -1,
145 					 0, str1,
146 					 1, str2,
147 					 -1);
148     }
149   else
150     {
151       gtk_tree_store_insert_with_values (GTK_TREE_STORE (model),
152 					 &iter,
153 					 NULL,
154 					 -1,
155 					 0, str1,
156 					 1, str2,
157 					 -1);
158     }
159 
160   g_free (str1);
161   g_free (str2);
162 }
163 
164 static void
iter_insert_before(GtkWidget * button,GtkTreeView * tree_view)165 iter_insert_before  (GtkWidget *button, GtkTreeView *tree_view)
166 {
167   GtkTreeIter iter;
168   GtkTreeIter selected;
169   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
170 
171   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
172 				       NULL,
173 				       &selected))
174     {
175       gtk_tree_store_insert_before (GTK_TREE_STORE (model),
176 				    &iter,
177 				    NULL,
178 				    &selected);
179     }
180   else
181     {
182       gtk_tree_store_insert_before (GTK_TREE_STORE (model),
183 				    &iter,
184 				    NULL,
185 				    NULL);
186     }
187 
188   node_set (&iter);
189 }
190 
191 static void
iter_insert_after(GtkWidget * button,GtkTreeView * tree_view)192 iter_insert_after (GtkWidget *button, GtkTreeView *tree_view)
193 {
194   GtkTreeIter iter;
195   GtkTreeIter selected;
196   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
197 
198   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
199 				       NULL,
200 				       &selected))
201     {
202       if (GTK_IS_TREE_STORE (model))
203 	{
204 	  gtk_tree_store_insert_after (GTK_TREE_STORE (model),
205 				       &iter,
206 				       NULL,
207 				       &selected);
208 	  node_set (&iter);
209 	}
210     }
211   else
212     {
213       if (GTK_IS_TREE_STORE (model))
214 	{
215 	  gtk_tree_store_insert_after (GTK_TREE_STORE (model),
216 				       &iter,
217 				       NULL,
218 				       NULL);
219 	  node_set (&iter);
220 	}
221     }
222 }
223 
224 static void
iter_prepend(GtkWidget * button,GtkTreeView * tree_view)225 iter_prepend (GtkWidget *button, GtkTreeView *tree_view)
226 {
227   GtkTreeIter iter;
228   GtkTreeIter selected;
229   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
230   GtkTreeSelection *selection = gtk_tree_view_get_selection (tree_view);
231 
232   if (gtk_tree_selection_get_selected (selection, NULL, &selected))
233     {
234       if (GTK_IS_TREE_STORE (model))
235 	{
236 	  gtk_tree_store_prepend (GTK_TREE_STORE (model),
237 				  &iter,
238 				  &selected);
239 	  node_set (&iter);
240 	}
241     }
242   else
243     {
244       if (GTK_IS_TREE_STORE (model))
245 	{
246 	  gtk_tree_store_prepend (GTK_TREE_STORE (model),
247 				  &iter,
248 				  NULL);
249 	  node_set (&iter);
250 	}
251     }
252 }
253 
254 static void
iter_append(GtkWidget * button,GtkTreeView * tree_view)255 iter_append (GtkWidget *button, GtkTreeView *tree_view)
256 {
257   GtkTreeIter iter;
258   GtkTreeIter selected;
259   GtkTreeModel *model = gtk_tree_view_get_model (tree_view);
260 
261   if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
262 				       NULL,
263 				       &selected))
264     {
265       if (GTK_IS_TREE_STORE (model))
266 	{
267 	  gtk_tree_store_append (GTK_TREE_STORE (model), &iter, &selected);
268 	  node_set (&iter);
269 	}
270     }
271   else
272     {
273       if (GTK_IS_TREE_STORE (model))
274 	{
275 	  gtk_tree_store_append (GTK_TREE_STORE (model), &iter, NULL);
276 	  node_set (&iter);
277 	}
278     }
279 }
280 
281 static void
make_window(gint view_type)282 make_window (gint view_type)
283 {
284   GtkWidget *window;
285   GtkWidget *vbox;
286   GtkWidget *hbox, *entry;
287   GtkWidget *button;
288   GtkWidget *scrolled_window;
289   GtkWidget *tree_view;
290   GtkTreeViewColumn *column;
291   GtkCellRenderer *cell;
292   GObject *selection;
293 
294   /* Make the Widgets/Objects */
295   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
296   switch (view_type)
297     {
298     case 0:
299       gtk_window_set_title (GTK_WINDOW (window), "Unsorted list");
300       break;
301     case 1:
302       gtk_window_set_title (GTK_WINDOW (window), "Sorted list");
303       break;
304     }
305 
306   vbox = gtk_vbox_new (FALSE, 8);
307   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
308   gtk_window_set_default_size (GTK_WINDOW (window), 300, 350);
309   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
310   switch (view_type)
311     {
312     case 0:
313       tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (base_model));
314       break;
315     case 1:
316       {
317 	GtkTreeModel *sort_model;
318 
319 	sort_model = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (base_model));
320 	tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (sort_model));
321       }
322       break;
323     default:
324       g_assert_not_reached ();
325       tree_view = NULL; /* Quiet compiler */
326       break;
327     }
328 
329   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
330   selection = G_OBJECT (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)));
331   gtk_tree_selection_set_mode (GTK_TREE_SELECTION (selection), GTK_SELECTION_SINGLE);
332 
333   /* Put them together */
334   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
335   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
336   gtk_container_add (GTK_CONTAINER (window), vbox);
337   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
338 				  GTK_POLICY_AUTOMATIC,
339 				  GTK_POLICY_AUTOMATIC);
340   g_signal_connect (window, "destroy", gtk_main_quit, NULL);
341 
342   /* buttons */
343   button = gtk_button_new_with_label ("gtk_tree_store_remove");
344   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
345   g_signal_connect (selection, "changed",
346                     G_CALLBACK (selection_changed),
347                     button);
348   g_signal_connect (button, "clicked",
349                     G_CALLBACK (iter_remove),
350                     tree_view);
351   gtk_widget_set_sensitive (button, FALSE);
352 
353   button = gtk_button_new_with_label ("gtk_tree_store_insert");
354   hbox = gtk_hbox_new (FALSE, 8);
355   entry = gtk_entry_new ();
356   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
357   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
358   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
359   g_object_set_data (G_OBJECT (button), "user_data", entry);
360   g_signal_connect (button, "clicked",
361                     G_CALLBACK (iter_insert),
362                     tree_view);
363 
364   button = gtk_button_new_with_label ("gtk_tree_store_set");
365   hbox = gtk_hbox_new (FALSE, 8);
366   entry = gtk_entry_new ();
367   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
368   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
369   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
370   g_object_set_data (G_OBJECT (button), "user_data", entry);
371   g_signal_connect (button, "clicked",
372 		    G_CALLBACK (iter_change),
373 		    tree_view);
374 
375   button = gtk_button_new_with_label ("gtk_tree_store_insert_with_values");
376   hbox = gtk_hbox_new (FALSE, 8);
377   entry = gtk_entry_new ();
378   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
379   gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
380   gtk_box_pack_start (GTK_BOX (hbox), entry, FALSE, FALSE, 0);
381   g_object_set_data (G_OBJECT (button), "user_data", entry);
382   g_signal_connect (button, "clicked",
383 		    G_CALLBACK (iter_insert_with_values),
384 		    tree_view);
385 
386   button = gtk_button_new_with_label ("gtk_tree_store_insert_before");
387   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
388   g_signal_connect (button, "clicked",
389                     G_CALLBACK (iter_insert_before),
390                     tree_view);
391   g_signal_connect (selection, "changed",
392                     G_CALLBACK (selection_changed),
393                     button);
394   gtk_widget_set_sensitive (button, FALSE);
395 
396   button = gtk_button_new_with_label ("gtk_tree_store_insert_after");
397   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
398   g_signal_connect (button, "clicked",
399                     G_CALLBACK (iter_insert_after),
400                     tree_view);
401   g_signal_connect (selection, "changed",
402                     G_CALLBACK (selection_changed),
403                     button);
404   gtk_widget_set_sensitive (button, FALSE);
405 
406   button = gtk_button_new_with_label ("gtk_tree_store_prepend");
407   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
408   g_signal_connect (button, "clicked",
409                     G_CALLBACK (iter_prepend),
410                     tree_view);
411 
412   button = gtk_button_new_with_label ("gtk_tree_store_append");
413   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
414   g_signal_connect (button, "clicked",
415                     G_CALLBACK (iter_append),
416                     tree_view);
417 
418   /* The selected column */
419   cell = gtk_cell_renderer_text_new ();
420   column = gtk_tree_view_column_new_with_attributes ("Node ID", cell, "markup", 0, NULL);
421   gtk_tree_view_column_set_sort_column_id (column, 0);
422   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
423 
424   cell = gtk_cell_renderer_text_new ();
425   column = gtk_tree_view_column_new_with_attributes ("Random Number", cell, "text", 1, NULL);
426   gtk_tree_view_column_set_sort_column_id (column, 1);
427   gtk_tree_view_append_column (GTK_TREE_VIEW (tree_view), column);
428 
429   /* A few to start */
430   if (view_type == 0)
431     {
432       iter_append (NULL, GTK_TREE_VIEW (tree_view));
433       iter_append (NULL, GTK_TREE_VIEW (tree_view));
434       iter_append (NULL, GTK_TREE_VIEW (tree_view));
435       iter_append (NULL, GTK_TREE_VIEW (tree_view));
436       iter_append (NULL, GTK_TREE_VIEW (tree_view));
437       iter_append (NULL, GTK_TREE_VIEW (tree_view));
438     }
439   /* Show it all */
440   gtk_widget_show_all (window);
441 }
442 
443 int
main(int argc,char * argv[])444 main (int argc, char *argv[])
445 {
446   gtk_init (&argc, &argv);
447 
448   base_model = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
449 
450   /* FIXME: reverse this */
451   make_window (0);
452   make_window (1);
453 
454   gtk_main ();
455 
456   return 0;
457 }
458 
459