Пример #1
0
        public void ChangeKeyModifiers_WontChangeChar()
        {
            var ki  = KeyInputUtil.VimKeyToKeyInput(VimKey.OpenBracket);
            var ki2 = KeyInputUtil.ChangeKeyModifiers(ki, KeyModifiers.Shift);

            Assert.AreEqual(ki.Char, ki2.Char);
        }
Пример #2
0
        /// <summary>
        /// Run the KeyInput directly in the Wpf control
        /// </summary>
        private void RunInWpf(KeyInput keyInput)
        {
            Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add(typeof(UIPermissionAttribute));
            var presentationSource = _factory.Create <PresentationSource>();

            // Normalize upper case letters here to lower and add the shift key modifier if
            // necessary
            if (Char.IsUpper(keyInput.Char))
            {
                var lowerKeyInput = KeyInputUtil.CharToKeyInput(Char.ToLower(keyInput.Char));
                keyInput = KeyInputUtil.ChangeKeyModifiers(lowerKeyInput, keyInput.KeyModifiers | KeyModifiers.Shift);
            }

            Key key;

            if (!KeyUtil.TryConvertToKeyOnly(keyInput.Key, out key))
            {
                throw new Exception("Couldn't get the WPF key for the given KeyInput");
            }

            // Update the KeyModifiers while this is being processed by our key processor
            try
            {
                _defaultKeyboardDevice.DownKeyModifiers = keyInput.KeyModifiers;

                // First raise the KeyDown event
                var keyDownEventArgs = new KeyEventArgs(
                    _defaultKeyboardDevice,
                    presentationSource.Object,
                    0,
                    key);
                keyDownEventArgs.RoutedEvent = UIElement.KeyDownEvent;
                _defaultInputController.HandleKeyDown(this, keyDownEventArgs);

                // If the event is handled then return
                if (keyDownEventArgs.Handled)
                {
                    return;
                }

                // Now raise the TextInput event
                var textInputEventArgs = new TextCompositionEventArgs(
                    _defaultKeyboardDevice,
                    new TextComposition(InputManager.Current, _wpfTextView.VisualElement, keyInput.Char.ToString()));
                textInputEventArgs.RoutedEvent = UIElement.TextInputEvent;
                _defaultInputController.HandleTextInput(this, textInputEventArgs);

                var keyUpEventArgs = new KeyEventArgs(
                    _defaultKeyboardDevice,
                    presentationSource.Object,
                    0,
                    key);
                keyUpEventArgs.RoutedEvent = UIElement.KeyUpEvent;
                _defaultInputController.HandleKeyUp(this, keyUpEventArgs);
            }
            finally
            {
                _defaultKeyboardDevice.DownKeyModifiers = KeyModifiers.None;
            }
        }
Пример #3
0
        /// <summary>
        /// Try and get the KeyInput which corresponds to the given Key and modifiers
        /// TODO: really think about this method
        /// </summary>
        internal bool TryGetKeyInput(Key key, ModifierKeys modifierKeys, out KeyInput keyInput)
        {
            // First just check and see if there is a direct mapping
            var keyType = new KeyType(key, modifierKeys);

            if (_keyTypeToKeyInputMap.TryGetValue(keyType, out keyInput))
            {
                return(true);
            }

            // Next consider only the shift key part of the requested modifier.  We can
            // re-apply the original modifiers later
            keyType = new KeyType(key, modifierKeys & ModifierKeys.Shift);
            if (_keyTypeToKeyInputMap.TryGetValue(keyType, out keyInput))
            {
                // Reapply the modifiers
                keyInput = KeyInputUtil.ChangeKeyModifiers(keyInput, ConvertToKeyModifiers(modifierKeys));
                return(true);
            }

            // Last consider it without any modifiers and reapply
            keyType = new KeyType(key, ModifierKeys.None);
            if (_keyTypeToKeyInputMap.TryGetValue(keyType, out keyInput))
            {
                // Reapply the modifiers
                keyInput = KeyInputUtil.ChangeKeyModifiers(keyInput, ConvertToKeyModifiers(modifierKeys));
                return(true);
            }

            return(false);
        }
Пример #4
0
        public void CompareSemantics()
        {
            var allKeyInputs = Enumerable.Concat(KeyInputUtil.VimKeyInputList, KeyInputUtil.AlternateKeyInputList);
            var all          = allKeyInputs.SelectMany(x => new[] {
                x,
                KeyInputUtil.ChangeKeyModifiers(x, KeyModifiers.Control),
                KeyInputUtil.ChangeKeyModifiers(x, KeyModifiers.Shift),
                KeyInputUtil.ChangeKeyModifiers(x, KeyModifiers.Alt)
            });

            foreach (var left in all)
            {
                foreach (var right in all)
                {
                    var altLeft  = left.GetAlternate();
                    var altRight = right.GetAlternate();
                    var result1  = left.CompareTo(right);
                    var result2  = right.CompareTo(left);
                    if (result1 == result2)
                    {
                        Assert.AreEqual(0, result1);
                        Assert.AreEqual(left.GetHashCode(), right.GetHashCode());
                        if (altLeft.IsSome())
                        {
                            Assert.AreEqual(0, altLeft.Value.CompareTo(right));
                        }
                        if (altRight.IsSome())
                        {
                            Assert.AreEqual(0, left.CompareTo(altRight.Value));
                        }
                    }
                    else if (result1 < 0)
                    {
                        Assert.IsTrue(result2 > 0);
                        if (altLeft.IsSome())
                        {
                            Assert.IsTrue(altLeft.Value.CompareTo(right) < 0);
                            Assert.IsTrue(right.CompareTo(altLeft.Value) > 0);
                        }
                    }
                    else if (result2 < 0)
                    {
                        Assert.IsTrue(result1 > 0);
                        if (altLeft.IsSome())
                        {
                            Assert.IsTrue(altLeft.Value.CompareTo(right) > 0);
                            Assert.IsTrue(right.CompareTo(altLeft.Value) < 0);
                        }
                    }
                    else
                    {
                        Assert.Fail();
                    }
                }
            }
        }
Пример #5
0
 public void ChangeKeyModifiers_RemoveShiftWontLowerAlpha()
 {
     foreach (var letter in CharsLettersLower)
     {
         var lower        = KeyInputUtil.CharToKeyInput(letter);
         var upper        = KeyInputUtil.CharToKeyInput(Char.ToUpper(letter));
         var upperNoShift = KeyInputUtil.ChangeKeyModifiers(upper, KeyModifiers.None);
         Assert.AreNotEqual(lower, upperNoShift);
     }
 }
Пример #6
0
 public void ChangeKeyModifiers_ShiftWontChangeAlpha()
 {
     foreach (var letter in CharsLettersLower)
     {
         var lower          = KeyInputUtil.CharToKeyInput(letter);
         var upper          = KeyInputUtil.CharToKeyInput(Char.ToUpper(letter));
         var lowerWithShift = KeyInputUtil.ChangeKeyModifiers(lower, KeyModifiers.Shift);
         Assert.AreNotEqual(lowerWithShift, upper);
     }
 }
Пример #7
0
        public void StringToKeyInput8()
        {
            var ki = KeyInputUtil.VimKeyToKeyInput(VimKey.Space);

            ki = KeyInputUtil.ChangeKeyModifiers(ki, KeyModifiers.Shift);
            var all = new string[] { "<S-space>", "<S-SPACE>" };

            foreach (var cur in all)
            {
                Assert.AreEqual(ki, KeyNotationUtil.StringToKeyInput(cur));
            }
        }
Пример #8
0
        public void Equality_AlternatesNotEquivalentWhenModifierPresent()
        {
            Action <KeyInput, KeyInput> func = (left, right) =>
            {
                Assert.AreNotEqual(KeyInputUtil.ChangeKeyModifiers(left, KeyModifiers.Control), right);
                Assert.AreNotEqual(KeyInputUtil.ChangeKeyModifiers(left, KeyModifiers.Alt), right);
                Assert.AreNotEqual(KeyInputUtil.ChangeKeyModifiers(left, KeyModifiers.Shift), right);
            };

            foreach (var cur in KeyInputUtil.AlternateKeyInputPairList)
            {
                func(cur.Item1, cur.Item2);
            }
        }
Пример #9
0
        /// <summary>
        /// Try and get the KeyInput for the specified char and ModifierKeys.  This will
        /// check and see if this is a well known char.  Many well known chars are expected
        /// to come with certain modifiers (for instance on US keyboard # is expected to
        /// have Shift applied).  These will be removed from the ModifierKeys passed in and
        /// whatever is left will be applied to the resulting KeyInput.
        /// </summary>
        internal KeyInput GetKeyInput(char c, ModifierKeys modifierKeys)
        {
            var          keyInput = KeyInputUtil.CharToKeyInput(c);
            ModifierKeys expected;

            if (_charToModifierMap.TryGetValue(c, out expected))
            {
                modifierKeys &= ~expected;
            }

            if (modifierKeys != ModifierKeys.None)
            {
                var keyModifiers = ConvertToKeyModifiers(modifierKeys);
                keyInput = KeyInputUtil.ChangeKeyModifiers(keyInput, keyModifiers);
            }

            return(keyInput);
        }