1 //  Gtk.TreeModelAdapter.cs - Gtk TreeModelAdapter customizations
2 //
3 //  Author:  Mike Kestner  <mkestner@novell.com>
4 //
5 //  Copyright (c) 2007 Novell, Inc.
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of version 2 of the Lesser GNU General
9 // Public License as published by the Free Software Foundation.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // Lesser General Public License for more details.
15 //
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this program; if not, write to the
18 // Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 // Boston, MA 02111-1307, USA.
20 
21 namespace Gtk {
22 
23 	using System;
24 	using System.Runtime.InteropServices;
25 
26 	public partial class TreeModelAdapter {
27 
28 		[DllImport (Global.GtkNativeDll, CallingConvention = CallingConvention.Cdecl)]
gtk_tree_model_iter_children(IntPtr raw, out Gtk.TreeIter iter, IntPtr parent)29 		static extern bool gtk_tree_model_iter_children (IntPtr raw, out Gtk.TreeIter iter, IntPtr parent);
IterChildren(out Gtk.TreeIter iter)30 		public bool IterChildren (out Gtk.TreeIter iter) {
31 			bool raw_ret = gtk_tree_model_iter_children (Handle, out iter, IntPtr.Zero);
32 			bool ret = raw_ret;
33 			return ret;
34 		}
35 
IterNChildren()36 		public int IterNChildren () {
37 			int raw_ret = gtk_tree_model_iter_n_children (Handle, IntPtr.Zero);
38 			int ret = raw_ret;
39 			return ret;
40 		}
41 
42 		[DllImport (Global.GtkNativeDll, CallingConvention = CallingConvention.Cdecl)]
gtk_tree_model_iter_nth_child(IntPtr raw, out Gtk.TreeIter iter, IntPtr parent, int n)43 		static extern bool gtk_tree_model_iter_nth_child (IntPtr raw, out Gtk.TreeIter iter, IntPtr parent, int n);
IterNthChild(out Gtk.TreeIter iter, int n)44 		public bool IterNthChild (out Gtk.TreeIter iter, int n) {
45 			bool raw_ret = gtk_tree_model_iter_nth_child (Handle, out iter, IntPtr.Zero, n);
46 			bool ret = raw_ret;
47 			return ret;
48 		}
49 
SetValue(Gtk.TreeIter iter, int column, bool value)50 		public void SetValue (Gtk.TreeIter iter, int column, bool value) {
51 			throw new NotImplementedException ();
52 		}
53 
SetValue(Gtk.TreeIter iter, int column, double value)54 		public void SetValue (Gtk.TreeIter iter, int column, double value) {
55 			throw new NotImplementedException ();
56 		}
57 
SetValue(Gtk.TreeIter iter, int column, int value)58 		public void SetValue (Gtk.TreeIter iter, int column, int value) {
59 			throw new NotImplementedException ();
60 		}
61 
SetValue(Gtk.TreeIter iter, int column, string value)62 		public void SetValue (Gtk.TreeIter iter, int column, string value) {
63 			throw new NotImplementedException ();
64 		}
65 
SetValue(Gtk.TreeIter iter, int column, float value)66 		public void SetValue (Gtk.TreeIter iter, int column, float value) {
67 			throw new NotImplementedException ();
68 		}
69 
SetValue(Gtk.TreeIter iter, int column, uint value)70 		public void SetValue (Gtk.TreeIter iter, int column, uint value) {
71 			throw new NotImplementedException ();
72 		}
73 
SetValue(Gtk.TreeIter iter, int column, object value)74 		public void SetValue (Gtk.TreeIter iter, int column, object value) {
75 			throw new NotImplementedException ();
76 		}
77 
GetValue(Gtk.TreeIter iter, int column)78 		public object GetValue (Gtk.TreeIter iter, int column) {
79 			GLib.Value val = GLib.Value.Empty;
80 			GetValue (iter, column, ref val);
81 			object ret = val.Val;
82 			val.Dispose ();
83 			return ret;
84 		}
85 
86 		[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
RowsReorderedSignalDelegate(IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch)87 		delegate void RowsReorderedSignalDelegate (IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch);
88 
RowsReorderedSignalCallback(IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch)89 		static void RowsReorderedSignalCallback (IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch)
90 		{
91 			Gtk.RowsReorderedArgs args = new Gtk.RowsReorderedArgs ();
92 			try {
93 				GLib.Signal sig = ((GCHandle) gch).Target as GLib.Signal;
94 				if (sig == null)
95 					throw new Exception("Unknown signal GC handle received " + gch);
96 
97 				TreeModelFilter sender = GLib.Object.GetObject (arg0) as TreeModelFilter;
98 				args.Args = new object[3];
99 				args.Args[0] = arg1 == IntPtr.Zero ? null : (Gtk.TreePath) GLib.Opaque.GetOpaque (arg1, typeof (Gtk.TreePath), false);
100 				args.Args[1] = Gtk.TreeIter.New (arg2);
101 				int child_cnt = arg2 == IntPtr.Zero ? sender.IterNChildren () : sender.IterNChildren ((TreeIter)args.Args[1]);
102 				int[] new_order = new int [child_cnt];
103 				Marshal.Copy (arg3, new_order, 0, child_cnt);
104 				args.Args[2] = new_order;
105 				Gtk.RowsReorderedHandler handler = (Gtk.RowsReorderedHandler) sig.Handler;
106 				handler (sender, args);
107 			} catch (Exception e) {
108 				GLib.ExceptionManager.RaiseUnhandledException (e, false);
109 			}
110 		}
111 
112 #if false
113 		[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
RowsReorderedVMDelegate(IntPtr tree_model, IntPtr path, IntPtr iter, IntPtr new_order)114 		delegate void RowsReorderedVMDelegate (IntPtr tree_model, IntPtr path, IntPtr iter, IntPtr new_order);
115 
116 		static RowsReorderedVMDelegate RowsReorderedVMCallback;
117 
rowsreordered_cb(IntPtr tree_model, IntPtr path_ptr, IntPtr iter_ptr, IntPtr new_order)118 		static void rowsreordered_cb (IntPtr tree_model, IntPtr path_ptr, IntPtr iter_ptr, IntPtr new_order)
119 		{
120 			try {
121 				TreeModelFilter store = GLib.Object.GetObject (tree_model, false) as TreeModelFilter;
122 				TreePath path = GLib.Opaque.GetOpaque (path_ptr, typeof (TreePath), false) as TreePath;
123 				TreeIter iter = TreeIter.New (iter_ptr);
124 				int child_cnt = store.IterNChildren (iter);
125 				int[] child_order = new int [child_cnt];
126 				Marshal.Copy (new_order, child_order, 0, child_cnt);
127 				store.OnRowsReordered (path, iter, child_order);
128 			} catch (Exception e) {
129 				GLib.ExceptionManager.RaiseUnhandledException (e, true);
130 				// NOTREACHED: above call doesn't return
131 				throw e;
132 			}
133 		}
134 
OverrideRowsReordered(GLib.GType gtype)135 		private static void OverrideRowsReordered (GLib.GType gtype)
136 		{
137 			if (RowsReorderedVMCallback == null)
138 				RowsReorderedVMCallback = new RowsReorderedVMDelegate (rowsreordered_cb);
139 			OverrideVirtualMethod (gtype, "rows_reordered", RowsReorderedVMCallback);
140 		}
141 
142 		[Obsolete ("Replaced by int[] new_order overload.")]
143 		[GLib.DefaultSignalHandler(Type=typeof(Gtk.TreeModelFilter), ConnectionMethod="OverrideRowsReordered")]
OnRowsReordered(Gtk.TreePath path, Gtk.TreeIter iter, out int new_order)144 		protected virtual void OnRowsReordered (Gtk.TreePath path, Gtk.TreeIter iter, out int new_order)
145 		{
146 			new_order = -1;
147 		}
148 
149 		[GLib.DefaultSignalHandler(Type=typeof(Gtk.TreeModelFilter), ConnectionMethod="OverrideRowsReordered")]
OnRowsReordered(Gtk.TreePath path, Gtk.TreeIter iter, int[] new_order)150 		protected virtual void OnRowsReordered (Gtk.TreePath path, Gtk.TreeIter iter, int[] new_order)
151 		{
152 			int dummy;
153 			OnRowsReordered (path, iter, out dummy);
154 			GLib.Value ret = GLib.Value.Empty;
155 			GLib.ValueArray inst_and_params = new GLib.ValueArray (4);
156 			GLib.Value[] vals = new GLib.Value [4];
157 			vals [0] = new GLib.Value (this);
158 			inst_and_params.Append (vals [0]);
159 			vals [1] = new GLib.Value (path);
160 			inst_and_params.Append (vals [1]);
161 			vals [2] = new GLib.Value (iter);
162 			inst_and_params.Append (vals [2]);
163 			int cnt = IterNChildren (iter);
164 			IntPtr new_order_ptr = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (int)) * cnt);
165 			Marshal.Copy (new_order, 0, new_order_ptr, cnt);
166 			vals [3] = new GLib.Value (new_order_ptr);
167 			inst_and_params.Append (vals [3]);
168 			g_signal_chain_from_overridden (inst_and_params.ArrayPtr, ref ret);
169 			Marshal.FreeHGlobal (new_order_ptr);
170 
171 			foreach (GLib.Value v in vals)
172 				v.Dispose ();
173 		}
174 
175 #endif
176 		[GLib.Signal("rows_reordered")]
177 		public event Gtk.RowsReorderedHandler RowsReordered {
178 			add {
179 				GLib.Object.GetObject (Handle).AddSignalHandler ("rows_reordered", value, new RowsReorderedSignalDelegate(RowsReorderedSignalCallback));
180 			}
181 			remove {
182 				GLib.Object.GetObject (Handle).RemoveSignalHandler ("rows_reordered", value);
183 			}
184 		}
185 	}
186 }
187