// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.Windows; using System.Windows.Input; namespace Microsoft.Management.UI.Internal { 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, "element not 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, "element not 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; } } }