1 /* testtreefocus.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 typedef struct _TreeStruct TreeStruct;
25 struct _TreeStruct
26 {
27   const gchar *label;
28   gboolean alex;
29   gboolean havoc;
30   gboolean tim;
31   gboolean owen;
32   gboolean dave;
33   gboolean world_holiday; /* shared by the european hackers */
34   TreeStruct *children;
35 };
36 
37 
38 static TreeStruct january[] =
39 {
40   {"New Years Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
41   {"Presidential Inauguration", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
42   {"Martin Luther King Jr. day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
43   { NULL }
44 };
45 
46 static TreeStruct february[] =
47 {
48   { "Presidents' Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
49   { "Groundhog Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
50   { "Valentine's Day", FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, NULL },
51   { NULL }
52 };
53 
54 static TreeStruct march[] =
55 {
56   { "National Tree Planting Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
57   { "St Patrick's Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
58   { NULL }
59 };
60 
61 static TreeStruct april[] =
62 {
63   { "April Fools' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
64   { "Army Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
65   { "Earth Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
66   { "Administrative Professionals' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
67   { NULL }
68 };
69 
70 static TreeStruct may[] =
71 {
72   { "Nurses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
73   { "National Day of Prayer", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
74   { "Mothers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
75   { "Armed Forces Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
76   { "Memorial Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
77   { NULL }
78 };
79 
80 static TreeStruct june[] =
81 {
82   { "June Fathers' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
83   { "Juneteenth (Liberation of Slaves)", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
84   { "Flag Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
85   { NULL }
86 };
87 
88 static TreeStruct july[] =
89 {
90   { "Parents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
91   { "Independence Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
92   { NULL }
93 };
94 
95 static TreeStruct august[] =
96 {
97   { "Air Force Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
98   { "Coast Guard Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
99   { "Friendship Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
100   { NULL }
101 };
102 
103 static TreeStruct september[] =
104 {
105   { "Grandparents' Day", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
106   { "Citizenship Day or Constitution Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
107   { "Labor Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
108   { NULL }
109 };
110 
111 static TreeStruct october[] =
112 {
113   { "National Children's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
114   { "Bosses' Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
115   { "Sweetest Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
116   { "Mother-in-Law's Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
117   { "Navy Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
118   { "Columbus Day", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
119   { "Halloween", FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, NULL },
120   { NULL }
121 };
122 
123 static TreeStruct november[] =
124 {
125   { "Marine Corps Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
126   { "Veterans' Day", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
127   { "Thanksgiving", FALSE, TRUE, FALSE, TRUE, FALSE, FALSE, NULL },
128   { NULL }
129 };
130 
131 static TreeStruct december[] =
132 {
133   { "Pearl Harbor Remembrance Day", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
134   { "Christmas", TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, NULL },
135   { "Kwanzaa", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
136   { NULL }
137 };
138 
139 
140 static TreeStruct toplevel[] =
141 {
142   {"January", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, january},
143   {"February", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, february},
144   {"March", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, march},
145   {"April", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, april},
146   {"May", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, may},
147   {"June", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, june},
148   {"July", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, july},
149   {"August", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, august},
150   {"September", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, september},
151   {"October", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, october},
152   {"November", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, november},
153   {"December", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, december},
154   {NULL}
155 };
156 
157 
158 enum
159 {
160   HOLIDAY_COLUMN = 0,
161   ALEX_COLUMN,
162   HAVOC_COLUMN,
163   TIM_COLUMN,
164   OWEN_COLUMN,
165   DAVE_COLUMN,
166   VISIBLE_COLUMN,
167   WORLD_COLUMN,
168   NUM_COLUMNS
169 };
170 
171 static GtkTreeModel *
make_model(void)172 make_model (void)
173 {
174   GtkTreeStore *model;
175   TreeStruct *month = toplevel;
176   GtkTreeIter iter;
177 
178   model = gtk_tree_store_new (NUM_COLUMNS,
179 			      G_TYPE_STRING,
180 			      G_TYPE_BOOLEAN,
181 			      G_TYPE_BOOLEAN,
182 			      G_TYPE_BOOLEAN,
183 			      G_TYPE_BOOLEAN,
184 			      G_TYPE_BOOLEAN,
185 			      G_TYPE_BOOLEAN,
186 			      G_TYPE_BOOLEAN);
187 
188   while (month->label)
189     {
190       TreeStruct *holiday = month->children;
191 
192       gtk_tree_store_append (model, &iter, NULL);
193       gtk_tree_store_set (model, &iter,
194 			  HOLIDAY_COLUMN, month->label,
195 			  ALEX_COLUMN, FALSE,
196 			  HAVOC_COLUMN, FALSE,
197 			  TIM_COLUMN, FALSE,
198 			  OWEN_COLUMN, FALSE,
199 			  DAVE_COLUMN, FALSE,
200 			  VISIBLE_COLUMN, FALSE,
201 			  WORLD_COLUMN, FALSE,
202 			  -1);
203       while (holiday->label)
204 	{
205 	  GtkTreeIter child_iter;
206 
207 	  gtk_tree_store_append (model, &child_iter, &iter);
208 	  gtk_tree_store_set (model, &child_iter,
209 			      HOLIDAY_COLUMN, holiday->label,
210 			      ALEX_COLUMN, holiday->alex,
211 			      HAVOC_COLUMN, holiday->havoc,
212 			      TIM_COLUMN, holiday->tim,
213 			      OWEN_COLUMN, holiday->owen,
214 			      DAVE_COLUMN, holiday->dave,
215 			      VISIBLE_COLUMN, TRUE,
216 			      WORLD_COLUMN, holiday->world_holiday,
217 			      -1);
218 
219 	  holiday ++;
220 	}
221       month ++;
222     }
223 
224   return GTK_TREE_MODEL (model);
225 }
226 
227 static void
alex_toggled(GtkCellRendererToggle * cell,gchar * path_str,gpointer data)228 alex_toggled (GtkCellRendererToggle *cell,
229 	      gchar                 *path_str,
230 	      gpointer               data)
231 {
232   GtkTreeModel *model = (GtkTreeModel *) data;
233   GtkTreeIter iter;
234   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
235   gboolean alex;
236 
237   gtk_tree_model_get_iter (model, &iter, path);
238   gtk_tree_model_get (model, &iter, ALEX_COLUMN, &alex, -1);
239 
240   alex = !alex;
241   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, ALEX_COLUMN, alex, -1);
242 
243   gtk_tree_path_free (path);
244 }
245 
246 static void
havoc_toggled(GtkCellRendererToggle * cell,gchar * path_str,gpointer data)247 havoc_toggled (GtkCellRendererToggle *cell,
248 	       gchar                 *path_str,
249 	       gpointer               data)
250 {
251   GtkTreeModel *model = (GtkTreeModel *) data;
252   GtkTreeIter iter;
253   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
254   gboolean havoc;
255 
256   gtk_tree_model_get_iter (model, &iter, path);
257   gtk_tree_model_get (model, &iter, HAVOC_COLUMN, &havoc, -1);
258 
259   havoc = !havoc;
260   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, HAVOC_COLUMN, havoc, -1);
261 
262   gtk_tree_path_free (path);
263 }
264 
265 static void
owen_toggled(GtkCellRendererToggle * cell,gchar * path_str,gpointer data)266 owen_toggled (GtkCellRendererToggle *cell,
267 	      gchar                 *path_str,
268 	      gpointer               data)
269 {
270   GtkTreeModel *model = (GtkTreeModel *) data;
271   GtkTreeIter iter;
272   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
273   gboolean owen;
274 
275   gtk_tree_model_get_iter (model, &iter, path);
276   gtk_tree_model_get (model, &iter, OWEN_COLUMN, &owen, -1);
277 
278   owen = !owen;
279   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, OWEN_COLUMN, owen, -1);
280 
281   gtk_tree_path_free (path);
282 }
283 
284 static void
tim_toggled(GtkCellRendererToggle * cell,gchar * path_str,gpointer data)285 tim_toggled (GtkCellRendererToggle *cell,
286 	     gchar                 *path_str,
287 	     gpointer               data)
288 {
289   GtkTreeModel *model = (GtkTreeModel *) data;
290   GtkTreeIter iter;
291   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
292   gboolean tim;
293 
294   gtk_tree_model_get_iter (model, &iter, path);
295   gtk_tree_model_get (model, &iter, TIM_COLUMN, &tim, -1);
296 
297   tim = !tim;
298   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, TIM_COLUMN, tim, -1);
299 
300   gtk_tree_path_free (path);
301 }
302 
303 static void
dave_toggled(GtkCellRendererToggle * cell,gchar * path_str,gpointer data)304 dave_toggled (GtkCellRendererToggle *cell,
305 	      gchar                 *path_str,
306 	      gpointer               data)
307 {
308   GtkTreeModel *model = (GtkTreeModel *) data;
309   GtkTreeIter iter;
310   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
311   gboolean dave;
312 
313   gtk_tree_model_get_iter (model, &iter, path);
314   gtk_tree_model_get (model, &iter, DAVE_COLUMN, &dave, -1);
315 
316   dave = !dave;
317   gtk_tree_store_set (GTK_TREE_STORE (model), &iter, DAVE_COLUMN, dave, -1);
318 
319   gtk_tree_path_free (path);
320 }
321 
322 static void
set_indicator_size(GtkTreeViewColumn * column,GtkCellRenderer * cell,GtkTreeModel * model,GtkTreeIter * iter,gpointer data)323 set_indicator_size (GtkTreeViewColumn *column,
324 		    GtkCellRenderer *cell,
325 		    GtkTreeModel *model,
326 		    GtkTreeIter *iter,
327 		    gpointer data)
328 {
329   gint size;
330   GtkTreePath *path;
331 
332   path = gtk_tree_model_get_path (model, iter);
333   size = gtk_tree_path_get_indices (path)[0]  * 2 + 10;
334   gtk_tree_path_free (path);
335 
336   g_object_set (cell, "indicator_size", size, NULL);
337 }
338 
339 int
main(int argc,char * argv[])340 main (int argc, char *argv[])
341 {
342   GtkWidget *window;
343   GtkWidget *vbox;
344   GtkWidget *scrolled_window;
345   GtkWidget *tree_view;
346   GtkTreeModel *model;
347   GtkCellRenderer *renderer;
348   gint col_offset;
349   GtkTreeViewColumn *column;
350 
351   gtk_init (&argc, &argv);
352 
353   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
354   gtk_window_set_title (GTK_WINDOW (window), "Card planning sheet");
355   g_signal_connect (window, "destroy", gtk_main_quit, NULL);
356   vbox = gtk_vbox_new (FALSE, 8);
357   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
358   gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("Jonathan's Holiday Card Planning Sheet"), FALSE, FALSE, 0);
359   gtk_container_add (GTK_CONTAINER (window), vbox);
360 
361   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
362   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
363   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
364   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
365 
366   model = make_model ();
367   tree_view = gtk_tree_view_new_with_model (model);
368   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
369   gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view)),
370 			       GTK_SELECTION_MULTIPLE);
371   renderer = gtk_cell_renderer_text_new ();
372   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
373 							    -1, "Holiday",
374 							    renderer,
375 							    "text", HOLIDAY_COLUMN, NULL);
376   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
377   gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
378 
379   /* Alex Column */
380   renderer = gtk_cell_renderer_toggle_new ();
381   g_signal_connect (renderer, "toggled", G_CALLBACK (alex_toggled), model);
382 
383   g_object_set (renderer, "xalign", 0.0, NULL);
384   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
385 							    -1, "Alex",
386 							    renderer,
387 							    "active", ALEX_COLUMN,
388 							    "visible", VISIBLE_COLUMN,
389 							    "activatable", WORLD_COLUMN,
390 							    NULL);
391   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
392   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
393   gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
394   gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
395 
396   /* Havoc Column */
397   renderer = gtk_cell_renderer_toggle_new ();
398   g_signal_connect (renderer, "toggled", G_CALLBACK (havoc_toggled), model);
399 
400   g_object_set (renderer, "xalign", 0.0, NULL);
401   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
402 							    -1, "Havoc",
403 							    renderer,
404 							    "active", HAVOC_COLUMN,
405 							    "visible", VISIBLE_COLUMN,
406 							    NULL);
407   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
408   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
409   gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
410   gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
411 
412   /* Tim Column */
413   renderer = gtk_cell_renderer_toggle_new ();
414   g_signal_connect (renderer, "toggled", G_CALLBACK (tim_toggled), model);
415 
416   g_object_set (renderer, "xalign", 0.0, NULL);
417   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
418 					       -1, "Tim",
419 					       renderer,
420 					       "active", TIM_COLUMN,
421 					       "visible", VISIBLE_COLUMN,
422 					       "activatable", WORLD_COLUMN,
423 					       NULL);
424   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
425   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
426   gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
427   gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
428 
429   /* Owen Column */
430   renderer = gtk_cell_renderer_toggle_new ();
431   g_signal_connect (renderer, "toggled", G_CALLBACK (owen_toggled), model);
432   g_object_set (renderer, "xalign", 0.0, NULL);
433   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
434 					       -1, "Owen",
435 					       renderer,
436 					       "active", OWEN_COLUMN,
437 					       "visible", VISIBLE_COLUMN,
438 					       NULL);
439   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
440   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
441   gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
442   gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
443 
444   /* Owen Column */
445   renderer = gtk_cell_renderer_toggle_new ();
446   g_signal_connect (renderer, "toggled", G_CALLBACK (dave_toggled), model);
447   g_object_set (renderer, "xalign", 0.0, NULL);
448   col_offset = gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
449 					       -1, "Dave",
450 					       renderer,
451 					       "active", DAVE_COLUMN,
452 					       "visible", VISIBLE_COLUMN,
453 					       NULL);
454   column = gtk_tree_view_get_column (GTK_TREE_VIEW (tree_view), col_offset - 1);
455   gtk_tree_view_column_set_cell_data_func (column, renderer, set_indicator_size, NULL, NULL);
456   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column), GTK_TREE_VIEW_COLUMN_FIXED);
457   gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
458   gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
459 
460   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
461 
462   g_signal_connect (tree_view, "realize",
463 		    G_CALLBACK (gtk_tree_view_expand_all),
464 		    NULL);
465   gtk_window_set_default_size (GTK_WINDOW (window),
466 			       650, 400);
467   gtk_widget_show_all (window);
468 
469   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
470   gtk_window_set_title (GTK_WINDOW (window), "Model");
471   g_signal_connect (window, "destroy", gtk_main_quit, NULL);
472   vbox = gtk_vbox_new (FALSE, 8);
473   gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
474   gtk_box_pack_start (GTK_BOX (vbox), gtk_label_new ("The model revealed"), FALSE, FALSE, 0);
475   gtk_container_add (GTK_CONTAINER (window), vbox);
476 
477   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
478   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window), GTK_SHADOW_ETCHED_IN);
479   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
480   gtk_box_pack_start (GTK_BOX (vbox), scrolled_window, TRUE, TRUE, 0);
481 
482 
483   tree_view = gtk_tree_view_new_with_model (model);
484   g_object_unref (model);
485   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (tree_view), TRUE);
486 
487   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
488 					       -1, "Holiday Column",
489 					       gtk_cell_renderer_text_new (),
490 					       "text", 0, NULL);
491 
492   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
493 					       -1, "Alex Column",
494 					       gtk_cell_renderer_text_new (),
495 					       "text", 1, NULL);
496 
497   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
498 					       -1, "Havoc Column",
499 					       gtk_cell_renderer_text_new (),
500 					       "text", 2, NULL);
501 
502   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
503 					       -1, "Tim Column",
504 					       gtk_cell_renderer_text_new (),
505 					       "text", 3, NULL);
506 
507   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
508 					       -1, "Owen Column",
509 					       gtk_cell_renderer_text_new (),
510 					       "text", 4, NULL);
511 
512   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
513 					       -1, "Dave Column",
514 					       gtk_cell_renderer_text_new (),
515 					       "text", 5, NULL);
516 
517   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
518 					       -1, "Visible Column",
519 					       gtk_cell_renderer_text_new (),
520 					       "text", 6, NULL);
521 
522   gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
523 					       -1, "World Holiday",
524 					       gtk_cell_renderer_text_new (),
525 					       "text", 7, NULL);
526 
527   g_signal_connect (tree_view, "realize",
528 		    G_CALLBACK (gtk_tree_view_expand_all),
529 		    NULL);
530 
531   gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
532 
533 
534   gtk_window_set_default_size (GTK_WINDOW (window),
535 			       650, 400);
536 
537   gtk_widget_show_all (window);
538   gtk_main ();
539 
540   return 0;
541 }
542 
543