import { AbsLineLayoutHandler } from "../AbsLineLayoutHandler";
import type { OolongLine } from "../../../../graphics";
import { AppEventContext } from "../../../../app";
import { AbsLayoutHandler } from "./handler/AbsLayoutHandler";
import { TopLayoutHandler } from "./handler/TopLayoutHandler";
import { IConnectEnd, IPoint } from "../../../../idl";
import { FreePointLayoutHandler } from "./handler/FreePointLayoutHandler";
import { ConnectInfo } from "../../../../graphics/base/NodeConnectEndType";
import { BottomLayoutHandler } from "./handler/BottomLayoutHandler";
import { LeftLayoutHandler } from "./handler/LeftLayoutHandler";
import { RightLayoutHandler } from "./handler/RightLayoutHandler";
/**
 * 折线/圆角折线的自动布局处理器。
 *
 * 这个类只负责把“连接信息”转换成线条的点数组，不直接关心渲染。
 *
 * 这里有两种主要入口：
 * 1. layoutToPoints：
 *    面向已有 OolongLine。常用于节点移动、连接节点位置变化后重新计算线条。
 *    输入是 line + ctx，方法内部会从 line.connectProps 中读取 start/end 连接关系。
 *
 * 2. layoutToPointsPro：
 *    面向更底层的连接信息。常用于创建连线、拖拽端点、快速创建等交互过程。
 *    调用方已经提前算好了 start/end 的 ConnectInfo，这里只负责产出全局坐标点。
 *
 * 坐标约定：
 * - 自动布局内部使用全局坐标，方便跨父容器、跨节点计算绕线。
 * - 写回 LineProps 前，再由调用方或 layoutToPoints 转成线所属父容器下的本地坐标。
 */
export declare class PolyLineLayoutHandler extends AbsLineLayoutHandler {
    /**
     * 当前布局处理器只处理折线类线条。
     * OolongLine.isPolyLine() 会覆盖普通折线和圆角折线两类。
     */
    enable(line: OolongLine): boolean;
    /**
     * 根据已有 line 的连接关系重新计算折线路径。
     *
     * 这个方法会区分“手动编辑过的折线”和“自动布局折线”：
     *
     * - lineProps.auto === false 且点数大于 2：
     *   说明用户已经手动调整过折线路径。此时不能完全重算路径，否则会抹掉用户拖出来的中间折点。
     *   所以这里只更新起点/终点贴住节点的位置，并保持相邻第一段/最后一段的水平或垂直方向。
     *
     * - 其他情况：
     *   说明可以走自动布局。根据起点连接边选择对应的方向布局器，再根据终点连接边计算完整路径。
     */
    layoutToPoints(line: OolongLine, ctx: AppEventContext): IPoint[];
    /**
     * 根据显式的起点/终点连接信息计算折线路径。
     *
     * 这是创建连线、拖拽端点、锚点快速创建等流程共用的底层入口。
     * 返回的是全局坐标点，调用方负责按线条父容器转换成本地坐标。
     */
    layoutToPointsPro(start: ConnectInfo, end: ConnectInfo): IPoint[];
    /**
     * 根据起点连接信息选择布局器。
     *
     * 起点不连接节点时：
     * - 使用 FreePointLayoutHandler，表示从自由点出发。
     *
     * 起点连接节点时：
     * - 起点在节点 Top 边，使用 TopLayoutHandler。
     * - 起点在节点 Right 边，使用 RightLayoutHandler。
     * - 起点在节点 Bottom 边，使用 BottomLayoutHandler。
     * - 起点在节点 Left 边，使用 LeftLayoutHandler。
     *
     * 各方向 handler 内部封装了“从该边出发时如何绕开源节点和目标节点”的规则。
     */
    getLayoutHandlerV2({ point, nodeConnect }: ConnectInfo): TopLayoutHandler | FreePointLayoutHandler | BottomLayoutHandler | LeftLayoutHandler | RightLayoutHandler;
    /**
     * 根据终点连接信息，调用布局器中对应的终点方向方法。
     *
     * 这里和 getLayoutHandlerV2 是一组：
     * - getLayoutHandlerV2 由“起点在哪条边”决定起点布局器。
     * - computePointsV2 由“终点在哪条边”决定调用 right/left/bottom/top 哪个方法。
     *
     * 如果终点不是节点连接点，就调用 handler.toPoint(point)，表示连到一个自由点。
     */
    computePointsV2(handler: AbsLayoutHandler, { point, nodeConnect }: ConnectInfo): IPoint[];
    /**
     * 从已有 line 的 start connectProps 中恢复起点 ConnectInfo，并返回对应的布局器。
     *
     * connectProps.start 只保存：
     * - 连接节点 id
     * - 连接点在节点内的相对坐标 x/y
     *
     * 自动布局真正需要的是：
     * - 全局连接点 point
     * - 节点全局矩形 rect
     * - 连接点所在边 endType
     *
     * 所以这里会通过 ctx.nodeManager 找到节点，把相对信息转换成完整 ConnectInfo。
     */
    getLayoutHandler(line: OolongLine, start: IConnectEnd | null, ctx: AppEventContext): AbsLayoutHandler;
    /**
     * 从已有 line 的 end connectProps 中恢复终点 ConnectInfo，并计算完整路径。
     *
     * InteractiveUtils.computeConnectInfo 会处理：
     * - 终点未连接节点：使用 line 当前最后一个全局点。
     * - 终点连接节点：根据节点和相对坐标重新计算当前全局连接点和连接边。
     */
    computeLayout(handler: AbsLayoutHandler, line: OolongLine, end: IConnectEnd | null, ctx: AppEventContext): IPoint[];
}
//# sourceMappingURL=PolyLineLayoutHandler.d.ts.map