Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Threading
Imports System.Threading.Tasks

Imports Nexamas.UI.Architecture
Imports Nexamas.UI.Composition
Imports Nexamas.UI.Controls
Imports Nexamas.UI.FileSystem
Imports Nexamas.UI.General
Imports Nexamas.UI.Icons
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Platform
Imports Nexamas.UI.Theming
Imports Nexamas.UI.Values

Imports SkiaSharp

Namespace Nexamas.UI.Components


    Partial Friend NotInheritable Class MASFileBrowser
#Region "Size / Scroll Content Contracts"

        Friend Function GetPreferredLayoutSize(context As MASLayoutMeasureContext) As SKSize Implements IMASLayoutParticipant.GetPreferredLayoutSize
            Return MeasureIntrinsicSize(CreateSizeContext(context), SizeIntent).DesiredSize
        End Function

        Friend Function GetMinLayoutSize(context As MASLayoutMeasureContext) As SKSize Implements IMASLayoutParticipant.GetMinLayoutSize
            Return MeasureIntrinsicSize(CreateSizeContext(context), SizeIntent).MinSize
        End Function

        Friend Function MeasureIntrinsicSize(context As MASSizeContext,
                                             intent As MASSize) As MASSizeResult _
            Implements IMASIntrinsicSizeContract.MeasureIntrinsicSize

            Dim safeContext As MASSizeContext = MASIntrinsicControlSizeMetrics.EnsureContext(context)
            Dim safeIntent As MASSize = MASSize.Normalize(intent)
            Dim listSize As MASSizeResult = _list.MeasureIntrinsicSize(safeContext, safeIntent)
            Dim scrollContentSize As SKSize = GetDesiredScrollContentSize(safeContext, safeContext.AvailableSize)
            Dim desired As SKSize = MASIntrinsicControlSizeMetrics.ResolveFileBrowserDesiredSize(
                listSize.DesiredSize,
                scrollContentSize,
                _items.Count,
                safeContext.AvailableSize)
            Dim minimum As SKSize = MASIntrinsicControlSizeMetrics.ResolveFileBrowserMinimumSize()

            Return MASSizeResolver.FromMeasured(
                desiredSize:=desired,
                minSize:=minimum,
                maxSize:=New SKSize(Single.PositiveInfinity, Single.PositiveInfinity),
                intent:=safeIntent,
                context:=safeContext,
                canGrowWidth:=True,
                canGrowHeight:=True,
                contentInset:=MASIntrinsicControlSizeMetrics.CreateFileBrowserContentInset(),
                visualOverflowInset:=MASIntrinsicControlSizeMetrics.CreateCollectionVisualOverflowInset(CollectionTokens.SurfaceVisualOverflowDip),
                hitOverflowInset:=MASLayoutInset.Empty,
                isFallback:=False)
        End Function

        Friend Function GetDesiredScrollContentSize(context As MASSizeContext,
                                                    viewportSize As SKSize) As SKSize _
            Implements IMASScrollContentSizeContract.GetDesiredScrollContentSize

            If _list Is Nothing Then Return SKSize.Empty
            Return _list.GetDesiredScrollContentSize(MASIntrinsicControlSizeMetrics.EnsureContext(context), viewportSize)
        End Function

        Private Shared Function CreateSizeContext(context As MASLayoutMeasureContext) As MASSizeContext
            If context Is Nothing Then Return New MASSizeContext(New SKSize(Single.PositiveInfinity, Single.PositiveInfinity))
            Return context.ToSizeContext()
        End Function

#End Region


    End Class

End Namespace
