Option Strict On
Option Explicit On

Imports System
Imports System.Globalization
Imports System.Windows.Forms
Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Components.DropDownMenu
Imports Nexamas.UI.Controls
Imports Nexamas.UI.FloatRuntime
Imports Nexamas.UI.General
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.TextRendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Composition
Imports Nexamas.UI.Values
Imports SkiaSharp

Namespace Nexamas.UI.Components

    Partial Public NotInheritable Class MASSplitButton

#Region "Input"

        Protected Overrides Sub OnMouseMove(ctx As MASThemeContext, ptPx As SKPoint)
            _lastContext = ctx
            Dim hit As MASSplitButtonSegment = HitTestSplit(ctx, ptPx)
            Dim oldMain As Boolean = _hoverMain
            Dim oldMenu As Boolean = _hoverMenu

            _hoverMain = (hit = MASSplitButtonSegment.Main)
            _hoverMenu = (hit = MASSplitButtonSegment.Menu)

            If oldMain <> _hoverMain OrElse oldMenu <> _hoverMenu Then 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
            If Not CanActivate() Then Return False

            _lastContext = ctx
            Dim hit As MASSplitButtonSegment = HitTestSplit(ctx, ptPx)
            If hit = MASSplitButtonSegment.None Then Return False

            RequestFocus()
            _keyboardSegment = hit
            _pressedMain = (hit = MASSplitButtonSegment.Main)
            _pressedMenu = (hit = MASSplitButtonSegment.Menu)
            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
            If Not (_pressedMain OrElse _pressedMenu) Then Return False

            _lastContext = ctx
            Dim wasMain As Boolean = _pressedMain
            Dim wasMenu As Boolean = _pressedMenu
            Dim hit As MASSplitButtonSegment = HitTestSplit(ctx, ptPx)

            _pressedMain = False
            _pressedMenu = False
            InvalidateVisual()

            If wasMain AndAlso hit = MASSplitButtonSegment.Main Then
                PulsePressReleaseMotion(MASSplitButtonSegment.Main)
                PerformClick()
                Return True
            End If

            If wasMenu AndAlso hit = MASSplitButtonSegment.Menu Then
                PulsePressReleaseMotion(MASSplitButtonSegment.Menu)
                ShowMenu()
                Return True
            End If

            Return True
        End Function

        Protected Overrides Sub OnMouseLeave(ctx As MASThemeContext)
            If _hoverMain OrElse _hoverMenu OrElse _pressedMain OrElse _pressedMenu Then
                _hoverMain = False
                _hoverMenu = False
                _pressedMain = False
                _pressedMenu = False
                InvalidateVisual()
            End If
        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
            If Not CanActivate() Then Return False
            _lastContext = ctx

            If keyCode = Keys.Left OrElse keyCode = Keys.Right Then
                Dim nextSegment As MASSplitButtonSegment = MASSplitButtonSegmentPolicy.ResolveKeyboardSegment(_keyboardSegment, keyCode, IsRightToLeft())
                If nextSegment <> _keyboardSegment Then
                    _keyboardSegment = nextSegment
                    RequestFocus()
                    InvalidateVisual()
                    Return True
                End If
            End If

            If MASSplitButtonSegmentPolicy.IsPrimaryActivationKey(keyCode) Then
                RequestFocus()
                If _keyboardSegment = MASSplitButtonSegment.Menu Then
                    PulsePressReleaseMotion(MASSplitButtonSegment.Menu)
                    ShowMenu()
                Else
                    PulsePressReleaseMotion(MASSplitButtonSegment.Main)
                    PerformClick()
                End If
                Return True
            End If

            If MASSplitButtonSegmentPolicy.IsMenuActivationKey(keyCode) Then
                RequestFocus()
                _keyboardSegment = MASSplitButtonSegment.Menu
                PulsePressReleaseMotion(MASSplitButtonSegment.Menu)
                ShowMenu()
                Return True
            End If

            If keyCode = Keys.Escape AndAlso IsMenuOpen Then
                CloseMenu()
                Return True
            End If

            Return False
        End Function

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

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

#End Region

    End Class

End Namespace
