﻿Option Explicit On
Option Strict On
Option Infer Off

Public Class HotKeyTextBox
    Inherits System.Windows.Forms.TextBox

#Region " Variables "

    Private m_IsCtrl, m_IsAlt, m_IsShift As Boolean
    Private m_Char As Char = CChar(String.Empty)

#End Region
#Region " Sub: New "

    Public Sub New()
        MyBase.New()
        Me.ReadOnly = True
        Me.ForeColor = SystemColors.Window

        m_IsCtrl = False
        m_IsAlt = False
        m_IsShift = False
    End Sub

#End Region
#Region " Overrides Subs: OnKeyDown, OnKeyUp "

    Protected Overrides Sub OnKeyDown(e As System.Windows.Forms.KeyEventArgs)
        MyBase.OnKeyDown(e)

        If e.Alt Then m_IsAlt = True
        If e.Control Then m_IsCtrl = True
        If e.Shift Then m_IsShift = True

        Call UpdateText()
    End Sub

    Protected Overrides Sub OnKeyPress(e As System.Windows.Forms.KeyPressEventArgs)
        MyBase.OnKeyPress(e)

        If Char.IsLetterOrDigit(e.KeyChar) Then
            m_Char = CChar(e.KeyChar.ToString.ToUpper)
            Call UpdateText()
        End If
    End Sub

    Protected Overrides Sub OnKeyUp(e As System.Windows.Forms.KeyEventArgs)
        MyBase.OnKeyDown(e)
        If m_Char <> CChar(String.Empty) Then
            If e.Alt Then m_IsAlt = False
            If e.Control Then m_IsCtrl = False
            If e.Shift Then m_IsShift = False

            Call UpdateText()
        Else
            m_IsAlt = False
            m_IsCtrl = False
            m_IsShift = False
        End If
    End Sub

    Private Sub UpdateText()
        If (m_IsCtrl OrElse m_IsAlt OrElse m_IsShift) Then
            Dim str As String = String.Empty
            If m_IsCtrl Then str = "Ctrl"
            If m_IsShift Then
                If m_IsCtrl Then str &= " + Shift" Else str = "Shift"
            End If
            If m_IsAlt Then
                If (m_IsCtrl OrElse m_IsShift) Then str &= " + Alt" Else str = "Alt"
            End If

            If m_Char <> CChar(String.Empty) Then str &= " + " & m_Char

            Me.Text = str
        Else
            Me.Text = String.Empty
            m_Char = CChar(String.Empty)
        End If
    End Sub

#End Region

End Class
