// This file was generated by the Gtk# code generator.
// Any changes made will be lost if regenerated.

namespace Gtk {

	using System;
	using System.Runtime.InteropServices;

#region Autogenerated code
	public partial class TreeDragDestAdapter : GLib.GInterfaceAdapter, Gtk.ITreeDragDest {

		[StructLayout (LayoutKind.Sequential)]
		struct GtkTreeDragDestIface {
			public DragDataReceivedNativeDelegate DragDataReceived;
			public RowDropPossibleNativeDelegate RowDropPossible;
		}

		static GtkTreeDragDestIface iface;

		static TreeDragDestAdapter ()
		{
			GLib.GType.Register (_gtype, typeof (TreeDragDestAdapter));
			iface.DragDataReceived = new DragDataReceivedNativeDelegate (DragDataReceived_cb);
			iface.RowDropPossible = new RowDropPossibleNativeDelegate (RowDropPossible_cb);
		}

		[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
		delegate bool DragDataReceivedNativeDelegate (IntPtr inst, IntPtr dest, IntPtr selection_data);

		static bool DragDataReceived_cb (IntPtr inst, IntPtr dest, IntPtr selection_data)
		{
			try {
				ITreeDragDestImplementor __obj = GLib.Object.GetObject (inst, false) as ITreeDragDestImplementor;
				bool __result;
				__result = __obj.DragDataReceived (dest == IntPtr.Zero ? null : (Gtk.TreePath) GLib.Opaque.GetOpaque (dest, typeof (Gtk.TreePath), false), selection_data == IntPtr.Zero ? null : (Gtk.SelectionData) GLib.Opaque.GetOpaque (selection_data, typeof (Gtk.SelectionData), false));
				return __result;
			} catch (Exception e) {
				GLib.ExceptionManager.RaiseUnhandledException (e, true);
				// NOTREACHED: above call does not return.
				throw;
			}
		}

		[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
		delegate bool RowDropPossibleNativeDelegate (IntPtr inst, IntPtr dest_path, IntPtr selection_data);

		static bool RowDropPossible_cb (IntPtr inst, IntPtr dest_path, IntPtr selection_data)
		{
			try {
				ITreeDragDestImplementor __obj = GLib.Object.GetObject (inst, false) as ITreeDragDestImplementor;
				bool __result;
				__result = __obj.RowDropPossible (dest_path == IntPtr.Zero ? null : (Gtk.TreePath) GLib.Opaque.GetOpaque (dest_path, typeof (Gtk.TreePath), false), selection_data == IntPtr.Zero ? null : (Gtk.SelectionData) GLib.Opaque.GetOpaque (selection_data, typeof (Gtk.SelectionData), false));
				return __result;
			} catch (Exception e) {
				GLib.ExceptionManager.RaiseUnhandledException (e, true);
				// NOTREACHED: above call does not return.
				throw;
			}
		}

		static int class_offset = 2 * IntPtr.Size;

		static void Initialize (IntPtr ptr, IntPtr data)
		{
			IntPtr ifaceptr = new IntPtr (ptr.ToInt64 () + class_offset);
			GtkTreeDragDestIface native_iface = (GtkTreeDragDestIface) Marshal.PtrToStructure (ifaceptr, typeof (GtkTreeDragDestIface));
			native_iface.DragDataReceived = iface.DragDataReceived;
			native_iface.RowDropPossible = iface.RowDropPossible;
			Marshal.StructureToPtr (native_iface, ifaceptr, false);
		}

		GLib.Object implementor;

		public TreeDragDestAdapter ()
		{
			InitHandler = new GLib.GInterfaceInitHandler (Initialize);
		}

		public TreeDragDestAdapter (ITreeDragDestImplementor implementor)
		{
			if (implementor == null)
				throw new ArgumentNullException ("implementor");
			else if (!(implementor is GLib.Object))
				throw new ArgumentException ("implementor must be a subclass of GLib.Object");
			this.implementor = implementor as GLib.Object;
		}

		public TreeDragDestAdapter (IntPtr handle)
		{
			if (!_gtype.IsInstance (handle))
				throw new ArgumentException ("The gobject doesn't implement the GInterface of this adapter", "handle");
			implementor = GLib.Object.GetObject (handle);
		}

		[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
		delegate IntPtr d_gtk_tree_drag_dest_get_type();
		static d_gtk_tree_drag_dest_get_type gtk_tree_drag_dest_get_type = FuncLoader.LoadFunction<d_gtk_tree_drag_dest_get_type>(FuncLoader.GetProcAddress(GLibrary.Load(Library.Gtk), "gtk_tree_drag_dest_get_type"));

		private static GLib.GType _gtype = new GLib.GType (gtk_tree_drag_dest_get_type ());

		public static GLib.GType GType {
			get {
				return _gtype;
			}
		}

		public override GLib.GType GInterfaceGType {
			get {
				return _gtype;
			}
		}

		public override IntPtr Handle {
			get {
				return implementor.Handle;
			}
		}

		public IntPtr OwnedHandle {
			get {
				return implementor.OwnedHandle;
			}
		}

		public static ITreeDragDest GetObject (IntPtr handle, bool owned)
		{
			GLib.Object obj = GLib.Object.GetObject (handle, owned);
			return GetObject (obj);
		}

		public static ITreeDragDest GetObject (GLib.Object obj)
		{
			if (obj == null)
				return null;
			else if (obj is ITreeDragDestImplementor)
				return new TreeDragDestAdapter (obj as ITreeDragDestImplementor);
			else if (obj as ITreeDragDest == null)
				return new TreeDragDestAdapter (obj.Handle);
			else
				return obj as ITreeDragDest;
		}

		public ITreeDragDestImplementor Implementor {
			get {
				return implementor as ITreeDragDestImplementor;
			}
		}

		[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
		delegate bool d_gtk_tree_drag_dest_drag_data_received(IntPtr raw, IntPtr dest, IntPtr selection_data);
		static d_gtk_tree_drag_dest_drag_data_received gtk_tree_drag_dest_drag_data_received = FuncLoader.LoadFunction<d_gtk_tree_drag_dest_drag_data_received>(FuncLoader.GetProcAddress(GLibrary.Load(Library.Gtk), "gtk_tree_drag_dest_drag_data_received"));

		public bool DragDataReceived(Gtk.TreePath dest, Gtk.SelectionData selection_data) {
			bool raw_ret = gtk_tree_drag_dest_drag_data_received(Handle, dest == null ? IntPtr.Zero : dest.Handle, selection_data == null ? IntPtr.Zero : selection_data.Handle);
			bool ret = raw_ret;
			return ret;
		}

		[UnmanagedFunctionPointer (CallingConvention.Cdecl)]
		delegate bool d_gtk_tree_drag_dest_row_drop_possible(IntPtr raw, IntPtr dest_path, IntPtr selection_data);
		static d_gtk_tree_drag_dest_row_drop_possible gtk_tree_drag_dest_row_drop_possible = FuncLoader.LoadFunction<d_gtk_tree_drag_dest_row_drop_possible>(FuncLoader.GetProcAddress(GLibrary.Load(Library.Gtk), "gtk_tree_drag_dest_row_drop_possible"));

		public bool RowDropPossible(Gtk.TreePath dest_path, Gtk.SelectionData selection_data) {
			bool raw_ret = gtk_tree_drag_dest_row_drop_possible(Handle, dest_path == null ? IntPtr.Zero : dest_path.Handle, selection_data == null ? IntPtr.Zero : selection_data.Handle);
			bool ret = raw_ret;
			return ret;
		}

#endregion
	}
}
