Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic

Namespace Nexamas.UI.Composition

    ''' <summary>
    ''' Host-scoped Layout facade.
    ''' It creates low-level layout nodes and can apply them through the owning MASCompositionHostRuntime.
    ''' </summary>
    <Global.System.ComponentModel.EditorBrowsable(Global.System.ComponentModel.EditorBrowsableState.Advanced)>
    Friend NotInheritable Class MASHostLayoutFacade

        Private ReadOnly _runtime As MASCompositionHostRuntime

        Friend Sub New(runtime As MASCompositionHostRuntime)
            If runtime Is Nothing Then Throw New ArgumentNullException(NameOf(runtime))
            _runtime = runtime
        End Sub

        Friend Function Item(control As Nexamas.UI.Controls.MASControlBase,
                             Optional width As MASSizePolicy = Nothing,
                             Optional height As MASSizePolicy = Nothing,
                             Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch,
                             Optional margin As MASLayoutThickness = Nothing,
                             Optional key As String = "") As MASLayoutItem

            Return MASComposition.Item(control, width, height, alignment, margin, key)
        End Function

        Friend Function NodeItem(node As IMASLayoutNode,
                                 Optional width As MASSizePolicy = Nothing,
                                 Optional height As MASSizePolicy = Nothing,
                                 Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch,
                                 Optional margin As MASLayoutThickness = Nothing,
                                 Optional key As String = "") As MASLayoutItem

            Return MASComposition.NodeItem(node, width, height, alignment, margin, key)
        End Function

        Friend Function Spacer(Optional preferredWidth As Single = 0.0F,
                               Optional preferredHeight As Single = 0.0F) As IMASLayoutNode

            Return MASComposition.Spacer(preferredWidth, preferredHeight)
        End Function

        Friend Function Vertical(children As IEnumerable(Of MASLayoutItem),
                                 Optional spacing As Single = 0.0F,
                                 Optional padding As MASLayoutThickness = Nothing,
                                 Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch) As IMASLayoutNode

            Return MASComposition.Vertical(children, spacing, padding, alignment)
        End Function

        Friend Function Horizontal(children As IEnumerable(Of MASLayoutItem),
                                   Optional spacing As Single = 0.0F,
                                   Optional padding As MASLayoutThickness = Nothing,
                                   Optional alignment As MASLayoutAlignment = MASLayoutAlignment.Stretch) As IMASLayoutNode

            Return MASComposition.Horizontal(children, spacing, padding, alignment)
        End Function

        Friend Function Dock(children As IEnumerable(Of MASLayoutItem),
                             Optional padding As MASLayoutThickness = Nothing) As IMASLayoutNode

            Return MASComposition.Dock(children, padding)
        End Function

        Friend Function Show(layout As IMASLayoutNode) As Boolean
            Return _runtime.SetLayout(layout)
        End Function

        Friend Function ShowFactory(factory As Func(Of IMASLayoutNode),
                                    Optional applyImmediately As Boolean = True) As Boolean
            Return _runtime.SetLayoutFactory(factory, applyImmediately)
        End Function

        Friend Function Rebuild() As Boolean
            Return _runtime.RebuildCurrent()
        End Function

        Friend Function Clear() As Boolean
            Return _runtime.Clear()
        End Function

    End Class

End Namespace
