//----------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------- namespace Microsoft.Management.UI.Internal { using System; using System.Collections.Generic; using System.Text; using System.Windows.Input; using System.Diagnostics; using System.Windows; internal enum LogicalDirection { None, Left, Right } internal static class KeyboardHelp { /// /// Gets the logical direction for a key, taking into account RTL settings. /// /// The element to get FlowDirection from. /// The key pressed. /// The logical direction. public static LogicalDirection GetLogicalDirection(DependencyObject element, Key key) { Debug.Assert(element != null); bool rightToLeft = IsElementRightToLeft(element); switch (key) { case Key.Right: if (rightToLeft) { return LogicalDirection.Left; } else { return LogicalDirection.Right; } case Key.Left: if (rightToLeft) { return LogicalDirection.Right; } else { return LogicalDirection.Left; } default: return LogicalDirection.None; } } /// /// Gets the focus direction for a key, taking into account RTL settings. /// /// The element to get FlowDirection from. /// The key pressed. /// The focus direction. public static FocusNavigationDirection GetNavigationDirection(DependencyObject element, Key key) { Debug.Assert(element != null); Debug.Assert(IsFlowDirectionKey(key)); bool rightToLeft = IsElementRightToLeft(element); switch (key) { case Key.Right: if (rightToLeft) { return FocusNavigationDirection.Left; } else { return FocusNavigationDirection.Right; } case Key.Left: if (rightToLeft) { return FocusNavigationDirection.Right; } else { return FocusNavigationDirection.Left; } case Key.Down: return FocusNavigationDirection.Down; case Key.Up: return FocusNavigationDirection.Up; default: Debug.Fail("Non-direction key specified"); return FocusNavigationDirection.First; } } /// /// Determines if the control key is pressed. /// /// True if a control is is pressed. public static bool IsControlPressed() { if (ModifierKeys.Control == (Keyboard.Modifiers & ModifierKeys.Control)) { return true; } else { return false; } } /// /// Determines if the key is a navigation key. /// /// The key pressed. /// True if the key is a navigation key. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] private static bool IsFlowDirectionKey(Key key) { switch (key) { case Key.Right: case Key.Left: case Key.Down: case Key.Up: return true; default: return false; } } private static bool IsElementRightToLeft(DependencyObject element) { FlowDirection flowDirection = FrameworkElement.GetFlowDirection(element); bool rightToLeft = (flowDirection == FlowDirection.RightToLeft); return rightToLeft; } } }