public bool ShortcutValidator(SRValidator aValidator, ushort aKeyCode, NSEventModifierMask aFlags, out string outReason)
        {
            outReason = string.Empty;

            var recorder = View.Window.FirstResponder as SRRecorderControl;

            if (recorder == null)
            {
                return(false);
            }

            var shortcut = CFunctions.SRShortcutWithCocoaModifierFlagsAndKeyCode(aFlags, aKeyCode);

            if (IsTaken(pingShortcutRecorder, shortcut) ||
                IsTaken(globalPingShortcutRecorder, shortcut) ||
                IsTaken(pingItemShortcutRecorder, shortcut))
            {
                outReason = "it's already used. To use this shortcut, first remove or change the other shortcut";
                return(true);
            }
            else
            {
                return(false);
            }
        }
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            // ensure we can safely change shortcuts without executing other bound actions
            UnbindGlobalShortcuts();

            Level = NSWindowLevel.ModalPanel;
            NSWindow.Notifications.ObserveWillClose(OnClose);

            _settings = new Settings();

            // setup shortcut recorders
            _validator       = new SRValidator(this);
            _controlDelegate = new ShortcutRecorderDelegate(_validator, x => PresentError(x));

            WdgRecorderScanSelect.Delegate = _controlDelegate;
            WdgRecorderScanClick.Delegate  = _controlDelegate;

            var defaults = NSUserDefaultsController.SharedUserDefaultsController;

            WdgRecorderScanSelect.Bind(ShortcutRecorder.Constants.NSValueBinding, defaults, Constants.KEY_HOTKEY_SCAN_SELECT, null);
            WdgRecorderScanClick.Bind(ShortcutRecorder.Constants.NSValueBinding, defaults, Constants.KEY_HOTKEY_SCAN_CLICK, null);

            // setup settings
            BtnResultsClipboard.State          = _settings.ShouldOutputScanResultsToClipboard ? NSCellStateValue.On : NSCellStateValue.Off;
            BtnResultsNotificationCenter.State = _settings.ShouldOutputScanResultsToNotificationCenter ? NSCellStateValue.On : NSCellStateValue.Off;

            _btnResultsClipboardObserver          = BtnResultsClipboard.AddObserver(Constants.KEY_CHECKBOX_CHANGED, NSKeyValueObservingOptions.Initial, OnCheckboxChanged);
            _btnResultsNotificationCenterObserver = BtnResultsNotificationCenter.AddObserver(Constants.KEY_CHECKBOX_CHANGED, NSKeyValueObservingOptions.Initial, OnCheckboxChanged);
        }
        public override void AwakeFromNib()
        {
            base.AwakeFromNib();

            _validator       = new SRValidator(this);
            _controlDelegate = new MySRRecorderControlDelegate(_validator, x => PresentError(x));

            pingButton.Activated += PingButton_Activated;

            pingButton.BindHotKey(NSUserDefaultsController.SharedUserDefaultsController, "values.ping");

            pingShortcutRecorder.Delegate       = _controlDelegate;
            globalPingShortcutRecorder.Delegate = _controlDelegate;
            pingItemShortcutRecorder.Delegate   = _controlDelegate;

            var defaults = NSUserDefaultsController.SharedUserDefaultsController;

            pingShortcutRecorder.Bind(Constants.NSValueBinding, defaults, "values.ping", null);
            pingShortcutRecorder.Bind(Constants.NSEnabledBinding, defaults, "values.isPingItemEnabled", null);

            pingShortcutRecorder.SetAllowedModifierFlags(
                newAllowedModifierFlags: NSEventModifierMask.ShiftKeyMask | NSEventModifierMask.AlternateKeyMask | NSEventModifierMask.CommandKeyMask,
                newRequiredModifierFlags: (NSEventModifierMask)0,
                newAllowsEmptyModifierFlags: true);

            globalPingShortcutRecorder.Bind(Constants.NSValueBinding, defaults, "values.globalPing", null);
            pingItemShortcutRecorder.Bind(Constants.NSValueBinding, defaults, "values.pingItem", null);

            defaults.AddObserver(this, "values.globalPing", NSKeyValueObservingOptions.Initial, IntPtr.Zero);
        }
        public bool ShortcutValidator(SRValidator aValidator, ushort aKeyCode, NSEventModifierMask aFlags, out string outReason)
        {
            outReason = string.Empty;

            if (!(FirstResponder is SRRecorderControl recorder))
            {
                return(false);
            }

            var shortcut = CFunctions.SRShortcutWithCocoaModifierFlagsAndKeyCode(aFlags, aKeyCode);

            if (IsTaken(WdgRecorderScanSelect, shortcut) ||
                IsTaken(WdgRecorderScanClick, shortcut))
            {
                outReason = "it's already used. To use this shortcut, first remove or change the other shortcut";
                return(true);
            }

            return(false);
        }
 public bool ShortcutValidatorShouldCheckMenu(SRValidator aValidator)
 {
     return(true);
 }
 public bool ShortcutValidatorShouldUseASCIIStringForKeyCodes(SRValidator aValidator)
 {
     return(false);
 }
 public bool ShortcutValidatorShouldCheckSystemShortcuts(SRValidator aValidator)
 {
     return(false);
 }
 public MySRRecorderControlDelegate(SRValidator validator, Action <NSError> onError)
 {
     _validator = validator;
     _onError   = onError;
 }
 public ShortcutRecorderDelegate(SRValidator validator, Action <NSError> onError)
 {
     _validator = validator;
     _onError   = onError;
 }