2 * Copyright (C) 2001 Red Hat, Inc
3 * Author: Jonathan Blandford
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.
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.
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/>.
22 typedef struct _TreeStruct TreeStruct;
31 gboolean world_holiday; /* shared by the european hackers */
36 static TreeStruct january[] =
38 {"New Years Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
39 {"Presidential Inauguration", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
40 {"Martin Luther King Jr. day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
44 static TreeStruct february[] =
46 { "Presidents' Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
47 { "Groundhog Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
48 { "Valentine's Day", FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, NULL },
52 static TreeStruct march[] =
54 { "National Tree Planting Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
55 { "St Patrick's Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
59 static TreeStruct april[] =
61 { "April Fools' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
62 { "Army Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
63 { "Earth Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
64 { "Administrative Professionals' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
68 static TreeStruct may[] =
70 { "Nurses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
71 { "National Day of Prayer", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
72 { "Mothers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
73 { "Armed Forces Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
74 { "Memorial Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
78 static TreeStruct june[] =
80 { "June Fathers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
81 { "Juneteenth (Liberation of Slaves)", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
82 { "Flag Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
86 static TreeStruct july[] =
88 { "Parents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
89 { "Independence Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
93 static TreeStruct august[] =
95 { "Air Force Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
96 { "Coast Guard Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
97 { "Friendship Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
101 static TreeStruct september[] =
103 { "Grandparents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
104 { "Citizenship Day or Constitution Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
105 { "Labor Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
109 static TreeStruct october[] =
111 { "National Children's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
112 { "Bosses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
113 { "Sweetest Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
114 { "Mother-in-Law's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
115 { "Navy Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
116 { "Columbus Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
117 { "Halloween", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
121 static TreeStruct november[] =
123 { "Marine Corps Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
124 { "Veterans' Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
125 { "Thanksgiving", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
129 static TreeStruct december[] =
131 { "Pearl Harbor Remembrance Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
132 { "Christmas", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
133 { "Kwanzaa", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
138 static TreeStruct toplevel[] =
140 {"January", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, january},
141 {"February", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, february},
142 {"March", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, march},
143 {"April", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, april},
144 {"May", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, may},
145 {"June", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, june},
146 {"July", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, july},
147 {"August", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, august},
148 {"September", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, september},
149 {"October", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, october},
150 {"November", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, november},
151 {"December", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, december},
169 static GtkTreeModel *
173 TreeStruct *month = toplevel;
176 model = gtk_tree_store_new (NUM_COLUMNS,
188 TreeStruct *holiday = month->children;
190 gtk_tree_store_append (model, &iter, NULL);
191 gtk_tree_store_set (model, &iter,
192 HOLIDAY_COLUMN, month->label,
198 VISIBLE_COLUMN, FALSE,
201 while (holiday->label)
203 GtkTreeIter child_iter;
205 gtk_tree_store_append (model, &child_iter, &iter);
206 gtk_tree_store_set (model, &child_iter,
207 HOLIDAY_COLUMN, holiday->label,
208 ALEX_COLUMN, holiday->alex,
209 HAVOC_COLUMN, holiday->havoc,
210 TIM_COLUMN, holiday->tim,
211 OWEN_COLUMN, holiday->owen,
212 DAVE_COLUMN, holiday->dave,
213 VISIBLE_COLUMN, TRUE,
214 WORLD_COLUMN, holiday->world_holiday,
222 return GTK_TREE_MODEL (model);
226 alex_toggled (GtkCellRendererToggle *cell,
230 GtkTreeModel *model = (GtkTreeModel *) data;
232 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
235 gtk_tree_model_get_iter (model, &iter, path);
236 gtk_tree_model_get (model, &iter, ALEX_COLUMN, &alex, -1);
239 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, ALEX_COLUMN, alex, -1);
241 gtk_tree_path_free (path);
245 havoc_toggled (GtkCellRendererToggle *cell,
249 GtkTreeModel *model = (GtkTreeModel *) data;
251 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
254 gtk_tree_model_get_iter (model, &iter, path);
255 gtk_tree_model_get (model, &iter, HAVOC_COLUMN, &havoc, -1);
258 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, HAVOC_COLUMN, havoc, -1);
260 gtk_tree_path_free (path);
264 owen_toggled (GtkCellRendererToggle *cell,
268 GtkTreeModel *model = (GtkTreeModel *) data;
270 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
273 gtk_tree_model_get_iter (model, &iter, path);
274 gtk_tree_model_get (model, &iter, OWEN_COLUMN, &owen, -1);
277 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, OWEN_COLUMN, owen, -1);
279 gtk_tree_path_free (path);
283 tim_toggled (GtkCellRendererToggle *cell,
287 GtkTreeModel *model = (GtkTreeModel *) data;
289 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
292 gtk_tree_model_get_iter (model, &iter, path);
293 gtk_tree_model_get (model, &iter, TIM_COLUMN, &tim, -1);
296 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, TIM_COLUMN, tim, -1);
298 gtk_tree_path_free (path);
302 dave_toggled (GtkCellRendererToggle *cell,
306 GtkTreeModel *model = (GtkTreeModel *) data;
308 GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
311 gtk_tree_model_get_iter (model, &iter, path);
312 gtk_tree_model_get (model, &iter, DAVE_COLUMN, &dave, -1);
315 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, DAVE_COLUMN, dave, -1);
317 gtk_tree_path_free (path);
321 set_indicator_size (GtkTreeViewColumn *column,
322 GtkCellRenderer *cell,
330 path = gtk_tree_model_get_path (model, iter);
331 size = gtk_tree_path_get_indices (path)[0] * 2 + 10;
332 gtk_tree_path_free (path);
334 g_object_set (cell, "indicator_size", size, NULL);
338 main (int argc, char *argv[])
342 GtkWidget *scrolled_window;
343 GtkWidget *tree_view;
345 GtkCellRenderer *renderer;
347 GtkTreeViewColumn *column;
349 gtk_init (&argc, &argv);
351 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
352 gtk_window_set_title (GTK_WINDOW (window), "Card planning sheet");
353 g_signal_connect (window, "destroy", gtk_main_quit, NULL);
354 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
355 gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
356 gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("Jonathan's Holiday Card Planning Sheet"), FALSE, FALSE, 0);
357 gtk_container_add (GTK_CONTAINER (window), vbox);
359 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
360 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
361 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
362 gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
364 model = make_model ();
365 tree_view = gtk_tree_view_new_with_model (model);
366 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
367 gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
368 GTK_SELECTION_MULTIPLE);
369 renderer = gtk_cell_renderer_text_new ();
370 col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
373 "text", HOLIDAY_COLUMN, NULL);
374 column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
375 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
378 renderer = gtk_cell_renderer_toggle_new ();
379 g_signal_connect (renderer, "toggled", G_CALLBACK (alex_toggled), model);
381 g_object_set (renderer, "xalign", 0.0, NULL);
382 col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
385 "active", ALEX_COLUMN,
386 "visible", VISIBLE_COLUMN,
387 "activatable", WORLD_COLUMN,
389 column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
390 gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
391 gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
392 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
395 renderer = gtk_cell_renderer_toggle_new ();
396 g_signal_connect (renderer, "toggled", G_CALLBACK (havoc_toggled), model);
398 g_object_set (renderer, "xalign", 0.0, NULL);
399 col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
402 "active", HAVOC_COLUMN,
403 "visible", VISIBLE_COLUMN,
405 column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
406 gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
407 gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
408 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
411 renderer = gtk_cell_renderer_toggle_new ();
412 g_signal_connect (renderer, "toggled", G_CALLBACK (tim_toggled), model);
414 g_object_set (renderer, "xalign", 0.0, NULL);
415 col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
418 "active", TIM_COLUMN,
419 "visible", VISIBLE_COLUMN,
420 "activatable", WORLD_COLUMN,
422 column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
423 gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
424 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
425 gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
428 renderer = gtk_cell_renderer_toggle_new ();
429 g_signal_connect (renderer, "toggled", G_CALLBACK (owen_toggled), model);
430 g_object_set (renderer, "xalign", 0.0, NULL);
431 col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
434 "active", OWEN_COLUMN,
435 "visible", VISIBLE_COLUMN,
437 column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
438 gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
439 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
440 gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
443 renderer = gtk_cell_renderer_toggle_new ();
444 g_signal_connect (renderer, "toggled", G_CALLBACK (dave_toggled), model);
445 g_object_set (renderer, "xalign", 0.0, NULL);
446 col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
449 "active", DAVE_COLUMN,
450 "visible", VISIBLE_COLUMN,
452 column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
453 gtk_tree_view_column_set_cell_data_func (column, renderer, set_indicator_size, NULL, NULL);
454 gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
455 gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
456 gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
458 gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
460 g_signal_connect (tree_view, "realize",
461 G_CALLBACK (gtk_tree_view_expand_all),
463 gtk_window_set_default_size (GTK_WINDOW (window),
465 gtk_widget_show_all (window);
467 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
468 gtk_window_set_title (GTK_WINDOW (window), "Model");
469 g_signal_connect (window, "destroy", gtk_main_quit, NULL);
470 vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
471 gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
472 gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("The model revealed"), FALSE, FALSE, 0);
473 gtk_container_add (GTK_CONTAINER (window), vbox);
475 scrolled_window = gtk_scrolled_window_new (NULL, NULL);
476 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
477 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
478 gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
481 tree_view = gtk_tree_view_new_with_model (model);
482 g_object_unref (model);
483 gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
485 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
486 -1, "Holiday Column",
487 gtk_cell_renderer_text_new (),
490 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
492 gtk_cell_renderer_text_new (),
495 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
497 gtk_cell_renderer_text_new (),
500 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
502 gtk_cell_renderer_text_new (),
505 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
507 gtk_cell_renderer_text_new (),
510 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
512 gtk_cell_renderer_text_new (),
515 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
516 -1, "Visible Column",
517 gtk_cell_renderer_text_new (),
520 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
522 gtk_cell_renderer_text_new (),
525 g_signal_connect (tree_view, "realize",
526 G_CALLBACK (gtk_tree_view_expand_all),
529 gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
532 gtk_window_set_default_size (GTK_WINDOW (window),
535 gtk_widget_show_all (window);