Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Windows.Forms

Namespace Nexamas.UI.CommandActions

     ''' <summary>
     ''' Immutable keyboard gesture owned by the Command / Action System foundation.
     ''' </summary>
    Friend NotInheritable Class MASCommandShortcutGesture

        Friend Shared ReadOnly Empty As New MASCommandShortcutGesture(Keys.None, Keys.None, String.Empty)

        Friend Sub New(keyCode As Keys,
                       modifiers As Keys,
                       Optional displayText As String = "")
            Me.KeyCode = NormalizeKeyCode(keyCode)
            Me.Modifiers = NormalizeModifiers(modifiers)
            Me.DisplayText = If(String.IsNullOrWhiteSpace(displayText), ResolveDisplayText(Me.KeyCode, Me.Modifiers), displayText.Trim())
        End Sub

        Friend ReadOnly Property KeyCode As Keys
        Friend ReadOnly Property Modifiers As Keys
        Friend ReadOnly Property DisplayText As String

        Friend ReadOnly Property IsEmpty As Boolean
            Get
                Return KeyCode = Keys.None
            End Get
        End Property

        Friend Function Matches(keyData As Keys) As Boolean
            If IsEmpty Then Return False

            Dim incomingCode As Keys = NormalizeKeyCode(keyData)
            Dim incomingModifiers As Keys = NormalizeModifiers(keyData)

            Return incomingCode = KeyCode AndAlso incomingModifiers = Modifiers
        End Function

        Friend Shared Function FromKeyData(keyData As Keys,
                                           Optional displayText As String = "") As MASCommandShortcutGesture
            Return New MASCommandShortcutGesture(NormalizeKeyCode(keyData), NormalizeModifiers(keyData), displayText)
        End Function

        Friend Shared Function Create(keyCode As Keys,
                                      Optional modifiers As Keys = Keys.None,
                                      Optional displayText As String = "") As MASCommandShortcutGesture
            Return New MASCommandShortcutGesture(keyCode, modifiers, displayText)
        End Function

        Private Shared Function NormalizeKeyCode(keyData As Keys) As Keys
            Return keyData And Keys.KeyCode
        End Function

        Private Shared Function NormalizeModifiers(keyData As Keys) As Keys
            Return keyData And (Keys.Control Or Keys.Shift Or Keys.Alt)
        End Function

        Private Shared Function ResolveDisplayText(keyCode As Keys,
                                                   modifiers As Keys) As String
            If keyCode = Keys.None Then Return String.Empty

            Dim parts As New List(Of String)()
            If (modifiers And Keys.Control) = Keys.Control Then parts.Add("Ctrl")
            If (modifiers And Keys.Shift) = Keys.Shift Then parts.Add("Shift")
            If (modifiers And Keys.Alt) = Keys.Alt Then parts.Add("Alt")
            parts.Add(keyCode.ToString())

            Return String.Join("+", parts.ToArray())
        End Function

    End Class

End Namespace
