context: using System;
  using System.Runtime.InteropServices;
  
  namespace LibGPhoto2
  {
  	public enum CameraWidgetType 
  	{				/* Value (get/set):     */
  		GP_WIDGET_WINDOW,
  		GP_WIDGET_SECTION,
  		GP_WIDGET_TEXT,		/* char *               */
  		GP_WIDGET_RANGE,	/* float                */
  		GP_WIDGET_TOGGLE,	/* int                  */
  		GP_WIDGET_RADIO,	/* char *               */
  		GP_WIDGET_MENU,		/* char *               */
  		GP_WIDGET_BUTTON,	/* CameraWidgetCallback */
  		GP_WIDGET_DATE		/* int                  */
  	}
  	
  	public class CameraWidget : IDisposable
  	{
  		protected HandleRef handle;
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_ref (HandleRef widget);
  
  		protected CameraWidget (IntPtr native)
  		{
  			this.handle = new HandleRef (this, native);
  			gp_widget_ref (this.Handle);
  		}
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_new (CameraWidgetType type, string lable, out IntPtr widget);
  
  		public CameraWidget (CameraWidgetType type, string label)
  		{
  			ErrorCode result;
  			unsafe 
  			{
  				IntPtr native;
  				result = gp_widget_new(type, label,out native);
  				this.handle = new HandleRef (this, native);
  			}
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  		}
  		
  		public void Dispose()
  		{
  			Dispose(true);
  			GC.SuppressFinalize(this);
  		}
  		
  		~CameraWidget()
  		{
  			Dispose(false);
  		}
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_unref (HandleRef widget);
  		
  		protected virtual void Dispose (bool disposing)
  		{
  			ErrorCode result;
  			unsafe
  			{
  				if (this.Handle.Handle != IntPtr.Zero)
  				{
  					result = gp_widget_unref(this.Handle);
  					if (Error.IsError(result)) throw Error.ErrorException(result);
  				}
  			}
  		}
  		
  		public HandleRef Handle
  		{
  			get {
  				return handle;
  			}
  		}
  
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_append (HandleRef widget, HandleRef child);
  
  		public void Append(CameraWidget child)
  		{
  			ErrorCode result;
  	
  			result = gp_widget_append(this.Handle, child.Handle);
  			
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  		}
  
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_prepend (HandleRef widget, HandleRef child);
  		
  		public void Prepend(CameraWidget child)
  		{
  			ErrorCode result;
  
  			result = gp_widget_prepend(this.Handle, child.Handle);
  
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  		}	
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_count_children (HandleRef widget);
  
  		public int ChildCount
  		{
  			get
  			{
  				ErrorCode result;
  				
  				result = gp_widget_count_children(this.Handle);
  					
  				if (Error.IsError(result)) throw Error.ErrorException(result);
  				return (int)result;
  			}
  		}
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_get_child (HandleRef widget, int child_number, out IntPtr child);
  		
  		public CameraWidget GetChild (int n)
  		{
  			ErrorCode result;
  			IntPtr native;
  
  			result = gp_widget_get_child(this.Handle, n, out native);
  			
  			CameraWidget child = new CameraWidget(native);
  			
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  			
  			return child;
  		}
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_get_child_by_label (HandleRef widget, string label, out IntPtr child);
  		
  		public CameraWidget GetChild (string label)
  		{
  			ErrorCode result;
  			IntPtr native;
  			
  			result = gp_widget_get_child_by_label(this.Handle, label, out native);
  			
  			CameraWidget child = new CameraWidget (native);
  			
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  			return child;
  		}
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_get_child_by_id (HandleRef widget, int id, out IntPtr child);
  		
  		public CameraWidget GetChildByID (int id)
  		{
  			ErrorCode result; 			
  			IntPtr native;
  			
  			result = gp_widget_get_child_by_id(this.Handle, id, out native);
  			CameraWidget child = new CameraWidget (native);
  			
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  			return child;
  		}
  
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_get_root (HandleRef widget, out IntPtr root);
  		
  		public CameraWidget GetRoot ()
  		{
  			ErrorCode result;
  			IntPtr native;
  
  			result = gp_widget_get_root (this.Handle, out native);
  			CameraWidget root = new CameraWidget(native);
  
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  			return root;
  		}
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_set_info (HandleRef widget, string info);
  		
  		public void SetInfo (string info)
  		{
  			ErrorCode result;
  
  			result = gp_widget_set_info(this.Handle, info);
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  		}
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_get_info (HandleRef widget, out string info);
  		
  		public string GetInfo ()
  		{
  			ErrorCode result;
  			string info;
  			
  			result = gp_widget_get_info (this.Handle, out info);
  
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  			return info;
  		}
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_get_id (HandleRef widget, out int id);
  		
  		public int GetID ()
  		{
  			ErrorCode result;
  			int id;
  
  			result = gp_widget_get_id (this.Handle, out id);
  
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  			return id;
  		}
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_get_type (HandleRef widget, out CameraWidgetType type);
  
  		public CameraWidgetType GetWidgetType ()
  		{
  			ErrorCode result;
  			CameraWidgetType widget_type;
  
  			result = gp_widget_get_type(this.Handle, out widget_type);
  
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  			return widget_type;
  		}
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_get_label (HandleRef widget, out string label);
  		
  		public string GetLabel ()
  		{
  			ErrorCode result;
  			string label;
  
  			result = gp_widget_get_label(this.Handle, out label);
  
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  			return label;
  		}
  		
  		/*public void SetValue (string value)
  		{
  			ErrorCode result;
  			unsafe
  			{
  				result = _CameraWidget.gp_widget_set_value(obj, Marshal.StringToHGlobalAnsi(value));
  			}
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  		}
  		
  		public void SetValue (float value)
  		{
  			ErrorCode result;
  			unsafe
  			{
  				IntPtr ptr = (void*)value;
  				result = _CameraWidget.gp_widget_set_value(obj, ptr);
  			}
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  		}
  		
  		public void SetValue (int value)
  		{
  			ErrorCode result;
  			unsafe
  			{
  				IntPtr ptr = value;
  				result = _CameraWidget.gp_widget_set_value(obj, ptr);
  			}
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  		}
  		
  		/*public void SetValue (CameraWidgetCallback value)
  		{
  			ErrorCode result;
  			unsafe
  			{
  				IntPtr ptr = &value;
  				result = _CameraWidget.gp_widget_set_value(obj, ptr);
  			}
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  		}*/
  		
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_get_range (HandleRef range, out 
  								      float min, out float max, out float increment);
  
  		public void GetRange (out float min, out float max, out float increment)
  		{
  			ErrorCode result;
  
  			result = gp_widget_get_range(this.Handle, out min, out max, out increment);
  
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  		}
  
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_add_choice (HandleRef widget, string choice);
  		
  		public void AddChoice (string choice)
  		{
  			ErrorCode result;
  			
  			result = gp_widget_add_choice (this.Handle, choice);
  
  			if (Error.IsError(result)) throw Error.ErrorException(result);
  		}
  
  		[DllImport ("libgphoto2.so")]
  		internal static extern ErrorCode gp_widget_count_choices (HandleRef widget);
  
  		public int ChoicesCount ()
  		{
  			ErrorCode result;
  
  			result = gp_widget_count_choices(this.Handle);
  			
  
gt: 			if (Error.IsError(result)) throw Error.ErrorException(result);