File: DemoEditableCells.cs

package info (click to toggle)
gtk-sharp3 2.99.3-4.1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 25,488 kB
  • sloc: xml: 308,885; cs: 38,796; sh: 11,336; perl: 1,295; makefile: 1,099; ansic: 903
file content (201 lines) | stat: -rw-r--r-- 4,593 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/* Tree View/Editable Cells
 *
 * This demo demonstrates the use of editable cells in a Gtk.TreeView. If
 * you are new to the Gtk.TreeView widgets and associates, look into
 * the Gtk.ListStore example first.
 *
 */

using System;
using System.Collections.Generic;
using Gtk;

namespace GtkDemo
{
	[Demo ("Editable Cells", "DemoEditableCells.cs", "Tree View")]
	public class DemoEditableCells : Gtk.Window
	{
		private ListStore store;
		private TreeView treeView;
		private IList<Item> articles;

		public DemoEditableCells () : base ("Shopping list")
		{
			SetDefaultSize (320, 200);
			BorderWidth = 5;

			VBox vbox = new VBox (false, 5);
			Add (vbox);

			vbox.PackStart (new Label ("Shopping list (you can edit the cells!)"), false, false, 0);

			ScrolledWindow scrolledWindow = new ScrolledWindow ();
			scrolledWindow.ShadowType = ShadowType.EtchedIn;
			scrolledWindow.SetPolicy (PolicyType.Automatic, PolicyType.Automatic);
			vbox.PackStart (scrolledWindow, true, true, 0);

			// create model
			store = CreateModel ();

			// create tree view
			treeView = new TreeView (store);
			treeView.RulesHint = true;
			treeView.Selection.Mode = SelectionMode.Single;

			AddColumns ();
			scrolledWindow.Add (treeView);

			// some buttons
			HBox hbox = new HBox (true, 4);
			vbox.PackStart (hbox, false, false, 0);

			Button button = new Button ("Add item");
			button.Clicked += new EventHandler (AddItem);
			hbox.PackStart (button, true, true, 0);

			button = new Button ("Remove item");
			button.Clicked += new EventHandler (RemoveItem);
			hbox.PackStart (button, true, true, 0);

			ShowAll ();
		}

		private void AddColumns ()
		{
			CellRendererText renderer;

			// number column
			renderer = new CellRendererText ();
			renderer.Edited += new EditedHandler (NumberCellEdited);
			renderer.Editable = true;
			treeView.AppendColumn ("Number", renderer,
					       "text", (int) Column.Number);

			// product column
			renderer = new CellRendererText ();
			renderer.Edited += new EditedHandler (TextCellEdited);
			renderer.Editable = true;
			treeView.AppendColumn ("Product", renderer ,
					       "text", (int) Column.Product);
		}

		private ListStore CreateModel ()
		{
			// create array
			articles = new List<Item> ();
			AddItems ();

			// create list store
			ListStore store = new ListStore (typeof (int), typeof (string), typeof (bool));

			// add items
			foreach (Item item in articles)
				store.AppendValues (item.Number, item.Product);

			return store;
		}

		private void AddItems ()
		{
			Item foo;

			foo = new Item (3, "bottles of coke");
			articles.Add (foo);

			foo = new Item (5, "packages of noodles");
			articles.Add (foo);

			foo = new Item (2, "packages of chocolate chip cookies");
			articles.Add (foo);

			foo = new Item (1, "can vanilla ice cream");
			articles.Add (foo);

			foo = new Item (6, "eggs");
			articles.Add (foo);
		}

		protected override bool OnDeleteEvent (Gdk.Event evt)
		{
			Destroy ();
			return true;
		}

		private void NumberCellEdited (object o, EditedArgs args)
		{
			TreePath path = new TreePath (args.Path);
 			TreeIter iter;
 			store.GetIter (out iter, path);
			int i = path.Indices[0];

			Item foo;
			try {
				foo = articles[i];
 				foo.Number = int.Parse (args.NewText);
			} catch (Exception e) {
				Console.WriteLine (e);
				return;
			}

 			store.SetValue (iter, (int) Column.Number, foo.Number);
		}

		private void TextCellEdited (object o, EditedArgs args)
		{
			TreePath path = new TreePath (args.Path);
 			TreeIter iter;
 			store.GetIter (out iter, path);
			int i = path.Indices[0];

			Item foo = articles[i];
			foo.Product = args.NewText;
			store.SetValue (iter, (int) Column.Product, foo.Product);
		}

		private void AddItem (object o, EventArgs args)
		{
			Item foo = new Item (0, "Description here");
			articles.Add (foo);
			store.AppendValues (foo.Number, foo.Product);
		}

		private void RemoveItem (object o, EventArgs args)
		{
 			TreeIter iter;
			ITreeModel model;

 			if (treeView.Selection.GetSelected (out model, out iter)) {
 				int position = store.GetPath (iter).Indices[0];
 				store.Remove (ref iter);
				articles.RemoveAt (position);
			}
		}
	}

	enum Column
	{
		Number,
		Product
	};

 	struct Item
 	{
		public int Number {
			get { return number; }
			set { number = value; }
		}
		public string Product {
			get { return product; }
			set { product = value; }
		}

		private int number;
		private string product;

 		public Item (int number, string product)
 		{
 			this.number = number;
 			this.product = product;
 		}
 	}
}