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()); }
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()); }
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)); }