2007-04-17 Mike Kestner <mkestner@novell.com>
* gtk/Gtk.metadata : hide TreeModel.RowsReordered signal so we can do a correct implementation while maintaining compat with the existing broken "NewOrder" parameter. * gtk/ListStore.custom : manual RowsReordered signal implementation. * gtk/RowsReorderedHandler.cs : manual implementation for preserve compat in the Args class. Adds NewChildOrder to replace the broken ChildOrder. * gtk/TreeModel.custom : manual RowsReordered signal declaration. * gtk/TreeModelFilter.custom : manual RowsReordered signal implementation. * gtk/TreeModelSort.custom : manual RowsReordered signal implementation. * gtk/TreeStore.custom : manual RowsReordered signal implementation. [Fixes #78512] svn path=/trunk/gtk-sharp/; revision=75837
This commit is contained in:
parent
e8c9485a52
commit
b108f0142e
9 changed files with 474 additions and 0 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
|||
2007-04-17 Mike Kestner <mkestner@novell.com>
|
||||
|
||||
* gtk/Gtk.metadata : hide TreeModel.RowsReordered signal so we can do
|
||||
a correct implementation while maintaining compat with the existing
|
||||
broken "NewOrder" parameter.
|
||||
* gtk/ListStore.custom : manual RowsReordered signal implementation.
|
||||
* gtk/RowsReorderedHandler.cs : manual implementation for preserve compat
|
||||
in the Args class. Adds NewChildOrder to replace the broken ChildOrder.
|
||||
* gtk/TreeModel.custom : manual RowsReordered signal declaration.
|
||||
* gtk/TreeModelFilter.custom : manual RowsReordered signal implementation.
|
||||
* gtk/TreeModelSort.custom : manual RowsReordered signal implementation.
|
||||
* gtk/TreeStore.custom : manual RowsReordered signal implementation.
|
||||
[Fixes #78512]
|
||||
|
||||
2007-04-17 Ben Motmans <ben.motmans@gmail.com>
|
||||
|
||||
* doc/en/Gtk/Widget.xml:
|
||||
|
|
|
@ -162,6 +162,7 @@
|
|||
<attr path="/api/namespace/interface[@cname='GtkTreeModel']/method[@name='RowInserted']" name="name">EmitRowInserted</attr>
|
||||
<attr path="/api/namespace/interface[@cname='GtkTreeModel']/method[@name='RowsReordered']" name="name">EmitRowsReordered</attr>
|
||||
<attr path="/api/namespace/interface[@cname='GtkTreeSortable']/method[@name='SortColumnChanged']" name="name">ChangeSortColumn</attr>
|
||||
<attr path="/api/namespace/interface[@cname='GtkTreeModel']/signal[@name='RowsReordered']" name="hidden">1</attr>
|
||||
<attr path="/api/namespace/object[@cname='GtkAccelLabel']/constructor[@cname='gtk_accel_label_new']/*/*[@name='string']" name="property_name">label</attr>
|
||||
<attr path="/api/namespace/object[@cname='GtkAboutDialog']/method[@name='GetArtists']" name="hidden">1</attr>
|
||||
<attr path="/api/namespace/object[@cname='GtkAboutDialog']/method[@name='GetAuthors']" name="hidden">1</attr>
|
||||
|
|
|
@ -170,3 +170,103 @@
|
|||
return new TreeEnumerator(this);
|
||||
}
|
||||
|
||||
[GLib.CDeclCallback]
|
||||
delegate void RowsReorderedSignalDelegate (IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch);
|
||||
|
||||
static void RowsReorderedSignalCallback (IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch)
|
||||
{
|
||||
Gtk.RowsReorderedArgs args = new Gtk.RowsReorderedArgs ();
|
||||
try {
|
||||
GLib.Signal sig = ((GCHandle) gch).Target as GLib.Signal;
|
||||
if (sig == null)
|
||||
throw new Exception("Unknown signal GC handle received " + gch);
|
||||
|
||||
ListStore sender = GLib.Object.GetObject (arg0) as ListStore;
|
||||
args.Args = new object[3];
|
||||
args.Args[0] = arg1 == IntPtr.Zero ? null : (Gtk.TreePath) GLib.Opaque.GetOpaque (arg1, typeof (Gtk.TreePath), false);
|
||||
args.Args[1] = Gtk.TreeIter.New (arg2);
|
||||
int child_cnt = sender.IterNChildren ();
|
||||
int[] new_order = new int [child_cnt];
|
||||
Marshal.Copy (arg3, new_order, 0, child_cnt);
|
||||
args.Args[2] = new_order;
|
||||
Gtk.RowsReorderedHandler handler = (Gtk.RowsReorderedHandler) sig.Handler;
|
||||
handler (sender, args);
|
||||
} catch (Exception e) {
|
||||
GLib.ExceptionManager.RaiseUnhandledException (e, false);
|
||||
}
|
||||
}
|
||||
|
||||
[GLib.CDeclCallback]
|
||||
delegate void RowsReorderedVMDelegate (IntPtr tree_model, IntPtr path, IntPtr iter, IntPtr new_order);
|
||||
|
||||
static RowsReorderedVMDelegate RowsReorderedVMCallback;
|
||||
|
||||
static void rowsreordered_cb (IntPtr tree_model, IntPtr path_ptr, IntPtr iter_ptr, IntPtr new_order)
|
||||
{
|
||||
try {
|
||||
ListStore store = GLib.Object.GetObject (tree_model, false) as ListStore;
|
||||
TreePath path = GLib.Opaque.GetOpaque (path_ptr, typeof (TreePath), false) as TreePath;
|
||||
TreeIter iter = TreeIter.New (iter_ptr);
|
||||
int child_cnt = store.IterNChildren ();
|
||||
int[] child_order = new int [child_cnt];
|
||||
Marshal.Copy (new_order, child_order, 0, child_cnt);
|
||||
store.OnRowsReordered (path, iter, child_order);
|
||||
} catch (Exception e) {
|
||||
GLib.ExceptionManager.RaiseUnhandledException (e, true);
|
||||
// NOTREACHED: above call doesn't return
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private static void OverrideRowsReordered (GLib.GType gtype)
|
||||
{
|
||||
if (RowsReorderedVMCallback == null)
|
||||
RowsReorderedVMCallback = new RowsReorderedVMDelegate (rowsreordered_cb);
|
||||
OverrideVirtualMethod (gtype, "rows_reordered", RowsReorderedVMCallback);
|
||||
}
|
||||
|
||||
[Obsolete ("Replaced by int[] new_order overload.")]
|
||||
[GLib.DefaultSignalHandler(Type=typeof(Gtk.ListStore), ConnectionMethod="OverrideRowsReordered")]
|
||||
protected virtual void OnRowsReordered (Gtk.TreePath path, Gtk.TreeIter iter, out int new_order)
|
||||
{
|
||||
new_order = -1;
|
||||
}
|
||||
|
||||
[GLib.DefaultSignalHandler(Type=typeof(Gtk.ListStore), ConnectionMethod="OverrideRowsReordered")]
|
||||
protected virtual void OnRowsReordered (Gtk.TreePath path, Gtk.TreeIter iter, int[] new_order)
|
||||
{
|
||||
int dummy;
|
||||
OnRowsReordered (path, iter, out dummy);
|
||||
GLib.Value ret = GLib.Value.Empty;
|
||||
GLib.ValueArray inst_and_params = new GLib.ValueArray (4);
|
||||
GLib.Value[] vals = new GLib.Value [4];
|
||||
vals [0] = new GLib.Value (this);
|
||||
inst_and_params.Append (vals [0]);
|
||||
vals [1] = new GLib.Value (path);
|
||||
inst_and_params.Append (vals [1]);
|
||||
vals [2] = new GLib.Value (iter);
|
||||
inst_and_params.Append (vals [2]);
|
||||
int cnt = IterNChildren ();
|
||||
IntPtr new_order_ptr = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (int)) * cnt);
|
||||
Marshal.Copy (new_order, 0, new_order_ptr, cnt);
|
||||
vals [3] = new GLib.Value (new_order_ptr);
|
||||
inst_and_params.Append (vals [3]);
|
||||
g_signal_chain_from_overridden (inst_and_params.ArrayPtr, ref ret);
|
||||
Marshal.FreeHGlobal (new_order_ptr);
|
||||
|
||||
foreach (GLib.Value v in vals)
|
||||
v.Dispose ();
|
||||
}
|
||||
|
||||
[GLib.Signal("rows_reordered")]
|
||||
public event Gtk.RowsReorderedHandler RowsReordered {
|
||||
add {
|
||||
GLib.Signal sig = GLib.Signal.Lookup (this, "rows_reordered", new RowsReorderedSignalDelegate(RowsReorderedSignalCallback));
|
||||
sig.AddDelegate (value);
|
||||
}
|
||||
remove {
|
||||
GLib.Signal sig = GLib.Signal.Lookup (this, "rows_reordered", new RowsReorderedSignalDelegate(RowsReorderedSignalCallback));
|
||||
sig.RemoveDelegate (value);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ sources = \
|
|||
NodeStore.cs \
|
||||
NodeView.cs \
|
||||
RadioActionEntry.cs \
|
||||
RowsReorderedHandler.cs \
|
||||
StockManager.cs \
|
||||
ThreadNotify.cs \
|
||||
ToggleActionEntry.cs \
|
||||
|
|
54
gtk/RowsReorderedHandler.cs
Normal file
54
gtk/RowsReorderedHandler.cs
Normal file
|
@ -0,0 +1,54 @@
|
|||
// RowsReorderedHandler.cs
|
||||
//
|
||||
// Authors: Mike Kestner <mkestner@novell.com>
|
||||
//
|
||||
// Copyright (c) 2007 Novell, Inc.
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or
|
||||
// modify it under the terms of version 2 of the Lesser GNU General
|
||||
// Public License as published by the Free Software Foundation.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
// Lesser General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Lesser General Public
|
||||
// License along with this program; if not, write to the
|
||||
// Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
// Boston, MA 02111-1307, USA.
|
||||
|
||||
|
||||
namespace Gtk {
|
||||
|
||||
using System;
|
||||
|
||||
public delegate void RowsReorderedHandler (object o, RowsReorderedArgs args);
|
||||
|
||||
public class RowsReorderedArgs : GLib.SignalArgs {
|
||||
|
||||
public Gtk.TreePath Path{
|
||||
get {
|
||||
return (Gtk.TreePath) Args[0];
|
||||
}
|
||||
}
|
||||
|
||||
public Gtk.TreeIter Iter{
|
||||
get {
|
||||
return (Gtk.TreeIter) Args[1];
|
||||
}
|
||||
}
|
||||
|
||||
[Obsolete ("Replaced by NewChildOrder property")]
|
||||
public int NewOrder{
|
||||
set { }
|
||||
}
|
||||
|
||||
|
||||
public int[] NewChildOrder {
|
||||
get {
|
||||
return (int[]) Args[2];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -41,3 +41,5 @@
|
|||
void SetValue (Gtk.TreeIter iter, int column, uint value);
|
||||
void SetValue (Gtk.TreeIter iter, int column, object value);
|
||||
object GetValue(Gtk.TreeIter iter, int column);
|
||||
|
||||
event RowsReorderedHandler RowsReordered;
|
||||
|
|
|
@ -83,3 +83,103 @@
|
|||
return TreeIter.Zero;
|
||||
}
|
||||
|
||||
[GLib.CDeclCallback]
|
||||
delegate void RowsReorderedSignalDelegate (IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch);
|
||||
|
||||
static void RowsReorderedSignalCallback (IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch)
|
||||
{
|
||||
Gtk.RowsReorderedArgs args = new Gtk.RowsReorderedArgs ();
|
||||
try {
|
||||
GLib.Signal sig = ((GCHandle) gch).Target as GLib.Signal;
|
||||
if (sig == null)
|
||||
throw new Exception("Unknown signal GC handle received " + gch);
|
||||
|
||||
TreeModelFilter sender = GLib.Object.GetObject (arg0) as TreeModelFilter;
|
||||
args.Args = new object[3];
|
||||
args.Args[0] = arg1 == IntPtr.Zero ? null : (Gtk.TreePath) GLib.Opaque.GetOpaque (arg1, typeof (Gtk.TreePath), false);
|
||||
args.Args[1] = Gtk.TreeIter.New (arg2);
|
||||
int child_cnt = sender.IterNChildren ((TreeIter)args.Args[1]);
|
||||
int[] new_order = new int [child_cnt];
|
||||
Marshal.Copy (arg3, new_order, 0, child_cnt);
|
||||
args.Args[2] = new_order;
|
||||
Gtk.RowsReorderedHandler handler = (Gtk.RowsReorderedHandler) sig.Handler;
|
||||
handler (sender, args);
|
||||
} catch (Exception e) {
|
||||
GLib.ExceptionManager.RaiseUnhandledException (e, false);
|
||||
}
|
||||
}
|
||||
|
||||
[GLib.CDeclCallback]
|
||||
delegate void RowsReorderedVMDelegate (IntPtr tree_model, IntPtr path, IntPtr iter, IntPtr new_order);
|
||||
|
||||
static RowsReorderedVMDelegate RowsReorderedVMCallback;
|
||||
|
||||
static void rowsreordered_cb (IntPtr tree_model, IntPtr path_ptr, IntPtr iter_ptr, IntPtr new_order)
|
||||
{
|
||||
try {
|
||||
TreeModelFilter store = GLib.Object.GetObject (tree_model, false) as TreeModelFilter;
|
||||
TreePath path = GLib.Opaque.GetOpaque (path_ptr, typeof (TreePath), false) as TreePath;
|
||||
TreeIter iter = TreeIter.New (iter_ptr);
|
||||
int child_cnt = store.IterNChildren (iter);
|
||||
int[] child_order = new int [child_cnt];
|
||||
Marshal.Copy (new_order, child_order, 0, child_cnt);
|
||||
store.OnRowsReordered (path, iter, child_order);
|
||||
} catch (Exception e) {
|
||||
GLib.ExceptionManager.RaiseUnhandledException (e, true);
|
||||
// NOTREACHED: above call doesn't return
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private static void OverrideRowsReordered (GLib.GType gtype)
|
||||
{
|
||||
if (RowsReorderedVMCallback == null)
|
||||
RowsReorderedVMCallback = new RowsReorderedVMDelegate (rowsreordered_cb);
|
||||
OverrideVirtualMethod (gtype, "rows_reordered", RowsReorderedVMCallback);
|
||||
}
|
||||
|
||||
[Obsolete ("Replaced by int[] new_order overload.")]
|
||||
[GLib.DefaultSignalHandler(Type=typeof(Gtk.TreeModelFilter), ConnectionMethod="OverrideRowsReordered")]
|
||||
protected virtual void OnRowsReordered (Gtk.TreePath path, Gtk.TreeIter iter, out int new_order)
|
||||
{
|
||||
new_order = -1;
|
||||
}
|
||||
|
||||
[GLib.DefaultSignalHandler(Type=typeof(Gtk.TreeModelFilter), ConnectionMethod="OverrideRowsReordered")]
|
||||
protected virtual void OnRowsReordered (Gtk.TreePath path, Gtk.TreeIter iter, int[] new_order)
|
||||
{
|
||||
int dummy;
|
||||
OnRowsReordered (path, iter, out dummy);
|
||||
GLib.Value ret = GLib.Value.Empty;
|
||||
GLib.ValueArray inst_and_params = new GLib.ValueArray (4);
|
||||
GLib.Value[] vals = new GLib.Value [4];
|
||||
vals [0] = new GLib.Value (this);
|
||||
inst_and_params.Append (vals [0]);
|
||||
vals [1] = new GLib.Value (path);
|
||||
inst_and_params.Append (vals [1]);
|
||||
vals [2] = new GLib.Value (iter);
|
||||
inst_and_params.Append (vals [2]);
|
||||
int cnt = IterNChildren (iter);
|
||||
IntPtr new_order_ptr = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (int)) * cnt);
|
||||
Marshal.Copy (new_order, 0, new_order_ptr, cnt);
|
||||
vals [3] = new GLib.Value (new_order_ptr);
|
||||
inst_and_params.Append (vals [3]);
|
||||
g_signal_chain_from_overridden (inst_and_params.ArrayPtr, ref ret);
|
||||
Marshal.FreeHGlobal (new_order_ptr);
|
||||
|
||||
foreach (GLib.Value v in vals)
|
||||
v.Dispose ();
|
||||
}
|
||||
|
||||
[GLib.Signal("rows_reordered")]
|
||||
public event Gtk.RowsReorderedHandler RowsReordered {
|
||||
add {
|
||||
GLib.Signal sig = GLib.Signal.Lookup (this, "rows_reordered", new RowsReorderedSignalDelegate(RowsReorderedSignalCallback));
|
||||
sig.AddDelegate (value);
|
||||
}
|
||||
remove {
|
||||
GLib.Signal sig = GLib.Signal.Lookup (this, "rows_reordered", new RowsReorderedSignalDelegate(RowsReorderedSignalCallback));
|
||||
sig.RemoveDelegate (value);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -96,3 +96,104 @@
|
|||
{
|
||||
DefaultSortFunc = sort_func;
|
||||
}
|
||||
|
||||
[GLib.CDeclCallback]
|
||||
delegate void RowsReorderedSignalDelegate (IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch);
|
||||
|
||||
static void RowsReorderedSignalCallback (IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch)
|
||||
{
|
||||
Gtk.RowsReorderedArgs args = new Gtk.RowsReorderedArgs ();
|
||||
try {
|
||||
GLib.Signal sig = ((GCHandle) gch).Target as GLib.Signal;
|
||||
if (sig == null)
|
||||
throw new Exception("Unknown signal GC handle received " + gch);
|
||||
|
||||
TreeModelSort sender = GLib.Object.GetObject (arg0) as TreeModelSort;
|
||||
args.Args = new object[3];
|
||||
args.Args[0] = arg1 == IntPtr.Zero ? null : (Gtk.TreePath) GLib.Opaque.GetOpaque (arg1, typeof (Gtk.TreePath), false);
|
||||
args.Args[1] = Gtk.TreeIter.New (arg2);
|
||||
int child_cnt = sender.IterNChildren ((TreeIter)args.Args[1]);
|
||||
int[] new_order = new int [child_cnt];
|
||||
Marshal.Copy (arg3, new_order, 0, child_cnt);
|
||||
args.Args[2] = new_order;
|
||||
Gtk.RowsReorderedHandler handler = (Gtk.RowsReorderedHandler) sig.Handler;
|
||||
handler (sender, args);
|
||||
} catch (Exception e) {
|
||||
GLib.ExceptionManager.RaiseUnhandledException (e, false);
|
||||
}
|
||||
}
|
||||
|
||||
[GLib.CDeclCallback]
|
||||
delegate void RowsReorderedVMDelegate (IntPtr tree_model, IntPtr path, IntPtr iter, IntPtr new_order);
|
||||
|
||||
static RowsReorderedVMDelegate RowsReorderedVMCallback;
|
||||
|
||||
static void rowsreordered_cb (IntPtr tree_model, IntPtr path_ptr, IntPtr iter_ptr, IntPtr new_order)
|
||||
{
|
||||
try {
|
||||
TreeModelSort store = GLib.Object.GetObject (tree_model, false) as TreeModelSort;
|
||||
TreePath path = GLib.Opaque.GetOpaque (path_ptr, typeof (TreePath), false) as TreePath;
|
||||
TreeIter iter = TreeIter.New (iter_ptr);
|
||||
int child_cnt = store.IterNChildren (iter);
|
||||
int[] child_order = new int [child_cnt];
|
||||
Marshal.Copy (new_order, child_order, 0, child_cnt);
|
||||
store.OnRowsReordered (path, iter, child_order);
|
||||
} catch (Exception e) {
|
||||
GLib.ExceptionManager.RaiseUnhandledException (e, true);
|
||||
// NOTREACHED: above call doesn't return
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private static void OverrideRowsReordered (GLib.GType gtype)
|
||||
{
|
||||
if (RowsReorderedVMCallback == null)
|
||||
RowsReorderedVMCallback = new RowsReorderedVMDelegate (rowsreordered_cb);
|
||||
OverrideVirtualMethod (gtype, "rows_reordered", RowsReorderedVMCallback);
|
||||
}
|
||||
|
||||
[Obsolete ("Replaced by int[] new_order overload.")]
|
||||
[GLib.DefaultSignalHandler(Type=typeof(Gtk.TreeModelSort), ConnectionMethod="OverrideRowsReordered")]
|
||||
protected virtual void OnRowsReordered (Gtk.TreePath path, Gtk.TreeIter iter, out int new_order)
|
||||
{
|
||||
new_order = -1;
|
||||
}
|
||||
|
||||
[GLib.DefaultSignalHandler(Type=typeof(Gtk.TreeModelSort), ConnectionMethod="OverrideRowsReordered")]
|
||||
protected virtual void OnRowsReordered (Gtk.TreePath path, Gtk.TreeIter iter, int[] new_order)
|
||||
{
|
||||
int dummy;
|
||||
OnRowsReordered (path, iter, out dummy);
|
||||
GLib.Value ret = GLib.Value.Empty;
|
||||
GLib.ValueArray inst_and_params = new GLib.ValueArray (4);
|
||||
GLib.Value[] vals = new GLib.Value [4];
|
||||
vals [0] = new GLib.Value (this);
|
||||
inst_and_params.Append (vals [0]);
|
||||
vals [1] = new GLib.Value (path);
|
||||
inst_and_params.Append (vals [1]);
|
||||
vals [2] = new GLib.Value (iter);
|
||||
inst_and_params.Append (vals [2]);
|
||||
int cnt = IterNChildren (iter);
|
||||
IntPtr new_order_ptr = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (int)) * cnt);
|
||||
Marshal.Copy (new_order, 0, new_order_ptr, cnt);
|
||||
vals [3] = new GLib.Value (new_order_ptr);
|
||||
inst_and_params.Append (vals [3]);
|
||||
g_signal_chain_from_overridden (inst_and_params.ArrayPtr, ref ret);
|
||||
Marshal.FreeHGlobal (new_order_ptr);
|
||||
|
||||
foreach (GLib.Value v in vals)
|
||||
v.Dispose ();
|
||||
}
|
||||
|
||||
[GLib.Signal("rows_reordered")]
|
||||
public event Gtk.RowsReorderedHandler RowsReordered {
|
||||
add {
|
||||
GLib.Signal sig = GLib.Signal.Lookup (this, "rows_reordered", new RowsReorderedSignalDelegate(RowsReorderedSignalCallback));
|
||||
sig.AddDelegate (value);
|
||||
}
|
||||
remove {
|
||||
GLib.Signal sig = GLib.Signal.Lookup (this, "rows_reordered", new RowsReorderedSignalDelegate(RowsReorderedSignalCallback));
|
||||
sig.RemoveDelegate (value);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -339,3 +339,104 @@
|
|||
{
|
||||
DefaultSortFunc = sort_func;
|
||||
}
|
||||
|
||||
[GLib.CDeclCallback]
|
||||
delegate void RowsReorderedSignalDelegate (IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch);
|
||||
|
||||
static void RowsReorderedSignalCallback (IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr gch)
|
||||
{
|
||||
Gtk.RowsReorderedArgs args = new Gtk.RowsReorderedArgs ();
|
||||
try {
|
||||
GLib.Signal sig = ((GCHandle) gch).Target as GLib.Signal;
|
||||
if (sig == null)
|
||||
throw new Exception("Unknown signal GC handle received " + gch);
|
||||
|
||||
TreeStore sender = GLib.Object.GetObject (arg0) as TreeStore;
|
||||
args.Args = new object[3];
|
||||
args.Args[0] = arg1 == IntPtr.Zero ? null : (Gtk.TreePath) GLib.Opaque.GetOpaque (arg1, typeof (Gtk.TreePath), false);
|
||||
args.Args[1] = Gtk.TreeIter.New (arg2);
|
||||
int child_cnt = sender.IterNChildren ((TreeIter)args.Args[1]);
|
||||
int[] new_order = new int [child_cnt];
|
||||
Marshal.Copy (arg3, new_order, 0, child_cnt);
|
||||
args.Args[2] = new_order;
|
||||
Gtk.RowsReorderedHandler handler = (Gtk.RowsReorderedHandler) sig.Handler;
|
||||
handler (sender, args);
|
||||
} catch (Exception e) {
|
||||
GLib.ExceptionManager.RaiseUnhandledException (e, false);
|
||||
}
|
||||
}
|
||||
|
||||
[GLib.CDeclCallback]
|
||||
delegate void RowsReorderedVMDelegate (IntPtr tree_model, IntPtr path, IntPtr iter, IntPtr new_order);
|
||||
|
||||
static RowsReorderedVMDelegate RowsReorderedVMCallback;
|
||||
|
||||
static void rowsreordered_cb (IntPtr tree_model, IntPtr path_ptr, IntPtr iter_ptr, IntPtr new_order)
|
||||
{
|
||||
try {
|
||||
TreeStore store = GLib.Object.GetObject (tree_model, false) as TreeStore;
|
||||
TreePath path = GLib.Opaque.GetOpaque (path_ptr, typeof (TreePath), false) as TreePath;
|
||||
TreeIter iter = TreeIter.New (iter_ptr);
|
||||
int child_cnt = store.IterNChildren (iter);
|
||||
int[] child_order = new int [child_cnt];
|
||||
Marshal.Copy (new_order, child_order, 0, child_cnt);
|
||||
store.OnRowsReordered (path, iter, child_order);
|
||||
} catch (Exception e) {
|
||||
GLib.ExceptionManager.RaiseUnhandledException (e, true);
|
||||
// NOTREACHED: above call doesn't return
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
private static void OverrideRowsReordered (GLib.GType gtype)
|
||||
{
|
||||
if (RowsReorderedVMCallback == null)
|
||||
RowsReorderedVMCallback = new RowsReorderedVMDelegate (rowsreordered_cb);
|
||||
OverrideVirtualMethod (gtype, "rows_reordered", RowsReorderedVMCallback);
|
||||
}
|
||||
|
||||
[Obsolete ("Replaced by int[] new_order overload.")]
|
||||
[GLib.DefaultSignalHandler(Type=typeof(Gtk.TreeStore), ConnectionMethod="OverrideRowsReordered")]
|
||||
protected virtual void OnRowsReordered (Gtk.TreePath path, Gtk.TreeIter iter, out int new_order)
|
||||
{
|
||||
new_order = -1;
|
||||
}
|
||||
|
||||
[GLib.DefaultSignalHandler(Type=typeof(Gtk.TreeStore), ConnectionMethod="OverrideRowsReordered")]
|
||||
protected virtual void OnRowsReordered (Gtk.TreePath path, Gtk.TreeIter iter, int[] new_order)
|
||||
{
|
||||
int dummy;
|
||||
OnRowsReordered (path, iter, out dummy);
|
||||
GLib.Value ret = GLib.Value.Empty;
|
||||
GLib.ValueArray inst_and_params = new GLib.ValueArray (4);
|
||||
GLib.Value[] vals = new GLib.Value [4];
|
||||
vals [0] = new GLib.Value (this);
|
||||
inst_and_params.Append (vals [0]);
|
||||
vals [1] = new GLib.Value (path);
|
||||
inst_and_params.Append (vals [1]);
|
||||
vals [2] = new GLib.Value (iter);
|
||||
inst_and_params.Append (vals [2]);
|
||||
int cnt = IterNChildren (iter);
|
||||
IntPtr new_order_ptr = Marshal.AllocHGlobal (Marshal.SizeOf (typeof (int)) * cnt);
|
||||
Marshal.Copy (new_order, 0, new_order_ptr, cnt);
|
||||
vals [3] = new GLib.Value (new_order_ptr);
|
||||
inst_and_params.Append (vals [3]);
|
||||
g_signal_chain_from_overridden (inst_and_params.ArrayPtr, ref ret);
|
||||
Marshal.FreeHGlobal (new_order_ptr);
|
||||
|
||||
foreach (GLib.Value v in vals)
|
||||
v.Dispose ();
|
||||
}
|
||||
|
||||
[GLib.Signal("rows_reordered")]
|
||||
public event Gtk.RowsReorderedHandler RowsReordered {
|
||||
add {
|
||||
GLib.Signal sig = GLib.Signal.Lookup (this, "rows_reordered", new RowsReorderedSignalDelegate(RowsReorderedSignalCallback));
|
||||
sig.AddDelegate (value);
|
||||
}
|
||||
remove {
|
||||
GLib.Signal sig = GLib.Signal.Lookup (this, "rows_reordered", new RowsReorderedSignalDelegate(RowsReorderedSignalCallback));
|
||||
sig.RemoveDelegate (value);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue