Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Core / CSharp / System / Windows / Input / Command / KeyGesture.cs / 1 / KeyGesture.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: The KeyGesture class is used by the developer to create Keyboard Input Bindings
//
// See spec at : http://avalon/coreUI/Specs/Commanding%20--%20design.htm
//
//* KeyGesture class serves the purpose of Input Bindings for Keyboard Device.
//* one will be passing the instance of this around with CommandLink to represent Accelerator Keys
//
// History:
// 06/01/2003 : chandras - Created
//
//---------------------------------------------------------------------------
using System;
using System.Globalization;
using System.Windows.Input;
using System.Windows;
using System.Windows.Markup;
using System.ComponentModel;
using MS.Internal.PresentationCore;
namespace System.Windows.Input
{
///
/// KeyGesture - Key and Modifier combination.
/// Can be set on properties of KeyBinding and RoutedCommand.
///
[TypeConverter(typeof(KeyGestureConverter))]
[ValueSerializer(typeof(KeyGestureValueSerializer))]
public class KeyGesture : InputGesture
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
///
/// constructor
///
/// key
public KeyGesture(Key key)
: this(key, ModifierKeys.None)
{
}
///
/// constructor
///
/// modifiers
/// key
public KeyGesture(Key key, ModifierKeys modifiers)
: this(key, modifiers, String.Empty, true)
{
}
///
/// constructor
///
/// modifiers
/// key
/// display string
public KeyGesture(Key key, ModifierKeys modifiers, string displayString)
: this(key, modifiers, displayString, true)
{
}
///
/// Internal constructor used by KeyBinding to avoid key and modifier validation
/// This allows setting KeyBinding.Key and KeyBinding.Modifiers without regard
/// to order.
///
/// Key
/// Modifiers
/// If true, throws an exception if the key and modifier are not valid
internal KeyGesture(Key key, ModifierKeys modifiers, bool validateGesture)
: this(key, modifiers, String.Empty, validateGesture)
{
}
///
/// Private constructor that does the real work.
///
/// Key
/// Modifiers
/// display string
/// If true, throws an exception if the key and modifier are not valid
private KeyGesture(Key key, ModifierKeys modifiers, string displayString, bool validateGesture)
{
if(!ModifierKeysConverter.IsDefinedModifierKeys(modifiers))
throw new InvalidEnumArgumentException("modifiers", (int)modifiers, typeof(ModifierKeys));
if(!IsDefinedKey(key))
throw new InvalidEnumArgumentException("key", (int)key, typeof(Key));
if (displayString == null)
throw new ArgumentNullException("displayString");
if(validateGesture && !IsValid(key, modifiers))
{
throw new NotSupportedException(SR.Get(SRID.KeyGesture_Invalid, modifiers, key));
}
_modifiers = modifiers;
_key = key;
_displayString = displayString;
}
#endregion Constructors
//------------------------------------------------------
//
// Public Methods
//
//-----------------------------------------------------
#region Public Methods
///
/// Modifier
///
public ModifierKeys Modifiers
{
get
{
return _modifiers;
}
}
///
/// Key
///
public Key Key
{
get
{
return _key;
}
}
///
/// DisplayString
///
public string DisplayString
{
get
{
return _displayString;
}
}
///
/// Returns a string that can be used to display the KeyGesture. If the
/// DisplayString was set by the constructor, it is returned. Otherwise
/// a suitable string is created from the Key and Modifiers, with any
/// conversions being governed by the given CultureInfo.
///
/// the culture used when creating a string from Key and Modifiers
public string GetDisplayStringForCulture(CultureInfo culture)
{
// return the DisplayString, if it was set by the ctor
if (!String.IsNullOrEmpty(_displayString))
{
return _displayString;
}
// otherwise use the type converter
return (string)_keyGestureConverter.ConvertTo(null, culture, this, typeof(string));
}
///
/// Compares InputEventArgs with current Input
///
/// the element to receive the command
/// inputEventArgs to compare to
/// True - KeyGesture matches, false otherwise.
///
public override bool Matches(object targetElement, InputEventArgs inputEventArgs)
{
KeyEventArgs keyEventArgs = inputEventArgs as KeyEventArgs;
if(keyEventArgs != null && IsDefinedKey(keyEventArgs.Key))
{
return ( ( (int)Key == (int)keyEventArgs.RealKey ) && ( this.Modifiers == Keyboard.Modifiers ) );
}
return false;
}
// Check for Valid enum, as any int can be casted to the enum.
internal static bool IsDefinedKey(Key key)
{
return (key >= Key.None && key <= Key.OemClear);
}
#endregion Public Methods
//------------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
///
/// Is Valid Keyboard input to process for commands
///
internal static bool IsValid(Key key, ModifierKeys modifiers)
{
//
// Don't enforce any rules on the Function keys or on the number pad keys.
//
if(!( ( key >= Key.F1 && key <= Key.F24 ) || ( key >= Key.NumPad0 && key <= Key.Divide ) ))
{
//
// We check whether Control/Alt/Windows key is down for modifiers. We don't check
// for shift at this time as Shift with any combination is already covered in above check.
// Shift alone as modifier case, we defer to the next condition to avoid conflicing with
// TextInput.
if(( modifiers & ( ModifierKeys.Control | ModifierKeys.Alt | ModifierKeys.Windows ) ) != 0)
{
switch(key)
{
case Key.LeftCtrl:
case Key.RightCtrl:
case Key.LeftAlt:
case Key.RightAlt:
case Key.LWin:
case Key.RWin:
return false;
default:
return true;
}
}
else if(( key >= Key.D0 && key <= Key.D9 ) || ( key >= Key.A && key <= Key.Z ))
{
return false;
}
}
return true;
}
///
/// Decode the strings keyGestures and displayStrings, creating a sequence
/// of KeyGestures. Add each KeyGesture to the given InputGestureCollection.
/// The two input strings typically come from a resource file.
///
internal static void AddGesturesFromResourceStrings(string keyGestures, string displayStrings, InputGestureCollection gestures)
{
while (!String.IsNullOrEmpty(keyGestures))
{
string keyGestureToken;
string keyDisplayString;
// break apart first gesture from the rest
int index = keyGestures.IndexOf(MULTIPLEGESTURE_DELIMITER, StringComparison.Ordinal);
if (index >= 0)
{ // multiple gestures exist
keyGestureToken = keyGestures.Substring(0, index);
keyGestures = keyGestures.Substring(index + 1);
}
else
{
keyGestureToken = keyGestures;
keyGestures = String.Empty;
}
// similarly, break apart first display string from the rest
index = displayStrings.IndexOf(MULTIPLEGESTURE_DELIMITER, StringComparison.Ordinal);
if (index >= 0)
{ // multiple display strings exist
keyDisplayString = displayStrings.Substring(0, index);
displayStrings = displayStrings.Substring(index + 1);
}
else
{
keyDisplayString = displayStrings;
displayStrings = String.Empty;
}
KeyGesture keyGesture = CreateFromResourceStrings(keyGestureToken, keyDisplayString);
if (keyGesture != null)
{
gestures.Add(keyGesture);
}
}
}
internal static KeyGesture CreateFromResourceStrings(string keyGestureToken, string keyDisplayString)
{
// combine the gesture and the display string, producing a string
// that the type converter will recognize
if (!String.IsNullOrEmpty(keyDisplayString))
{
keyGestureToken += KeyGestureConverter.DISPLAYSTRING_SEPARATOR + keyDisplayString;
}
return _keyGestureConverter.ConvertFromInvariantString(keyGestureToken) as KeyGesture;
}
#endregion Internal Methods
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
private ModifierKeys _modifiers = ModifierKeys.None;
private Key _key = Key.None;
private string _displayString;
private const string MULTIPLEGESTURE_DELIMITER = ";";
private static TypeConverter _keyGestureConverter = new KeyGestureConverter();
//private static bool _classRegistered = false;
#endregion Private Fields
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: The KeyGesture class is used by the developer to create Keyboard Input Bindings
//
// See spec at : http://avalon/coreUI/Specs/Commanding%20--%20design.htm
//
//* KeyGesture class serves the purpose of Input Bindings for Keyboard Device.
//* one will be passing the instance of this around with CommandLink to represent Accelerator Keys
//
// History:
// 06/01/2003 : chandras - Created
//
//---------------------------------------------------------------------------
using System;
using System.Globalization;
using System.Windows.Input;
using System.Windows;
using System.Windows.Markup;
using System.ComponentModel;
using MS.Internal.PresentationCore;
namespace System.Windows.Input
{
///
/// KeyGesture - Key and Modifier combination.
/// Can be set on properties of KeyBinding and RoutedCommand.
///
[TypeConverter(typeof(KeyGestureConverter))]
[ValueSerializer(typeof(KeyGestureValueSerializer))]
public class KeyGesture : InputGesture
{
//-----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
///
/// constructor
///
/// key
public KeyGesture(Key key)
: this(key, ModifierKeys.None)
{
}
///
/// constructor
///
/// modifiers
/// key
public KeyGesture(Key key, ModifierKeys modifiers)
: this(key, modifiers, String.Empty, true)
{
}
///
/// constructor
///
/// modifiers
/// key
/// display string
public KeyGesture(Key key, ModifierKeys modifiers, string displayString)
: this(key, modifiers, displayString, true)
{
}
///
/// Internal constructor used by KeyBinding to avoid key and modifier validation
/// This allows setting KeyBinding.Key and KeyBinding.Modifiers without regard
/// to order.
///
/// Key
/// Modifiers
/// If true, throws an exception if the key and modifier are not valid
internal KeyGesture(Key key, ModifierKeys modifiers, bool validateGesture)
: this(key, modifiers, String.Empty, validateGesture)
{
}
///
/// Private constructor that does the real work.
///
/// Key
/// Modifiers
/// display string
/// If true, throws an exception if the key and modifier are not valid
private KeyGesture(Key key, ModifierKeys modifiers, string displayString, bool validateGesture)
{
if(!ModifierKeysConverter.IsDefinedModifierKeys(modifiers))
throw new InvalidEnumArgumentException("modifiers", (int)modifiers, typeof(ModifierKeys));
if(!IsDefinedKey(key))
throw new InvalidEnumArgumentException("key", (int)key, typeof(Key));
if (displayString == null)
throw new ArgumentNullException("displayString");
if(validateGesture && !IsValid(key, modifiers))
{
throw new NotSupportedException(SR.Get(SRID.KeyGesture_Invalid, modifiers, key));
}
_modifiers = modifiers;
_key = key;
_displayString = displayString;
}
#endregion Constructors
//------------------------------------------------------
//
// Public Methods
//
//-----------------------------------------------------
#region Public Methods
///
/// Modifier
///
public ModifierKeys Modifiers
{
get
{
return _modifiers;
}
}
///
/// Key
///
public Key Key
{
get
{
return _key;
}
}
///
/// DisplayString
///
public string DisplayString
{
get
{
return _displayString;
}
}
///
/// Returns a string that can be used to display the KeyGesture. If the
/// DisplayString was set by the constructor, it is returned. Otherwise
/// a suitable string is created from the Key and Modifiers, with any
/// conversions being governed by the given CultureInfo.
///
/// the culture used when creating a string from Key and Modifiers
public string GetDisplayStringForCulture(CultureInfo culture)
{
// return the DisplayString, if it was set by the ctor
if (!String.IsNullOrEmpty(_displayString))
{
return _displayString;
}
// otherwise use the type converter
return (string)_keyGestureConverter.ConvertTo(null, culture, this, typeof(string));
}
///
/// Compares InputEventArgs with current Input
///
/// the element to receive the command
/// inputEventArgs to compare to
/// True - KeyGesture matches, false otherwise.
///
public override bool Matches(object targetElement, InputEventArgs inputEventArgs)
{
KeyEventArgs keyEventArgs = inputEventArgs as KeyEventArgs;
if(keyEventArgs != null && IsDefinedKey(keyEventArgs.Key))
{
return ( ( (int)Key == (int)keyEventArgs.RealKey ) && ( this.Modifiers == Keyboard.Modifiers ) );
}
return false;
}
// Check for Valid enum, as any int can be casted to the enum.
internal static bool IsDefinedKey(Key key)
{
return (key >= Key.None && key <= Key.OemClear);
}
#endregion Public Methods
//------------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
///
/// Is Valid Keyboard input to process for commands
///
internal static bool IsValid(Key key, ModifierKeys modifiers)
{
//
// Don't enforce any rules on the Function keys or on the number pad keys.
//
if(!( ( key >= Key.F1 && key <= Key.F24 ) || ( key >= Key.NumPad0 && key <= Key.Divide ) ))
{
//
// We check whether Control/Alt/Windows key is down for modifiers. We don't check
// for shift at this time as Shift with any combination is already covered in above check.
// Shift alone as modifier case, we defer to the next condition to avoid conflicing with
// TextInput.
if(( modifiers & ( ModifierKeys.Control | ModifierKeys.Alt | ModifierKeys.Windows ) ) != 0)
{
switch(key)
{
case Key.LeftCtrl:
case Key.RightCtrl:
case Key.LeftAlt:
case Key.RightAlt:
case Key.LWin:
case Key.RWin:
return false;
default:
return true;
}
}
else if(( key >= Key.D0 && key <= Key.D9 ) || ( key >= Key.A && key <= Key.Z ))
{
return false;
}
}
return true;
}
///
/// Decode the strings keyGestures and displayStrings, creating a sequence
/// of KeyGestures. Add each KeyGesture to the given InputGestureCollection.
/// The two input strings typically come from a resource file.
///
internal static void AddGesturesFromResourceStrings(string keyGestures, string displayStrings, InputGestureCollection gestures)
{
while (!String.IsNullOrEmpty(keyGestures))
{
string keyGestureToken;
string keyDisplayString;
// break apart first gesture from the rest
int index = keyGestures.IndexOf(MULTIPLEGESTURE_DELIMITER, StringComparison.Ordinal);
if (index >= 0)
{ // multiple gestures exist
keyGestureToken = keyGestures.Substring(0, index);
keyGestures = keyGestures.Substring(index + 1);
}
else
{
keyGestureToken = keyGestures;
keyGestures = String.Empty;
}
// similarly, break apart first display string from the rest
index = displayStrings.IndexOf(MULTIPLEGESTURE_DELIMITER, StringComparison.Ordinal);
if (index >= 0)
{ // multiple display strings exist
keyDisplayString = displayStrings.Substring(0, index);
displayStrings = displayStrings.Substring(index + 1);
}
else
{
keyDisplayString = displayStrings;
displayStrings = String.Empty;
}
KeyGesture keyGesture = CreateFromResourceStrings(keyGestureToken, keyDisplayString);
if (keyGesture != null)
{
gestures.Add(keyGesture);
}
}
}
internal static KeyGesture CreateFromResourceStrings(string keyGestureToken, string keyDisplayString)
{
// combine the gesture and the display string, producing a string
// that the type converter will recognize
if (!String.IsNullOrEmpty(keyDisplayString))
{
keyGestureToken += KeyGestureConverter.DISPLAYSTRING_SEPARATOR + keyDisplayString;
}
return _keyGestureConverter.ConvertFromInvariantString(keyGestureToken) as KeyGesture;
}
#endregion Internal Methods
//-----------------------------------------------------
//
// Private Fields
//
//------------------------------------------------------
#region Private Fields
private ModifierKeys _modifiers = ModifierKeys.None;
private Key _key = Key.None;
private string _displayString;
private const string MULTIPLEGESTURE_DELIMITER = ";";
private static TypeConverter _keyGestureConverter = new KeyGestureConverter();
//private static bool _classRegistered = false;
#endregion Private Fields
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SchemaNames.cs
- GlobalizationSection.cs
- ListMarkerSourceInfo.cs
- Point3DKeyFrameCollection.cs
- DrawingImage.cs
- Trace.cs
- Sequence.cs
- CodeBlockBuilder.cs
- WebFaultClientMessageInspector.cs
- WmlPanelAdapter.cs
- oledbconnectionstring.cs
- PrintPageEvent.cs
- ExpressionConverter.cs
- SplineKeyFrames.cs
- XomlCompiler.cs
- AnnotationHighlightLayer.cs
- CrossAppDomainChannel.cs
- SizeConverter.cs
- ExtendedPropertyDescriptor.cs
- DataGridCellInfo.cs
- WindowsFormsHostAutomationPeer.cs
- TextOptionsInternal.cs
- DispatcherHooks.cs
- DigestComparer.cs
- CodeCompiler.cs
- SelectionGlyphBase.cs
- PeerCollaboration.cs
- SamlAuthorizationDecisionStatement.cs
- SmiTypedGetterSetter.cs
- GacUtil.cs
- FileRecordSequence.cs
- SystemWebSectionGroup.cs
- XmlExceptionHelper.cs
- InstalledFontCollection.cs
- SecurityContext.cs
- FrameworkTextComposition.cs
- Module.cs
- PagedDataSource.cs
- SecurityUniqueId.cs
- GeometryValueSerializer.cs
- WebPartCollection.cs
- BitmapData.cs
- AutomationFocusChangedEventArgs.cs
- CompilerHelpers.cs
- MemberMaps.cs
- ImmutableObjectAttribute.cs
- RepeaterItemCollection.cs
- SqlDataSourceCommandEventArgs.cs
- PKCS1MaskGenerationMethod.cs
- FamilyMapCollection.cs
- InkCanvas.cs
- CustomError.cs
- ContentType.cs
- FactoryGenerator.cs
- LineVisual.cs
- MSAAWinEventWrap.cs
- QilParameter.cs
- LOSFormatter.cs
- ResolveNameEventArgs.cs
- CatalogPartCollection.cs
- RandomNumberGenerator.cs
- PiiTraceSource.cs
- DelegateSerializationHolder.cs
- MatrixAnimationUsingPath.cs
- CDSsyncETWBCLProvider.cs
- AssociationTypeEmitter.cs
- SafeHandle.cs
- FirstMatchCodeGroup.cs
- HotSpot.cs
- Padding.cs
- metadatamappinghashervisitor.hashsourcebuilder.cs
- SafeCloseHandleCritical.cs
- WsatProxy.cs
- DiagnosticStrings.cs
- Serializer.cs
- DefinitionBase.cs
- WaitForChangedResult.cs
- ServicePoint.cs
- KeyTimeConverter.cs
- BulletChrome.cs
- EntityParameterCollection.cs
- PrinterResolution.cs
- UnknownWrapper.cs
- DynamicDiscoSearcher.cs
- WebPartVerb.cs
- DesignerDataConnection.cs
- KeyGesture.cs
- ClientScriptManagerWrapper.cs
- ClockController.cs
- ExecutedRoutedEventArgs.cs
- SignatureDescription.cs
- MetadataUtilsSmi.cs
- SecurityPermission.cs
- FontStyle.cs
- TextServicesManager.cs
- ConditionValidator.cs
- MoveSizeWinEventHandler.cs
- Rethrow.cs
- MachineKeyConverter.cs
- AnnotationResource.cs