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

namespace CPF.Mac.AppKit
{
	[Register("NSRuleEditor", true)]
	public class NSRuleEditor : NSControl
	{
		[Register]
		private sealed class _NSRuleEditorDelegate : NSRuleEditorDelegate
		{
			internal NSRuleEditorNumberOfChildren numberOfChildren;

			internal NSRulerEditorChildCriterion childForCriterion;

			internal NSRulerEditorDisplayValue displayValue;

			internal NSRulerEditorPredicateParts predicateParts;

			internal EventHandler rowsDidChange;

			internal EventHandler editingEnded;

			internal EventHandler changed;

			internal EventHandler editingBegan;

			[Preserve(Conditional = true)]
			public override long NumberOfChildren(NSRuleEditor editor, NSObject criterion, NSRuleEditorRowType rowType)
			{
				return numberOfChildren?.Invoke(editor, criterion, rowType) ?? 0;
			}

			[Preserve(Conditional = true)]
			public override NSObject ChildForCriterion(NSRuleEditor editor, long index, NSObject criterion, NSRuleEditorRowType rowType)
			{
				return childForCriterion?.Invoke(editor, index, criterion, rowType);
			}

			[Preserve(Conditional = true)]
			public override NSObject DisplayValue(NSRuleEditor editor, NSObject criterion, long row)
			{
				return displayValue?.Invoke(editor, criterion, row);
			}

			[Preserve(Conditional = true)]
			public override NSDictionary PredicateParts(NSRuleEditor editor, NSObject criterion, NSObject value, long row)
			{
				return predicateParts?.Invoke(editor, criterion, value, row);
			}

			[Preserve(Conditional = true)]
			public override void RowsDidChange(NSNotification notification)
			{
				rowsDidChange?.Invoke(notification, EventArgs.Empty);
			}

			[Preserve(Conditional = true)]
			public override void EditingEnded(NSNotification notification)
			{
				editingEnded?.Invoke(notification, EventArgs.Empty);
			}

			[Preserve(Conditional = true)]
			public override void Changed(NSNotification notification)
			{
				changed?.Invoke(notification, EventArgs.Empty);
			}

			[Preserve(Conditional = true)]
			public override void EditingBegan(NSNotification notification)
			{
				editingBegan?.Invoke(notification, EventArgs.Empty);
			}
		}

		private static readonly IntPtr selPredicateHandle = Selector.GetHandle("predicate");

		private static readonly IntPtr selNumberOfRowsHandle = Selector.GetHandle("numberOfRows");

		private static readonly IntPtr selSelectedRowIndexesHandle = Selector.GetHandle("selectedRowIndexes");

		private static readonly IntPtr selDelegateHandle = Selector.GetHandle("delegate");

		private static readonly IntPtr selSetDelegate_Handle = Selector.GetHandle("setDelegate:");

		private static readonly IntPtr selFormattingStringsFilenameHandle = Selector.GetHandle("formattingStringsFilename");

		private static readonly IntPtr selSetFormattingStringsFilename_Handle = Selector.GetHandle("setFormattingStringsFilename:");

		private static readonly IntPtr selFormattingDictionaryHandle = Selector.GetHandle("formattingDictionary");

		private static readonly IntPtr selSetFormattingDictionary_Handle = Selector.GetHandle("setFormattingDictionary:");

		private static readonly IntPtr selNestingModeHandle = Selector.GetHandle("nestingMode");

		private static readonly IntPtr selSetNestingMode_Handle = Selector.GetHandle("setNestingMode:");

		private static readonly IntPtr selRowHeightHandle = Selector.GetHandle("rowHeight");

		private static readonly IntPtr selSetRowHeight_Handle = Selector.GetHandle("setRowHeight:");

		private static readonly IntPtr selIsEditableHandle = Selector.GetHandle("isEditable");

		private static readonly IntPtr selSetEditable_Handle = Selector.GetHandle("setEditable:");

		private static readonly IntPtr selCanRemoveAllRowsHandle = Selector.GetHandle("canRemoveAllRows");

		private static readonly IntPtr selSetCanRemoveAllRows_Handle = Selector.GetHandle("setCanRemoveAllRows:");

		private static readonly IntPtr selRowClassHandle = Selector.GetHandle("rowClass");

		private static readonly IntPtr selSetRowClass_Handle = Selector.GetHandle("setRowClass:");

		private static readonly IntPtr selRowTypeKeyPathHandle = Selector.GetHandle("rowTypeKeyPath");

		private static readonly IntPtr selSetRowTypeKeyPath_Handle = Selector.GetHandle("setRowTypeKeyPath:");

		private static readonly IntPtr selSubrowsKeyPathHandle = Selector.GetHandle("subrowsKeyPath");

		private static readonly IntPtr selSetSubrowsKeyPath_Handle = Selector.GetHandle("setSubrowsKeyPath:");

		private static readonly IntPtr selCriteriaKeyPathHandle = Selector.GetHandle("criteriaKeyPath");

		private static readonly IntPtr selSetCriteriaKeyPath_Handle = Selector.GetHandle("setCriteriaKeyPath:");

		private static readonly IntPtr selDisplayValuesKeyPathHandle = Selector.GetHandle("displayValuesKeyPath");

		private static readonly IntPtr selSetDisplayValuesKeyPath_Handle = Selector.GetHandle("setDisplayValuesKeyPath:");

		private static readonly IntPtr selReloadCriteriaHandle = Selector.GetHandle("reloadCriteria");

		private static readonly IntPtr selReloadPredicateHandle = Selector.GetHandle("reloadPredicate");

		private static readonly IntPtr selPredicateForRow_Handle = Selector.GetHandle("predicateForRow:");

		private static readonly IntPtr selSubrowIndexesForRow_Handle = Selector.GetHandle("subrowIndexesForRow:");

		private static readonly IntPtr selCriteriaForRow_Handle = Selector.GetHandle("criteriaForRow:");

		private static readonly IntPtr selDisplayValuesForRow_Handle = Selector.GetHandle("displayValuesForRow:");

		private static readonly IntPtr selRowForDisplayValue_Handle = Selector.GetHandle("rowForDisplayValue:");

		private static readonly IntPtr selRowTypeForRow_Handle = Selector.GetHandle("rowTypeForRow:");

		private static readonly IntPtr selParentRowForRow_Handle = Selector.GetHandle("parentRowForRow:");

		private static readonly IntPtr selAddRow_Handle = Selector.GetHandle("addRow:");

		private static readonly IntPtr selInsertRowAtIndexWithTypeAsSubrowOfRowAnimate_Handle = Selector.GetHandle("insertRowAtIndex:withType:asSubrowOfRow:animate:");

		private static readonly IntPtr selSetCriteriaAndDisplayValuesForRowAtIndex_Handle = Selector.GetHandle("setCriteria:andDisplayValues:forRowAtIndex:");

		private static readonly IntPtr selRemoveRowAtIndex_Handle = Selector.GetHandle("removeRowAtIndex:");

		private static readonly IntPtr selRemoveRowsAtIndexesIncludeSubrows_Handle = Selector.GetHandle("removeRowsAtIndexes:includeSubrows:");

		private static readonly IntPtr selSelectRowIndexesByExtendingSelection_Handle = Selector.GetHandle("selectRowIndexes:byExtendingSelection:");

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

		private object __mt_Predicate_var;

		private object __mt_SelectedRows_var;

		private object __mt_WeakDelegate_var;

		private object __mt_FormattingDictionary_var;

		public override IntPtr ClassHandle => class_ptr;

		public virtual NSPredicate Predicate
		{
			[Export("predicate")]
			get
			{
				NSApplication.EnsureUIThread();
				return (NSPredicate)(__mt_Predicate_var = ((!IsDirectBinding) ? ((NSPredicate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selPredicateHandle))) : ((NSPredicate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selPredicateHandle)))));
			}
		}

		public virtual long NumberOfRows
		{
			[Export("numberOfRows")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return Messaging.Int64_objc_msgSend(base.Handle, selNumberOfRowsHandle);
				}
				return Messaging.Int64_objc_msgSendSuper(base.SuperHandle, selNumberOfRowsHandle);
			}
		}

		public virtual NSIndexSet SelectedRows
		{
			[Export("selectedRowIndexes")]
			get
			{
				NSApplication.EnsureUIThread();
				return (NSIndexSet)(__mt_SelectedRows_var = ((!IsDirectBinding) ? ((NSIndexSet)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selSelectedRowIndexesHandle))) : ((NSIndexSet)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selSelectedRowIndexesHandle)))));
			}
		}

		public virtual NSRuleEditorDelegate WeakDelegate
		{
			[Export("delegate", ArgumentSemantic.Assign)]
			get
			{
				NSApplication.EnsureUIThread();
				return (NSRuleEditorDelegate)(__mt_WeakDelegate_var = ((!IsDirectBinding) ? ((NSRuleEditorDelegate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selDelegateHandle))) : ((NSRuleEditorDelegate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selDelegateHandle)))));
			}
			[Export("setDelegate:", ArgumentSemantic.Assign)]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetDelegate_Handle, value?.Handle ?? IntPtr.Zero);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetDelegate_Handle, value?.Handle ?? IntPtr.Zero);
				}
				__mt_WeakDelegate_var = value;
			}
		}

		public NSRuleEditorDelegate Delegate
		{
			get
			{
				return WeakDelegate;
			}
			set
			{
				WeakDelegate = value;
			}
		}

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

		public virtual NSDictionary FormattingDictionary
		{
			[Export("formattingDictionary")]
			get
			{
				NSApplication.EnsureUIThread();
				return (NSDictionary)(__mt_FormattingDictionary_var = ((!IsDirectBinding) ? ((NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selFormattingDictionaryHandle))) : ((NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selFormattingDictionaryHandle)))));
			}
			[Export("setFormattingDictionary:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetFormattingDictionary_Handle, value.Handle);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetFormattingDictionary_Handle, value.Handle);
				}
				__mt_FormattingDictionary_var = value;
			}
		}

		public virtual NSRuleEditorNestingMode NestingMode
		{
			[Export("nestingMode")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return (NSRuleEditorNestingMode)Messaging.UInt64_objc_msgSend(base.Handle, selNestingModeHandle);
				}
				return (NSRuleEditorNestingMode)Messaging.UInt64_objc_msgSendSuper(base.SuperHandle, selNestingModeHandle);
			}
			[Export("setNestingMode:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_UInt64(base.Handle, selSetNestingMode_Handle, (ulong)value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_UInt64(base.SuperHandle, selSetNestingMode_Handle, (ulong)value);
				}
			}
		}

		public virtual double RowHeight
		{
			[Export("rowHeight")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return Messaging.Double_objc_msgSend(base.Handle, selRowHeightHandle);
				}
				return Messaging.Double_objc_msgSendSuper(base.SuperHandle, selRowHeightHandle);
			}
			[Export("setRowHeight:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_Double(base.Handle, selSetRowHeight_Handle, value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_Double(base.SuperHandle, selSetRowHeight_Handle, value);
				}
			}
		}

		public virtual bool Editable
		{
			[Export("isEditable")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selIsEditableHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsEditableHandle);
			}
			[Export("setEditable:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_bool(base.Handle, selSetEditable_Handle, value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_bool(base.SuperHandle, selSetEditable_Handle, value);
				}
			}
		}

		public virtual bool CanRemoveAllRows
		{
			[Export("canRemoveAllRows")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selCanRemoveAllRowsHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selCanRemoveAllRowsHandle);
			}
			[Export("setCanRemoveAllRows:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_bool(base.Handle, selSetCanRemoveAllRows_Handle, value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_bool(base.SuperHandle, selSetCanRemoveAllRows_Handle, value);
				}
			}
		}

		public virtual Class RowClass
		{
			[Export("rowClass")]
			get
			{
				NSApplication.EnsureUIThread();
				if (IsDirectBinding)
				{
					return new Class(Messaging.IntPtr_objc_msgSend(base.Handle, selRowClassHandle));
				}
				return new Class(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selRowClassHandle));
			}
			[Export("setRowClass:")]
			set
			{
				NSApplication.EnsureUIThread();
				if (value == null)
				{
					throw new ArgumentNullException("value");
				}
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetRowClass_Handle, value.Handle);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetRowClass_Handle, value.Handle);
				}
			}
		}

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

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

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

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

		public NSRuleEditorNumberOfChildren NumberOfChildren
		{
			get
			{
				return EnsureNSRuleEditorDelegate().numberOfChildren;
			}
			set
			{
				EnsureNSRuleEditorDelegate().numberOfChildren = value;
			}
		}

		public NSRulerEditorChildCriterion ChildForCriterion
		{
			get
			{
				return EnsureNSRuleEditorDelegate().childForCriterion;
			}
			set
			{
				EnsureNSRuleEditorDelegate().childForCriterion = value;
			}
		}

		public NSRulerEditorDisplayValue DisplayValue
		{
			get
			{
				return EnsureNSRuleEditorDelegate().displayValue;
			}
			set
			{
				EnsureNSRuleEditorDelegate().displayValue = value;
			}
		}

		public NSRulerEditorPredicateParts PredicateParts
		{
			get
			{
				return EnsureNSRuleEditorDelegate().predicateParts;
			}
			set
			{
				EnsureNSRuleEditorDelegate().predicateParts = value;
			}
		}

		public event EventHandler RowsDidChange
		{
			add
			{
				_NSRuleEditorDelegate nSRuleEditorDelegate = EnsureNSRuleEditorDelegate();
				nSRuleEditorDelegate.rowsDidChange = (EventHandler)System.Delegate.Combine(nSRuleEditorDelegate.rowsDidChange, value);
			}
			remove
			{
				_NSRuleEditorDelegate nSRuleEditorDelegate = EnsureNSRuleEditorDelegate();
				nSRuleEditorDelegate.rowsDidChange = (EventHandler)System.Delegate.Remove(nSRuleEditorDelegate.rowsDidChange, value);
			}
		}

		public event EventHandler EditingEnded
		{
			add
			{
				_NSRuleEditorDelegate nSRuleEditorDelegate = EnsureNSRuleEditorDelegate();
				nSRuleEditorDelegate.editingEnded = (EventHandler)System.Delegate.Combine(nSRuleEditorDelegate.editingEnded, value);
			}
			remove
			{
				_NSRuleEditorDelegate nSRuleEditorDelegate = EnsureNSRuleEditorDelegate();
				nSRuleEditorDelegate.editingEnded = (EventHandler)System.Delegate.Remove(nSRuleEditorDelegate.editingEnded, value);
			}
		}

		public event EventHandler Changed
		{
			add
			{
				_NSRuleEditorDelegate nSRuleEditorDelegate = EnsureNSRuleEditorDelegate();
				nSRuleEditorDelegate.changed = (EventHandler)System.Delegate.Combine(nSRuleEditorDelegate.changed, value);
			}
			remove
			{
				_NSRuleEditorDelegate nSRuleEditorDelegate = EnsureNSRuleEditorDelegate();
				nSRuleEditorDelegate.changed = (EventHandler)System.Delegate.Remove(nSRuleEditorDelegate.changed, value);
			}
		}

		public event EventHandler EditingBegan
		{
			add
			{
				_NSRuleEditorDelegate nSRuleEditorDelegate = EnsureNSRuleEditorDelegate();
				nSRuleEditorDelegate.editingBegan = (EventHandler)System.Delegate.Combine(nSRuleEditorDelegate.editingBegan, value);
			}
			remove
			{
				_NSRuleEditorDelegate nSRuleEditorDelegate = EnsureNSRuleEditorDelegate();
				nSRuleEditorDelegate.editingBegan = (EventHandler)System.Delegate.Remove(nSRuleEditorDelegate.editingBegan, value);
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		[Export("init")]
		public NSRuleEditor()
			: 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 NSRuleEditor(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 NSRuleEditor(NSObjectFlag t)
			: base(t)
		{
		}

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

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

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

		[Export("predicateForRow:")]
		public virtual NSPredicate GetPredicate(long row)
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				return (NSPredicate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_Int64(base.Handle, selPredicateForRow_Handle, row));
			}
			return (NSPredicate)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_Int64(base.SuperHandle, selPredicateForRow_Handle, row));
		}

		[Export("subrowIndexesForRow:")]
		public virtual NSIndexSet SubrowIndexes(long rowIndex)
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				return (NSIndexSet)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_Int64(base.Handle, selSubrowIndexesForRow_Handle, rowIndex));
			}
			return (NSIndexSet)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_Int64(base.SuperHandle, selSubrowIndexesForRow_Handle, rowIndex));
		}

		[Export("criteriaForRow:")]
		public virtual NSArray Criteria(long row)
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				return (NSArray)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_Int64(base.Handle, selCriteriaForRow_Handle, row));
			}
			return (NSArray)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_Int64(base.SuperHandle, selCriteriaForRow_Handle, row));
		}

		[Export("displayValuesForRow:")]
		public virtual NSObject[] DisplayValues(long row)
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				return NSArray.ArrayFromHandle<NSObject>(Messaging.IntPtr_objc_msgSend_Int64(base.Handle, selDisplayValuesForRow_Handle, row));
			}
			return NSArray.ArrayFromHandle<NSObject>(Messaging.IntPtr_objc_msgSendSuper_Int64(base.SuperHandle, selDisplayValuesForRow_Handle, row));
		}

		[Export("rowForDisplayValue:")]
		public virtual long Row(NSObject displayValue)
		{
			NSApplication.EnsureUIThread();
			if (displayValue == null)
			{
				throw new ArgumentNullException("displayValue");
			}
			if (IsDirectBinding)
			{
				return Messaging.Int64_objc_msgSend_IntPtr(base.Handle, selRowForDisplayValue_Handle, displayValue.Handle);
			}
			return Messaging.Int64_objc_msgSendSuper_IntPtr(base.SuperHandle, selRowForDisplayValue_Handle, displayValue.Handle);
		}

		[Export("rowTypeForRow:")]
		public virtual NSRuleEditorRowType RowType(long rowIndex)
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				return (NSRuleEditorRowType)Messaging.UInt64_objc_msgSend_Int64(base.Handle, selRowTypeForRow_Handle, rowIndex);
			}
			return (NSRuleEditorRowType)Messaging.UInt64_objc_msgSendSuper_Int64(base.SuperHandle, selRowTypeForRow_Handle, rowIndex);
		}

		[Export("parentRowForRow:")]
		public virtual long ParentRow(long rowIndex)
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				return Messaging.Int64_objc_msgSend_Int64(base.Handle, selParentRowForRow_Handle, rowIndex);
			}
			return Messaging.Int64_objc_msgSendSuper_Int64(base.SuperHandle, selParentRowForRow_Handle, rowIndex);
		}

		[Export("addRow:")]
		public virtual void AddRow(NSObject sender)
		{
			NSApplication.EnsureUIThread();
			if (sender == null)
			{
				throw new ArgumentNullException("sender");
			}
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr(base.Handle, selAddRow_Handle, sender.Handle);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selAddRow_Handle, sender.Handle);
			}
		}

		[Export("insertRowAtIndex:withType:asSubrowOfRow:animate:")]
		public virtual void InsertRowAtIndex(long rowIndex, NSRuleEditorRowType rowType, long parentRow, bool shouldAnimate)
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_Int64_UInt64_Int64_bool(base.Handle, selInsertRowAtIndexWithTypeAsSubrowOfRowAnimate_Handle, rowIndex, (ulong)rowType, parentRow, shouldAnimate);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_Int64_UInt64_Int64_bool(base.SuperHandle, selInsertRowAtIndexWithTypeAsSubrowOfRowAnimate_Handle, rowIndex, (ulong)rowType, parentRow, shouldAnimate);
			}
		}

		[Export("setCriteria:andDisplayValues:forRowAtIndex:")]
		public virtual void SetCriteria(NSArray criteria, NSArray values, long rowIndex)
		{
			NSApplication.EnsureUIThread();
			if (criteria == null)
			{
				throw new ArgumentNullException("criteria");
			}
			if (values == null)
			{
				throw new ArgumentNullException("values");
			}
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr_IntPtr_Int64(base.Handle, selSetCriteriaAndDisplayValuesForRowAtIndex_Handle, criteria.Handle, values.Handle, rowIndex);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr_IntPtr_Int64(base.SuperHandle, selSetCriteriaAndDisplayValuesForRowAtIndex_Handle, criteria.Handle, values.Handle, rowIndex);
			}
		}

		[Export("removeRowAtIndex:")]
		public virtual void RemoveRowAtIndex(long rowIndex)
		{
			NSApplication.EnsureUIThread();
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_Int64(base.Handle, selRemoveRowAtIndex_Handle, rowIndex);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_Int64(base.SuperHandle, selRemoveRowAtIndex_Handle, rowIndex);
			}
		}

		[Export("removeRowsAtIndexes:includeSubrows:")]
		public virtual void RemoveRowsAtIndexes(NSIndexSet rowIndexes, bool includeSubrows)
		{
			NSApplication.EnsureUIThread();
			if (rowIndexes == null)
			{
				throw new ArgumentNullException("rowIndexes");
			}
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr_bool(base.Handle, selRemoveRowsAtIndexesIncludeSubrows_Handle, rowIndexes.Handle, includeSubrows);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr_bool(base.SuperHandle, selRemoveRowsAtIndexesIncludeSubrows_Handle, rowIndexes.Handle, includeSubrows);
			}
		}

		[Export("selectRowIndexes:byExtendingSelection:")]
		public virtual void SelectRows(NSIndexSet indexes, bool extend)
		{
			NSApplication.EnsureUIThread();
			if (indexes == null)
			{
				throw new ArgumentNullException("indexes");
			}
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr_bool(base.Handle, selSelectRowIndexesByExtendingSelection_Handle, indexes.Handle, extend);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr_bool(base.SuperHandle, selSelectRowIndexesByExtendingSelection_Handle, indexes.Handle, extend);
			}
		}

		private _NSRuleEditorDelegate EnsureNSRuleEditorDelegate()
		{
			NSRuleEditorDelegate nSRuleEditorDelegate = Delegate;
			if (nSRuleEditorDelegate == null || !(nSRuleEditorDelegate is _NSRuleEditorDelegate))
			{
				nSRuleEditorDelegate = (Delegate = new _NSRuleEditorDelegate());
			}
			return (_NSRuleEditorDelegate)nSRuleEditorDelegate;
		}

		protected override void Dispose(bool disposing)
		{
			base.Dispose(disposing);
			if (base.Handle == IntPtr.Zero)
			{
				__mt_Predicate_var = null;
				__mt_SelectedRows_var = null;
				__mt_WeakDelegate_var = null;
				__mt_FormattingDictionary_var = null;
			}
		}
	}
}
