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