Option Strict On
Option Explicit On

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports Nexamas.UI.Components
Imports Nexamas.UI.Controls
Imports Nexamas.UI.Host
Imports Nexamas.UI.Layout
Imports Nexamas.UI.Theming
Imports SkiaSharp

Namespace Nexamas.UI.Application

    Partial Public NotInheritable Class MASApplicationWindowControls

        ''' <summary>
        ''' Gives focus to a MAS control through the owning window controls layer.
        ''' </summary>
        Public Sub Focus(control As MASControlBase)
            ExecuteControlsUiThread(
                "Focus",
                Sub()
                    If control Is Nothing Then Return
                    Layer.FocusControl(control)
                End Sub)
        End Sub


        ''' <summary>
        ''' Intent-revealing alias for Focus.
        ''' </summary>
        Public Sub RequestFocus(control As MASControlBase)
            Focus(control)
        End Sub


        Public Function Contains(control As MASControlBase) As Boolean
            Return ExecuteControlsUiThread(
                "Contains",
                Function()
                    Return ContainsCore(control)
                End Function)
        End Function


        Private Function ContainsCore(control As MASControlBase) As Boolean
            If control Is Nothing Then Return False

            For Each item As MASControlBase In Layer.GetSnapshot()
                If Object.ReferenceEquals(item, control) Then Return True
            Next

            Return False
        End Function


        Friend Function GetSnapshot() As MASControlBase()
            Return ExecuteControlsUiThread("GetSnapshot", Function() Layer.GetSnapshot())
        End Function

        ''' <summary>
        ''' Advanced compatibility access to the existing root-owned controls layer. Prefer Add/Remove/Clear and the Create*/Add* gateways for new code.
        ''' </summary>
        <Obsolete("AdvancedLayer is a internal advanced compatibility hook. Prefer MASApplicationWindow.Controls.Add/Remove/Clear or Create*/Add* gateways for new SDK code.", True)>
        Friend ReadOnly Property AdvancedLayer As ControlsLayer
            Get
                Return Layer
            End Get
        End Property
    End Class

End Namespace
