1 /* Tree View/Tree Store
2  *
3  * The Gtk.TreeStore is used to store data in tree form, to be
4  * used later on by a Gtk.TreeView to display it. This demo builds
5  * a simple Gtk.TreeStore and displays it. If you're new to the
6  * Gtk.TreeView widgets and associates, look into the Gtk.ListStore
7  * example first.
8  */
9 
10 using System;
11 using System.Collections;
12 
13 using Gtk;
14 using GLib;
15 
16 namespace GtkDemo
17 {
18 	[Demo ("TreeStore", "DemoTreeStore.cs", "Tree View")]
19 	public class DemoTreeStore : Gtk.Window
20 	{
21 		private TreeStore store;
22 
DemoTreeStore()23 		public DemoTreeStore () : base ("Card planning sheet")
24 		{
25 			VBox vbox = new VBox (false, 8);
26 			vbox.BorderWidth = 8;
27 			Add (vbox);
28 
29 			vbox.PackStart (new Label ("Jonathan's Holiday Card Planning Sheet"),
30 					false, false, 0);
31 
32 			ScrolledWindow sw = new ScrolledWindow ();
33 			sw.ShadowType = ShadowType.EtchedIn;
34 			sw.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
35 			vbox.PackStart (sw, true, true, 0);
36 
37 			// create model
38 			CreateModel ();
39 
40 			// create tree view
41 			TreeView treeView = new TreeView (store);
42 			treeView.RulesHint = true;
43 			treeView.Selection.Mode = SelectionMode.Multiple;
44 			AddColumns (treeView);
45 
46 			sw.Add (treeView);
47 
48 			// expand all rows after the treeview widget has been realized
49 			treeView.Realized += new EventHandler (ExpandRows);
50 
51 			SetDefaultSize (650, 400);
52 			ShowAll ();
53 		}
54 
ExpandRows(object obj, EventArgs args)55 		private void ExpandRows (object obj, EventArgs args)
56 		{
57 			TreeView treeView = obj as TreeView;
58 
59 			treeView.ExpandAll ();
60 		}
61 
62 		ArrayList columns = new ArrayList ();
63 
ItemToggled(object sender, ToggledArgs args)64 		private void ItemToggled (object sender, ToggledArgs args)
65 		{
66 			int column = columns.IndexOf (sender);
67 
68  			Gtk.TreeIter iter;
69  			if (store.GetIterFromString (out iter, args.Path)) {
70  				bool val = (bool) store.GetValue (iter, column);
71  				store.SetValue (iter, column, !val);
72  			}
73 		}
74 
AddColumns(TreeView treeView)75 		private void AddColumns (TreeView treeView)
76 		{
77 			CellRendererText text;
78 			CellRendererToggle toggle;
79 
80 			// column for holiday names
81 			text = new CellRendererText ();
82 			text.Xalign = 0.0f;
83 			columns.Add (text);
84 			TreeViewColumn column = new TreeViewColumn ("Holiday", text,
85 								    "text", Column.HolidayName);
86 			treeView.InsertColumn (column, (int) Column.HolidayName);
87 
88 			// alex column
89 			toggle = new CellRendererToggle ();
90 			toggle.Xalign = 0.0f;
91 			columns.Add (toggle);
92 			toggle.Toggled += new ToggledHandler (ItemToggled);
93 			column = new TreeViewColumn ("Alex", toggle,
94 						     "active", (int) Column.Alex,
95 						     "visible", (int) Column.Visible,
96 						     "activatable", (int) Column.World);
97 			column.Sizing = TreeViewColumnSizing.Fixed;
98 			column.FixedWidth = 50;
99 			column.Clickable = true;
100 			treeView.InsertColumn (column, (int) Column.Alex);
101 
102 			// havoc column
103 			toggle = new CellRendererToggle ();
104 			toggle.Xalign = 0.0f;
105 			columns.Add (toggle);
106 			toggle.Toggled += new ToggledHandler (ItemToggled);
107 			column = new TreeViewColumn ("Havoc", toggle,
108 						     "active", (int) Column.Havoc,
109 						     "visible", (int) Column.Visible);
110 			treeView.InsertColumn (column, (int) Column.Havoc);
111 			column.Sizing = TreeViewColumnSizing.Fixed;
112 			column.FixedWidth = 50;
113 			column.Clickable = true;
114 
115 			// tim column
116 			toggle = new CellRendererToggle ();
117 			toggle.Xalign = 0.0f;
118 			columns.Add (toggle);
119 			toggle.Toggled += new ToggledHandler (ItemToggled);
120 			column = new TreeViewColumn ("Tim", toggle,
121 						     "active", (int) Column.Tim,
122 						     "visible", (int) Column.Visible,
123 						     "activatable", (int) Column.World);
124 			treeView.InsertColumn (column, (int) Column.Tim);
125 			column.Sizing = TreeViewColumnSizing.Fixed;
126 			column.FixedWidth = 50;
127 			column.Clickable = true;
128 
129 			// owen column
130 			toggle = new CellRendererToggle ();
131 			toggle.Xalign = 0.0f;
132 			columns.Add (toggle);
133 			toggle.Toggled += new ToggledHandler (ItemToggled);
134 			column = new TreeViewColumn ("Owen", toggle,
135 						     "active", (int) Column.Owen,
136 						     "visible", (int) Column.Visible);
137 			treeView.InsertColumn (column, (int) Column.Owen);
138 			column.Sizing = TreeViewColumnSizing.Fixed;
139 			column.FixedWidth = 50;
140 			column.Clickable = true;
141 
142 			// dave column
143 			toggle = new CellRendererToggle ();
144 			toggle.Xalign = 0.0f;
145 			columns.Add (toggle);
146 			toggle.Toggled += new ToggledHandler (ItemToggled);
147 			column = new TreeViewColumn ("Dave", toggle,
148 						     "active", (int) Column.Dave,
149 						     "visible", (int) Column.Visible);
150 			treeView.InsertColumn (column, (int) Column.Dave);
151 			column.Sizing = TreeViewColumnSizing.Fixed;
152 			column.FixedWidth = 50;
153 			column.Clickable = true;
154 		}
155 
OnDeleteEvent(Gdk.Event evt)156 		protected override bool OnDeleteEvent (Gdk.Event evt)
157 		{
158 			Destroy ();
159 			return true;
160 		}
161 
CreateModel()162 		private void CreateModel ()
163 		{
164 			// create tree store
165 			store = new TreeStore (typeof (string),
166 					       typeof (bool),
167 					       typeof (bool),
168 					       typeof (bool),
169 					       typeof (bool),
170 					       typeof (bool),
171 					       typeof (bool),
172 					       typeof (bool));
173 
174 			// add data to the tree store
175 			foreach (MyTreeItem month in toplevel) {
176 				TreeIter iter = store.AppendValues (month.Label,
177 								    false,
178 								    false,
179 								    false,
180 								    false,
181 								    false,
182 								    false,
183 								    false);
184 
185 				foreach (MyTreeItem holiday in month.Children) {
186 					store.AppendValues (iter,
187 							    holiday.Label,
188 							    holiday.Alex,
189 							    holiday.Havoc,
190 							    holiday.Tim,
191 							    holiday.Owen,
192 							    holiday.Dave,
193 							    true,
194 							    holiday.WorldHoliday);
195 				}
196 			}
197 		}
198 
199 		// tree data
200 		private static MyTreeItem[] january =
201 		{
202 			new MyTreeItem ("New Years Day", true, true, true, true, false, true, null ),
203 			new MyTreeItem ("Presidential Inauguration", false, true, false, true, false, false, null ),
204 			new MyTreeItem ("Martin Luther King Jr. day", false, true, false, true, false, false, null )
205 		};
206 
207 		private static MyTreeItem[] february =
208 		{
209 			new MyTreeItem ( "Presidents' Day", false, true, false, true, false, false, null ),
210 			new MyTreeItem ( "Groundhog Day", false, false, false, false, false, false, null ),
211 			new MyTreeItem ( "Valentine's Day", false, false, false, false, true, true, null )
212 		};
213 
214 		private static MyTreeItem[] march =
215 		{
216 			new MyTreeItem ( "National Tree Planting Day", false, false, false, false, false, false, null ),
217 			new MyTreeItem ( "St Patrick's Day", false, false, false, false, false, true, null )
218 		};
219 
220 		private static MyTreeItem[] april =
221 		{
222 			new MyTreeItem ( "April Fools' Day", false, false, false, false, false, true, null ),
223 			new MyTreeItem ( "Army Day", false, false, false, false, false, false, null ),
224 			new MyTreeItem ( "Earth Day", false, false, false, false, false, true, null ),
225 			new MyTreeItem ( "Administrative Professionals' Day", false, false, false, false, false, false, null )
226 		};
227 
228 		private static MyTreeItem[] may =
229 		{
230 			new MyTreeItem ( "Nurses' Day", false, false, false, false, false, false, null ),
231 			new MyTreeItem ( "National Day of Prayer", false, false, false, false, false, false, null ),
232 			new MyTreeItem ( "Mothers' Day", false, false, false, false, false, true, null ),
233 			new MyTreeItem ( "Armed Forces Day", false, false, false, false, false, false, null ),
234 			new MyTreeItem ( "Memorial Day", true, true, true, true, false, true, null )
235 		};
236 
237 		private static MyTreeItem[] june =
238 		{
239 			new MyTreeItem ( "June Fathers' Day", false, false, false, false, false, true, null ),
240 			new MyTreeItem ( "Juneteenth (Liberation of Slaves)", false, false, false, false, false, false, null ),
241 			new MyTreeItem ( "Flag Day", false, true, false, true, false, false, null )
242 		};
243 
244 		private static MyTreeItem[] july =
245 		{
246 			new MyTreeItem ( "Parents' Day", false, false, false, false, false, true, null ),
247 			new MyTreeItem ( "Independence Day", false, true, false, true, false, false, null )
248 		};
249 
250 		private static MyTreeItem[] august =
251 		{
252 			new MyTreeItem ( "Air Force Day", false, false, false, false, false, false, null ),
253 			new MyTreeItem ( "Coast Guard Day", false, false, false, false, false, false, null ),
254 			new MyTreeItem ( "Friendship Day", false, false, false, false, false, false, null )
255 		};
256 
257 		private static MyTreeItem[] september =
258 		{
259 			new MyTreeItem ( "Grandparents' Day", false, false, false, false, false, true, null ),
260 			new MyTreeItem ( "Citizenship Day or Constitution Day", false, false, false, false, false, false, null ),
261 			new MyTreeItem ( "Labor Day", true, true, true, true, false, true, null )
262 		};
263 
264 		private static MyTreeItem[] october =
265 		{
266 			new MyTreeItem ( "National Children's Day", false, false, false, false, false, false, null ),
267 			new MyTreeItem ( "Bosses' Day", false, false, false, false, false, false, null ),
268 			new MyTreeItem ( "Sweetest Day", false, false, false, false, false, false, null ),
269 			new MyTreeItem ( "Mother-in-Law's Day", false, false, false, false, false, false, null ),
270 			new MyTreeItem ( "Navy Day", false, false, false, false, false, false, null ),
271 			new MyTreeItem ( "Columbus Day", false, true, false, true, false, false, null ),
272 			new MyTreeItem ( "Halloween", false, false, false, false, false, true, null )
273 		};
274 
275 		private static MyTreeItem[] november =
276 		{
277 			new MyTreeItem ( "Marine Corps Day", false, false, false, false, false, false, null ),
278 			new MyTreeItem ( "Veterans' Day", true, true, true, true, false, true, null ),
279 			new MyTreeItem ( "Thanksgiving", false, true, false, true, false, false, null )
280 		};
281 
282 		private static MyTreeItem[] december =
283 		{
284 			new MyTreeItem ( "Pearl Harbor Remembrance Day", false, false, false, false, false, false, null ),
285 			new MyTreeItem ( "Christmas", true, true, true, true, false, true, null ),
286 			new MyTreeItem ( "Kwanzaa", false, false, false, false, false, false, null )
287 		};
288 
289 
290 		private static MyTreeItem[] toplevel =
291 		{
292 			new MyTreeItem ("January", false, false, false, false, false, false, january),
293 			new MyTreeItem ("February", false, false, false, false, false, false, february),
294 			new MyTreeItem ("March", false, false, false, false, false, false, march),
295 			new MyTreeItem ("April", false, false, false, false, false, false, april),
296 			new MyTreeItem ("May", false, false, false, false, false, false, may),
297 			new MyTreeItem ("June", false, false, false, false, false, false, june),
298 			new MyTreeItem ("July", false, false, false, false, false, false, july),
299 			new MyTreeItem ("August", false, false, false, false, false, false, august),
300 			new MyTreeItem ("September", false, false, false, false, false, false, september),
301 			new MyTreeItem ("October", false, false, false, false, false, false, october),
302 			new MyTreeItem ("November", false, false, false, false, false, false, november),
303 			new MyTreeItem ("December", false, false, false, false, false, false, december)
304 		};
305 
306 		// TreeItem structure
307 		public class MyTreeItem
308 		{
309 			public string Label;
310 			public bool Alex, Havoc, Tim, Owen, Dave;
311 			public bool WorldHoliday; // shared by the European hackers
312 			public MyTreeItem[] Children;
313 
MyTreeItem(string label, bool alex, bool havoc, bool tim, bool owen, bool dave, bool worldHoliday, MyTreeItem[] children)314 			public MyTreeItem (string label, bool alex, bool havoc, bool tim,
315 					   bool owen, bool dave, bool worldHoliday,
316 					   MyTreeItem[] children)
317 			{
318 				Label = label;
319 				Alex = alex;
320 				Havoc = havoc;
321 				Tim = tim;
322 				Owen = owen;
323 				Dave = dave;
324 				WorldHoliday =  worldHoliday;
325 				Children = children;
326 			}
327 		}
328 
329 		// columns
330 		public enum Column
331 		{
332 			HolidayName,
333 			Alex,
334 			Havoc,
335 			Tim,
336 			Owen,
337 			Dave,
338 
339 			Visible,
340 			World,
341 		}
342 	}
343 }
344