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 | |
23 | GtkTreeStore *base_model; |
24 | static int node_count = 0; |
25 | |
26 | static void |
27 | selection_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 | |
36 | static void |
37 | node_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 | |
55 | static void |
56 | iter_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 | |
74 | static void |
75 | iter_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 | |
103 | static void |
104 | iter_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 | |
122 | static void |
123 | iter_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 | |
162 | static void |
163 | iter_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 | |
189 | static void |
190 | iter_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 | |
222 | static void |
223 | iter_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 | |
252 | static void |
253 | iter_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 | |
279 | static gboolean done = FALSE; |
280 | |
281 | static void |
282 | quit_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 | |
292 | static void |
293 | make_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 | |
455 | int |
456 | main (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 | |