Option Strict On
Option Explicit On

Imports System
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 MASSplitView

#Region "Input"

        Protected Overrides Sub OnMouseMove(ctx As MASThemeContext,
                                            ptPx As SKPoint)
            If _activeDivider <> SplitDividerSide.None Then
                UpdateActiveDividerFromPoint(ptPx)
                UpdateDividerCursor()
                Return
            End If

            Dim divider As SplitDividerSide = HitTestDivider(ptPx)
            If divider = _hoverDivider Then Return
            _hoverDivider = divider
            UpdateDividerCursor()
            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 divider As SplitDividerSide = HitTestDivider(ptPx)
            If divider = SplitDividerSide.None Then Return False
            BeginDividerDrag(divider, ptPx)
            UpdateDividerCursor()
            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 handled As Boolean = _activeDivider <> SplitDividerSide.None
            EndDividerDrag()
            _hoverDivider = HitTestDivider(ptPx)
            UpdateDividerCursor()
            InvalidateVisual()
            Return handled
        End Function

        Protected Overrides Sub OnMouseLeave(ctx As MASThemeContext)
            If _activeDivider <> SplitDividerSide.None Then
                UpdateDividerCursor()
                Return
            End If
            _hoverDivider = SplitDividerSide.None
            ResetDividerCursor()
            InvalidateVisual()
        End Sub

        Protected Overrides Sub OnMouseCancel(ctx As MASThemeContext)
            EndDividerDrag()
            _hoverDivider = SplitDividerSide.None
            ResetDividerCursor()
            InvalidateVisual()
        End Sub

        Protected Overrides Sub OnHostLostFocus(ctx As MASThemeContext)
            EndDividerDrag()
            _hoverDivider = SplitDividerSide.None
            ResetDividerCursor()
            InvalidateVisual()
        End Sub

        Protected Overrides Function OnKeyDown(ctx As MASThemeContext,
                                               keyCode As Keys) As Boolean
            If keyCode = Keys.Escape AndAlso _activeDivider <> SplitDividerSide.None Then
                EndDividerDrag()
                _hoverDivider = SplitDividerSide.None
                ResetDividerCursor()
                InvalidateVisual()
                Return True
            End If

            Select Case keyCode
                Case Keys.Left
                    Return ApplyKeyboardSplitterCommand(If(MASSplitViewPolicy.ResolveRightToLeft(), MASSplitViewKeyboardSplitterCommand.MovePositiveSmall, MASSplitViewKeyboardSplitterCommand.MoveNegativeSmall))
                Case Keys.Right
                    Return ApplyKeyboardSplitterCommand(If(MASSplitViewPolicy.ResolveRightToLeft(), MASSplitViewKeyboardSplitterCommand.MoveNegativeSmall, MASSplitViewKeyboardSplitterCommand.MovePositiveSmall))
                Case Keys.PageUp
                    Return ApplyKeyboardSplitterCommand(MASSplitViewKeyboardSplitterCommand.MoveNegativeLarge)
                Case Keys.PageDown
                    Return ApplyKeyboardSplitterCommand(MASSplitViewKeyboardSplitterCommand.MovePositiveLarge)
                Case Keys.Home
                    Return ApplyKeyboardSplitterCommand(MASSplitViewKeyboardSplitterCommand.CollapseFocusedPane)
                Case Keys.End
                    Return ApplyKeyboardSplitterCommand(MASSplitViewKeyboardSplitterCommand.ExpandFocusedPane)
            End Select
            Return False
        End Function

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

        Protected Overrides Function WantsPointerFocus() As Boolean
            Return False
        End Function


        Private Sub UpdateDividerCursor()
            MASResizeInteractionPolicy.ApplyHorizontalResizeCursor(_activeDivider <> SplitDividerSide.None OrElse _hoverDivider <> SplitDividerSide.None)
        End Sub

        Private Sub ResetDividerCursor()
            MASResizeInteractionPolicy.ApplyHorizontalResizeCursor(False)
        End Sub

#End Region

    End Class

End Namespace
