import type { Align } from './types';
import type Context from './Context';
export type TextSelectionRange = {
    start: number;
    end: number;
};
export type TextGlyph = {
    char: string;
    index: number;
    line: number;
    x: number;
    y: number;
    width: number;
    height: number;
};
export type TextLineItem = {
    char: string;
    sourceIndex: number;
    ellipsis?: boolean;
};
export type TextLayoutLine = {
    items: TextLineItem[];
    text: string;
    caretIndex: number;
    lineIndex: number;
    drawX: number;
    drawY: number;
    width: number;
    segments: TextLineSegment[];
};
export type TextLineSegment = {
    char: string;
    itemIndex: number;
    sourceIndex: number;
    x: number;
    width: number;
};
export type TextLayout = {
    text: string;
    chars: string[];
    glyphs: TextGlyph[];
    lines: TextLayoutLine[];
    box: {
        x: number;
        y: number;
        width: number;
        height: number;
    };
    contentBox: {
        x: number;
        y: number;
        width: number;
        height: number;
    };
    contentY: number;
    lineHeight: number;
    font: string;
    color: string;
    align: Align;
    ellipsis: boolean;
};
export default class TextSelector {
    private static readonly DRAG_THRESHOLD;
    private ctx;
    private layouts;
    private activeCellKey;
    private selectionStart;
    private selectionEnd;
    private pending;
    constructor(ctx: Context);
    private get canSelect();
    /** 跨表头列或从表头拖入 body 时，让位给列/区域选择 */
    private yieldToColumnDrag;
    private onMouseDown;
    private onMouseMove;
    private tryStartDrag;
    private onMouseUp;
    private onCopyKeydown;
    /**
     * 命中最顶层文字（固定列/表头后绘制会覆盖普通单元格，取最后一个命中）。
     */
    private hitTest;
    private updateSelection;
    private hitTestText;
    clearLayouts(): void;
    draw(): void;
    private drawTextSelection;
    private getSelectionRange;
    private getSelectedText;
    private resetSelection;
    destroy(): void;
}
