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

source code of gtk/tests/treestoretest.c