/**
 * GroupRow - Special row type for grouped table rendering
 * Handles rendering of group header rows and separator rows
 */
import Context from './Context';
import type DataGrid from './DataGrid';
import { type GroupedTableRowData } from './types';
/**
 * GroupRow class for rendering group headers and separators
 */
declare class GroupRow extends Context {
    data: GroupedTableRowData;
    rowIndex: number;
    _rowId: string;
    isGroupHeader: boolean;
    isSeparator: boolean;
    hoverColIndex: number;
    /** 当 hover 列为 nested 父列时，记录鼠标所在的子列偏移索引（-1 表示不在子列上） */
    hoverSubColIndex: number;
    /** 鼠标是否 hover 在当前组头行上 */
    isHovered: boolean;
    /** 鼠标是否 hover 在展开箭头区域附近（包括 checkbox 区域） */
    isArrowAreaHovered: boolean;
    /** 人员工时图标的边界矩形缓存，用于点击和悬停命中检测 */
    private userWorkingHoursIconRect;
    constructor(grid: DataGrid, rowIndex: number, x: number, y: number, height: number, data: GroupedTableRowData);
    /**
     * Draw the group row
     */
    draw(): void;
    /**
     * 获取指定 groupLevel 的水平缩进量（非线性）
     * level 0: 0px（无缩进）
     * level 1: 18px
     * level 2+: 18px（与 level 1 相同，避免叶子分组过度靠右）
     */
    private getLevelIndent;
    /**
     * 获取组头行的搜索命中状态。
     *
     * 状态来源：rowDataAdapter.preprocessRow 在 isGroup 行上注入的
     * `_groupHeaderSearchMatched` 和 `_groupHeaderSearchCurrentHighlight` 字段。
     *
     * - Separator 行（isSeparateRow）永远返回 false/false，不承载搜索命中语义；
     * - 非 isGroupHeader 行也返回 false/false（防御性兜底）；
     * - currentHighlight = true 时，draw() 会绘制 2px 橙色 inset 边框。
     */
    getGroupHeaderSearchMatchState(): {
        matched: boolean;
        currentHighlight: boolean;
    };
    /**
     * 获取组头行搜索命中高亮的"首列左边框" x 坐标。
     *
     * 方案 1A（顶/底/左三边同步内缩到色条右缘）：按 (maxGroupLevel, groupLevel)
     * 计算序号列分层色条的宽度 `barWidth`，返回 `this.x + barWidth`，使左边框与
     * `drawGroupHeader` 中色条右缘的灰色分隔竖线 x 位置完全对齐——色条区域不被
     * 橙色边框包裹，保留分层层次感。
     *
     * barWidth 规则（与 drawGroupHeader 色条绘制逻辑一致）：
     *   maxGroupLevel=0 (1D) → 无色条，barWidth = 0
     *   maxGroupLevel=1 (2D)：groupLevel=0 → 0；groupLevel>=1 → l0w (6)
     *   maxGroupLevel=2 (3D)：groupLevel=0 → 0；groupLevel>=1 → l0w (6)；groupLevel>=2 → l0w+l1w (16)
     *
     * @param groupLevel - 当前组头行的层级（0 表示最外层）
     * @returns 色条右缘的 x 坐标，作为顶/底/左三边的公共起点
     */
    getSearchHighlightFirstLeftBorderX(groupLevel: number): number;
    /**
     * 绘制组头行搜索命中的 2px 橙色 inset 边框（对齐 DOM 表格 data-search-matched-highlight 行为）。
     *
     * 边框组合（方案 1A：顶/底/左三边同步内缩到色条右缘）：
     * - 顶边 + 底边：从 `firstLeftX`（色条右缘）横跨到可视区域右边界，不覆盖序号列色条区
     * - 首列左边：贴在 `firstLeftX`，与顶/底边起点对齐，视觉上与 `drawGroupHeader`
     *   中色条右缘的灰色分隔竖线同列，使第二/第三层组头命中框与分组原有左边界对齐
     * - 末列右边：仅当表格末列在可视区域内时绘制，位置保持不变（tableRightEdge）
     *
     * 色条区域（`this.x` 到 `firstLeftX` 之间）刻意不被橙色边框包裹，继续保留分层层次感。
     *
     * 仅当"当前高亮"（currentHighlight = true）时绘制，与 DOM 表格保持一致——
     * "命中但非当前"状态不渲染边框，避免多条命中之间的视觉噪音。
     */
    private drawSearchHighlightBorder;
    /**
     * Draw group header row
     */
    private drawGroupHeader;
    /**
     * Draw expand/collapse arrow using SVG path from icon_singlearrowright.svg
     * SVG viewBox: 0 0 32 32, rendered at 16x16 (scale 0.5)
     * Collapsed: right arrow (original orientation)
     * Expanded: rotated 90° clockwise → down arrow
     */
    private drawExpandArrow;
    /**
     * 绘制 hook_mark / mark_bg_color 图标容器
     * 对应 DOM 表格 group-header-cell.ts 中的 groupStatusContainer 逻辑
     * @returns 图标容器占用的宽度（含右侧 4px 间距），供调用方更新 currentX
     */
    private drawHookMarkIcon;
    /**
     * 将图片重着色为指定颜色（offscreen canvas + source-in 合成）
     */
    private recolorImage;
    /**
     * Draw group name (supports string or array)
     */
    private drawGroupName;
    /**
     * 解析分组名称应使用的 viewer 类型和数据
     * 使用外部显式传入的 groupNameViewerType + groupNameViewerData（由 AssetMatrix buildGroupNameViewerData 构建），
     * 否则回退到文本渲染
     */
    private resolveGroupNameViewer;
    /**
     * 根据列 key 从 grid.columns 中查找列配置
     */
    /**
     * 使用 viewer 绘制分组名称区域
     * 根据 viewerType 从 ViewerRegistry 获取对应的 viewer 实例来渲染，
     * 参考旧表格 GroupHeaderCell.updateMiddle 中根据字段 editor 类型分派渲染的逻辑
     */
    private drawGroupNameWithViewer;
    /**
     * 估算 viewer 绘制后的宽度，用于定位后续元素（如 count badge）
     * 针对不同 viewer 类型的绘制逻辑进行精确估算，避免内联统计值与 viewer 内容重叠
     */
    private estimateViewerWidth;
    /**
     * Draw count badge
     * 返回绘制后的 X 坐标，用于后续元素定位
     */
    private drawCountBadge;
    /**
     * 获取校验通过样式
     * 当分组是叶子分组（isLeafGroup）且有有效的 validation 数据时返回样式
     * 参考旧表格 table-switcher-cell.ts 中 getValidationStyle 方法
     */
    private getValidationStyle;
    /**
     * 在展开箭头右边绘制校验图标或 checkbox
     * 参考旧表格 table-switcher-cell.ts 的布局：
     *   .before (展开箭头) 在左，.middle (checkbox) 在右
     * 交互逻辑：
     * - 有 validation 数据且未 checked 且未 hover → 显示校验图标（✅）
     * - hover 展开箭头区域时 → 校验图标变成 checkbox
     * - 无 validation 数据时 hover → 显示 checkbox
     * @returns 绘制后的 X 坐标
     */
    private drawGroupValidationOrCheckbox;
    /**
     * 在展开箭头右边内联绘制 checkbox
     * @returns 绘制后的 X 坐标
     */
    private drawInlineCheckbox;
    /**
     * 在展开箭头右边内联绘制校验图标（绿色勾选圆圈）
     * 与旧表格 .before 内 .checked-done { font-size: 17px; color: #00bd77; } 对齐
     * @returns 绘制后的 X 坐标
     */
    private drawInlineValidationIcon;
    /**
     * 检测点击是否在校验图标/checkbox 区域内
     * 区域范围：展开箭头右侧的校验图标/checkbox 所在位置
     */
    private isInsideCheckboxArea;
    /**
     * 检测鼠标是否在人员工时图标区域内
     */
    private isInsideUserWorkingHoursIcon;
    /**
     * 检测点击是否在整个 index 列区域内（序号列区域）
     * 用于一维分组下判断鼠标是否在 index 列 hover
     */
    private isInsideIndexColumnArea;
    /**
     * 获取第一个有 colKey 的数据列（即第一个非系统列）
     * 用于定位分组名称的起始位置
     */
    private getFirstDataColumn;
    /**
     * 绘制内联统计值（跟在分组名称+计数后面）
     * 用于第一个数据列的统计数字
     */
    private drawInlineStatValue;
    /**
     * Draw separator row
     *
     * 背景色逻辑与 DOM 模式对齐：
     * - _separatorStyle === 'gray'：最外层分组之间的间隙，使用灰色（#e6eaf0）
     * - _separatorStyle === 'white'：内层组间间隙，使用白色（#fff）
     * - 未设置 _separatorStyle 时（兼容旧数据）：回退到按 separateLevel 选择颜色
     *
     * 序号列分层背景色：与数据行 RowHeader 的分层效果一致，
     * 根据 _parentGroupLevel 在最左侧绘制 level0/level1 的缩进色块
     */
    private drawSeparator;
    /**
     * 绘制组头行各列的统计单元格
     */
    private drawGroupHeaderCells;
    /**
     * 获取列在屏幕上的实际 X 坐标
     */
    private getColumnScreenX;
    /**
     * 获取鼠标悬停所在的列索引（考虑固定列和滚动偏移），同时更新 hoverSubColIndex
     */
    getHoverColumnIndex(mouseX: number): number;
    /** 获取指定 nested 父列的所有子列列头 */
    private getNestedChildHeaders;
    /** 安全获取 canvas 元素的视口边界（测试环境中 target 可能不存在） */
    private getCanvasRect;
    /**
     * 绘制单个统计单元格
     */
    private drawStatCell;
    /**
     * 绘制 nested 列的子统计单元格拆分渲染
     */
    private drawNestedStatCell;
    /**
     * 绘制 "数据统计" 提示文字
     */
    private drawHintText;
    /**
     * 绘制 "数据统计" 提示文字（指定最大宽度）
     */
    private drawHintTextWithMaxWidth;
    /**
     * 绘制刷新图标（icon_backtodefault）
     * @param x 刷新图标区域左边界（包含 padding）
     */
    private drawRefreshIcon;
    /**
     * 绘制 loading 旋转图标（替代刷新icon位置）
     * @param x loading 图标区域左边界（包含 padding，与刷新icon位置对齐）
     */
    private drawLoadingIcon;
    /**
     * 截断文字并添加省略号，不压缩文字宽度
     */
    private truncateText;
    /**
     * 绘制下拉箭头图标
     */
    private drawArrowIcon;
    /**
     * Check if point is inside the expand arrow area
     */
    isInsideExpandArrow(mouseX: number, mouseY: number): boolean;
    /**
     * Check if this row is visible in the viewport
     */
    isVerticalVisibleOnBody(): boolean;
    /**
     * Check if mouse is inside vertical body boundary
     */
    isInsideVerticaBodyBoundary(mouseX: number, mouseY: number): boolean;
    /**
     * Get the group name viewer area bounds for hit testing
     * Returns the viewer bounds (x, y, width) and the resolved viewer + data, or null if no viewer
     */
    private getGroupNameViewerInfo;
    /**
     * Check viewer hover state for group name area (e.g. person name underline on hover)
     * Called from mouseMove to update viewer's internal hover tracking
     */
    private checkGroupNameViewerHover;
    /**
     * Handle click on group name viewer area (e.g. person name click-to-jump)
     * Returns true if the click was handled by the viewer
     */
    private handleGroupNameViewerClick;
    /**
     * Reset group name viewer hover state (called when mouse leaves this GroupRow)
     */
    resetGroupNameViewerHover(): void;
    /**
     * Handle click on group row
     */
    handleClick(mouseX: number, mouseY: number): boolean;
    /**
     * 计算该组下将新增的选中行数（不含已选中的行）
     * 用于 maxSelectedRows 前置校验
     *
     * @param groupId - 组头行的 ID
     * @returns 该组内尚未选中的普通行数量
     */
    private countGroupRows;
    /**
     * Placeholder methods for compatibility with Row interface
     */
    rePaint(): void;
    resizeColumn(_colIndex: number, _diffWidth: number): void;
    checked: boolean;
    handleCheck(_checked?: boolean): void;
    isInVerticalAutofill(_mouseX: number, _mouseY: number): boolean;
    handleAutofill(_x: number, _y: number): void;
    handleStartAutofill(_x: number, _y: number, _shiftKey?: boolean): void;
    isInsideVerticaTableBoundary(mouseX: number, mouseY: number): boolean;
    mouseMove(x: number, y: number): void;
    mouseDown(_x: number, _y: number): void;
    click(x: number, y: number, clientX?: number, clientY?: number): void;
    /** 处理 nested 子列点击 */
    private onNestedChildClick;
    /**
     * 检测鼠标是否在嵌套子列的刷新图标区域内
     */
    private isInsideNestedRefreshIcon;
    /**
     * 从列配置中查找指定 key 的列。
     * 注意：必须按 key 匹配，不能按 index — grid.headers 由 calCrossSpan 生成的复合表头树形结构，
     * 元素本身并无 index 字段（HeaderConfig 仅有 level/rowspan/colspan/children），
     * 而 ColumnHeader 的 index 是叶子列序号，与 headers 树形结构无对应关系。
     */
    private findColumnConfig;
    dbClick(_x: number, _y: number): void;
    rowHeader: {
        handleCheck: (_val: boolean) => void;
    };
    allCells: any[];
    cells: any[];
    fixedCells: any[];
}
export default GroupRow;
