Option Strict On
Option Explicit On

Namespace Nexamas.UI.Virtualization

    ''' <summary>
    ''' Logical one-dimensional viewport consumed by MASVirtualizedItemsSystem. Scroll adapters provide offset/extent facts;
    ''' the virtualization system returns item plans and never scrolls a host directly. Single properties are retained for
    ''' existing consumers, while Double facts are the internal planning source for huge extents.
    ''' </summary>
    Friend NotInheritable Class MASVirtualizationViewport

        Friend Sub New(offsetPx As Single, extentPx As Single)
            Me.New(CDbl(offsetPx), CDbl(extentPx))
        End Sub

        Friend Sub New(offsetPx As Double, extentPx As Double)
            Me.OffsetPxDouble = MASVirtualizationNumericGuard.NormalizeNonNegative(offsetPx)
            Me.ExtentPxDouble = MASVirtualizationNumericGuard.NormalizeNonNegative(extentPx)
            Me.OffsetPx = MASVirtualizationNumericGuard.ToSingleSaturated(Me.OffsetPxDouble)
            Me.ExtentPx = MASVirtualizationNumericGuard.ToSingleSaturated(Me.ExtentPxDouble)
        End Sub

        Friend ReadOnly Property OffsetPx As Single
        Friend ReadOnly Property ExtentPx As Single
        Friend ReadOnly Property OffsetPxDouble As Double
        Friend ReadOnly Property ExtentPxDouble As Double

        Friend ReadOnly Property EndPx As Single
            Get
                Return MASVirtualizationNumericGuard.ToSingleSaturated(EndPxDouble)
            End Get
        End Property

        Friend ReadOnly Property EndPxDouble As Double
            Get
                Return OffsetPxDouble + ExtentPxDouble
            End Get
        End Property

        Friend ReadOnly Property IsValid As Boolean
            Get
                Return MASVirtualizationNumericGuard.IsFinitePositive(ExtentPxDouble) AndAlso
                       MASVirtualizationNumericGuard.IsFinite(OffsetPxDouble)
            End Get
        End Property

    End Class

End Namespace
