Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Composition
Imports Nexamas.UI.General
Imports Nexamas.UI.Icons
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Rendering
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values
Imports SkiaSharp
Imports Nexamas.UI.Architecture

Namespace Nexamas.UI.Components


    Partial Public Class MASToolbar
#Region "Add API"
        Friend Function AddToolButton(id As String,
                              toolKind As MASToolbarToolKind,
                              Optional widthDip As Single = 0.0F,
                              Optional alignment As MASToolbarItemAlignment = MASToolbarItemAlignment.Left) As GlyphButton

            Return AddIconButtonInternal(
        id:=id,
        iconKind:=MapToolKindToIconKind(toolKind),
        widthDip:=widthDip,
        alignment:=alignment
    )
        End Function
        Friend Function AddIconButtonInternal(id As String,
                                      iconKind As MASIconKind,
                                      Optional widthDip As Single = 0.0F,
                                      Optional alignment As MASToolbarItemAlignment = MASToolbarItemAlignment.Left,
                                      Optional iconStyle As MASIconStyle = MASIconStyle.Outline) As GlyphButton

            Dim btn As New GlyphButton() With {
        .Name = SafeName(id),
        .IconKind = iconKind,
        .IconStyle = iconStyle,
        .Intent = GlyphButtonIntent.Toolbar
    }

            AddHandler btn.Click, AddressOf OnInternalButtonClick

            AddControlInternal(
        id:=id,
        control:=btn,
        widthDip:=If(widthDip > 0.0F, widthDip, _defaultButtonWidthDip),
        kind:=MASToolbarItemKind.Control,
        sizing:=MASToolbarItemSizing.Fixed,
        alignment:=alignment
    )

            Return btn
        End Function

                <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Public Function AddSearchBox(id As String,
                                     Optional placeholder As String = "Search...",
                                     Optional widthDip As Single = ToolbarTokens.SearchBoxWidth,
                                     Optional sizing As MASToolbarItemSizing = MASToolbarItemSizing.Fixed,
                                     Optional alignment As MASToolbarItemAlignment = MASToolbarItemAlignment.Left,
                                     Optional minWidthDip As Single = ToolbarTokens.SearchBoxMinWidth,
                                     Optional maxWidthDip As Single = 0.0F) As MASSearchTextBox

            Dim box As New MASSearchTextBox() With {
                .Name = SafeName(id),
                .Placeholder = If(placeholder, String.Empty)
            }

            If sizing = MASToolbarItemSizing.Fixed Then
                widthDip = Math.Max(minWidthDip, widthDip)
            Else
                widthDip = 0.0F
            End If

            AddControlInternal(
                id:=id,
                control:=box,
                widthDip:=widthDip,
                kind:=MASToolbarItemKind.Control,
                sizing:=sizing,
                alignment:=alignment,
                minWidthDip:=minWidthDip,
                maxWidthDip:=maxWidthDip
            )

            Return box
        End Function

        Public Function AddSeparator(Optional id As String = "",
                                     Optional alignment As MASToolbarItemAlignment = MASToolbarItemAlignment.Left) As MASToolbarSeparator

            Dim sep As New MASToolbarSeparator() With {
                .Name = SafeName(If(String.IsNullOrWhiteSpace(id), "Separator", id))
            }

            AddControlInternal(
                id:=id,
                control:=sep,
                widthDip:=_defaultSeparatorWidthDip,
                kind:=MASToolbarItemKind.Separator,
                sizing:=MASToolbarItemSizing.Fixed,
                alignment:=alignment
            )

            Return sep
        End Function

                <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Public Function AddSpacer(Optional id As String = "",
                                  Optional widthDip As Single = ToolbarTokens.DefaultSpacerWidth,
                                  Optional alignment As MASToolbarItemAlignment = MASToolbarItemAlignment.Left) As MASToolbarSpacer

            Dim spacer As New MASToolbarSpacer() With {
                .Name = SafeName(If(String.IsNullOrWhiteSpace(id), "Spacer", id))
            }

            AddControlInternal(
                id:=id,
                control:=spacer,
                widthDip:=Math.Max(0.0F, widthDip),
                kind:=MASToolbarItemKind.Control,
                sizing:=MASToolbarItemSizing.Fixed,
                alignment:=alignment
            )

            Return spacer
        End Function

                <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Public Function AddFlexibleSpacer(Optional id As String = "",
                                          Optional alignment As MASToolbarItemAlignment = MASToolbarItemAlignment.Left,
                                          Optional minWidthDip As Single = 0.0F,
                                          Optional maxWidthDip As Single = 0.0F) As MASToolbarSpacer

            Dim spacer As New MASToolbarSpacer() With {
                .Name = SafeName(If(String.IsNullOrWhiteSpace(id), "FlexibleSpacer", id))
            }

            AddControlInternal(
                id:=id,
                control:=spacer,
                widthDip:=0.0F,
                kind:=MASToolbarItemKind.FlexibleSpace,
                sizing:=MASToolbarItemSizing.Fill,
                alignment:=alignment,
                minWidthDip:=minWidthDip,
                maxWidthDip:=maxWidthDip
            )

            Return spacer
        End Function

                <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Public Sub AddControl(id As String,
                              control As MASControlBase,
                              widthDip As Single,
                              Optional sizing As MASToolbarItemSizing = MASToolbarItemSizing.Fixed,
                              Optional alignment As MASToolbarItemAlignment = MASToolbarItemAlignment.Left,
                              Optional minWidthDip As Single = 0.0F,
                              Optional maxWidthDip As Single = 0.0F)

            If sizing = MASToolbarItemSizing.Fixed AndAlso widthDip <= 0.0F Then
                Throw New ArgumentOutOfRangeException(NameOf(widthDip))
            End If

            If sizing = MASToolbarItemSizing.Fill Then
                widthDip = 0.0F
            End If

            AddControlInternal(
                id:=id,
                control:=control,
                widthDip:=widthDip,
                kind:=MASToolbarItemKind.Control,
                sizing:=sizing,
                alignment:=alignment,
                minWidthDip:=minWidthDip,
                maxWidthDip:=maxWidthDip
            )
        End Sub

                <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Public Sub AddFillControl(id As String,
                                  control As MASControlBase,
                                  Optional minWidthDip As Single = 0.0F,
                                  Optional maxWidthDip As Single = 0.0F)

            AddControlInternal(
                id:=id,
                control:=control,
                widthDip:=0.0F,
                kind:=MASToolbarItemKind.Control,
                sizing:=MASToolbarItemSizing.Fill,
                alignment:=MASToolbarItemAlignment.Left,
                minWidthDip:=minWidthDip,
                maxWidthDip:=maxWidthDip
            )
        End Sub

#End Region




#Region "Item Mutation API"

                <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Friend Sub SetItemWidth(id As String, widthDip As Single)
            Dim item As ToolbarEntry = FindEntry(id)
            If item Is Nothing Then Return

            item.WidthDip = Math.Max(0.0F, widthDip)
            item.Sizing = MASToolbarItemSizing.Fixed

            RequestSizeLayoutRefreshForSizeAffectingChange("MASToolbar.SetItemWidth")
            InvalidateVisual()
        End Sub

                <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Friend Sub SetItemMinWidth(id As String, minWidthDip As Single)
            Dim item As ToolbarEntry = FindEntry(id)
            If item Is Nothing Then Return

            item.MinWidthDip = Math.Max(0.0F, minWidthDip)

            If item.MaxWidthDip > 0.0F AndAlso item.MinWidthDip > item.MaxWidthDip Then
                item.MaxWidthDip = item.MinWidthDip
            End If

            RequestSizeLayoutRefreshForSizeAffectingChange("MASToolbar.SetItemMinWidth")
            InvalidateVisual()
        End Sub

                <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Friend Sub SetItemMaxWidth(id As String, maxWidthDip As Single)
            Dim item As ToolbarEntry = FindEntry(id)
            If item Is Nothing Then Return

            item.MaxWidthDip = Math.Max(0.0F, maxWidthDip)

            If item.MaxWidthDip > 0.0F AndAlso item.MinWidthDip > item.MaxWidthDip Then
                item.MinWidthDip = item.MaxWidthDip
            End If

            RequestSizeLayoutRefreshForSizeAffectingChange("MASToolbar.SetItemMaxWidth")
            InvalidateVisual()
        End Sub

                <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
        Friend Sub SetItemSizing(id As String,
                                 sizing As MASToolbarItemSizing,
                                 Optional widthDip As Single = 0.0F)

            Dim item As ToolbarEntry = FindEntry(id)
            If item Is Nothing Then Return

            item.Sizing = sizing
            item.WidthDip = If(sizing = MASToolbarItemSizing.Fixed, Math.Max(0.0F, widthDip), 0.0F)

            RequestSizeLayoutRefreshForSizeAffectingChange("MASToolbar.SetItemSizing")
            InvalidateVisual()
        End Sub

#End Region




#Region "Clear"

        Public Sub ClearItems()
            For Each item As ToolbarEntry In _items
                If item Is Nothing OrElse item.Control Is Nothing Then Continue For

                If TypeOf item.Control Is GlyphButton Then
                    RemoveHandler DirectCast(item.Control, GlyphButton).Click, AddressOf OnInternalButtonClick
                End If

                UnregisterChild(item.Control)

                Try
                    item.Control.Dispose()
                Catch masCaughtException1 As Exception
                    Nexamas.UI.Diagnostics.MASExceptionSilencer.SwallowRecoverable(masCaughtException1)
                End Try
            Next

            _items.Clear()
            RequestSizeLayoutRefreshForSizeAffectingChange("MASToolbar.ClearItems")
            InvalidateVisual()
        End Sub

#End Region

    End Class

End Namespace
