// This source file is adapted from the WinUI project.
// (https://github.com/microsoft/microsoft-ui-xaml)
//
// Licensed to The Avalonia Project under MIT License, courtesy of The .NET Foundation.
using System.Collections.Specialized;
namespace Avalonia.Layout
{
///
/// Represents the base class for an object that sizes and arranges child elements for a host
/// and supports virtualization.
///
///
/// is the base class for layouts that support virtualization.
/// You can use one of the provided derived class, or inherit from it to create your own layout.
/// Provided concrete virtualizing layout classes are and
/// .
///
public abstract class VirtualizingLayout : AttachedLayout
{
///
/// Notifies the layout when the data collection assigned to the container element (Items)
/// has changed.
///
///
/// The context object that facilitates communication between the layout and its host
/// container.
///
/// The data source.
/// Data about the collection change.
///
/// Override
/// to provide the behavior for this method in a derived class.
///
public void OnItemsChanged(
VirtualizingLayoutContext context,
object? source,
NotifyCollectionChangedEventArgs args) => OnItemsChangedCore(context, source, args);
///
/// When overridden in a derived class, initializes any per-container state the layout
/// requires when it is attached to an ILayoutable container.
///
///
/// The context object that facilitates communication between the layout and its host
/// container.
///
protected internal virtual void InitializeForContextCore(VirtualizingLayoutContext context)
{
}
///
/// When overridden in a derived class, removes any state the layout previously stored on
/// the ILayoutable container.
///
///
/// The context object that facilitates communication between the layout and its host
/// container.
///
protected internal virtual void UninitializeForContextCore(VirtualizingLayoutContext context)
{
}
///
/// Provides the behavior for the "Measure" pass of the layout cycle. Classes can override
/// this method to define their own "Measure" pass behavior.
///
///
/// The context object that facilitates communication between the layout and its host
/// container.
///
///
/// The available size that this object can give to child objects. Infinity can be
/// specified as a value to indicate that the object will size to whatever content is
/// available.
///
///
/// The size that this object determines it needs during layout, based on its calculations
/// of the allocated sizes for child objects or based on other considerations such as a
/// fixed container size.
///
protected internal abstract Size MeasureOverride(
VirtualizingLayoutContext context,
Size availableSize);
///
/// When implemented in a derived class, provides the behavior for the "Arrange" pass of
/// layout. Classes can override this method to define their own "Arrange" pass behavior.
///
///
/// The context object that facilitates communication between the layout and its host
/// container.
///
///
/// The final area within the container that this object should use to arrange itself and
/// its children.
///
/// The actual size that is used after the element is arranged in layout.
protected internal virtual Size ArrangeOverride(
VirtualizingLayoutContext context,
Size finalSize) => finalSize;
///
/// Notifies the layout when the data collection assigned to the container element (Items)
/// has changed.
///
///
/// The context object that facilitates communication between the layout and its host
/// container.
///
/// The data source.
/// Data about the collection change.
protected internal virtual void OnItemsChangedCore(
VirtualizingLayoutContext context,
object? source,
NotifyCollectionChangedEventArgs args) => InvalidateMeasure();
}
}