Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Components.ListPopup
Imports Nexamas.UI.Components.ListRendering
Imports Nexamas.UI.Composition
Imports Nexamas.UI.Controls
Imports Nexamas.UI.FloatRuntime
Imports Nexamas.UI.General
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    Partial Public NotInheritable Class MASComboBox

#Region "Mouse & Dropdown"

        Protected Overrides Sub OnMouseMove(ctx As MASThemeContext, ptPx As SKPoint)
            If Not Me.Enabled Then Return

            Dim rPx As SKRect = GetPixelBounds(ctx)
            Dim nowHover As Boolean = rPx.Contains(ptPx.X, ptPx.Y)

            If nowHover <> _hover Then
                _hover = nowHover
                InvalidateVisual()
            End If
        End Sub

        Protected Overrides Function OnMouseDown(ctx As MASThemeContext,
                                                 ptPx As SKPoint,
                                                 button As Integer) As Boolean

            Nexamas.UI.Performance.MASPerformanceSystem.RecordConsumerInput(
                Nexamas.UI.Performance.MASPerformanceConsumerKind.ComboBox,
                "MASComboBox.OnMouseDown")

            If Not Me.Enabled Then Return False
            If button <> CInt(MouseButtons.Left) Then Return False

            Dim rPx As SKRect = GetPixelBounds(ctx)
            If Not rPx.Contains(ptPx.X, ptPx.Y) Then Return False

            RequestFocus()
            PulsePress()
            _hover = True

            InvalidateVisual()
            ToggleDropdown(ctx)

            Return True
        End Function

        Protected Overrides Sub OnMouseLeave(ctx As MASThemeContext)
            If _hover OrElse _pressed Then
                _hover = False
                _pressed = False
                InvalidateVisual()
            End If

            StopPressPulse(clearPressed:=False)
        End Sub

        Protected Overrides Sub OnMouseCancel(ctx As MASThemeContext)
            _pressed = False
            _hover = False

            StopPressPulse(clearPressed:=False)

            InvalidateVisual()
        End Sub

        Protected Overrides Sub OnHostLostFocus(ctx As MASThemeContext)
            If _isDropdownOpen Then
                CloseDropdownSafe()
                Return
            End If

            _pressed = False
            _hover = False

            StopPressPulse(clearPressed:=False)

            InvalidateVisual()
        End Sub

#End Region

#Region "Keyboard"

        Protected Overrides Function OnKeyDown(ctx As MASThemeContext,
                                               keyCode As Keys) As Boolean

            Nexamas.UI.Performance.MASPerformanceSystem.RecordConsumerInput(
                Nexamas.UI.Performance.MASPerformanceConsumerKind.ComboBox,
                "MASComboBox.OnKeyDown")

            If Not Enabled Then Return False

            Select Case keyCode

                Case Keys.Space, Keys.Enter
                    RequestFocus()
                    PulsePress()
                    ToggleDropdown(ctx)
                    Return True

                Case Keys.Down
                    RequestFocus()

                    If _items.Count <= 0 Then Return True

                    If Not _isDropdownOpen Then
                        ToggleDropdown(ctx)
                    ElseIf _selectedIndex < (_items.Count - 1) Then
                        SelectedIndex += 1
                    End If

                    Return True

                Case Keys.Up
                    RequestFocus()

                    If _items.Count <= 0 Then Return True

                    If _isDropdownOpen AndAlso _selectedIndex > 0 Then
                        SelectedIndex -= 1
                    End If

                    Return True

                Case Keys.Home
                    RequestFocus()

                    If _items.Count <= 0 Then Return True

                    If _isDropdownOpen Then
                        SelectedIndex = 0
                    End If

                    Return True

                Case Keys.End
                    RequestFocus()

                    If _items.Count <= 0 Then Return True

                    If _isDropdownOpen Then
                        SelectedIndex = _items.Count - 1
                    End If

                    Return True

                Case Keys.PageDown
                    RequestFocus()

                    If _items.Count <= 0 Then Return True

                    If _isDropdownOpen Then
                        SelectedIndex = Math.Min(_items.Count - 1, Math.Max(0, _selectedIndex) + GetKeyboardPageStep())
                    End If

                    Return True

                Case Keys.PageUp
                    RequestFocus()

                    If _items.Count <= 0 Then Return True

                    If _isDropdownOpen Then
                        SelectedIndex = Math.Max(0, Math.Max(0, _selectedIndex) - GetKeyboardPageStep())
                    End If

                    Return True

                Case Keys.Escape
                    If _isDropdownOpen Then
                        CloseDropdownSafe()
                        Return True
                    End If

            End Select

            Return False
        End Function

        Protected Overrides Function OnTextInput(ctx As MASThemeContext,
                                                 text As String) As Boolean
            If Not Enabled Then Return False
            If String.IsNullOrEmpty(text) Then Return False

            RequestFocus()
            Return ApplyKeyboardTextSearch(text)
        End Function

#End Region

    End Class

End Namespace
