Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.General
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    Partial Public NotInheritable Class MASPagination

#Region "Interaction"

        Protected Overrides Sub OnMouseMove(ctx As MASThemeContext, ptPx As SKPoint)
            Dim hit As Integer = HitNodeIndex(ptPx)
            If hit = _hoverNodeIndex Then Return

            _hoverNodeIndex = hit
            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

            Dim hit As Integer = HitNodeIndex(ptPx)
            If hit < 0 Then Return False

            RequestFocus()
            _pressedNodeIndex = hit
            _hoverNodeIndex = hit
            InvalidateVisual()
            Return True
        End Function

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

            Dim pressed As Integer = _pressedNodeIndex
            _pressedNodeIndex = -1
            Dim released As Integer = HitNodeIndex(ptPx)

            If pressed >= 0 AndAlso pressed = released Then
                ActivateNode(_lastNodes(pressed))
                InvalidateVisual()
                Return True
            End If

            If pressed >= 0 Then
                InvalidateVisual()
                Return True
            End If

            Return False
        End Function

        Protected Overrides Sub OnMouseLeave(ctx As MASThemeContext)
            If _hoverNodeIndex = -1 AndAlso _pressedNodeIndex = -1 Then Return
            ResetPointerState()
            InvalidateVisual()
        End Sub

        Protected Overrides Sub OnMouseCancel(ctx As MASThemeContext)
            ResetPointerState()
            InvalidateVisual()
        End Sub

        Protected Overrides Sub OnHostLostFocus(ctx As MASThemeContext)
            ResetPointerState()
            InvalidateVisual()
        End Sub

        Protected Overrides Function OnKeyDown(ctx As MASThemeContext,
                                               keyCode As Keys) As Boolean
            Select Case keyCode
                Case Keys.Left, Keys.Right, Keys.Home, Keys.End, Keys.PageUp, Keys.PageDown
                    SetCurrentPageInternal(MASPaginationNavigationPolicy.ResolveKeyboardPage(keyCode, _currentPage, _totalPages, _lastRenderedRtl), True)
                    Return True
            End Select

            Return False
        End Function

        Protected Overrides Function WantsKeyboardFocus() As Boolean
            Return Visible AndAlso Enabled AndAlso _totalPages > 1
        End Function

        Protected Overrides Function WantsPointerFocus() As Boolean
            Return Visible AndAlso Enabled
        End Function

        Private Sub ActivateNode(node As PageNode)
            If Not node.Enabled Then Return

            Select Case node.Action
                Case PageNodeAction.FirstPage
                    MoveFirst()
                Case PageNodeAction.PreviousPage
                    MovePrevious()
                Case PageNodeAction.PageNumber
                    SetCurrentPageInternal(node.Page, True)
                Case PageNodeAction.NextPage
                    MoveNext()
                Case PageNodeAction.LastPage
                    MoveLast()
            End Select
        End Sub

#End Region

    End Class

End Namespace
