1 /*
2  * This file is part of gtkD.
3  *
4  * gtkD is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation; either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * gtkD is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with gtkD; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
17  */
18 
19 module TestTreeView;
20 
21 private import gtk.ScrolledWindow;
22 
23 private import gtk.TreeView;
24 private import gtk.TreePath;
25 private import gtk.TreeViewColumn;
26 private import gtk.TreeIter;
27 private import gtk.TreeStore;
28 private import gtk.TreeModel;
29 //private import ddi.Pixbuf;
30 private import gtk.TreeSelection;
31 private import gtk.CellRendererText;
32 
33 private import gtk.Image;
34 //private import ddi.Pixbuf;
35 
36 private import gtk.TreeNode;
37 
38 version(Tango) private import tango.io.Stdout;
39 version(Tango) private import tango.stdc.stdio;
40 else private import std.stdio;
41 
42 
43 /* Don't copy this bad example; inline RGB data is always a better
44  * idea than inline XPMs.
45  */
46 
47 static string[]  book_closed_xpm = [
48 "16 16 6 1",
49 "       c None s None",
50 ".      c black",
51 "X      c red",
52 "o      c yellow",
53 "O      c #808080",
54 "#      c white",
55 "                ",
56 "       ..       ",
57 "     ..XX.      ",
58 "   ..XXXXX.     ",
59 " ..XXXXXXXX.    ",
60 ".ooXXXXXXXXX.   ",
61 "..ooXXXXXXXXX.  ",
62 ".X.ooXXXXXXXXX. ",
63 ".XX.ooXXXXXX..  ",
64 " .XX.ooXXX..#O  ",
65 "  .XX.oo..##OO. ",
66 "   .XX..##OO..  ",
67 "    .X.#OO..    ",
68 "     ..O..      ",
69 "      ..        ",
70 "                "
71 ];
72 
73 /**
74  * This tests the GtkD tree widget
75  * \todo report bug to ng: nested class with same name of other class was not used<br>
76  * test if this works:<br>
77  * class A {}<br>
78  * class B { <br>
79  *  class A{} <br>
80  *  method (){ new A;}<br>
81  * }<br>
82  */
83 class TestTreeView : ScrolledWindow
84 {
85 	Image image;
86 	//Pixbuf pixbuf;
87 
88 	enum columns
89 	{
90 		//gtkDObject = GtkDType.PIXBUF,
91 		gtkDObject = GType.STRING,
92 		gtkObject = GType.STRING,
93 		desc = GType.STRING,
94 		percentDone = GType.STRING,
95 		author = GType.STRING
96 	}
97 
98 	this()
99 	{
100 		super(null,null);
101 
102 		TreeView treeView = setup();
103 		addWithViewport(treeView);
104 
105 		treeView.addOnRowActivated(&rowActivatedCallback);
106 		treeView.addOnMoveCursor(&moveCursorCallBack);
107 	}
108 
109 	void rowActivatedCallback(TreePath path, TreeViewColumn column, TreeView treeView)
110 	{
111 		version(Tango)
112 		{
113 			Stdout("rowActivateCallback for {}",treeView).newline;
114 			Stdout("rowActivateCallback for path {}",path.toString()).newline;
115 		}
116 		else
117 		{
118 			writefln("rowActivateCallback for %X",treeView);
119 			writefln("rowActivateCallback for path %s",path.toString());
120 		}
121 	}
122 
123 	bool moveCursorCallBack(GtkMovementStep step, int direction, TreeView treeView)
124 	{
125 		version(Tango)
126 		{
127 			Stdout("moveCursorCallBack for {}",treeView).newline;
128 			Stdout("moveCursorCallBack row = {}",direction).newline;
129 		}
130 		else
131 		{
132 			writefln("moveCursorCallBack for %X",treeView);
133 			writefln("moveCursorCallBack row = %d",direction);
134 		}
135 		return false;
136 	}
137 
138 	TreeIter [12] h;
139 	int stack = 0;
140 	void push(TreeIter ti)
141 	{
142 		h[stack++]=ti;
143 	}
144 	TreeIter peek()
145 	{
146 		if ( stack == 0)
147 		{
148 			return null;
149 		}
150 		return h[stack-1];
151 	}
152 
153 	TreeIter pop()
154 	{
155 		if ( stack == 0)
156 		{
157 			return null;
158 		}
159 		return h[--stack];
160 	}
161 
162 	class HTreeNode : TreeNode
163 	{
164 
165 		string gtkDL;
166 		string gtk;
167 		string desc;
168 		int percent;
169 		string author;
170 		//TestTreeView ttv;
171 
172 		this(string gtkDL,string gtk,string desc,int percent)//, TestTreeView ttv)
173 		{
174 			this.gtkDL = gtkDL;
175 			this.gtk = gtk;
176 			this.desc = desc;
177 			this.percent = percent;
178 			this.author = "Ant";
179 			//this.ttv = ttv;
180 
181 		}
182 
183 		//Pixbuf getNodePixbuf(int colum)
184 		//{
185 		//	return pixbuf;
186 		//}
187 
188 		int columnCount()
189 		{
190 			return 5;
191 		}
192 
193 		string getNodeValue(int column)
194 		{
195 			string value;
196 			switch (column)
197 			{
198 				//case 0: value = pixbuf; break;
199 				case 0: value = gtkDL; break;
200 				case 1: value = gtk; break;
201 				case 2: value = desc; break;
202 				case 3:
203 					switch(percent)
204 					{
205 						case -1: value = "uggly: won't get in"; break;
206 						case 0: value = "unknown"; break;
207 						case 1: value = "not yet";break;
208 						case 98: value = "Almost"; break;
209 						case 99: value = "AGAIG"; break;
210 						case 100: value = "Complete"; break;
211 						default:value = "%"; break;
212 					}
213 					break;
214 
215 				case 4: value = author; break;
216 				default: value = "N/A"; break;
217 			}
218 			return value;
219 		}
220 	}
221 
222 	TreeView setup()
223 	{
224 
225 		class TTreeStore : TreeStore
226 		{
227 			this()
228 			{
229 				//this.nCols = nCols;
230 				static GType [5] columns = [
231 					//GtkDType.PIXBUF,
232 					GType.STRING,
233 					GType.STRING,
234 					GType.STRING,
235 					GType.STRING,
236 					GType.STRING];
237 				super(columns);
238 
239 			}
240 		}
241 
242 		TTreeStore testTreeStore = new TTreeStore();
243 		TreeView treeView = new TreeView(testTreeStore);
244 		treeView.setRulesHint(true);
245 
246 		TreeSelection ts = treeView.getSelection();
247 		ts.setMode(SelectionMode.MULTIPLE);
248 
249 		//TreeViewColumn column = new TreeViewColumn("GtkDObject",new CellRendererPixbuf(),"GdkPixbuf", 0);
250 		TreeViewColumn column = new TreeViewColumn("GtkDObject",new CellRendererText(),"text", 0);
251 		treeView.appendColumn(column);
252 		column.setResizable(true);
253 		column.setReorderable(true);
254 		column.setSortColumnId(0);
255 		column.setSortIndicator(true);
256 		//pixbuf = new Pixbuf(book_closed_xpm);
257 		//image = new Image(pixbuf);
258 		//column.setWidget(image);
259 
260 		column = new TreeViewColumn("GtkObject",new CellRendererText(),"text", 1);
261 		treeView.appendColumn(column);
262 		column.setResizable(true);
263 		column.setReorderable(true);
264 		column.setSortColumnId(1);
265 		column.setSortIndicator(true);
266 
267 		column = new TreeViewColumn("Desc",new CellRendererText(),"text", 2);
268 		treeView.appendColumn(column);
269 		column.setResizable(true);
270 		column.setReorderable(true);
271 		column.setSortColumnId(2);
272 		column.setSortIndicator(true);
273 
274 		column = new TreeViewColumn("Complete",new CellRendererText(),"text", 3);
275 		treeView.appendColumn(column);
276 		column.setResizable(true);
277 		column.setReorderable(true);
278 		column.setSortColumnId(3);
279 		column.setSortIndicator(true);
280 
281 		column = new TreeViewColumn("Author",new CellRendererText(),"text", 4);
282 		treeView.appendColumn(column);
283 		column.setResizable(true);
284 		column.setReorderable(true);
285 		column.setSortColumnId(4);
286 		column.setSortIndicator(true);
287 
288 		TreeIter iter;
289 		TreeIter iterTop = testTreeStore.createIter(null);
290 
291 		TreeIter peekIter(bool pushIt)
292 		{
293 			TreeIter iter = testTreeStore.append(peek());
294 			if ( pushIt )
295 			{
296 				push(iter);
297 			}
298 			return iter;
299 		}
300 
301 		TreeIter popIter(bool pushIt)
302 		{
303 			TreeIter iter = testTreeStore.append(pop());
304 			if ( pushIt )
305 			{
306 				push(iter);
307 			}
308 			return iter;
309 		}
310 
311 		push(iterTop);
312 		testTreeStore.set(iterTop, new HTreeNode("ObjectG","GObject","Parent of the main GtkD objects",90));
313 
314 		testTreeStore.set(peekIter(true), new HTreeNode("ObjectGtk","GtkObject","The main gtk object",100));
315 		testTreeStore.set(peekIter(true), new HTreeNode("Misc","GtkMisc","Comon for Most widgets",100));
316 
317 		testTreeStore.set(peekIter(true), new HTreeNode("Label","GtkLabel","Display only widget",100));
318 		testTreeStore.set(popIter(false), new HTreeNode("AccelLabel","GtkAccelLabel","A label with a thing",1));
319 		testTreeStore.set(peekIter(false), new HTreeNode("Arrow","GtkArrow","A standard arrow",100));
320 		testTreeStore.set(popIter(false), new HTreeNode("Image","GtkImage","A image",100));
321 		testTreeStore.set(peekIter(true), new HTreeNode("Container","GtkContainer","Comon for all widgets that can contain other widgets",90));
322 		testTreeStore.set(peekIter(false), new HTreeNode("Bin","GtkBin","Comon for many widgets",90));
323 
324 		testTreeStore.set(peekIter(false), new HTreeNode("Alignment","GtkAlignment","Aligns a widget in a larger area",100));
325 		testTreeStore.set(peekIter(true), new HTreeNode("Frame","GtkFrame","",100));
326 		testTreeStore.set(popIter(false), new HTreeNode("AspectFrame","GtkAspectFrame","",100));
327 		testTreeStore.set(peekIter(true), new HTreeNode("Button","GtkButton","",90));
328 
329 		testTreeStore.set(peekIter(true), new HTreeNode("ToggleButton","GtkToggleButton","",0));
330 		testTreeStore.set(peekIter(false), new HTreeNode("CheckButton","GtkCheckButton","",0));
331 		testTreeStore.set(popIter(false), new HTreeNode("RadioButton","GtkRadioButton","",0));
332 		testTreeStore.set(popIter(false), new HTreeNode("OptionMenu","GtkOptionMenu","",0));
333 		testTreeStore.set(peekIter(true), new HTreeNode("Item","GtkItem","",0));
334 		testTreeStore.set(peekIter(true), new HTreeNode("MenuItem","GtkMenuItem","",0));
335 		testTreeStore.set(peekIter(true), new HTreeNode("CheckMenuItem","GtkCheckMenuItem","",0));
336 		testTreeStore.set(popIter(false), new HTreeNode("RadioMenuItem","GtkRadioMenuItem","",0));
337 		testTreeStore.set(peekIter(false), new HTreeNode("ImageMenuItem","GtkImageMenuItem","",0));
338 		testTreeStore.set(peekIter(false), new HTreeNode("SeparatorMenuItem","GtkSeparatorMenuItem","",0));
339 		testTreeStore.set(popIter(false), new HTreeNode("TearoffMenuItem","GtkTearoffMenuItem","",0));
340 		testTreeStore.set(peekIter(true), new HTreeNode("Window","GtkWindow","",0));
341 		testTreeStore.set(peekIter(true), new HTreeNode("Dialog","GtkDialog","",0));
342 		testTreeStore.set(peekIter(false), new HTreeNode("ColorSelectionDialog","GtkColorSelectionDialog","",0));
343 		testTreeStore.set(peekIter(false), new HTreeNode("FileSelection","GtkFileSelection","",0));
344 		testTreeStore.set(peekIter(false), new HTreeNode("FontSelectionDialog","GtkFontSelectionDialog","",0));
345 		testTreeStore.set(peekIter(false), new HTreeNode("InputDialog","GtkInputDialog","",0));
346 		testTreeStore.set(popIter(false), new HTreeNode("MessageDialog","GtkMessageDialog","",0));
347 		testTreeStore.set(popIter(false), new HTreeNode("Plug","GtkPlug","",0));
348 		testTreeStore.set(peekIter(false), new HTreeNode("EventBox","GtkEventBox","",0));
349 		testTreeStore.set(peekIter(false), new HTreeNode("HandleBox","GtkHandleBox","",0));
350 		testTreeStore.set(peekIter(false), new HTreeNode("ScrolledWindow","GtkScrolledWindow","",0));
351 		testTreeStore.set(popIter(false), new HTreeNode("Viewport","GtkViewport","",0));
352 
353 
354 		testTreeStore.set(peekIter(true), new HTreeNode("Box","GtkBox","",0));
355 		testTreeStore.set(peekIter(true), new HTreeNode("ButtonBox","GtkButtonBox","",0));
356 		testTreeStore.set(peekIter(false), new HTreeNode("HButtonBox","GtkHButtonBox","",0));
357 		testTreeStore.set(popIter(false), new HTreeNode("VButtonBox","GtkVButtonBox","",0));
358 		testTreeStore.set(peekIter(true), new HTreeNode("VBox","GtkVBox","",100));
359 		testTreeStore.set(peekIter(false), new HTreeNode("ColorSelection","GtkColorSelection","",100));
360 		testTreeStore.set(peekIter(false), new HTreeNode("FontSelection","GtkFontSelection","",100));
361 		testTreeStore.set(popIter(false), new HTreeNode("GammaCurve","GtkGammaCurve","",0));
362 		testTreeStore.set(popIter(true), new HTreeNode("HBox","GtkHBox","",100));
363 		testTreeStore.set(peekIter(false), new HTreeNode("Combo","GtkCombo","",0));
364 		testTreeStore.set(popIter(false), new HTreeNode("Statusbar","GtkStatusbar","",0));
365 		testTreeStore.set(peekIter(false), new HTreeNode("Fixed","GtkFixed","",0));
366 		testTreeStore.set(peekIter(true), new HTreeNode("Paned","GtkPaned","",0));
367 		testTreeStore.set(peekIter(false), new HTreeNode("HPaned","GtkHPaned","",0));
368 		testTreeStore.set(popIter(false), new HTreeNode("VPaned","GtkVPaned","",0));
369 		testTreeStore.set(peekIter(false), new HTreeNode("Layout","GtkLayout","",0));
370 		testTreeStore.set(peekIter(true), new HTreeNode("MenuShell","GtkMenuShell","",0));
371 		testTreeStore.set(peekIter(false), new HTreeNode("MenuBar","GtkMenuBar","",0));
372 		testTreeStore.set(popIter(false), new HTreeNode("Menu","GtkMenu","",0));
373 		testTreeStore.set(peekIter(false), new HTreeNode("Notebook","GtkNotebook","",0));
374 		testTreeStore.set(peekIter(false), new HTreeNode("Socket","GtkSocket","",0));
375 		testTreeStore.set(peekIter(false), new HTreeNode("Table","GtkTable","",0));
376 		testTreeStore.set(peekIter(false), new HTreeNode("TextView","GtkTextView","",0));
377 		testTreeStore.set(peekIter(false), new HTreeNode("Toolbar","GtkToolbar","",0));
378 		testTreeStore.set(popIter(false), new HTreeNode("TreeView","GtkTreeView","",0));
379 		testTreeStore.set(peekIter(false), new HTreeNode("Calendar","GtkCalendar","",0));
380 
381 		testTreeStore.set(peekIter(true), new HTreeNode("DrawingArea","GtkDrawingArea","",0));
382 		testTreeStore.set(popIter(false), new HTreeNode("Curve","GtkCurve","",0));
383 		testTreeStore.set(peekIter(true), new HTreeNode("Editable","GtkEditable","",0));
384 		testTreeStore.set(peekIter(true), new HTreeNode("Entry","GtkEntry","",0));
385 		testTreeStore.set(popIter(false), new HTreeNode("SpinButton","GtkSpinButton","",0));
386 		pop();
387 		testTreeStore.set(peekIter(true), new HTreeNode("Ruler","GtkRuler","",0));
388 		testTreeStore.set(peekIter(false), new HTreeNode("HRuler","GtkHRuler","",0));
389 		testTreeStore.set(popIter(false), new HTreeNode("VRuler","GtkVRuler","",0));
390 		testTreeStore.set(peekIter(true), new HTreeNode("Range","GtkRange","",0));
391 		testTreeStore.set(peekIter(true), new HTreeNode("Scale","GtkScale","",0));
392 		testTreeStore.set(peekIter(true), new HTreeNode("HScale","GtkHScale","",0));
393 		testTreeStore.set(popIter(false), new HTreeNode("VScale","GtkVScale","",0));
394 		testTreeStore.set(popIter(true), new HTreeNode("Scrollbar","GtkScrollbar","",0));
395 		testTreeStore.set(peekIter(false), new HTreeNode("HScrollbar","GtkHScrollbar","",0));
396 		testTreeStore.set(popIter(false), new HTreeNode("VScrollbar","GtkVScrollbar","",0));
397 		pop();
398 		testTreeStore.set(peekIter(true), new HTreeNode("Separator","GtkSeparator","",0));
399 		testTreeStore.set(peekIter(false), new HTreeNode("HSeparator","GtkHSeparator","",0));
400 		testTreeStore.set(popIter(false), new HTreeNode("VSeparator","GtkVSeparator","",0));
401 		testTreeStore.set(peekIter(false), new HTreeNode("Invisible","GtkInvisible","",0));
402 		testTreeStore.set(peekIter(false), new HTreeNode("Preview","GtkPreview","",0));
403 		testTreeStore.set(popIter(false), new HTreeNode("ProgressBar","GtkProgressBar","",0));
404 		testTreeStore.set(peekIter(false), new HTreeNode("Adjustment","GtkAdjustment","Values for the range widget (scroolbars, spin buttons...)",0));
405 		testTreeStore.set(peekIter(true), new HTreeNode("CellRenderer","GtkCellRenderer","",0));
406 		testTreeStore.set(peekIter(false), new HTreeNode("CellRendererPixbuf","GtkCellRendererPixbuf","",0));
407 		testTreeStore.set(peekIter(false), new HTreeNode("CellRendererText","GtkCellRendererText","",0));
408 		testTreeStore.set(popIter(false), new HTreeNode("CellRendererToggle","GtkCellRendererToggle","",0));
409 		testTreeStore.set(peekIter(false), new HTreeNode("ItemFactory","GtkItemFactory","",1));
410 		testTreeStore.set(peekIter(false), new HTreeNode("Tooltips","GtkTooltips","",0));
411 		testTreeStore.set(popIter(false), new HTreeNode("TreeViewColumn","GtkTreeViewColumn","",0));
412 		push(iterTop);
413 		testTreeStore.set(peekIter(false), new HTreeNode("ListG","GList","a double linked list used to comboBox and stuf",0));
414 
415 		return treeView;
416 
417 	}
418 
419 
420 }