/*
 * Copyright (c) 2026 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License"),
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * [DynamicLayout]{@link @ohos.arkui.components.ArkDynamicLayout}组件支持的布局算法详细信息。
 * 
 * > **说明:**
 *
 * @file
 * @kit ArkUI
 */

import { FrameNode, LayoutConstraint } from './FrameNode';
import { Position, LengthMetrics } from './Graphics';

/**
 * 动态布局容器[DynamicLayout]{@link @ohos.arkui.components.ArkDynamicLayout}的布局算法基础类型。
 * 
 * > **说明:**
 * >
 * > 该类型变量可以赋值具体的布局算法类对象,如[CustomLayoutAlgorithm]{@link CustomLayoutAlgorithm}类对象、
 * > [RowLayoutAlgorithm]{@link RowLayoutAlgorithm}类对象等。
 *
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @stagemodelonly
 * @crossplatform
 * @form
 * @atomicservice
 * @since 24 dynamic
 */
export interface LayoutAlgorithm {}

/**
 * 自定义布局算法类。
 * 
 * > **说明:**
 * >
 * > CustomLayoutAlgorithm类对象可以赋值给LayoutAlgorithm类型变量,作为[DynamicLayout]{@link @ohos.arkui.components.ArkDynamicLayout}组件
 * > 的入参指定布局算法。
 *
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @stagemodelonly
 * @crossplatform
 * @form
 * @atomicservice
 * @since 24 dynamic
 */
@ObservedV2
export class CustomLayoutAlgorithm implements LayoutAlgorithm {
    /**
     * 通过重写此函数,开发者可以自定义测量子组件的大小。ArkUI框架会在动态布局组件确定尺寸时,将该组件对应的FrameNode和布局约束通过onMeasure传递给开发者。不允许在onMeasure函数中改变状态变量。
     * 
     * > **说明:**
     * >
     * > 在此函数中,开发者可以调用[FrameNode]{@link FrameNode:FrameNode}的
     * > [getChild()]{@link FrameNode:FrameNode#getChild(index: number)}方法获取子组件FrameNode,调用
     * > [FrameNode]{@link FrameNode:FrameNode}的[measure()]{@link FrameNode:FrameNode#measure}方法测量子组件大小,参考DynamicLayout组
     * > 件
     * > [示例1(自定义布局算法实现瀑布流布局)]{@link @ohos.arkui.components.ArkDynamicLayout}。
     *
     * @param { FrameNode } self - 动态布局组件在组件树上的实体节点。
     * @param { LayoutConstraint } constraint - 动态布局组件进行测量时使用的布局约束。
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    onMeasure(self: FrameNode, constraint: LayoutConstraint): void;
    /**
     * 通过重写此函数,开发者可以自定义排列子组件的位置。ArkUI框架会在动态布局组件确定位置时,将该组件对应的FrameNode和布局位置通过onLayout传递给开发者。不允许在onLayout函数中改变状态变量。
     * 
     * > **说明:**
     * >
     * > 在此函数中,开发者可以调用[FrameNode]{@link FrameNode:FrameNode}的
     * > [getChild()]{@link FrameNode:FrameNode#getChild(index: number)}方法获取子组件FrameNode,调用
     * > [FrameNode]{@link FrameNode:FrameNode}的[layout()]{@link FrameNode:FrameNode#layout}方法设置子组件位置,参考DynamicLayout组件
     * > [示例1(自定义布局算法实现瀑布流布局)]{@link @ohos.arkui.components.ArkDynamicLayout}。
     *
     * @param { FrameNode } self - 动态布局组件在组件树上的实体节点。
     * @param { Position } position - 动态布局组件进行布局时使用的位置信息。
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    onLayout(self: FrameNode, position: Position): void;
}
 
/**
 * 设置垂直方向线性布局算法的间距、主轴对齐方式、交叉轴对齐方式及主轴排列方向。
 *
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @stagemodelonly
 * @crossplatform
 * @form
 * @atomicservice
 * @since 24 dynamic
 */
interface ColumnLayoutAlgorithmOptions {
    /**
     * 纵向布局元素垂直方向间距。
     * 
     * 默认值:LengthMetrics.vp(0) 
     * 
     * 非法值:按默认值处理。
     *
     * @default LengthMetrics.vp(0)
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    space?: LengthMetrics;
    /**
     * 所有子组件在水平方向上的对齐格式。
     * 
     * 默认值:HorizontalAlign.Center 
     * 
     * 非法值:按默认值处理。
     *
     * @default HorizontalAlign.Center
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    alignItems?: HorizontalAlign;
    /**
     * 所有子组件在垂直方向上的对齐格式。
     * 
     * 默认值:FlexAlign.Start 
     * 
     * 非法值:按默认值处理。
     *
     * @default FlexAlign.Start
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    justifyContent?: FlexAlign;
    /**
     * 子组件在水平方向上的排列是否反转。取值为true表示子组件在水平方向上反转排列,由于水平方向受通用属性[direction]{@link CommonMethod#direction}影响,如果
     * [direction]{@link CommonMethod#direction}属性生效,再做一次反转。取值为false表示子组件在水平方向上正序排列。
     * 
     * 默认值:false 
     * 
     * 非法值:按默认值处理。
     *
     * @default false
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    isReverse?: boolean;
}
 
/**
 * 垂直方向线性布局算法类。
 * 
 * > **说明:**
 * >
 * > ColumnLayoutAlgorithm类对象可以赋值给LayoutAlgorithm类型变量,作为[DynamicLayout]{@link @ohos.arkui.components.ArkDynamicLayout}组件
 * > 的入参指定布局算法。
 *
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @stagemodelonly
 * @crossplatform
 * @form
 * @atomicservice
 * @since 24 dynamic
 */
@ObservedV2
export class ColumnLayoutAlgorithm implements LayoutAlgorithm {
    /**
     * 垂直方向线性布局算法类的构造函数。
     *
     * @param { ColumnLayoutAlgorithmOptions } [option] - 垂直方向线性布局算法的构造入参,设置布局算法的间距、主轴对齐方式、交叉轴对齐方式及主轴排列方向。
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    constructor(option?: ColumnLayoutAlgorithmOptions);
    /**
     * 纵向布局元素垂直方向间距。
     * 
     * 默认值:LengthMetrics.vp(0) 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public space?: LengthMetrics;
    /**
     * 所有子组件在水平方向上的对齐格式。
     * 
     * 默认值:HorizontalAlign.Center 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public alignItems?: HorizontalAlign;
    /**
     * 所有子组件在垂直方向上的对齐格式。
     * 
     * 默认值:FlexAlign.Start 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public justifyContent?: FlexAlign;
    /**
     * 子组件在水平方向上的排列是否反转。取值为true表示子组件在水平方向上反转排列,由于水平方向受通用属性[direction]{@link CommonMethod#direction}影响,如果
     * [direction]{@link CommonMethod#direction}属性生效,再做一次反转。取值为false表示子组件在水平方向上正序排列。
     * 
     * 默认值:false 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public isReverse?: boolean;
}
 
/**
 * 设置水平方向线性布局算法的间距、主轴对齐方式、交叉轴对齐方式及主轴排列方向。
 *
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @stagemodelonly
 * @crossplatform
 * @form
 * @atomicservice
 * @since 24 dynamic
 */
interface RowLayoutAlgorithmOptions {
    /**
     * 横向布局元素水平方向间距。
     * 
     * 默认值:LengthMetrics.vp(0) 
     * 
     * 非法值:按默认值处理。
     *
     * @default LengthMetrics.vp(0)
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    space?: LengthMetrics;
    /**
     * 所有子组件在垂直方向上的对齐格式。
     * 
     * 默认值:VerticalAlign.Center 
     * 
     * 非法值:按默认值处理。
     *
     * @default VerticalAlign.Center
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    alignItems?: VerticalAlign;
    /**
     * 所有子组件在水平方向上的对齐格式。
     * 
     * 默认值:FlexAlign.Start 
     * 
     * 非法值:按默认值处理。
     *
     * @default FlexAlign.Start
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    justifyContent?: FlexAlign;
    /**
     * 子组件在水平方向上的排列是否反转。取值为true表示子组件在水平方向上反转排列,由于水平方向受通用属性[direction]{@link CommonMethod#direction}影响,如果
     * [direction]{@link CommonMethod#direction}属性生效,再做一次反转。取值为false表示子组件在水平方向上正序排列。
     * 
     * 默认值:false 
     * 
     * 非法值:按默认值处理。
     *
     * @default false
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    isReverse?: boolean;
}
 
/**
 * 水平方向线性布局算法类。
 * 
 * > **说明:**
 * >
 * > RowLayoutAlgorithm类对象可以赋值给LayoutAlgorithm类型变量,作为[DynamicLayout]{@link @ohos.arkui.components.ArkDynamicLayout}组件的入参
 * > 指定布局算法。
 *
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @stagemodelonly
 * @crossplatform
 * @form
 * @atomicservice
 * @since 24 dynamic
 */
@ObservedV2
export class RowLayoutAlgorithm implements LayoutAlgorithm {
    /**
     * 水平方向线性布局算法类的构造函数。
     *
     * @param { RowLayoutAlgorithmOptions } [option] - 水平方向线性布局算法的构造入参,设置布局算法的间距、主轴对齐方式、交叉轴对齐方式及主轴排列方向。
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    constructor(option?: RowLayoutAlgorithmOptions);
    /**
     * 横向布局元素水平方向间距。
     * 
     * 默认值:LengthMetrics.vp(0) 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public space?: LengthMetrics;
    /**
     * 所有子组件在垂直方向上的对齐格式。
     * 
     * 默认值:VerticalAlign.Center 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public alignItems?: VerticalAlign;
    /**
     * 所有子组件在水平方向上的对齐格式。
     * 
     * 默认值:FlexAlign.Start 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public justifyContent?: FlexAlign;
    /**
     * 子组件在水平方向上的排列是否反转。取值为true表示子组件在水平方向上反转排列,由于水平方向受通用属性[direction]{@link CommonMethod#direction}影响,如果
     * [direction]{@link CommonMethod#direction}属性生效,再做一次反转。取值为false表示子组件在水平方向上正序排列。
     * 
     * 默认值:false 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public isReverse?: boolean;
}
 
/**
 * 设置堆叠布局算法的对齐方式。
 *
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @stagemodelonly
 * @crossplatform
 * @form
 * @atomicservice
 * @since 24 dynamic
 */
interface StackLayoutAlgorithmOptions {
    /**
     * 设置子组件在堆叠布局算法中对齐格式。
     * 
     * 默认值:LocalizedAlignment.CENTER 
     * 
     * 非法值:按默认值处理。
     *
     * @default LocalizedAlignment.Center
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    alignContent?: LocalizedAlignment;
}
 
/**
 * 堆叠布局算法类。
 * 
 * > **说明:**
 * >
 * > StackLayoutAlgorithm类对象可以赋值给LayoutAlgorithm类型变量,作为[DynamicLayout]{@link @ohos.arkui.components.ArkDynamicLayout}组件的
 * > 入参指定布局算法。
 *
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @stagemodelonly
 * @crossplatform
 * @form
 * @atomicservice
 * @since 24 dynamic
 */
@ObservedV2
export class StackLayoutAlgorithm implements LayoutAlgorithm {
    /**
     * 堆叠布局算法类的构造函数。
     *
     * @param { StackLayoutAlgorithmOptions } [option] - 堆叠布局算法的构造入参,设置九宫格对齐格式。
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    constructor(option?: StackLayoutAlgorithmOptions);
    /**
     * 设置子组件在堆叠布局算法中对齐格式。 
     * 
     * 默认值:LocalizedAlignment.CENTER 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @form
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public alignContent?: LocalizedAlignment;
}

/**
 * 设置网格布局算法的列数模板、列间距、行间距。
 *
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @stagemodelonly
 * @crossplatform
 * @atomicservice
 * @since 24 dynamic
 */
interface GridLayoutAlgorithmOptions {
    /**
     * 设置当前网格布局的列数。
     * 
     * 默认值:'1fr' 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @default '1fr'
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @atomicservice
     * @since 24 dynamic
     */
    columnsTemplate?: string | ItemFillPolicy;
    /**
     * 列与列之间的间距。
     * 
     * 默认值:LengthMetrics.vp(0) 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @default LengthMetrics.vp(0)
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @atomicservice
     * @since 24 dynamic
     */
    columnsGap?: LengthMetrics;
    /**
     * 行与行之间的间距。
     * 
     * 默认值:LengthMetrics.vp(0) 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @default LengthMetrics.vp(0)
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @atomicservice
     * @since 24 dynamic
     */
    rowsGap?: LengthMetrics;
}
 
/**
 * 网格布局算法类。
 * 
 * > **说明:**
 * >
 * > GridLayoutAlgorithm类对象可以赋值给LayoutAlgorithm类型变量,作为[DynamicLayout]{@link @ohos.arkui.components.ArkDynamicLayout}组件的入
 * > 参指定布局算法。
 *
 * @syscap SystemCapability.ArkUI.ArkUI.Full
 * @stagemodelonly
 * @crossplatform
 * @atomicservice
 * @since 24 dynamic
 */
@ObservedV2
export class GridLayoutAlgorithm implements LayoutAlgorithm {
    /**
     * 网格布局算法类的构造函数。
     *
     * @param { GridLayoutAlgorithmOptions } [option] - 网格布局算法的构造入参,设置网格布局的列数、列间距、行间距。
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @atomicservice
     * @since 24 dynamic
     */
    constructor(option?: GridLayoutAlgorithmOptions);
    /**
     * 设置当前网格布局的列数。
     * 
     * 默认值:'1fr' 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @default '1fr'
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public columnsTemplate?: string | ItemFillPolicy;
    /**
     * 列与列之间的间距。
     * 
     * 默认值:LengthMetrics.vp(0) 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @default LengthMetrics.vp(0)
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public columnsGap?: LengthMetrics;
    /**
     * 行与行之间的间距。
     * 
     * 默认值:LengthMetrics.vp(0) 
     * 
     * 非法值:按默认值处理。
     * 
     * 装饰器类型:@Trace
     *
     * @default LengthMetrics.vp(0)
     * @syscap SystemCapability.ArkUI.ArkUI.Full
     * @stagemodelonly
     * @crossplatform
     * @atomicservice
     * @since 24 dynamic
     */
    @Trace public rowsGap?: LengthMetrics;
}