Пример #1
0
        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType != typeof(string))
            {
                throw new NotSupportedException();
            }

            if (!(value is MultiKeyGesture gesture))
            {
                throw new InvalidCastException();
            }

            var sb = new StringBuilder();

            if (!gesture.IsRealMultiKeyGesture)
            {
                if (gesture.Modifiers == ModifierKeys.None)
                {
                    return(KeyboardLocalizationUtilities.GetKeyCultureName(gesture.Key, culture));
                }
                return(KeyboardLocalizationUtilities.GetCultureModifiersName(gesture.Modifiers, culture) + "+" +
                       KeyboardLocalizationUtilities.GetKeyCultureName(gesture.Key, culture));
            }


            foreach (var i in gesture.GestureCollection)
            {
                sb.Append($"{i}, ");
            }

            sb.Remove(sb.Length - 2, 2);

            return(sb.ToString());
        }
Пример #2
0
 private static Key KeyFromString(string keyString, CultureInfo culture)
 {
     if (string.IsNullOrEmpty(keyString))
     {
         return(Key.None);
     }
     return(KeyboardLocalizationUtilities.CultureStringToKey(keyString.ToLower(), culture));
 }
Пример #3
0
        private static ModifierKeys ModifiersFromString(string modifierString, CultureInfo culture)
        {
            if (string.IsNullOrEmpty(modifierString))
            {
                return(ModifierKeys.None);
            }
            var modifiers = modifierString.Split('+');

            return(modifiers.Aggregate(ModifierKeys.None,
                                       (current, modifier) =>
                                       current | KeyboardLocalizationUtilities.SingleStringToModifierKey(modifier, culture)));
        }
Пример #4
0
        public override string ToString()
        {
            var builder      = new StringBuilder();
            var modifierName = KeyboardLocalizationUtilities.GetCultureModifiersName(Modifiers);


            if (Modifiers != ModifierKeys.None)
            {
                builder.Append($"{modifierName}+");
            }

            builder.Append(KeyboardLocalizationUtilities.GetKeyCultureName(Key));
            return(builder.ToString());
        }
Пример #5
0
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if (!(value is string input))
            {
                throw new InvalidCastException("Only strings can be converted to a MultiKeyGesture");
            }
            input = input.Trim();
            if (string.IsNullOrEmpty(input))
            {
                return(new MultiKeyGesture(Key.None));
            }

            var keyStrokes = input.Split(',');

            //Since ',' is a valid KeyGesture char we need to re-add it if it was lost by the split() operation
            for (int i = 1; i < keyStrokes.Length; i++)
            {
                if (string.IsNullOrEmpty(keyStrokes[i]))
                {
                    keyStrokes[i - 1] += ",";
                }
            }

            //Remove any possible gaps in the array
            var rawSequences = keyStrokes.Where(x => !string.IsNullOrEmpty(x)).ToList();
            var sequences    = new List <KeySequence>();

            foreach (var sequence in rawSequences)
            {
                var    lastDelimiterIndex = sequence.LastIndexOf('+');
                string modifierString     = string.Empty;
                string keyString;

                if (lastDelimiterIndex >= 0)
                {
                    if (lastDelimiterIndex == sequence.Length - 1)
                    {
                        if (sequence.Contains(KeyboardLocalizationUtilities.GetKeyCultureName(Key.OemPlus)))
                        {
                            lastDelimiterIndex = sequence.LastIndexOf('+', lastDelimiterIndex - 1);
                        }
                        else
                        {
                            lastDelimiterIndex--;
                        }
                    }
                    modifierString = sequence.Substring(0, lastDelimiterIndex).Trim();
                    keyString      = sequence.Substring(lastDelimiterIndex + 1).Trim();
                }
                else
                {
                    keyString = sequence;
                }

                var modifiers = ModifiersFromString(modifierString, culture);
                var key       = KeyFromString(keyString, culture);
                sequences.Add(new KeySequence(modifiers, key));
            }
            if (sequences.Count == 1)
            {
                return(new MultiKeyGesture(sequences[0].Key, sequences[0].Modifiers));
            }
            return(new MultiKeyGesture(sequences));
        }