Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Globalization
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.Controls
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 MASAgendaView

#Region "Interaction"

        Protected Overrides Sub OnMouseMove(ctx As MASThemeContext, ptPx As SKPoint)
            Dim previousHover As Boolean = _previousRect.Contains(ptPx.X, ptPx.Y)
            Dim nextHover As Boolean = _nextRect.Contains(ptPx.X, ptPx.Y)
            Dim eventHover As Integer = HitTestEvent(ptPx)
            If previousHover = _hoverPrevious AndAlso nextHover = _hoverNext AndAlso eventHover = _hoverEventIndex Then Return
            _hoverPrevious = previousHover
            _hoverNext = nextHover
            _hoverEventIndex = eventHover
            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
            _pressedPrevious = _previousRect.Contains(ptPx.X, ptPx.Y)
            _pressedNext = _nextRect.Contains(ptPx.X, ptPx.Y)
            _pressedEventIndex = HitTestEvent(ptPx)
            If _pressedPrevious OrElse _pressedNext OrElse _pressedEventIndex >= 0 Then
                InvalidateVisual()
                Return True
            End If
            Return _contentRect.Contains(ptPx.X, ptPx.Y)
        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 wasPrevious As Boolean = _pressedPrevious
            Dim wasNext As Boolean = _pressedNext
            Dim wasEvent As Integer = _pressedEventIndex
            _pressedPrevious = False
            _pressedNext = False
            _pressedEventIndex = -1

            If wasPrevious AndAlso _previousRect.Contains(ptPx.X, ptPx.Y) Then
                MovePreviousRange()
                InvalidateVisual()
                Return True
            End If
            If wasNext AndAlso _nextRect.Contains(ptPx.X, ptPx.Y) Then
                MoveNextRange()
                InvalidateVisual()
                Return True
            End If
            If wasEvent >= 0 AndAlso wasEvent = HitTestEvent(ptPx) Then
                SetSelection(wasEvent, True)
                InvalidateVisual()
                Return True
            End If
            If wasPrevious OrElse wasNext OrElse wasEvent >= 0 Then
                InvalidateVisual()
                Return True
            End If
            Return False
        End Function

        Protected Overrides Sub OnMouseLeave(ctx As MASThemeContext)
            ResetPointerState()
        End Sub

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

        Protected Overrides Sub OnHostLostFocus(ctx As MASThemeContext)
            _pressedPrevious = False
            _pressedNext = False
            _pressedEventIndex = -1
            InvalidateVisual()
        End Sub

        Protected Overrides Function OnKeyDown(ctx As MASThemeContext,
                                               keyCode As Keys) As Boolean
            If Not Enabled Then Return False
            Dim isRtl As Boolean = MASAgendaViewPolicy.ResolveRightToLeft()
            Select Case keyCode
                Case Keys.Up
                    MoveSelection(-1)
                    Return True
                Case Keys.Down
                    MoveSelection(1)
                    Return True
                Case Keys.Left
                    If isRtl Then MoveNextRange() Else MovePreviousRange()
                    Return True
                Case Keys.Right
                    If isRtl Then MovePreviousRange() Else MoveNextRange()
                    Return True
                Case Keys.PageUp
                    MovePreviousRange()
                    Return True
                Case Keys.PageDown
                    MoveNextRange()
                    Return True
                Case Keys.Home
                    MoveToday()
                    Return True
                Case Keys.Escape, Keys.Delete, Keys.Back
                    SetSelection(-1, True)
                    Return True
            End Select
            Return False
        End Function

        Protected Overrides Function WantsKeyboardFocus() As Boolean
            Return MASCompositeContentFocusPolicy.CanReceiveKeyboardFocus(Me.ArchitectureContract, Visible, Enabled)
        End Function

        Protected Overrides Function WantsPointerFocus() As Boolean
            Return MASCompositeContentFocusPolicy.AllowsPointerFocusForCompositeContent(Me.ArchitectureContract, Visible, Enabled)
        End Function

#End Region

    End Class

End Namespace
