Option Strict On
Option Explicit On

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Immutable construction options for a one-dimensional virtualized item controller. The options deliberately avoid any
    ''' DataGrid/ListView-specific terminology so the system remains a reusable Nexamas UI service.
    ''' </summary>
    Friend NotInheritable Class MASVirtualizationOptions

        Friend Sub New(itemCount As Integer,
                       estimatedItemExtentPx As Single,
                       Optional overscanItemCount As Integer = 2,
                       Optional axis As MASVirtualizationAxis = MASVirtualizationAxis.Vertical,
                       Optional extentStrategy As MASVirtualizationExtentStrategy = MASVirtualizationExtentStrategy.EstimatedWithMeasuredOverrides)
            Me.ItemCount = itemCount
            Me.EstimatedItemExtentPx = estimatedItemExtentPx
            Me.OverscanItemCount = overscanItemCount
            Me.Axis = axis
            Me.ExtentStrategy = extentStrategy
        End Sub

        Friend ReadOnly Property ItemCount As Integer
        Friend ReadOnly Property EstimatedItemExtentPx As Single
        Friend ReadOnly Property OverscanItemCount As Integer
        Friend ReadOnly Property Axis As MASVirtualizationAxis
        Friend ReadOnly Property ExtentStrategy As MASVirtualizationExtentStrategy

        Friend ReadOnly Property IsValid As Boolean
            Get
                Return ItemCount >= 0 AndAlso
                       MASVirtualizationNumericGuard.IsFinitePositive(EstimatedItemExtentPx) AndAlso
                       OverscanItemCount >= 0 AndAlso
                       System.Enum.IsDefined(GetType(MASVirtualizationAxis), Axis) AndAlso
                       System.Enum.IsDefined(GetType(MASVirtualizationExtentStrategy), ExtentStrategy)
            End Get
        End Property

    End Class

End Namespace
