Option Strict On
Option Explicit On

Imports System.Windows.Forms
Imports Nexamas.UI.Theming
Imports SkiaSharp
Imports Nexamas.UI.Components

Namespace Nexamas.UI.Controls

    Partial Public NotInheritable Class MASTabControl


#Region "HitTest"

        Protected Overrides Function HitTest(ctx As MASThemeContext, ptPx As SKPoint) As Boolean
            Dim r As SKRect = GetPixelHitBounds(ctx)
            Return r.Contains(ptPx.X, ptPx.Y)
        End Function

#End Region



#Region "Mouse"

        Protected Overrides Sub OnMouseMove(ctx As MASThemeContext, ptPx As SKPoint)
            Dim boundsPx As SKRect = GetPixelBounds(ctx)
            Dim navHit As MASTabNavButtonKind = _renderer.HitNavButton(ctx, boundsPx, ptPx, Me)
            _hoverNav = navHit

            If navHit <> MASTabNavButtonKind.None Then
                _hoverIndex = -1
            Else
                _hoverIndex = _renderer.HitIndex(ctx, boundsPx, ptPx, Me)
            End If

            InvalidateVisual()
        End Sub

        Protected Overrides Function OnMouseDown(ctx As MASThemeContext, ptPx As SKPoint, button As Integer) As Boolean
            If button <> CInt(MouseButtons.Left) Then Return False

            RequestFocus()

            Dim boundsPx As SKRect = GetPixelBounds(ctx)

            _pressedNav = _renderer.HitNavButton(ctx, boundsPx, ptPx, Me)
            If _pressedNav <> MASTabNavButtonKind.None Then
                _pressedIndex = -1
                InvalidateVisual()
                Return True
            End If

            _pressedIndex = _renderer.HitIndex(ctx, boundsPx, ptPx, Me)
            InvalidateVisual()

            Return (_pressedIndex >= 0)
        End Function

        Protected Overrides Function OnMouseUp(ctx As MASThemeContext, ptPx As SKPoint, button As Integer) As Boolean
            If button <> CInt(MouseButtons.Left) Then
                _pressedIndex = -1
                _pressedNav = MASTabNavButtonKind.None
                InvalidateVisual()
                Return False
            End If

            Dim boundsPx As SKRect = GetPixelBounds(ctx)

            Dim hitNav As MASTabNavButtonKind = _renderer.HitNavButton(ctx, boundsPx, ptPx, Me)
            Dim oldPressedNav As MASTabNavButtonKind = _pressedNav
            _pressedNav = MASTabNavButtonKind.None

            If hitNav <> MASTabNavButtonKind.None AndAlso hitNav = oldPressedNav Then
                ScrollByNav(hitNav)
                Return True
            End If

            Dim hit As Integer = _renderer.HitIndex(ctx, boundsPx, ptPx, Me)
            Dim oldPressed As Integer = _pressedIndex
            _pressedIndex = -1

            If hit >= 0 AndAlso hit = oldPressed Then
                SelectIndexIfEnabled(hit)
                EnsureSelectedVisible()
                Return True
            End If

            InvalidateVisual()
            Return (hit >= 0 OrElse hitNav <> MASTabNavButtonKind.None)
        End Function

        Protected Overrides Sub OnMouseLeave(ctx As MASThemeContext)
            _hoverIndex = -1
            _pressedIndex = -1
            _hoverNav = MASTabNavButtonKind.None
            _pressedNav = MASTabNavButtonKind.None
            InvalidateVisual()
        End Sub

        Protected Overrides Sub OnMouseCancel(ctx As MASThemeContext)
            _hoverIndex = -1
            _pressedIndex = -1
            _hoverNav = MASTabNavButtonKind.None
            _pressedNav = MASTabNavButtonKind.None
            StopAnimation()
            InvalidateVisual()
        End Sub

        Protected Overrides Sub OnHostLostFocus(ctx As MASThemeContext)
            _hoverIndex = -1
            _pressedIndex = -1
            _hoverNav = MASTabNavButtonKind.None
            _pressedNav = MASTabNavButtonKind.None
            InvalidateVisual()
        End Sub

#End Region



#Region "Keyboard"

        Protected Overrides Function WantsKeyboardFocus() As Boolean
            Return True
        End Function

        Protected Overrides Function OnKeyDown(ctx As MASThemeContext, keyCode As Keys) As Boolean
            If _items.Count <= 0 Then Return False

            Select Case keyCode
                Case Keys.Left
                    MoveSelection(-1)
                    EnsureSelectedVisible()
                    Return True

                Case Keys.Right
                    MoveSelection(1)
                    EnsureSelectedVisible()
                    Return True

                Case Keys.Home
                    SelectFirstEnabled()
                    EnsureSelectedVisible()
                    Return True

                Case Keys.End
                    SelectLastEnabled()
                    EnsureSelectedVisible()
                    Return True

                Case Keys.PageUp
                    AnimateScrollTo(_targetScrollOffsetPx - MASTabPremiumVisualPolicy.ResolveNavigationScrollStep(_viewportWidthPx, ResolveCurrentDpi(ctx)))
                    Return True

                Case Keys.PageDown
                    AnimateScrollTo(_targetScrollOffsetPx + MASTabPremiumVisualPolicy.ResolveNavigationScrollStep(_viewportWidthPx, ResolveCurrentDpi(ctx)))
                    Return True

                Case Keys.Enter, Keys.Space
                    If _selectedIndex >= 0 Then
                        InvalidateVisual()
                        Return True
                    End If
            End Select

            Return False
        End Function

#End Region


    End Class

End Namespace
