import { StreamProcessor } from "../../basic/StreamProcessor";
import { InteractiveEvent, Point, RectNode } from "../../../../common";
import { GraphicNode } from "../../../../graphics";
import { AppEventContext } from "../../../../app";
import { AlignWorker } from "../../align/AlignWorker";
import { LayoutWorker } from "../../../../ability/line/LayoutWorker";
import { DuplicateWorker } from "../../../../ability/copyPaste/duplicate/DuplicateWorker";
import { HandlerCtx } from "./handler/HandlerCtx";
import { RelatedGroupBaseWorker } from "../../../../ability/group/RelatedGroupBaseWorker";
/**
 * 拖拽处理器
 * 负责处理节点拖拽、移动、对齐、关联关系更新等核心逻辑
 */
export declare class DragProcessor extends StreamProcessor {
    /** 当前拖拽的矩形选区 */
    moveRect: RectNode | null;
    /** 上一次鼠标位置 */
    lastPos: Point;
    /** 上一次移动矩形的位置 */
    lastMoveRectPos: Point;
    /** 本次拖拽需要移动的目标节点列表 */
    targetNodes: GraphicNode[];
    originContainer: GraphicNode | null;
    /** 对齐线辅助工具 */
    alignWorker: AlignWorker;
    /** 布局辅助工具（用于连线位置重算） */
    layoutWorker: LayoutWorker;
    /** 复制辅助工具（Alt+拖拽时触发复制） */
    duplicateWorker: DuplicateWorker;
    /** 节点分组辅助工具 */
    groupBaseWorker: RelatedGroupBaseWorker;
    /** 处理器上下文，包含多种节点移动处理器 */
    handlerCtx: HandlerCtx;
    /**
     * 计算需要移动的节点
     * - 按住Alt键时触发复制
     * - DocContainer的直接子节点不能移动
     * - Mindmap子节点不能移动
     * - 连线根据其连接点是否在选中节点中来决定是否移动
     */
    private computeMoveNodes;
    /**
     * 将选中节点列表转换为ID到节点的Map
     */
    private recordNodeMap;
    /**
     * 拖拽开始时的处理
     * - 记录开始日志
     * - 计算需要移动的节点
     * - 保存选区矩形和位置
     * - 如果有正在编辑的文本，取消选中
     * - 如果关联连线正在编辑，也提前取消编辑
     * - 启动分组统计
     */
    onStart(event: InteractiveEvent, ctx: AppEventContext): void;
    /**
     * 拖拽移动过程中的处理
     * - 清除之前的对齐辅助线
     * - 执行节点移动（带对齐辅助）
     * - 检测是否悬停在容器上，显示悬停容器高亮
     */
    onMove(event: InteractiveEvent, ctx: AppEventContext): void;
    /**
     * 判断连线与选中节点的关系
     * - 如果起点存在且终点不存在：连线跟随起点
     * - 如果起点和终点都存在：判断终点是否选中
     * - 如果起点不存在但终点存在：判断终点是否选中
     * - 如果起点和终点都不存在：连线跟随选中状态
     */
    private judgeLinkLineRelation;
    /**
     * 拖拽结束时的处理
     * - 执行最终的位置移动
     * - 更新节点间的关联关系（如从父容器A移动到父容器B）
     * - 记录结束日志
     * - 清除对齐辅助线
     */
    onUp(event: InteractiveEvent, ctx: AppEventContext): void;
    /**
     * 变更节点的关联关系（如切换父容器）
     * - 检测悬停的容器节点
     * - 收集需要改变关系的节点和连线
     * - 对节点进行排序并更新zIndex
     * - 执行批量更新操作
     */
    private changeNodesRelation;
    /**
     * 执行节点的移动
     * - 计算鼠标移动的差值
     * - 根据是否按住了Meta键决定是否需要对齐辅助
     * - 计算对齐结果并绘制对齐辅助线
     * - 处理随节点移动的连线（避免重复平移）
     * - 调用各处理器执行实际的节点位置更新
     * - 更新分组信息
     * - 触发连线布局重算
     */
    private moveNode;
    /**
     * 检测鼠标是否悬停在某个容器上
     * - 通过探测器检测悬停的容器
     * - 如果悬停容器是移动节点的祖先容器，则返回null（避免嵌套）
     */
    private hoverOnContainer;
    private detectSectionAtPoint;
    /**
     * 选中内容包围盒移动位置
     */
    private moveRectChange;
    /**
     * 检查是否存在对齐结果
     * 对齐结果可以是上、下、左、右、水平中点、垂直中点之一
     */
    private checkAlign;
    /**
     * 收集随节点移动的连线
     * 这些连线会随着节点一起移动，不需要额外再平移一次
     * - 跳过已经是节点后代连线的连线
     * - 只收集起点和终点都是移动节点后代的情况
     *
     * 比如两个节点 A、B 都在同一个被拖动的容器里，A 和 B 之间有一条线。拖动外层容器时，
     * 这条线其实已经跟着容器一起走了。如果再让布局系统重算/平移一次，就可能重复移动。
     */
    private collectMoveWithNodesLines;
    /**
     * 按显示顺序收集节点及其所有后代（前序深度优先，每层按 zIndex 排序）
     */
    private collectNodesWithChildren;
    /**
     * 批量收集节点关联的连线
     */
    private batchCollectNodeLinks;
    /**
     * 收集单个节点关联的连线
     * - 从节点管理器获取直接关联的连线
     * - 递归收集子节点中的连线
     */
    private collectNodeLinks;
}
//# sourceMappingURL=DragProcessor.d.ts.map