// Object.cs - GObject class wrapper implementation // // Authors: Bob Smith // Mike Kestner // // (c) 2001 Bob Smith and Mike Kestner namespace GLib { using System; using System.Collections; using System.ComponentModel; using System.Runtime.InteropServices; /// /// Object Class /// /// /// /// Wrapper class for GObject. /// public class Object : IWrapper, IDisposable { // Private class and instance members IntPtr _obj; EventHandlerList _events; bool disposed = false; Hashtable Data; static Hashtable Objects = new Hashtable(); ~Object () { Dispose (); } /// /// Dispose Method /// /// /// /// Disposes of the raw object. Only override this if /// the Raw object should not be unref'd when the object /// is garbage collected. /// public void Dispose () { if (disposed) return; DisposeNative (); disposed = true; } [DllImport("gobject-2.0")] static extern void g_object_unref (IntPtr raw); protected virtual void DisposeNative () { if (_obj == IntPtr.Zero) return; g_object_unref (_obj); } /// /// GetObject Shared Method /// /// /// /// Used to obtain a CLI typed object associated with a /// given raw object pointer. This method is primarily /// used to wrap object references that are returned /// by either the signal system or raw class methods that /// return GObject references. /// /// /// /// The wrapper instance. /// public static Object GetObject(IntPtr o) { Object obj = (Object)Objects[(int)o]; if (obj != null) return obj; return GtkSharp.ObjectManager.CreateObject(o); } /// /// Object Constructor /// /// /// /// Dummy constructor needed for derived classes. /// public Object () {} /// /// Object Constructor /// /// /// /// Creates an object from a raw object reference. /// public Object (IntPtr raw) { Raw = raw; } /// /// Raw Property /// /// /// /// The raw GObject reference associated with this wrapper. /// Only subclasses of Object can access this read/write /// property. For public read-only access, use the /// Handle property. /// protected IntPtr Raw { get { return _obj; } set { Objects [value] = this; _obj = value; } } /// /// GType Property /// /// /// /// The type associated with this object class. /// public static int GType { get { return 0; } } /// /// Handle Property /// /// /// /// The raw GObject reference associated with this object. /// Subclasses can use Raw property for read/write /// access. /// public IntPtr Handle { get { return _obj; } } /// /// EventList Property /// /// /// /// A list object containing all the events for this /// object indexed by the Gtk+ signal name. /// protected EventHandlerList EventList { get { if (_events == null) _events = new EventHandlerList (); return _events; } } /// /// Equals Method /// /// /// /// Checks equivalence of two Objects. /// public override bool Equals (object o) { if (!(o is Object)) return false; return (Handle == ((Object) o).Handle); } /// /// GetHashCode Method /// /// /// /// Calculates a hashing value. /// public override int GetHashCode () { return Handle.GetHashCode (); } /// /// GetData Method /// /// /// /// Accesses arbitrary data storage on the Object. /// public object GetData (string key) { if (Data == null) return String.Empty; return Data [key]; } /// /// SetData Method /// /// /// /// Stores arbitrary data on the Object. /// public void SetData (string key, object val) { if (Data == null) Data = new Hashtable (); Data [key] = val; } [DllImport("gobject-2.0")] static extern void g_object_get_property ( IntPtr obj, string name, IntPtr val); /// /// GetProperty Method /// /// /// /// Accesses a Value Property. /// public void GetProperty (String name, GLib.Value val) { g_object_get_property (Raw, name, val.Handle); } [DllImport("gobject-2.0")] static extern void g_object_set_property ( IntPtr obj, string name, IntPtr val); /// /// SetProperty Method /// /// /// /// Accesses a Value Property. /// public void SetProperty (String name, GLib.Value val) { g_object_set_property (Raw, name, val.Handle); } [DllImport("gtksharpglue")] static extern bool gtksharp_is_object (IntPtr obj); internal static bool IsObject (IntPtr obj) { return gtksharp_is_object (obj); } } }