using CPF.Mac.Foundation;
using CPF.Mac.ObjCRuntime;
using System;
using System.ComponentModel;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Threading;

namespace CPF.Mac.AppKit
{
    [Register("NSApplication", true)]
    public class NSApplication : NSResponder
    {
        [Register]
        private sealed class _NSApplicationDelegate : NSApplicationDelegate
        {
            internal NSApplicationTermination applicationShouldTerminate;

            internal NSApplicationFile openFile;

            internal EventHandler<NSApplicationFilesEventArgs> openFiles;

            internal NSApplicationFile openTempFile;

            internal NSApplicationPredicate applicationShouldOpenUntitledFile;

            internal NSApplicationPredicate applicationOpenUntitledFile;

            internal NSApplicationFileCommand openFileWithoutUI;

            internal NSApplicationFile printFile;

            internal NSApplicationPrint printFiles;

            internal NSApplicationPredicate applicationShouldTerminateAfterLastWindowClosed;

            internal NSApplicationReopen applicationShouldHandleReopen;

            internal NSApplicationMenu applicationDockMenu;

            internal NSApplicationError willPresentError;

            internal EventHandler willFinishLaunching;

            internal EventHandler didFinishLaunching;

            internal EventHandler willHide;

            internal EventHandler didHide;

            internal EventHandler willUnhide;

            internal EventHandler didUnhide;

            internal EventHandler willBecomeActive;

            internal EventHandler didBecomeActive;

            internal EventHandler willResignActive;

            internal EventHandler didResignActive;

            internal EventHandler willUpdate;

            internal EventHandler didUpdate;

            internal EventHandler willTerminate;

            internal EventHandler screenParametersChanged;

            internal EventHandler<NSApplicationRegisterEventArgs> registerServicesMenu;

            internal NSApplicationSelection writeSelectionToPasteboard;

            internal NSPasteboardPredicate readSelectionFromPasteboard;

            internal EventHandler orderFrontStandardAboutPanel;

            internal EventHandler orderFrontStandardAboutPanelWithOptions;

            internal EventHandler<NSDataEventArgs> registeredForRemoteNotifications;

            internal EventHandler<NSErrorEventArgs> failedToRegisterForRemoteNotifications;

            internal EventHandler<NSDictionaryEventArgs> receivedRemoteNotification;

            internal EventHandler<NSCoderEventArgs> willEncodeRestorableState;

            internal EventHandler<NSCoderEventArgs> decodedRestorableState;

            [Preserve(Conditional = true)]
            public override NSApplicationTerminateReply ApplicationShouldTerminate(NSApplication sender)
            {
                return applicationShouldTerminate?.Invoke(sender) ?? NSApplicationTerminateReply.Now;
            }

            [Preserve(Conditional = true)]
            public override bool OpenFile(NSApplication sender, string filename)
            {
                return openFile?.Invoke(sender, filename) ?? false;
            }

            [Preserve(Conditional = true)]
            public override void OpenFiles(NSApplication sender, string[] filenames)
            {
                EventHandler<NSApplicationFilesEventArgs> eventHandler = openFiles;
                if (eventHandler != null)
                {
                    NSApplicationFilesEventArgs e = new NSApplicationFilesEventArgs(filenames);
                    eventHandler(sender, e);
                }
            }

            [Preserve(Conditional = true)]
            public override bool OpenTempFile(NSApplication sender, string filename)
            {
                return openTempFile?.Invoke(sender, filename) ?? false;
            }

            [Preserve(Conditional = true)]
            public override bool ApplicationShouldOpenUntitledFile(NSApplication sender)
            {
                return applicationShouldOpenUntitledFile?.Invoke(sender) ?? false;
            }

            [Preserve(Conditional = true)]
            public override bool ApplicationOpenUntitledFile(NSApplication sender)
            {
                return applicationOpenUntitledFile?.Invoke(sender) ?? false;
            }

            [Preserve(Conditional = true)]
            public override bool OpenFileWithoutUI(NSObject sender, string filename)
            {
                return openFileWithoutUI?.Invoke(sender, filename) ?? false;
            }

            [Preserve(Conditional = true)]
            public override bool PrintFile(NSApplication sender, string filename)
            {
                return printFile?.Invoke(sender, filename) ?? false;
            }

            [Preserve(Conditional = true)]
            public override NSApplicationPrintReply PrintFiles(NSApplication application, string[] fileNames, NSDictionary printSettings, bool showPrintPanels)
            {
                return printFiles?.Invoke(application, fileNames, printSettings, showPrintPanels) ?? NSApplicationPrintReply.Failure;
            }

            [Preserve(Conditional = true)]
            public override bool ApplicationShouldTerminateAfterLastWindowClosed(NSApplication sender)
            {
                return applicationShouldTerminateAfterLastWindowClosed?.Invoke(sender) ?? false;
            }

            [Preserve(Conditional = true)]
            public override bool ApplicationShouldHandleReopen(NSApplication sender, bool hasVisibleWindows)
            {
                return applicationShouldHandleReopen?.Invoke(sender, hasVisibleWindows) ?? false;
            }

            [Preserve(Conditional = true)]
            public override NSMenu ApplicationDockMenu(NSApplication sender)
            {
                return applicationDockMenu?.Invoke(sender);
            }

            [Preserve(Conditional = true)]
            public override NSError WillPresentError(NSApplication application, NSError error)
            {
                return willPresentError?.Invoke(application, error);
            }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            [Preserve(Conditional = true)]
            public override void RegisterServicesMenu(string[] sendTypes, string[] returnTypes)
            {
                EventHandler<NSApplicationRegisterEventArgs> eventHandler = registerServicesMenu;
                if (eventHandler != null)
                {
                    NSApplicationRegisterEventArgs e = new NSApplicationRegisterEventArgs(returnTypes);
                    eventHandler(sendTypes, e);
                }
            }

            [Preserve(Conditional = true)]
            public override bool WriteSelectionToPasteboard(NSPasteboard board, string[] types)
            {
                return writeSelectionToPasteboard?.Invoke(board, types) ?? false;
            }

            [Preserve(Conditional = true)]
            public override bool ReadSelectionFromPasteboard(NSPasteboard pboard)
            {
                return readSelectionFromPasteboard?.Invoke(pboard) ?? false;
            }

            [Preserve(Conditional = true)]
            public override void OrderFrontStandardAboutPanel(NSObject sender)
            {
                orderFrontStandardAboutPanel?.Invoke(sender, EventArgs.Empty);
            }

            [Preserve(Conditional = true)]
            public override void OrderFrontStandardAboutPanelWithOptions(NSDictionary optionsDictionary)
            {
                orderFrontStandardAboutPanelWithOptions?.Invoke(optionsDictionary, EventArgs.Empty);
            }

            [Preserve(Conditional = true)]
            public override void RegisteredForRemoteNotifications(NSApplication application, NSData deviceToken)
            {
                EventHandler<NSDataEventArgs> eventHandler = registeredForRemoteNotifications;
                if (eventHandler != null)
                {
                    NSDataEventArgs e = new NSDataEventArgs(deviceToken);
                    eventHandler(application, e);
                }
            }

            [Preserve(Conditional = true)]
            public override void FailedToRegisterForRemoteNotifications(NSApplication application, NSError error)
            {
                EventHandler<NSErrorEventArgs> eventHandler = failedToRegisterForRemoteNotifications;
                if (eventHandler != null)
                {
                    NSErrorEventArgs e = new NSErrorEventArgs(error);
                    eventHandler(application, e);
                }
            }

            [Preserve(Conditional = true)]
            public override void ReceivedRemoteNotification(NSApplication application, NSDictionary userInfo)
            {
                EventHandler<NSDictionaryEventArgs> eventHandler = receivedRemoteNotification;
                if (eventHandler != null)
                {
                    NSDictionaryEventArgs e = new NSDictionaryEventArgs(userInfo);
                    eventHandler(application, e);
                }
            }

            [Preserve(Conditional = true)]
            public override void WillEncodeRestorableState(NSApplication app, NSCoder encoder)
            {
                EventHandler<NSCoderEventArgs> eventHandler = willEncodeRestorableState;
                if (eventHandler != null)
                {
                    NSCoderEventArgs e = new NSCoderEventArgs(encoder);
                    eventHandler(app, e);
                }
            }

            [Preserve(Conditional = true)]
            public override void DecodedRestorableState(NSApplication app, NSCoder state)
            {
                EventHandler<NSCoderEventArgs> eventHandler = decodedRestorableState;
                if (eventHandler != null)
                {
                    NSCoderEventArgs e = new NSCoderEventArgs(state);
                    eventHandler(app, e);
                }
            }
        }

        public static class Notifications
        {
            public static NSObject ObserveDidBecomeActive(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(DidBecomeActiveNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveDidHide(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(DidHideNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveDidFinishLaunching(EventHandler<NSApplicationDidFinishLaunchingEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(DidFinishLaunchingNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSApplicationDidFinishLaunchingEventArgs(notification));
                });
            }

            public static NSObject ObserveDidResignActive(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(DidResignActiveNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveDidUnhide(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(DidUnhideNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveDidUpdate(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(DidUpdateNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveWillBecomeActive(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(WillBecomeActiveNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveWillHide(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(WillHideNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveWillFinishLaunching(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(WillFinishLaunchingNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveWillResignActive(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(WillResignActiveNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveWillUnhide(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(WillUnhideNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveWillUpdate(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(WillUpdateNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveWillTerminate(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(WillTerminateNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveDidChangeScreenParameters(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(DidChangeScreenParametersNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }

            public static NSObject ObserveDidFinishRestoringWindows(EventHandler<NSNotificationEventArgs> handler)
            {
                return NSNotificationCenter.DefaultCenter.AddObserver(DidFinishRestoringWindowsNotification, delegate (NSNotification notification)
                {
                    handler(null, new NSNotificationEventArgs(notification));
                });
            }
        }

        public static bool CheckForIllegalCrossThreadCalls;

        private static Thread mainThread;

        private static bool initialized;

        private static readonly IntPtr selSharedApplicationHandle;

        private static readonly IntPtr selDelegateHandle;

        private static readonly IntPtr selSetDelegate_Handle;

        private static readonly IntPtr selContextHandle;

        private static readonly IntPtr selMainWindowHandle;

        private static readonly IntPtr selKeyWindowHandle;

        private static readonly IntPtr selIsActiveHandle;

        private static readonly IntPtr selIsHiddenHandle;

        private static readonly IntPtr selIsRunningHandle;

        private static readonly IntPtr selModalWindowHandle;

        private static readonly IntPtr selCurrentEventHandle;

        private static readonly IntPtr selWindowsHandle;

        private static readonly IntPtr selMainMenuHandle;

        private static readonly IntPtr selSetMainMenu_Handle;

        private static readonly IntPtr selHelpMenuHandle;

        private static readonly IntPtr selSetHelpMenu_Handle;

        private static readonly IntPtr selApplicationIconImageHandle;

        private static readonly IntPtr selSetApplicationIconImage_Handle;

        private static readonly IntPtr selDockTileHandle;

        private static readonly IntPtr selPresentationOptionsHandle;

        private static readonly IntPtr selSetPresentationOptions_Handle;

        private static readonly IntPtr selCurrentSystemPresentationOptionsHandle;

        private static readonly IntPtr selWindowsMenuHandle;

        private static readonly IntPtr selSetWindowsMenu_Handle;

        private static readonly IntPtr selIsFullKeyboardAccessEnabledHandle;

        private static readonly IntPtr selServicesProviderHandle;

        private static readonly IntPtr selSetServicesProvider_Handle;

        private static readonly IntPtr selUserInterfaceLayoutDirectionHandle;

        private static readonly IntPtr selServicesMenuHandle;

        private static readonly IntPtr selSetServicesMenu_Handle;

        private static readonly IntPtr selHide_Handle;

        private static readonly IntPtr selUnhide_Handle;

        private static readonly IntPtr selUnhideWithoutActivationHandle;

        private static readonly IntPtr selWindowWithWindowNumber_Handle;

        private static readonly IntPtr selDeactivateHandle;

        private static readonly IntPtr selActivateIgnoringOtherApps_Handle;

        private static readonly IntPtr selHideOtherApplications_Handle;

        private static readonly IntPtr selUnhideAllApplications_Handle;

        private static readonly IntPtr selFinishLaunchingHandle;

        private static readonly IntPtr selRunHandle;

        private static readonly IntPtr selRunModalForWindow_Handle;

        private static readonly IntPtr selStop_Handle;

        private static readonly IntPtr selStopModalHandle;

        private static readonly IntPtr selStopModalWithCode_Handle;

        private static readonly IntPtr selAbortModalHandle;

        private static readonly IntPtr selBeginModalSessionForWindow_Handle;

        private static readonly IntPtr selRunModalSession_Handle;

        private static readonly IntPtr selEndModalSession_Handle;

        private static readonly IntPtr selTerminate_Handle;

        private static readonly IntPtr selRequestUserAttention_Handle;

        private static readonly IntPtr selCancelUserAttentionRequest_Handle;

        private static readonly IntPtr selBeginSheetModalForWindowModalDelegateDidEndSelectorContextInfo_Handle;

        private static readonly IntPtr selEndSheet_Handle;

        private static readonly IntPtr selEndSheetReturnCode_Handle;

        private static readonly IntPtr selNextEventMatchingMaskUntilDateInModeDequeue_Handle;

        private static readonly IntPtr selDiscardEventsMatchingMaskBeforeEvent_Handle;

        private static readonly IntPtr selPostEventAtStart_Handle;

        private static readonly IntPtr selSendEvent_Handle;

        private static readonly IntPtr selPreventWindowOrderingHandle;

        private static readonly IntPtr selMakeWindowsPerformInOrder_Handle;

        private static readonly IntPtr selSetWindowsNeedUpdate_Handle;

        private static readonly IntPtr selUpdateWindowsHandle;

        private static readonly IntPtr selActivationPolicyHandle;

        private static readonly IntPtr selSetActivationPolicy_Handle;

        private static readonly IntPtr selSendActionToFrom_Handle;

        private static readonly IntPtr selTargetForAction_Handle;

        private static readonly IntPtr selTargetForActionToFrom_Handle;

        private static readonly IntPtr selTryToPerformWith_Handle;

        private static readonly IntPtr selValidRequestorForSendTypeReturnType_Handle;

        private static readonly IntPtr selReportException_Handle;

        private static readonly IntPtr selDetachDrawingThreadToTargetWithObject_Handle;

        private static readonly IntPtr selReplyToApplicationShouldTerminate_Handle;

        private static readonly IntPtr selReplyToOpenOrPrint_Handle;

        private static readonly IntPtr selOrderFrontCharacterPalette_Handle;

        private static readonly IntPtr selArrangeInFront_Handle;

        private static readonly IntPtr selRemoveWindowsItem_Handle;

        private static readonly IntPtr selAddWindowsItemTitleFilename_Handle;

        private static readonly IntPtr selChangeWindowsItemTitleFilename_Handle;

        private static readonly IntPtr selUpdateWindowsItem_Handle;

        private static readonly IntPtr selMiniaturizeAll_Handle;

        private static readonly IntPtr selOrderFrontColorPanel_Handle;

        private static readonly IntPtr selDisableRelaunchOnLoginHandle;

        private static readonly IntPtr selEnableRelaunchOnLoginHandle;

        private static readonly IntPtr selEnabledRemoteNotificationTypesHandle;

        private static readonly IntPtr selRegisterForRemoteNotificationTypes_Handle;

        private static readonly IntPtr selUnregisterForRemoteNotificationsHandle;

        private static readonly IntPtr selRestoreWindowWithIdentifierStateCompletionHandler_Handle;

        private static readonly IntPtr class_ptr;

        private static object __mt_SharedApplication_var_static;

        private object __mt_WeakDelegate_var;

        private object __mt_Context_var;

        private object __mt_MainWindow_var;

        private object __mt_KeyWindow_var;

        private object __mt_ModalWindow_var;

        private object __mt_CurrentEvent_var;

        private object __mt_Windows_var;

        private object __mt_MainMenu_var;

        private object __mt_HelpMenu_var;

        private object __mt_ApplicationIconImage_var;

        private object __mt_DockTile_var;

        private object __mt_WindowsMenu_var;

        private object __mt_ServicesProvider_var;

        private object __mt_ServicesMenu_var;

        private static NSString _DidBecomeActiveNotification;

        private static NSString _DidHideNotification;

        private static NSString _DidFinishLaunchingNotification;

        private static NSString _DidResignActiveNotification;

        private static NSString _DidUnhideNotification;

        private static NSString _DidUpdateNotification;

        private static NSString _WillBecomeActiveNotification;

        private static NSString _WillHideNotification;

        private static NSString _WillFinishLaunchingNotification;

        private static NSString _WillResignActiveNotification;

        private static NSString _WillUnhideNotification;

        private static NSString _WillUpdateNotification;

        private static NSString _WillTerminateNotification;

        private static NSString _DidChangeScreenParametersNotification;

        private static NSString _LaunchIsDefaultLaunchKey;

        private static NSString _LaunchRemoteNotificationKey;

        private static NSString _DidFinishRestoringWindowsNotification;

        public NSApplicationActivationPolicy ActivationPolicy
        {
            get
            {
                return GetActivationPolicy();
            }
            set
            {
                SetActivationPolicy(value);
            }
        }

        public override IntPtr ClassHandle => class_ptr;

        [ThreadSafe]
        public static NSApplication SharedApplication
        {
            [Export("sharedApplication")]
            get
            {
                return (NSApplication)(__mt_SharedApplication_var_static = (NSApplication)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(class_ptr, selSharedApplicationHandle)));
            }
        }

        public virtual NSObject WeakDelegate
        {
            [Export("delegate", ArgumentSemantic.Assign)]
            get
            {
                EnsureUIThread();
                return (NSObject)(__mt_WeakDelegate_var = ((!IsDirectBinding) ? Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selDelegateHandle)) : Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selDelegateHandle))));
            }
            [Export("setDelegate:", ArgumentSemantic.Assign)]
            set
            {
                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 NSApplicationDelegate Delegate
        {
            get
            {
                return WeakDelegate as NSApplicationDelegate;
            }
            set
            {
                WeakDelegate = value;
            }
        }

        public virtual NSGraphicsContext Context
        {
            [Export("context")]
            get
            {
                EnsureUIThread();
                return (NSGraphicsContext)(__mt_Context_var = ((!IsDirectBinding) ? ((NSGraphicsContext)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selContextHandle))) : ((NSGraphicsContext)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selContextHandle)))));
            }
        }

        public virtual NSWindow MainWindow
        {
            [Export("mainWindow")]
            get
            {
                EnsureUIThread();
                return (NSWindow)(__mt_MainWindow_var = ((!IsDirectBinding) ? ((NSWindow)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selMainWindowHandle))) : ((NSWindow)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selMainWindowHandle)))));
            }
        }

        public virtual NSWindow KeyWindow
        {
            [Export("keyWindow")]
            get
            {
                EnsureUIThread();
                return (NSWindow)(__mt_KeyWindow_var = ((!IsDirectBinding) ? ((NSWindow)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selKeyWindowHandle))) : ((NSWindow)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selKeyWindowHandle)))));
            }
        }

        public virtual bool Active
        {
            [Export("isActive")]
            get
            {
                EnsureUIThread();
                if (IsDirectBinding)
                {
                    return Messaging.bool_objc_msgSend(base.Handle, selIsActiveHandle);
                }
                return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsActiveHandle);
            }
        }

        public virtual bool Hidden
        {
            [Export("isHidden")]
            get
            {
                EnsureUIThread();
                if (IsDirectBinding)
                {
                    return Messaging.bool_objc_msgSend(base.Handle, selIsHiddenHandle);
                }
                return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsHiddenHandle);
            }
        }

        public virtual bool Running
        {
            [Export("isRunning")]
            get
            {
                EnsureUIThread();
                if (IsDirectBinding)
                {
                    return Messaging.bool_objc_msgSend(base.Handle, selIsRunningHandle);
                }
                return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsRunningHandle);
            }
        }

        public virtual NSWindow ModalWindow
        {
            [Export("modalWindow")]
            get
            {
                EnsureUIThread();
                return (NSWindow)(__mt_ModalWindow_var = ((!IsDirectBinding) ? ((NSWindow)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selModalWindowHandle))) : ((NSWindow)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selModalWindowHandle)))));
            }
        }

        public virtual NSEvent CurrentEvent
        {
            [Export("currentEvent")]
            get
            {
                EnsureUIThread();
                return (NSEvent)(__mt_CurrentEvent_var = ((!IsDirectBinding) ? ((NSEvent)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selCurrentEventHandle))) : ((NSEvent)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selCurrentEventHandle)))));
            }
        }

        public virtual NSWindow[] Windows
        {
            [Export("windows")]
            get
            {
                EnsureUIThread();
                return (NSWindow[])(__mt_Windows_var = ((!IsDirectBinding) ? NSArray.ArrayFromHandle<NSWindow>(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selWindowsHandle)) : NSArray.ArrayFromHandle<NSWindow>(Messaging.IntPtr_objc_msgSend(base.Handle, selWindowsHandle))));
            }
        }

        public virtual NSMenu MainMenu
        {
            [Export("mainMenu")]
            get
            {
                EnsureUIThread();
                return (NSMenu)(__mt_MainMenu_var = ((!IsDirectBinding) ? ((NSMenu)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selMainMenuHandle))) : ((NSMenu)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selMainMenuHandle)))));
            }
            [Export("setMainMenu:")]
            set
            {
                EnsureUIThread();
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                if (IsDirectBinding)
                {
                    Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetMainMenu_Handle, value.Handle);
                }
                else
                {
                    Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetMainMenu_Handle, value.Handle);
                }
                __mt_MainMenu_var = value;
            }
        }

        public virtual NSMenu HelpMenu
        {
            [Export("helpMenu")]
            get
            {
                EnsureUIThread();
                return (NSMenu)(__mt_HelpMenu_var = ((!IsDirectBinding) ? ((NSMenu)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selHelpMenuHandle))) : ((NSMenu)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selHelpMenuHandle)))));
            }
            [Export("setHelpMenu:")]
            set
            {
                EnsureUIThread();
                if (IsDirectBinding)
                {
                    Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetHelpMenu_Handle, value?.Handle ?? IntPtr.Zero);
                }
                else
                {
                    Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetHelpMenu_Handle, value?.Handle ?? IntPtr.Zero);
                }
                __mt_HelpMenu_var = value;
            }
        }

        public virtual NSImage ApplicationIconImage
        {
            [Export("applicationIconImage")]
            get
            {
                EnsureUIThread();
                return (NSImage)(__mt_ApplicationIconImage_var = ((!IsDirectBinding) ? ((NSImage)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selApplicationIconImageHandle))) : ((NSImage)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selApplicationIconImageHandle)))));
            }
            [Export("setApplicationIconImage:")]
            set
            {
                EnsureUIThread();
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                if (IsDirectBinding)
                {
                    Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetApplicationIconImage_Handle, value.Handle);
                }
                else
                {
                    Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetApplicationIconImage_Handle, value.Handle);
                }
                __mt_ApplicationIconImage_var = value;
            }
        }

        public virtual NSDockTile DockTile
        {
            [Export("dockTile")]
            get
            {
                EnsureUIThread();
                return (NSDockTile)(__mt_DockTile_var = ((!IsDirectBinding) ? ((NSDockTile)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selDockTileHandle))) : ((NSDockTile)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selDockTileHandle)))));
            }
        }

        public virtual NSApplicationPresentationOptions PresentationOptions
        {
            [Export("presentationOptions")]
            get
            {
                EnsureUIThread();
                if (IsDirectBinding)
                {
                    return (NSApplicationPresentationOptions)Messaging.UInt64_objc_msgSend(base.Handle, selPresentationOptionsHandle);
                }
                return (NSApplicationPresentationOptions)Messaging.UInt64_objc_msgSendSuper(base.SuperHandle, selPresentationOptionsHandle);
            }
            [Export("setPresentationOptions:")]
            set
            {
                EnsureUIThread();
                if (IsDirectBinding)
                {
                    Messaging.void_objc_msgSend_UInt64(base.Handle, selSetPresentationOptions_Handle, (ulong)value);
                }
                else
                {
                    Messaging.void_objc_msgSendSuper_UInt64(base.SuperHandle, selSetPresentationOptions_Handle, (ulong)value);
                }
            }
        }

        public virtual NSApplicationPresentationOptions CurrentSystemPresentationOptions
        {
            [Export("currentSystemPresentationOptions")]
            get
            {
                EnsureUIThread();
                if (IsDirectBinding)
                {
                    return (NSApplicationPresentationOptions)Messaging.UInt64_objc_msgSend(base.Handle, selCurrentSystemPresentationOptionsHandle);
                }
                return (NSApplicationPresentationOptions)Messaging.UInt64_objc_msgSendSuper(base.SuperHandle, selCurrentSystemPresentationOptionsHandle);
            }
        }

        public virtual NSMenu WindowsMenu
        {
            [Export("windowsMenu")]
            get
            {
                EnsureUIThread();
                return (NSMenu)(__mt_WindowsMenu_var = ((!IsDirectBinding) ? ((NSMenu)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selWindowsMenuHandle))) : ((NSMenu)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selWindowsMenuHandle)))));
            }
            [Export("setWindowsMenu:")]
            set
            {
                EnsureUIThread();
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                if (IsDirectBinding)
                {
                    Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetWindowsMenu_Handle, value.Handle);
                }
                else
                {
                    Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetWindowsMenu_Handle, value.Handle);
                }
                __mt_WindowsMenu_var = value;
            }
        }

        public virtual bool FullKeyboardAccessEnabled
        {
            [Export("isFullKeyboardAccessEnabled")]
            get
            {
                EnsureUIThread();
                if (IsDirectBinding)
                {
                    return Messaging.bool_objc_msgSend(base.Handle, selIsFullKeyboardAccessEnabledHandle);
                }
                return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsFullKeyboardAccessEnabledHandle);
            }
        }

        public virtual NSObject ServicesProvider
        {
            [Export("servicesProvider")]
            get
            {
                EnsureUIThread();
                return (NSObject)(__mt_ServicesProvider_var = ((!IsDirectBinding) ? Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selServicesProviderHandle)) : Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selServicesProviderHandle))));
            }
            [Export("setServicesProvider:")]
            set
            {
                EnsureUIThread();
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                if (IsDirectBinding)
                {
                    Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetServicesProvider_Handle, value.Handle);
                }
                else
                {
                    Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetServicesProvider_Handle, value.Handle);
                }
                __mt_ServicesProvider_var = value;
            }
        }

        public virtual NSApplicationLayoutDirection UserInterfaceLayoutDirection
        {
            [Export("userInterfaceLayoutDirection")]
            get
            {
                EnsureUIThread();
                if (IsDirectBinding)
                {
                    return (NSApplicationLayoutDirection)Messaging.Int64_objc_msgSend(base.Handle, selUserInterfaceLayoutDirectionHandle);
                }
                return (NSApplicationLayoutDirection)Messaging.Int64_objc_msgSendSuper(base.SuperHandle, selUserInterfaceLayoutDirectionHandle);
            }
        }

        public virtual NSMenu ServicesMenu
        {
            [Export("servicesMenu")]
            get
            {
                EnsureUIThread();
                return (NSMenu)(__mt_ServicesMenu_var = ((!IsDirectBinding) ? ((NSMenu)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selServicesMenuHandle))) : ((NSMenu)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selServicesMenuHandle)))));
            }
            [Export("setServicesMenu:")]
            set
            {
                EnsureUIThread();
                if (value == null)
                {
                    throw new ArgumentNullException("value");
                }
                if (IsDirectBinding)
                {
                    Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetServicesMenu_Handle, value.Handle);
                }
                else
                {
                    Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetServicesMenu_Handle, value.Handle);
                }
                __mt_ServicesMenu_var = value;
            }
        }

        [Field("NSApplicationDidBecomeActiveNotification", "AppKit")]
        public static NSString DidBecomeActiveNotification
        {
            get
            {
                if (_DidBecomeActiveNotification == null)
                {
                    _DidBecomeActiveNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationDidBecomeActiveNotification");
                }
                return _DidBecomeActiveNotification;
            }
        }

        [Field("NSApplicationDidHideNotification", "AppKit")]
        public static NSString DidHideNotification
        {
            get
            {
                if (_DidHideNotification == null)
                {
                    _DidHideNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationDidHideNotification");
                }
                return _DidHideNotification;
            }
        }

        [Field("NSApplicationDidFinishLaunchingNotification", "AppKit")]
        public static NSString DidFinishLaunchingNotification
        {
            get
            {
                if (_DidFinishLaunchingNotification == null)
                {
                    _DidFinishLaunchingNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationDidFinishLaunchingNotification");
                }
                return _DidFinishLaunchingNotification;
            }
        }

        [Field("NSApplicationDidResignActiveNotification", "AppKit")]
        public static NSString DidResignActiveNotification
        {
            get
            {
                if (_DidResignActiveNotification == null)
                {
                    _DidResignActiveNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationDidResignActiveNotification");
                }
                return _DidResignActiveNotification;
            }
        }

        [Field("NSApplicationDidUnhideNotification", "AppKit")]
        public static NSString DidUnhideNotification
        {
            get
            {
                if (_DidUnhideNotification == null)
                {
                    _DidUnhideNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationDidUnhideNotification");
                }
                return _DidUnhideNotification;
            }
        }

        [Field("NSApplicationDidUpdateNotification", "AppKit")]
        public static NSString DidUpdateNotification
        {
            get
            {
                if (_DidUpdateNotification == null)
                {
                    _DidUpdateNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationDidUpdateNotification");
                }
                return _DidUpdateNotification;
            }
        }

        [Field("NSApplicationWillBecomeActiveNotification", "AppKit")]
        public static NSString WillBecomeActiveNotification
        {
            get
            {
                if (_WillBecomeActiveNotification == null)
                {
                    _WillBecomeActiveNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationWillBecomeActiveNotification");
                }
                return _WillBecomeActiveNotification;
            }
        }

        [Field("NSApplicationWillHideNotification", "AppKit")]
        public static NSString WillHideNotification
        {
            get
            {
                if (_WillHideNotification == null)
                {
                    _WillHideNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationWillHideNotification");
                }
                return _WillHideNotification;
            }
        }

        [Field("NSApplicationWillFinishLaunchingNotification", "AppKit")]
        public static NSString WillFinishLaunchingNotification
        {
            get
            {
                if (_WillFinishLaunchingNotification == null)
                {
                    _WillFinishLaunchingNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationWillFinishLaunchingNotification");
                }
                return _WillFinishLaunchingNotification;
            }
        }

        [Field("NSApplicationWillResignActiveNotification", "AppKit")]
        public static NSString WillResignActiveNotification
        {
            get
            {
                if (_WillResignActiveNotification == null)
                {
                    _WillResignActiveNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationWillResignActiveNotification");
                }
                return _WillResignActiveNotification;
            }
        }

        [Field("NSApplicationWillUnhideNotification", "AppKit")]
        public static NSString WillUnhideNotification
        {
            get
            {
                if (_WillUnhideNotification == null)
                {
                    _WillUnhideNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationWillUnhideNotification");
                }
                return _WillUnhideNotification;
            }
        }

        [Field("NSApplicationWillUpdateNotification", "AppKit")]
        public static NSString WillUpdateNotification
        {
            get
            {
                if (_WillUpdateNotification == null)
                {
                    _WillUpdateNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationWillUpdateNotification");
                }
                return _WillUpdateNotification;
            }
        }

        [Field("NSApplicationWillTerminateNotification", "AppKit")]
        public static NSString WillTerminateNotification
        {
            get
            {
                if (_WillTerminateNotification == null)
                {
                    _WillTerminateNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationWillTerminateNotification");
                }
                return _WillTerminateNotification;
            }
        }

        [Field("NSApplicationDidChangeScreenParametersNotification", "AppKit")]
        public static NSString DidChangeScreenParametersNotification
        {
            get
            {
                if (_DidChangeScreenParametersNotification == null)
                {
                    _DidChangeScreenParametersNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationDidChangeScreenParametersNotification");
                }
                return _DidChangeScreenParametersNotification;
            }
        }

        [Field("NSApplicationLaunchIsDefaultLaunchKey", "AppKit")]
        public static NSString LaunchIsDefaultLaunchKey
        {
            get
            {
                if (_LaunchIsDefaultLaunchKey == null)
                {
                    _LaunchIsDefaultLaunchKey = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationLaunchIsDefaultLaunchKey");
                }
                return _LaunchIsDefaultLaunchKey;
            }
        }

        [Field("NSApplicationLaunchRemoteNotificationKey", "AppKit")]
        public static NSString LaunchRemoteNotificationKey
        {
            get
            {
                if (_LaunchRemoteNotificationKey == null)
                {
                    _LaunchRemoteNotificationKey = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationLaunchRemoteNotificationKey");
                }
                return _LaunchRemoteNotificationKey;
            }
        }

        [Field("NSApplicationDidFinishRestoringWindowsNotification", "AppKit")]
        public static NSString DidFinishRestoringWindowsNotification
        {
            get
            {
                if (_DidFinishRestoringWindowsNotification == null)
                {
                    _DidFinishRestoringWindowsNotification = Dlfcn.GetStringConstant(Libraries.AppKit.Handle, "NSApplicationDidFinishRestoringWindowsNotification");
                }
                return _DidFinishRestoringWindowsNotification;
            }
        }

        public NSApplicationTermination ApplicationShouldTerminate
        {
            get
            {
                return EnsureNSApplicationDelegate().applicationShouldTerminate;
            }
            set
            {
                EnsureNSApplicationDelegate().applicationShouldTerminate = value;
            }
        }

        public NSApplicationFile OpenFile
        {
            get
            {
                return EnsureNSApplicationDelegate().openFile;
            }
            set
            {
                EnsureNSApplicationDelegate().openFile = value;
            }
        }

        public NSApplicationFile OpenTempFile
        {
            get
            {
                return EnsureNSApplicationDelegate().openTempFile;
            }
            set
            {
                EnsureNSApplicationDelegate().openTempFile = value;
            }
        }

        public NSApplicationPredicate ApplicationShouldOpenUntitledFile
        {
            get
            {
                return EnsureNSApplicationDelegate().applicationShouldOpenUntitledFile;
            }
            set
            {
                EnsureNSApplicationDelegate().applicationShouldOpenUntitledFile = value;
            }
        }

        public NSApplicationPredicate ApplicationOpenUntitledFile
        {
            get
            {
                return EnsureNSApplicationDelegate().applicationOpenUntitledFile;
            }
            set
            {
                EnsureNSApplicationDelegate().applicationOpenUntitledFile = value;
            }
        }

        public NSApplicationFileCommand OpenFileWithoutUI
        {
            get
            {
                return EnsureNSApplicationDelegate().openFileWithoutUI;
            }
            set
            {
                EnsureNSApplicationDelegate().openFileWithoutUI = value;
            }
        }

        public NSApplicationFile PrintFile
        {
            get
            {
                return EnsureNSApplicationDelegate().printFile;
            }
            set
            {
                EnsureNSApplicationDelegate().printFile = value;
            }
        }

        public NSApplicationPrint PrintFiles
        {
            get
            {
                return EnsureNSApplicationDelegate().printFiles;
            }
            set
            {
                EnsureNSApplicationDelegate().printFiles = value;
            }
        }

        public NSApplicationPredicate ApplicationShouldTerminateAfterLastWindowClosed
        {
            get
            {
                return EnsureNSApplicationDelegate().applicationShouldTerminateAfterLastWindowClosed;
            }
            set
            {
                EnsureNSApplicationDelegate().applicationShouldTerminateAfterLastWindowClosed = value;
            }
        }

        public NSApplicationReopen ApplicationShouldHandleReopen
        {
            get
            {
                return EnsureNSApplicationDelegate().applicationShouldHandleReopen;
            }
            set
            {
                EnsureNSApplicationDelegate().applicationShouldHandleReopen = value;
            }
        }

        public NSApplicationMenu ApplicationDockMenu
        {
            get
            {
                return EnsureNSApplicationDelegate().applicationDockMenu;
            }
            set
            {
                EnsureNSApplicationDelegate().applicationDockMenu = value;
            }
        }

        public NSApplicationError WillPresentError
        {
            get
            {
                return EnsureNSApplicationDelegate().willPresentError;
            }
            set
            {
                EnsureNSApplicationDelegate().willPresentError = value;
            }
        }

        public NSApplicationSelection WriteSelectionToPasteboard
        {
            get
            {
                return EnsureNSApplicationDelegate().writeSelectionToPasteboard;
            }
            set
            {
                EnsureNSApplicationDelegate().writeSelectionToPasteboard = value;
            }
        }

        public NSPasteboardPredicate ReadSelectionFromPasteboard
        {
            get
            {
                return EnsureNSApplicationDelegate().readSelectionFromPasteboard;
            }
            set
            {
                EnsureNSApplicationDelegate().readSelectionFromPasteboard = value;
            }
        }

        public event EventHandler<NSApplicationFilesEventArgs> OpenFiles
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.openFiles = (EventHandler<NSApplicationFilesEventArgs>)System.Delegate.Combine(nSApplicationDelegate.openFiles, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.openFiles = (EventHandler<NSApplicationFilesEventArgs>)System.Delegate.Remove(nSApplicationDelegate.openFiles, value);
            }
        }

        public event EventHandler WillFinishLaunching
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willFinishLaunching = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.willFinishLaunching, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willFinishLaunching = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.willFinishLaunching, value);
            }
        }

        public event EventHandler DidFinishLaunching
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didFinishLaunching = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.didFinishLaunching, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didFinishLaunching = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.didFinishLaunching, value);
            }
        }

        public event EventHandler WillHide
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willHide = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.willHide, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willHide = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.willHide, value);
            }
        }

        public event EventHandler DidHide
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didHide = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.didHide, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didHide = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.didHide, value);
            }
        }

        public event EventHandler WillUnhide
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willUnhide = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.willUnhide, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willUnhide = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.willUnhide, value);
            }
        }

        public event EventHandler DidUnhide
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didUnhide = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.didUnhide, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didUnhide = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.didUnhide, value);
            }
        }

        public event EventHandler WillBecomeActive
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willBecomeActive = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.willBecomeActive, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willBecomeActive = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.willBecomeActive, value);
            }
        }

        public event EventHandler DidBecomeActive
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didBecomeActive = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.didBecomeActive, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didBecomeActive = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.didBecomeActive, value);
            }
        }

        public event EventHandler WillResignActive
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willResignActive = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.willResignActive, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willResignActive = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.willResignActive, value);
            }
        }

        public event EventHandler DidResignActive
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didResignActive = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.didResignActive, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didResignActive = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.didResignActive, value);
            }
        }

        public event EventHandler WillUpdate
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willUpdate = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.willUpdate, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willUpdate = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.willUpdate, value);
            }
        }

        public event EventHandler DidUpdate
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didUpdate = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.didUpdate, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.didUpdate = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.didUpdate, value);
            }
        }

        public event EventHandler WillTerminate
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willTerminate = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.willTerminate, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willTerminate = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.willTerminate, value);
            }
        }

        public event EventHandler ScreenParametersChanged
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.screenParametersChanged = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.screenParametersChanged, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.screenParametersChanged = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.screenParametersChanged, value);
            }
        }

        public event EventHandler<NSApplicationRegisterEventArgs> RegisterServicesMenu
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.registerServicesMenu = (EventHandler<NSApplicationRegisterEventArgs>)System.Delegate.Combine(nSApplicationDelegate.registerServicesMenu, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.registerServicesMenu = (EventHandler<NSApplicationRegisterEventArgs>)System.Delegate.Remove(nSApplicationDelegate.registerServicesMenu, value);
            }
        }

        public event EventHandler OrderFrontStandardAboutPanel
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.orderFrontStandardAboutPanel = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.orderFrontStandardAboutPanel, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.orderFrontStandardAboutPanel = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.orderFrontStandardAboutPanel, value);
            }
        }

        public event EventHandler OrderFrontStandardAboutPanelWithOptions
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.orderFrontStandardAboutPanelWithOptions = (EventHandler)System.Delegate.Combine(nSApplicationDelegate.orderFrontStandardAboutPanelWithOptions, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.orderFrontStandardAboutPanelWithOptions = (EventHandler)System.Delegate.Remove(nSApplicationDelegate.orderFrontStandardAboutPanelWithOptions, value);
            }
        }

        public event EventHandler<NSDataEventArgs> RegisteredForRemoteNotifications
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.registeredForRemoteNotifications = (EventHandler<NSDataEventArgs>)System.Delegate.Combine(nSApplicationDelegate.registeredForRemoteNotifications, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.registeredForRemoteNotifications = (EventHandler<NSDataEventArgs>)System.Delegate.Remove(nSApplicationDelegate.registeredForRemoteNotifications, value);
            }
        }

        public event EventHandler<NSErrorEventArgs> FailedToRegisterForRemoteNotifications
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.failedToRegisterForRemoteNotifications = (EventHandler<NSErrorEventArgs>)System.Delegate.Combine(nSApplicationDelegate.failedToRegisterForRemoteNotifications, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.failedToRegisterForRemoteNotifications = (EventHandler<NSErrorEventArgs>)System.Delegate.Remove(nSApplicationDelegate.failedToRegisterForRemoteNotifications, value);
            }
        }

        public event EventHandler<NSDictionaryEventArgs> ReceivedRemoteNotification
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.receivedRemoteNotification = (EventHandler<NSDictionaryEventArgs>)System.Delegate.Combine(nSApplicationDelegate.receivedRemoteNotification, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.receivedRemoteNotification = (EventHandler<NSDictionaryEventArgs>)System.Delegate.Remove(nSApplicationDelegate.receivedRemoteNotification, value);
            }
        }

        public event EventHandler<NSCoderEventArgs> WillEncodeRestorableState
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willEncodeRestorableState = (EventHandler<NSCoderEventArgs>)System.Delegate.Combine(nSApplicationDelegate.willEncodeRestorableState, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.willEncodeRestorableState = (EventHandler<NSCoderEventArgs>)System.Delegate.Remove(nSApplicationDelegate.willEncodeRestorableState, value);
            }
        }

        public event EventHandler<NSCoderEventArgs> DecodedRestorableState
        {
            add
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.decodedRestorableState = (EventHandler<NSCoderEventArgs>)System.Delegate.Combine(nSApplicationDelegate.decodedRestorableState, value);
            }
            remove
            {
                _NSApplicationDelegate nSApplicationDelegate = EnsureNSApplicationDelegate();
                nSApplicationDelegate.decodedRestorableState = (EventHandler<NSCoderEventArgs>)System.Delegate.Remove(nSApplicationDelegate.decodedRestorableState, value);
            }
        }

        public void BeginSheet(NSWindow sheet, NSWindow docWindow)
        {
            BeginSheet(sheet, docWindow, null, null, IntPtr.Zero);
        }

        public void BeginSheet(NSWindow sheet, NSWindow docWindow, NSAction onEnded)
        {
            NSObject modalDelegate = OneShotTracker.Create(onEnded);
            BeginSheet(sheet, docWindow, modalDelegate, NSActionDispatcher.Selector, IntPtr.Zero);
        }

        static NSApplication()
        {
            CheckForIllegalCrossThreadCalls = true;
            selSharedApplicationHandle = Selector.GetHandle("sharedApplication");
            selDelegateHandle = Selector.GetHandle("delegate");
            selSetDelegate_Handle = Selector.GetHandle("setDelegate:");
            selContextHandle = Selector.GetHandle("context");
            selMainWindowHandle = Selector.GetHandle("mainWindow");
            selKeyWindowHandle = Selector.GetHandle("keyWindow");
            selIsActiveHandle = Selector.GetHandle("isActive");
            selIsHiddenHandle = Selector.GetHandle("isHidden");
            selIsRunningHandle = Selector.GetHandle("isRunning");
            selModalWindowHandle = Selector.GetHandle("modalWindow");
            selCurrentEventHandle = Selector.GetHandle("currentEvent");
            selWindowsHandle = Selector.GetHandle("windows");
            selMainMenuHandle = Selector.GetHandle("mainMenu");
            selSetMainMenu_Handle = Selector.GetHandle("setMainMenu:");
            selHelpMenuHandle = Selector.GetHandle("helpMenu");
            selSetHelpMenu_Handle = Selector.GetHandle("setHelpMenu:");
            selApplicationIconImageHandle = Selector.GetHandle("applicationIconImage");
            selSetApplicationIconImage_Handle = Selector.GetHandle("setApplicationIconImage:");
            selDockTileHandle = Selector.GetHandle("dockTile");
            selPresentationOptionsHandle = Selector.GetHandle("presentationOptions");
            selSetPresentationOptions_Handle = Selector.GetHandle("setPresentationOptions:");
            selCurrentSystemPresentationOptionsHandle = Selector.GetHandle("currentSystemPresentationOptions");
            selWindowsMenuHandle = Selector.GetHandle("windowsMenu");
            selSetWindowsMenu_Handle = Selector.GetHandle("setWindowsMenu:");
            selIsFullKeyboardAccessEnabledHandle = Selector.GetHandle("isFullKeyboardAccessEnabled");
            selServicesProviderHandle = Selector.GetHandle("servicesProvider");
            selSetServicesProvider_Handle = Selector.GetHandle("setServicesProvider:");
            selUserInterfaceLayoutDirectionHandle = Selector.GetHandle("userInterfaceLayoutDirection");
            selServicesMenuHandle = Selector.GetHandle("servicesMenu");
            selSetServicesMenu_Handle = Selector.GetHandle("setServicesMenu:");
            selHide_Handle = Selector.GetHandle("hide:");
            selUnhide_Handle = Selector.GetHandle("unhide:");
            selUnhideWithoutActivationHandle = Selector.GetHandle("unhideWithoutActivation");
            selWindowWithWindowNumber_Handle = Selector.GetHandle("windowWithWindowNumber:");
            selDeactivateHandle = Selector.GetHandle("deactivate");
            selActivateIgnoringOtherApps_Handle = Selector.GetHandle("activateIgnoringOtherApps:");
            selHideOtherApplications_Handle = Selector.GetHandle("hideOtherApplications:");
            selUnhideAllApplications_Handle = Selector.GetHandle("unhideAllApplications:");
            selFinishLaunchingHandle = Selector.GetHandle("finishLaunching");
            selRunHandle = Selector.GetHandle("run");
            selRunModalForWindow_Handle = Selector.GetHandle("runModalForWindow:");
            selStop_Handle = Selector.GetHandle("stop:");
            selStopModalHandle = Selector.GetHandle("stopModal");
            selStopModalWithCode_Handle = Selector.GetHandle("stopModalWithCode:");
            selAbortModalHandle = Selector.GetHandle("abortModal");
            selBeginModalSessionForWindow_Handle = Selector.GetHandle("beginModalSessionForWindow:");
            selRunModalSession_Handle = Selector.GetHandle("runModalSession:");
            selEndModalSession_Handle = Selector.GetHandle("endModalSession:");
            selTerminate_Handle = Selector.GetHandle("terminate:");
            selRequestUserAttention_Handle = Selector.GetHandle("requestUserAttention:");
            selCancelUserAttentionRequest_Handle = Selector.GetHandle("cancelUserAttentionRequest:");
            selBeginSheetModalForWindowModalDelegateDidEndSelectorContextInfo_Handle = Selector.GetHandle("beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:");
            selEndSheet_Handle = Selector.GetHandle("endSheet:");
            selEndSheetReturnCode_Handle = Selector.GetHandle("endSheet:returnCode:");
            selNextEventMatchingMaskUntilDateInModeDequeue_Handle = Selector.GetHandle("nextEventMatchingMask:untilDate:inMode:dequeue:");
            selDiscardEventsMatchingMaskBeforeEvent_Handle = Selector.GetHandle("discardEventsMatchingMask:beforeEvent:");
            selPostEventAtStart_Handle = Selector.GetHandle("postEvent:atStart:");
            selSendEvent_Handle = Selector.GetHandle("sendEvent:");
            selPreventWindowOrderingHandle = Selector.GetHandle("preventWindowOrdering");
            selMakeWindowsPerformInOrder_Handle = Selector.GetHandle("makeWindowsPerform:inOrder:");
            selSetWindowsNeedUpdate_Handle = Selector.GetHandle("setWindowsNeedUpdate:");
            selUpdateWindowsHandle = Selector.GetHandle("updateWindows");
            selActivationPolicyHandle = Selector.GetHandle("activationPolicy");
            selSetActivationPolicy_Handle = Selector.GetHandle("setActivationPolicy:");
            selSendActionToFrom_Handle = Selector.GetHandle("sendAction:to:from:");
            selTargetForAction_Handle = Selector.GetHandle("targetForAction:");
            selTargetForActionToFrom_Handle = Selector.GetHandle("targetForAction:to:from:");
            selTryToPerformWith_Handle = Selector.GetHandle("tryToPerform:with:");
            selValidRequestorForSendTypeReturnType_Handle = Selector.GetHandle("validRequestorForSendType:returnType:");
            selReportException_Handle = Selector.GetHandle("reportException:");
            selDetachDrawingThreadToTargetWithObject_Handle = Selector.GetHandle("detachDrawingThread:toTarget:withObject:");
            selReplyToApplicationShouldTerminate_Handle = Selector.GetHandle("replyToApplicationShouldTerminate:");
            selReplyToOpenOrPrint_Handle = Selector.GetHandle("replyToOpenOrPrint:");
            selOrderFrontCharacterPalette_Handle = Selector.GetHandle("orderFrontCharacterPalette:");
            selArrangeInFront_Handle = Selector.GetHandle("arrangeInFront:");
            selRemoveWindowsItem_Handle = Selector.GetHandle("removeWindowsItem:");
            selAddWindowsItemTitleFilename_Handle = Selector.GetHandle("addWindowsItem:title:filename:");
            selChangeWindowsItemTitleFilename_Handle = Selector.GetHandle("changeWindowsItem:title:filename:");
            selUpdateWindowsItem_Handle = Selector.GetHandle("updateWindowsItem:");
            selMiniaturizeAll_Handle = Selector.GetHandle("miniaturizeAll:");
            selOrderFrontColorPanel_Handle = Selector.GetHandle("orderFrontColorPanel:");
            selDisableRelaunchOnLoginHandle = Selector.GetHandle("disableRelaunchOnLogin");
            selEnableRelaunchOnLoginHandle = Selector.GetHandle("enableRelaunchOnLogin");
            selEnabledRemoteNotificationTypesHandle = Selector.GetHandle("enabledRemoteNotificationTypes");
            selRegisterForRemoteNotificationTypes_Handle = Selector.GetHandle("registerForRemoteNotificationTypes:");
            selUnregisterForRemoteNotificationsHandle = Selector.GetHandle("unregisterForRemoteNotifications");
            selRestoreWindowWithIdentifierStateCompletionHandler_Handle = Selector.GetHandle("restoreWindowWithIdentifier:state:completionHandler:");
            class_ptr = Class.GetHandle("NSApplication");
            RuntimeHelpers.RunClassConstructor(typeof(NSObject).TypeHandle);
            class_ptr = Class.GetHandle("NSApplication");
        }

        [DllImport("/System/Library/Frameworks/AppKit.framework/AppKit")]
        private static extern void NSApplicationMain(int argc, string[] argv);

        public static void Init()
        {
            if (initialized)
            {
                throw new InvalidOperationException("Init has already be be invoked; it can only be invoke once");
            }
            initialized = true;
            Assembly assembly = typeof(NSApplication).Assembly;
            Runtime.RegisterAssembly(assembly);
            AssemblyName name = assembly.GetName();
            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
            foreach (Assembly assembly2 in assemblies)
            {
                AssemblyName[] referencedAssemblies = assembly2.GetReferencedAssemblies();
                for (int j = 0; j < referencedAssemblies.Length; j++)
                {
                    if (AssemblyName.ReferenceMatchesDefinition(referencedAssemblies[j], name))
                    {
                        Runtime.RegisterAssembly(assembly2);
                        break;
                    }
                }
            }
            if (SynchronizationContext.Current == null)
            {
                SynchronizationContext.SetSynchronizationContext(new AppKitSynchronizationContext());
            }
            mainThread = Thread.CurrentThread;
        }

        public static void InitDrawingBridge()
        {
            FieldInfo field = Type.GetType("System.Drawing.GDIPlus, System.Drawing").GetField("UseCocoaDrawable", BindingFlags.Static | BindingFlags.Public);
            FieldInfo field2 = Type.GetType("System.Drawing.GDIPlus, System.Drawing").GetField("UseCarbonDrawable", BindingFlags.Static | BindingFlags.Public);
            field.SetValue(null, true);
            field2.SetValue(null, false);
        }

        public static void Main(string[] args)
        {
            if (SynchronizationContext.Current == null || !typeof(AppKitSynchronizationContext).IsAssignableFrom(SynchronizationContext.Current.GetType()))
            {
                SynchronizationContext.SetSynchronizationContext(new AppKitSynchronizationContext());
            }
            mainThread = Thread.CurrentThread;
            NSApplicationMain(args.Length, args);
        }

        public static void EnsureUIThread()
        {
            if (CheckForIllegalCrossThreadCalls && mainThread != Thread.CurrentThread)
            {
                throw new AppKitThreadAccessException();
            }
        }

        public NSEvent NextEvent(NSEventMask mask, NSDate expiration, string mode, bool deqFlag)
        {
            return NextEvent((uint)mask, expiration, mode, deqFlag);
        }

        public void DiscardEvents(NSEventMask mask, NSEvent lastEvent)
        {
            DiscardEvents((uint)mask, lastEvent);
        }

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

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

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

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

        [Export("unhideWithoutActivation")]
        public virtual void UnhideWithoutActivation()
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selUnhideWithoutActivationHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selUnhideWithoutActivationHandle);
            }
        }

        [Export("windowWithWindowNumber:")]
        public virtual NSWindow WindowWithWindowNumber(long windowNum)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                return (NSWindow)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_Int64(base.Handle, selWindowWithWindowNumber_Handle, windowNum));
            }
            return (NSWindow)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_Int64(base.SuperHandle, selWindowWithWindowNumber_Handle, windowNum));
        }

        [Export("deactivate")]
        public virtual void Deactivate()
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selDeactivateHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selDeactivateHandle);
            }
        }

        [Export("activateIgnoringOtherApps:")]
        public virtual void ActivateIgnoringOtherApps(bool flag)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_bool(base.Handle, selActivateIgnoringOtherApps_Handle, flag);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_bool(base.SuperHandle, selActivateIgnoringOtherApps_Handle, flag);
            }
        }

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

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

        [Export("finishLaunching")]
        public virtual void FinishLaunching()
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selFinishLaunchingHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selFinishLaunchingHandle);
            }
        }

        [Export("run")]
        public virtual void Run()
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selRunHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selRunHandle);
            }
        }

        [Export("runModalForWindow:")]
        public virtual long RunModalForWindow(NSWindow theWindow)
        {
            EnsureUIThread();
            if (theWindow == null)
            {
                throw new ArgumentNullException("theWindow");
            }
            if (IsDirectBinding)
            {
                return Messaging.Int64_objc_msgSend_IntPtr(base.Handle, selRunModalForWindow_Handle, theWindow.Handle);
            }
            return Messaging.Int64_objc_msgSendSuper_IntPtr(base.SuperHandle, selRunModalForWindow_Handle, theWindow.Handle);
        }

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

        [Export("stopModal")]
        public virtual void StopModal()
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selStopModalHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selStopModalHandle);
            }
        }

        [Export("stopModalWithCode:")]
        public virtual void StopModalWithCode(long returnCode)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_Int64(base.Handle, selStopModalWithCode_Handle, returnCode);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_Int64(base.SuperHandle, selStopModalWithCode_Handle, returnCode);
            }
        }

        [Export("abortModal")]
        [ThreadSafe]
        public virtual void AbortModal()
        {
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selAbortModalHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selAbortModalHandle);
            }
        }

        [Export("beginModalSessionForWindow:")]
        public virtual IntPtr BeginModalSession(NSWindow theWindow)
        {
            EnsureUIThread();
            if (theWindow == null)
            {
                throw new ArgumentNullException("theWindow");
            }
            if (IsDirectBinding)
            {
                return Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, selBeginModalSessionForWindow_Handle, theWindow.Handle);
            }
            return Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, selBeginModalSessionForWindow_Handle, theWindow.Handle);
        }

        [Export("runModalSession:")]
        public virtual long RunModalSession(IntPtr session)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                return Messaging.Int64_objc_msgSend_IntPtr(base.Handle, selRunModalSession_Handle, session);
            }
            return Messaging.Int64_objc_msgSendSuper_IntPtr(base.SuperHandle, selRunModalSession_Handle, session);
        }

        [Export("endModalSession:")]
        public virtual void EndModalSession(IntPtr session)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr(base.Handle, selEndModalSession_Handle, session);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selEndModalSession_Handle, session);
            }
        }

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

        [Export("requestUserAttention:")]
        public virtual long RequestUserAttention(NSRequestUserAttentionType requestType)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                return Messaging.Int64_objc_msgSend_UInt64(base.Handle, selRequestUserAttention_Handle, (ulong)requestType);
            }
            return Messaging.Int64_objc_msgSendSuper_UInt64(base.SuperHandle, selRequestUserAttention_Handle, (ulong)requestType);
        }

        [Export("cancelUserAttentionRequest:")]
        public virtual void CancelUserAttentionRequest(long request)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_Int64(base.Handle, selCancelUserAttentionRequest_Handle, request);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_Int64(base.SuperHandle, selCancelUserAttentionRequest_Handle, request);
            }
        }

        [Export("beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:")]
        public virtual void BeginSheet(NSWindow sheet, NSWindow docWindow, NSObject modalDelegate, Selector didEndSelector, IntPtr contextInfo)
        {
            EnsureUIThread();
            if (sheet == null)
            {
                throw new ArgumentNullException("sheet");
            }
            if (docWindow == null)
            {
                throw new ArgumentNullException("docWindow");
            }
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr(base.Handle, selBeginSheetModalForWindowModalDelegateDidEndSelectorContextInfo_Handle, sheet.Handle, docWindow.Handle, modalDelegate?.Handle ?? IntPtr.Zero, (didEndSelector == null) ? IntPtr.Zero : didEndSelector.Handle, contextInfo);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr(base.SuperHandle, selBeginSheetModalForWindowModalDelegateDidEndSelectorContextInfo_Handle, sheet.Handle, docWindow.Handle, modalDelegate?.Handle ?? IntPtr.Zero, (didEndSelector == null) ? IntPtr.Zero : didEndSelector.Handle, contextInfo);
            }
        }

        [Export("endSheet:")]
        public virtual void EndSheet(NSWindow sheet)
        {
            EnsureUIThread();
            if (sheet == null)
            {
                throw new ArgumentNullException("sheet");
            }
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr(base.Handle, selEndSheet_Handle, sheet.Handle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selEndSheet_Handle, sheet.Handle);
            }
        }

        [Export("endSheet:returnCode:")]
        public virtual void EndSheet(NSWindow sheet, long returnCode)
        {
            EnsureUIThread();
            if (sheet == null)
            {
                throw new ArgumentNullException("sheet");
            }
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr_Int64(base.Handle, selEndSheetReturnCode_Handle, sheet.Handle, returnCode);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr_Int64(base.SuperHandle, selEndSheetReturnCode_Handle, sheet.Handle, returnCode);
            }
        }

        [Export("nextEventMatchingMask:untilDate:inMode:dequeue:")]
        protected virtual NSEvent NextEvent(ulong mask, NSDate expiration, string mode, bool deqFlag)
        {
            EnsureUIThread();
            if (expiration == null)
            {
                throw new ArgumentNullException("expiration");
            }
            if (mode == null)
            {
                throw new ArgumentNullException("mode");
            }
            IntPtr intPtr = NSString.CreateNative(mode);
            NSEvent result = (!IsDirectBinding) ? ((NSEvent)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_UInt64_IntPtr_IntPtr_bool(base.SuperHandle, selNextEventMatchingMaskUntilDateInModeDequeue_Handle, mask, expiration.Handle, intPtr, deqFlag))) : ((NSEvent)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_UInt64_IntPtr_IntPtr_bool(base.Handle, selNextEventMatchingMaskUntilDateInModeDequeue_Handle, mask, expiration.Handle, intPtr, deqFlag)));
            NSString.ReleaseNative(intPtr);
            return result;
        }

        [Export("discardEventsMatchingMask:beforeEvent:")]
        protected virtual void DiscardEvents(ulong mask, NSEvent lastEvent)
        {
            EnsureUIThread();
            if (lastEvent == null)
            {
                throw new ArgumentNullException("lastEvent");
            }
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_UInt64_IntPtr(base.Handle, selDiscardEventsMatchingMaskBeforeEvent_Handle, mask, lastEvent.Handle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_UInt64_IntPtr(base.SuperHandle, selDiscardEventsMatchingMaskBeforeEvent_Handle, mask, lastEvent.Handle);
            }
        }

        [Export("postEvent:atStart:")]
        [ThreadSafe]
        public virtual void PostEvent(NSEvent theEvent, bool atStart)
        {
            if (theEvent == null)
            {
                throw new ArgumentNullException("theEvent");
            }
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr_bool(base.Handle, selPostEventAtStart_Handle, theEvent.Handle, atStart);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr_bool(base.SuperHandle, selPostEventAtStart_Handle, theEvent.Handle, atStart);
            }
        }

        [Export("sendEvent:")]
        public virtual void SendEvent(NSEvent theEvent)
        {
            EnsureUIThread();
            if (theEvent == null)
            {
                throw new ArgumentNullException("theEvent");
            }
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr(base.Handle, selSendEvent_Handle, theEvent.Handle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSendEvent_Handle, theEvent.Handle);
            }
        }

        [Export("preventWindowOrdering")]
        public virtual void PreventWindowOrdering()
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selPreventWindowOrderingHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selPreventWindowOrderingHandle);
            }
        }

        [Export("makeWindowsPerform:inOrder:")]
        public virtual NSWindow MakeWindowsPerform(Selector aSelector, bool inOrder)
        {
            EnsureUIThread();
            if (aSelector == null)
            {
                throw new ArgumentNullException("aSelector");
            }
            if (IsDirectBinding)
            {
                return (NSWindow)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr_bool(base.Handle, selMakeWindowsPerformInOrder_Handle, aSelector.Handle, inOrder));
            }
            return (NSWindow)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_IntPtr_bool(base.SuperHandle, selMakeWindowsPerformInOrder_Handle, aSelector.Handle, inOrder));
        }

        [Export("setWindowsNeedUpdate:")]
        public virtual void SetWindowsNeedUpdate(bool needUpdate)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_bool(base.Handle, selSetWindowsNeedUpdate_Handle, needUpdate);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_bool(base.SuperHandle, selSetWindowsNeedUpdate_Handle, needUpdate);
            }
        }

        [Export("updateWindows")]
        public virtual void UpdateWindows()
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selUpdateWindowsHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selUpdateWindowsHandle);
            }
        }

        [Export("setMainMenu:")]
        [Obsolete("Use MainMenu property", false)]
        public virtual void SetMainMenu(NSMenu aMenu)
        {
            EnsureUIThread();
            if (aMenu == null)
            {
                throw new ArgumentNullException("aMenu");
            }
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetMainMenu_Handle, aMenu.Handle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetMainMenu_Handle, aMenu.Handle);
            }
        }

        [Export("activationPolicy")]
        protected virtual NSApplicationActivationPolicy GetActivationPolicy()
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                return (NSApplicationActivationPolicy)Messaging.Int64_objc_msgSend(base.Handle, selActivationPolicyHandle);
            }
            return (NSApplicationActivationPolicy)Messaging.Int64_objc_msgSendSuper(base.SuperHandle, selActivationPolicyHandle);
        }

        [Export("setActivationPolicy:")]
        protected virtual bool SetActivationPolicy(NSApplicationActivationPolicy activationPolicy)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                return Messaging.bool_objc_msgSend_Int64(base.Handle, selSetActivationPolicy_Handle, (long)activationPolicy);
            }
            return Messaging.bool_objc_msgSendSuper_Int64(base.SuperHandle, selSetActivationPolicy_Handle, (long)activationPolicy);
        }

        [Export("sendAction:to:from:")]
        public virtual bool SendAction(Selector theAction, NSObject theTarget, NSObject sender)
        {
            EnsureUIThread();
            if (theAction == null)
            {
                throw new ArgumentNullException("theAction");
            }
            if (theTarget == null)
            {
                throw new ArgumentNullException("theTarget");
            }
            if (sender == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (IsDirectBinding)
            {
                return Messaging.bool_objc_msgSend_IntPtr_IntPtr_IntPtr(base.Handle, selSendActionToFrom_Handle, theAction.Handle, theTarget.Handle, sender.Handle);
            }
            return Messaging.bool_objc_msgSendSuper_IntPtr_IntPtr_IntPtr(base.SuperHandle, selSendActionToFrom_Handle, theAction.Handle, theTarget.Handle, sender.Handle);
        }

        [Export("targetForAction:")]
        public virtual NSObject TargetForAction(Selector theAction)
        {
            EnsureUIThread();
            if (theAction == null)
            {
                throw new ArgumentNullException("theAction");
            }
            if (IsDirectBinding)
            {
                return Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, selTargetForAction_Handle, theAction.Handle));
            }
            return Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, selTargetForAction_Handle, theAction.Handle));
        }

        [Export("targetForAction:to:from:")]
        public virtual NSObject TargetForAction(Selector theAction, NSObject theTarget, NSObject sender)
        {
            EnsureUIThread();
            if (theAction == null)
            {
                throw new ArgumentNullException("theAction");
            }
            if (theTarget == null)
            {
                throw new ArgumentNullException("theTarget");
            }
            if (sender == null)
            {
                throw new ArgumentNullException("sender");
            }
            if (IsDirectBinding)
            {
                return Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr_IntPtr(base.Handle, selTargetForActionToFrom_Handle, theAction.Handle, theTarget.Handle, sender.Handle));
            }
            return Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_IntPtr_IntPtr_IntPtr(base.SuperHandle, selTargetForActionToFrom_Handle, theAction.Handle, theTarget.Handle, sender.Handle));
        }

        [Export("tryToPerform:with:")]
        public virtual bool TryToPerform(Selector anAction, NSObject target)
        {
            EnsureUIThread();
            if (anAction == null)
            {
                throw new ArgumentNullException("anAction");
            }
            if (target == null)
            {
                throw new ArgumentNullException("target");
            }
            if (IsDirectBinding)
            {
                return Messaging.bool_objc_msgSend_IntPtr_IntPtr(base.Handle, selTryToPerformWith_Handle, anAction.Handle, target.Handle);
            }
            return Messaging.bool_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, selTryToPerformWith_Handle, anAction.Handle, target.Handle);
        }

        [Export("validRequestorForSendType:returnType:")]
        public virtual NSObject ValidRequestor(string sendType, string returnType)
        {
            EnsureUIThread();
            if (sendType == null)
            {
                throw new ArgumentNullException("sendType");
            }
            if (returnType == null)
            {
                throw new ArgumentNullException("returnType");
            }
            IntPtr intPtr = NSString.CreateNative(sendType);
            IntPtr intPtr2 = NSString.CreateNative(returnType);
            NSObject result = (!IsDirectBinding) ? Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, selValidRequestorForSendTypeReturnType_Handle, intPtr, intPtr2)) : Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr(base.Handle, selValidRequestorForSendTypeReturnType_Handle, intPtr, intPtr2));
            NSString.ReleaseNative(intPtr);
            NSString.ReleaseNative(intPtr2);
            return result;
        }

        [Export("reportException:")]
        public virtual void ReportException(NSException theException)
        {
            EnsureUIThread();
            if (theException == null)
            {
                throw new ArgumentNullException("theException");
            }
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr(base.Handle, selReportException_Handle, theException.Handle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selReportException_Handle, theException.Handle);
            }
        }

        [Export("detachDrawingThread:toTarget:withObject:")]
        public static void DetachDrawingThread(Selector selector, NSObject target, NSObject argument)
        {
            EnsureUIThread();
            if (selector == null)
            {
                throw new ArgumentNullException("selector");
            }
            if (target == null)
            {
                throw new ArgumentNullException("target");
            }
            if (argument == null)
            {
                throw new ArgumentNullException("argument");
            }
            Messaging.void_objc_msgSend_IntPtr_IntPtr_IntPtr(class_ptr, selDetachDrawingThreadToTargetWithObject_Handle, selector.Handle, target.Handle, argument.Handle);
        }

        [Export("replyToApplicationShouldTerminate:")]
        public virtual void ReplyToApplicationShouldTerminate(bool shouldTerminate)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_bool(base.Handle, selReplyToApplicationShouldTerminate_Handle, shouldTerminate);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_bool(base.SuperHandle, selReplyToApplicationShouldTerminate_Handle, shouldTerminate);
            }
        }

        [Export("replyToOpenOrPrint:")]
        public virtual void ReplyToOpenOrPrint(NSApplicationDelegateReply reply)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_UInt64(base.Handle, selReplyToOpenOrPrint_Handle, (ulong)reply);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_UInt64(base.SuperHandle, selReplyToOpenOrPrint_Handle, (ulong)reply);
            }
        }

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

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

        [Export("removeWindowsItem:")]
        public virtual void RemoveWindowsItem(NSWindow win)
        {
            EnsureUIThread();
            if (win == null)
            {
                throw new ArgumentNullException("win");
            }
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr(base.Handle, selRemoveWindowsItem_Handle, win.Handle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selRemoveWindowsItem_Handle, win.Handle);
            }
        }

        [Export("addWindowsItem:title:filename:")]
        public virtual void AddWindowsItem(NSWindow win, string title, bool isFilename)
        {
            EnsureUIThread();
            if (win == null)
            {
                throw new ArgumentNullException("win");
            }
            if (title == null)
            {
                throw new ArgumentNullException("title");
            }
            IntPtr intPtr = NSString.CreateNative(title);
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr_IntPtr_bool(base.Handle, selAddWindowsItemTitleFilename_Handle, win.Handle, intPtr, isFilename);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr_IntPtr_bool(base.SuperHandle, selAddWindowsItemTitleFilename_Handle, win.Handle, intPtr, isFilename);
            }
            NSString.ReleaseNative(intPtr);
        }

        [Export("changeWindowsItem:title:filename:")]
        public virtual void ChangeWindowsItem(NSWindow win, string title, bool isFilename)
        {
            EnsureUIThread();
            if (win == null)
            {
                throw new ArgumentNullException("win");
            }
            if (title == null)
            {
                throw new ArgumentNullException("title");
            }
            IntPtr intPtr = NSString.CreateNative(title);
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr_IntPtr_bool(base.Handle, selChangeWindowsItemTitleFilename_Handle, win.Handle, intPtr, isFilename);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr_IntPtr_bool(base.SuperHandle, selChangeWindowsItemTitleFilename_Handle, win.Handle, intPtr, isFilename);
            }
            NSString.ReleaseNative(intPtr);
        }

        [Export("updateWindowsItem:")]
        public virtual void UpdateWindowsItem(NSWindow win)
        {
            EnsureUIThread();
            if (win == null)
            {
                throw new ArgumentNullException("win");
            }
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_IntPtr(base.Handle, selUpdateWindowsItem_Handle, win.Handle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selUpdateWindowsItem_Handle, win.Handle);
            }
        }

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

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

        [Export("disableRelaunchOnLogin")]
        [ThreadSafe]
        public virtual void DisableRelaunchOnLogin()
        {
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selDisableRelaunchOnLoginHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selDisableRelaunchOnLoginHandle);
            }
        }

        [Export("enableRelaunchOnLogin")]
        [ThreadSafe]
        public virtual void EnableRelaunchOnLogin()
        {
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selEnableRelaunchOnLoginHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selEnableRelaunchOnLoginHandle);
            }
        }

        [Export("enabledRemoteNotificationTypes")]
        public virtual NSRemoteNotificationType EnabledRemoteNotificationTypes()
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                return (NSRemoteNotificationType)Messaging.UInt64_objc_msgSend(base.Handle, selEnabledRemoteNotificationTypesHandle);
            }
            return (NSRemoteNotificationType)Messaging.UInt64_objc_msgSendSuper(base.SuperHandle, selEnabledRemoteNotificationTypesHandle);
        }

        [Export("registerForRemoteNotificationTypes:")]
        public virtual void RegisterForRemoteNotificationTypes(NSRemoteNotificationType types)
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend_UInt64(base.Handle, selRegisterForRemoteNotificationTypes_Handle, (ulong)types);
            }
            else
            {
                Messaging.void_objc_msgSendSuper_UInt64(base.SuperHandle, selRegisterForRemoteNotificationTypes_Handle, (ulong)types);
            }
        }

        [Export("unregisterForRemoteNotifications")]
        public virtual void UnregisterForRemoteNotifications()
        {
            EnsureUIThread();
            if (IsDirectBinding)
            {
                Messaging.void_objc_msgSend(base.Handle, selUnregisterForRemoteNotificationsHandle);
            }
            else
            {
                Messaging.void_objc_msgSendSuper(base.SuperHandle, selUnregisterForRemoteNotificationsHandle);
            }
        }

        [Export("restoreWindowWithIdentifier:state:completionHandler:")]
        public unsafe static void RestoreWindow(string identifier, NSCoder state, NSWindowCompletionHandler onCompletion)
        {
            EnsureUIThread();
            if (identifier == null)
            {
                throw new ArgumentNullException("identifier");
            }
            if (state == null)
            {
                throw new ArgumentNullException("state");
            }
            if (onCompletion == null)
            {
                throw new ArgumentNullException("onCompletion");
            }
            IntPtr intPtr = NSString.CreateNative(identifier);
            BlockLiteral blockLiteral = default(BlockLiteral);
            BlockLiteral* ptr = &blockLiteral;
            blockLiteral.SetupBlock(Trampolines.SDNSWindowCompletionHandler.Handler, onCompletion);
            Messaging.void_objc_msgSend_IntPtr_IntPtr_IntPtr(class_ptr, selRestoreWindowWithIdentifierStateCompletionHandler_Handle, intPtr, state.Handle, (IntPtr)(void*)ptr);
            NSString.ReleaseNative(intPtr);
            ptr->CleanupBlock();
        }

        private _NSApplicationDelegate EnsureNSApplicationDelegate()
        {
            NSObject nSObject = WeakDelegate;
            if (nSObject == null || !(nSObject is _NSApplicationDelegate))
            {
                nSObject = (WeakDelegate = new _NSApplicationDelegate());
            }
            return (_NSApplicationDelegate)nSObject;
        }

        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            if (base.Handle == IntPtr.Zero)
            {
                __mt_WeakDelegate_var = null;
                __mt_Context_var = null;
                __mt_MainWindow_var = null;
                __mt_KeyWindow_var = null;
                __mt_ModalWindow_var = null;
                __mt_CurrentEvent_var = null;
                __mt_Windows_var = null;
                __mt_MainMenu_var = null;
                __mt_HelpMenu_var = null;
                __mt_ApplicationIconImage_var = null;
                __mt_DockTile_var = null;
                __mt_WindowsMenu_var = null;
                __mt_ServicesProvider_var = null;
                __mt_ServicesMenu_var = null;
            }
        }
    }
}
