using CPF.Mac.CoreGraphics;
using CPF.Mac.Foundation;
using CPF.Mac.ObjCRuntime;
using System;
using System.ComponentModel;

namespace CPF.Mac.AppKit
{
	[Register("NSBox", true)]
	public class NSBox : NSView
	{
		private static readonly IntPtr selBorderTypeHandle = Selector.GetHandle("borderType");

		private static readonly IntPtr selSetBorderType_Handle = Selector.GetHandle("setBorderType:");

		private static readonly IntPtr selTitlePositionHandle = Selector.GetHandle("titlePosition");

		private static readonly IntPtr selSetTitlePosition_Handle = Selector.GetHandle("setTitlePosition:");

		private static readonly IntPtr selBoxTypeHandle = Selector.GetHandle("boxType");

		private static readonly IntPtr selSetBoxType_Handle = Selector.GetHandle("setBoxType:");

		private static readonly IntPtr selTitleHandle = Selector.GetHandle("title");

		private static readonly IntPtr selSetTitle_Handle = Selector.GetHandle("setTitle:");

		private static readonly IntPtr selTitleFontHandle = Selector.GetHandle("titleFont");

		private static readonly IntPtr selSetTitleFont_Handle = Selector.GetHandle("setTitleFont:");

		private static readonly IntPtr selBorderRectHandle = Selector.GetHandle("borderRect");

		private static readonly IntPtr selTitleRectHandle = Selector.GetHandle("titleRect");

		private static readonly IntPtr selTitleCellHandle = Selector.GetHandle("titleCell");

		private static readonly IntPtr selContentViewMarginsHandle = Selector.GetHandle("contentViewMargins");

		private static readonly IntPtr selSetContentViewMargins_Handle = Selector.GetHandle("setContentViewMargins:");

		private static readonly IntPtr selContentViewHandle = Selector.GetHandle("contentView");

		private static readonly IntPtr selSetContentView_Handle = Selector.GetHandle("setContentView:");

		private static readonly IntPtr selIsTransparentHandle = Selector.GetHandle("isTransparent");

		private static readonly IntPtr selSetTransparent_Handle = Selector.GetHandle("setTransparent:");

		private static readonly IntPtr selBorderWidthHandle = Selector.GetHandle("borderWidth");

		private static readonly IntPtr selSetBorderWidth_Handle = Selector.GetHandle("setBorderWidth:");

		private static readonly IntPtr selCornerRadiusHandle = Selector.GetHandle("cornerRadius");

		private static readonly IntPtr selSetCornerRadius_Handle = Selector.GetHandle("setCornerRadius:");

		private static readonly IntPtr selBorderColorHandle = Selector.GetHandle("borderColor");

		private static readonly IntPtr selSetBorderColor_Handle = Selector.GetHandle("setBorderColor:");

		private static readonly IntPtr selFillColorHandle = Selector.GetHandle("fillColor");

		private static readonly IntPtr selSetFillColor_Handle = Selector.GetHandle("setFillColor:");

		private static readonly IntPtr selInitWithFrame_Handle = Selector.GetHandle("initWithFrame:");

		private static readonly IntPtr selSizeToFitHandle = Selector.GetHandle("sizeToFit");

		private static readonly IntPtr selSetFrameFromContentFrame_Handle = Selector.GetHandle("setFrameFromContentFrame:");

		private static readonly IntPtr selSetTitleWithMnemonic_Handle = Selector.GetHandle("setTitleWithMnemonic:");

		private static readonly IntPtr class_ptr = Class.GetHandle("NSBox");

		private object __mt_TitleFont_var;

		private object __mt_TitleCell_var;

		private object __mt_ContentView_var;

		private object __mt_BorderColor_var;

		private object __mt_FillColor_var;

		public override IntPtr ClassHandle => class_ptr;

		public virtual NSBorderType BorderType
		{
			[Export("borderType")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return (NSBorderType)Messaging.UInt64_objc_msgSend(base.Handle, selBorderTypeHandle);
				}
				return (NSBorderType)Messaging.UInt64_objc_msgSendSuper(base.SuperHandle, selBorderTypeHandle);
			}
			[Export("setBorderType:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_UInt64(base.Handle, selSetBorderType_Handle, (ulong)value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_UInt64(base.SuperHandle, selSetBorderType_Handle, (ulong)value);
				}
			}
		}

		public virtual NSTitlePosition TitlePosition
		{
			[Export("titlePosition")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return (NSTitlePosition)Messaging.int_objc_msgSend(base.Handle, selTitlePositionHandle);
				}
				return (NSTitlePosition)Messaging.int_objc_msgSendSuper(base.SuperHandle, selTitlePositionHandle);
			}
			[Export("setTitlePosition:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_int(base.Handle, selSetTitlePosition_Handle, (int)value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_int(base.SuperHandle, selSetTitlePosition_Handle, (int)value);
				}
			}
		}

		public virtual NSBoxType BoxType
		{
			[Export("boxType")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return (NSBoxType)Messaging.int_objc_msgSend(base.Handle, selBoxTypeHandle);
				}
				return (NSBoxType)Messaging.int_objc_msgSendSuper(base.SuperHandle, selBoxTypeHandle);
			}
			[Export("setBoxType:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_int(base.Handle, selSetBoxType_Handle, (int)value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_int(base.SuperHandle, selSetBoxType_Handle, (int)value);
				}
			}
		}

		public virtual string Title
		{
			[Export("title")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return NSString.FromHandle(Messaging.IntPtr_objc_msgSend(base.Handle, selTitleHandle));
				}
				return NSString.FromHandle(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selTitleHandle));
			}
			[Export("setTitle:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				IntPtr intPtr = NSString.CreateNative(value);
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetTitle_Handle, intPtr);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetTitle_Handle, intPtr);
				}
				NSString.ReleaseNative(intPtr);
			}
		}

		public virtual NSFont TitleFont
		{
			[Export("titleFont")]
			get
			{
				NSApplication.EnsureUIThread();
				return (NSFont)(__mt_TitleFont_var = ((!IsDirectBinding) ? ((NSFont)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selTitleFontHandle))) : ((NSFont)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selTitleFontHandle)))));
			}
			[Export("setTitleFont:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetTitleFont_Handle, value.Handle);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetTitleFont_Handle, value.Handle);
				}
				__mt_TitleFont_var = value;
			}
		}

		public virtual CGRect BorderRect
		{
			[Export("borderRect")]
			get
			{
				NSApplication.EnsureUIThread();
				CGRect retval;
				if (IsDirectBinding)
				{
					Messaging.CGRect_objc_msgSend_stret(out retval, base.Handle, selBorderRectHandle);
				}
				else
				{
					Messaging.CGRect_objc_msgSendSuper_stret(out retval, base.SuperHandle, selBorderRectHandle);
				}
				return retval;
			}
		}

		public virtual CGRect TitleRect
		{
			[Export("titleRect")]
			get
			{
				NSApplication.EnsureUIThread();
				CGRect retval;
				if (IsDirectBinding)
				{
					Messaging.CGRect_objc_msgSend_stret(out retval, base.Handle, selTitleRectHandle);
				}
				else
				{
					Messaging.CGRect_objc_msgSendSuper_stret(out retval, base.SuperHandle, selTitleRectHandle);
				}
				return retval;
			}
		}

		public virtual NSObject TitleCell
		{
			[Export("titleCell")]
			get
			{
				NSApplication.EnsureUIThread();
				return (NSObject)(__mt_TitleCell_var = ((!IsDirectBinding) ? Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selTitleCellHandle)) : Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selTitleCellHandle))));
			}
		}

		public virtual CGSize ContentViewMargins
		{
			[Export("contentViewMargins")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return Messaging.CGSize_objc_msgSend(base.Handle, selContentViewMarginsHandle);
				}
				return Messaging.CGSize_objc_msgSendSuper(base.SuperHandle, selContentViewMarginsHandle);
			}
			[Export("setContentViewMargins:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_CGSize(base.Handle, selSetContentViewMargins_Handle, value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_CGSize(base.SuperHandle, selSetContentViewMargins_Handle, value);
				}
			}
		}

		public virtual NSObject ContentView
		{
			[Export("contentView")]
			get
			{
				NSApplication.EnsureUIThread();
				return (NSObject)(__mt_ContentView_var = ((!IsDirectBinding) ? Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selContentViewHandle)) : Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selContentViewHandle))));
			}
			[Export("setContentView:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetContentView_Handle, value.Handle);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetContentView_Handle, value.Handle);
				}
				__mt_ContentView_var = value;
			}
		}

		public virtual bool Transparent
		{
			[Export("isTransparent")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selIsTransparentHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsTransparentHandle);
			}
			[Export("setTransparent:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_bool(base.Handle, selSetTransparent_Handle, value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_bool(base.SuperHandle, selSetTransparent_Handle, value);
				}
			}
		}

		public virtual double BorderWidth
		{
			[Export("borderWidth")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return Messaging.Double_objc_msgSend(base.Handle, selBorderWidthHandle);
				}
				return Messaging.Double_objc_msgSendSuper(base.SuperHandle, selBorderWidthHandle);
			}
			[Export("setBorderWidth:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_Double(base.Handle, selSetBorderWidth_Handle, value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_Double(base.SuperHandle, selSetBorderWidth_Handle, value);
				}
			}
		}

		public virtual double CornerRadius
		{
			[Export("cornerRadius")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return Messaging.Double_objc_msgSend(base.Handle, selCornerRadiusHandle);
				}
				return Messaging.Double_objc_msgSendSuper(base.SuperHandle, selCornerRadiusHandle);
			}
			[Export("setCornerRadius:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_Double(base.Handle, selSetCornerRadius_Handle, value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_Double(base.SuperHandle, selSetCornerRadius_Handle, value);
				}
			}
		}

		public virtual NSColor BorderColor
		{
			[Export("borderColor")]
			get
			{
				NSApplication.EnsureUIThread();
				return (NSColor)(__mt_BorderColor_var = ((!IsDirectBinding) ? ((NSColor)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selBorderColorHandle))) : ((NSColor)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selBorderColorHandle)))));
			}
			[Export("setBorderColor:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetBorderColor_Handle, value.Handle);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetBorderColor_Handle, value.Handle);
				}
				__mt_BorderColor_var = value;
			}
		}

		public virtual NSColor FillColor
		{
			[Export("fillColor")]
			get
			{
				NSApplication.EnsureUIThread();
				return (NSColor)(__mt_FillColor_var = ((!IsDirectBinding) ? ((NSColor)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selFillColorHandle))) : ((NSColor)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selFillColorHandle)))));
			}
			[Export("setFillColor:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetFillColor_Handle, value.Handle);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetFillColor_Handle, value.Handle);
				}
				__mt_FillColor_var = value;
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		[Export("init")]
		public NSBox()
			: base(NSObjectFlag.Empty)
		{
			if (IsDirectBinding)
			{
				base.Handle = Messaging.IntPtr_objc_msgSend(base.Handle, Selector.Init);
			}
			else
			{
				base.Handle = Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, Selector.Init);
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		[Export("initWithCoder:")]
		public NSBox(NSCoder coder)
			: base(NSObjectFlag.Empty)
		{
			if (IsDirectBinding)
			{
				base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, Selector.InitWithCoder, coder.Handle);
			}
			else
			{
				base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, Selector.InitWithCoder, coder.Handle);
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		public NSBox(NSObjectFlag t)
			: base(t)
		{
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		public NSBox(IntPtr handle)
			: base(handle)
		{
		}

		[Export("initWithFrame:")]
		public NSBox(CGRect frameRect)
			: base(NSObjectFlag.Empty)
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				base.Handle = Messaging.IntPtr_objc_msgSend_CGRect(base.Handle, selInitWithFrame_Handle, frameRect);
			}
			else
			{
				base.Handle = Messaging.IntPtr_objc_msgSendSuper_CGRect(base.SuperHandle, selInitWithFrame_Handle, frameRect);
			}
		}

		[Export("sizeToFit")]
		public virtual void SizeToFit()
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend(base.Handle, selSizeToFitHandle);
			}
			else
			{
				Messaging.void_objc_msgSendSuper(base.SuperHandle, selSizeToFitHandle);
			}
		}

		[Export("setFrameFromContentFrame:")]
		public virtual void SetFrameFromContentFrame(CGRect contentFrame)
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_CGRect(base.Handle, selSetFrameFromContentFrame_Handle, contentFrame);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_CGRect(base.SuperHandle, selSetFrameFromContentFrame_Handle, contentFrame);
			}
		}

		[Export("setTitleWithMnemonic:")]
		public virtual void SetTitleWithMnemonic(string stringWithMnemonic)
		{
			NSApplication.EnsureUIThread();
			if (stringWithMnemonic == null)
			{
				throw new ArgumentNullException("stringWithMnemonic");
			}
			IntPtr intPtr = NSString.CreateNative(stringWithMnemonic);
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetTitleWithMnemonic_Handle, intPtr);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetTitleWithMnemonic_Handle, intPtr);
			}
			NSString.ReleaseNative(intPtr);
		}

		protected override void Dispose(bool disposing)
		{
			base.Dispose(disposing);
			if (base.Handle == IntPtr.Zero)
			{
				__mt_TitleFont_var = null;
				__mt_TitleCell_var = null;
				__mt_ContentView_var = null;
				__mt_BorderColor_var = null;
				__mt_FillColor_var = null;
			}
		}
	}
}
