import type { CellAddress, CellRange, CellLocation, FieldDef, CellAddressWithBound } from './table-engine';
import type { DropDownMenuEventArgs, MenuListItem, PivotInfo } from './menu';
import type { IDimensionInfo, MergeCellInfo, RectProps, SortOrder } from './common';
import type { IconFuncTypeEnum, CellInfo, HierarchyState, ColumnsDefine } from '.';
import type { Icon } from '../scenegraph/graphic/icon';
import type { FederatedPointerEvent, Group, IEventTarget } from './../vrender';
import type { BaseTableConstructorOptions } from './base-table';
export type KeyboardEventListener = (e: KeyboardEvent) => void;
export type TableEventListener<TYPE extends keyof TableEventHandlersEventArgumentMap> = (args: TableEventHandlersEventArgumentMap[TYPE]) => TableEventHandlersReturnMap[TYPE];
export type EventListenerId = number;
export type SelectedCellEvent = CellAddress & {
    ranges: CellRange[];
};
export type MenuEvent = CellAddress & {
    dropDownMenu: MenuListItem[];
    pivotInfo: PivotInfo;
};
export type TouchCellEvent = CellAddress & {
    event: TouchEvent;
};
export type KeydownEvent = {
    keyCode: number;
    code: string;
    event: KeyboardEvent;
    stopCellMoving?: () => void;
    scaleRatio?: number;
};
export type MousePointerCellEvent = CellAddressWithBound & CellInfo & {
    scaleRatio?: number;
    targetIcon?: {
        name: string;
        position: RectProps;
        funcType: string;
    };
    event?: MouseEvent | PointerEvent | TouchEvent;
    federatedEvent?: FederatedPointerEvent;
    target: IEventTarget | undefined;
    mergeCellInfo?: MergeCellInfo;
};
export type MousePointerMultiCellEvent = MousePointerCellEvent & {
    cells: CellInfo[][];
};
export type MousePointerSparklineEvent = MousePointerCellEvent & {
    sparkline: {
        pointData: any;
    };
};
export interface TableEventHandlersEventArgumentMap {
    selected_cell: SelectedCellEvent;
    selected_clear: {};
    click_cell: MousePointerCellEvent;
    dblclick_cell: MousePointerCellEvent;
    mouseenter_table: {
        event?: MouseEvent | PointerEvent | TouchEvent;
    };
    mouseleave_table: {
        event?: MouseEvent | PointerEvent | TouchEvent;
    };
    mousedown_table: {
        event?: MouseEvent | PointerEvent | TouchEvent;
    };
    mousemove_table: MousePointerCellEvent;
    mouseenter_cell: MousePointerCellEvent;
    mouseleave_cell: MousePointerCellEvent;
    mousemove_cell: MousePointerCellEvent;
    mousedown_cell: MousePointerCellEvent;
    mouseup_cell: MousePointerCellEvent;
    contextmenu_cell: MousePointerMultiCellEvent;
    contextmenu_canvas: MousePointerCellEvent;
    before_keydown: KeydownEvent;
    keydown: KeydownEvent;
    scroll: {
        event: WheelEvent;
        scrollLeft: number;
        scrollTop: number;
        scrollWidth: number;
        scrollHeight: number;
        viewWidth: number;
        viewHeight: number;
        scrollDirection: 'horizontal' | 'vertical';
        scrollRatioX?: number;
        scrollRatioY?: number;
        dx?: number;
        dy?: number;
    };
    can_scroll: {
        event: WheelEvent;
        scrollLeft: number;
        scrollTop: number;
        scrollWidth: number;
        scrollHeight: number;
        viewWidth: number;
        viewHeight: number;
        scrollDirection: 'horizontal' | 'vertical';
        scrollRatioX?: number;
        scrollRatioY?: number;
        dx?: number;
        dy?: number;
    };
    scroll_vertical_end: {
        scrollLeft: number;
        scrollTop: number;
        scrollWidth: number;
        scrollHeight: number;
        viewWidth: number;
        viewHeight: number;
    };
    scroll_horizontal_end: {
        scrollLeft: number;
        scrollTop: number;
        scrollWidth: number;
        scrollHeight: number;
        viewWidth: number;
        viewHeight: number;
    };
    resize_column: {
        col: number;
        colWidth: number;
    };
    resize_column_end: {
        col: number;
        colWidths: number[];
    };
    resize_row: {
        row: number;
        rowHeight: number;
    };
    resize_row_end: {
        row: number;
        rowHeight: number;
    };
    change_header_position: {
        source: CellAddress;
        target: CellAddress;
        movingColumnOrRow?: 'column' | 'row';
        event: Event;
    };
    change_header_position_start: {
        col: number;
        row: number;
        x: number;
        y: number;
        backX: number;
        lineX: number;
        backY: number;
        lineY: number;
        event: Event;
        movingColumnOrRow?: 'column' | 'row';
    };
    changing_header_position: {
        col: number;
        row: number;
        x: number;
        y: number;
        backX: number;
        lineX: number;
        backY: number;
        lineY: number;
        event: Event;
        movingColumnOrRow?: 'column' | 'row';
    };
    change_header_position_fail: {
        source: CellAddress;
        target: CellAddress;
        movingColumnOrRow?: 'column' | 'row';
        event: Event;
    };
    sort_click: {
        field: FieldDef;
        order: SortOrder;
        event: Event;
    };
    after_sort: {
        field: FieldDef;
        order: SortOrder;
        event: Event;
    };
    freeze_click: {
        col: number;
        row: number;
        fields: FieldDef[];
        colCount: number;
    };
    dropdown_menu_click: DropDownMenuEventArgs;
    mouseover_chart_symbol: MousePointerSparklineEvent;
    drag_select_end: MousePointerMultiCellEvent;
    selected_changed: {
        col: number;
        row: number;
        ranges: CellRange[];
    };
    copy_data: {
        cellRange: CellRange[];
        copyData: string;
        isCut: boolean;
    };
    drillmenu_click: DrillMenuEventInfo;
    dropdown_icon_click: CellAddress & {
        event: Event;
    };
    dropdown_menu_clear: CellAddress;
    show_menu: {
        x: number;
        y: number;
        col: number;
        row: number;
        type: 'dropDown' | 'contextmenu' | 'custom';
    };
    hide_menu: [];
    icon_click: {
        name: string;
        col: number;
        row: number;
        x: number;
        y: number;
        funcType?: IconFuncTypeEnum | string;
        icon: Icon;
        event: Event;
    };
    pivot_sort_click: {
        col: number;
        row: number;
        order: SortOrder;
        dimensionInfo: IDimensionInfo[];
        cellLocation: CellLocation;
        event: Event;
    };
    tree_hierarchy_state_change: {
        col: number;
        row: number;
        changeAll?: boolean;
        hierarchyState: HierarchyState;
        dimensionInfo?: IDimensionInfo[];
        originData?: any;
        cellLocation?: CellLocation;
    };
    vchart_event_type: {
        eventName: string;
        col: number;
        row: number;
        chartEventArguments: any;
    };
    change_order: [];
    source_length_update: number;
    legend_item_click: {
        model: any;
        value: any;
        event: PointerEvent;
    };
    legend_item_hover: {
        model: any;
        value: any;
        event: PointerEvent;
    };
    legend_item_unHover: {
        model: any;
        value: any;
        event: PointerEvent;
    };
    legend_change: {
        model: any;
        value: any;
        event: PointerEvent;
    };
    mouseenter_axis: MousePointerCellEvent & {
        axisPosition: 'left' | 'right' | 'top' | 'bottom';
    };
    mouseleave_axis: MousePointerCellEvent & {
        axisPosition: 'left' | 'right' | 'top' | 'bottom';
    };
    checkbox_state_change: MousePointerCellEvent & {
        checked: boolean;
    };
    radio_state_change: MousePointerCellEvent & {
        radioIndexInCell: number | undefined;
    };
    switch_state_change: MousePointerCellEvent & {
        checked: boolean;
    };
    before_init: {
        options: BaseTableConstructorOptions;
        container: HTMLElement | null;
    };
    before_update_option: {
        options: BaseTableConstructorOptions;
        container: HTMLElement | null;
    };
    before_set_size: {
        width: number;
        height: number;
    };
    after_render: null;
    initialized: null;
    updated: null;
    after_update_cell_content_width: {
        col: number;
        row: number;
        cellHeight: number;
        cellGroup: Group;
        padding: [number, number, number, number];
        textBaseline: CanvasTextBaseline;
    };
    after_update_select_border_height: {
        startRow: number;
        endRow: number;
        currentHeight: number;
        selectComp: {
            rect: any;
            fillhandle?: any;
            role: string;
        };
    };
    change_cell_value: {
        col: number;
        row: number;
        recordIndex?: number | number[];
        field?: FieldDef;
        rawValue: string | number;
        currentValue: string | number;
        changedValue: string | number;
    };
    change_cell_values: {
        values: {
            col: number;
            row: number;
            recordIndex?: number | number[];
            field?: FieldDef;
            rawValue: string | number;
            currentValue: string | number;
            changedValue: string | number;
        }[];
    };
    mousedown_fill_handle: {};
    drag_fill_handle_end: {
        direction?: 'top' | 'bottom' | 'left' | 'right';
    };
    dblclick_fill_handle: {};
    empty_tip_click: {};
    empty_tip_dblclick: {};
    button_click: {
        col: number;
        row: number;
        event: Event;
    };
    before_cache_chart_image: {
        chartInstance: any;
    };
    pasted_data: {
        col: number;
        row: number;
        pasteData: (string | number)[][];
        changedCellResults: boolean[][];
    };
    plugin_event: {
        event: any;
        plugin: any;
        pluginEventInfo: any;
    };
    add_record: {
        records: any[];
        recordIndex?: number | number[];
        recordCount: number;
    };
    delete_record: {
        recordIndexs: number[] | number[][];
        records: any[];
        rowIndexs: number[];
        deletedCount: number;
    };
    update_record: {
        records: any[];
        recordIndexs: (number | number[])[];
        updateCount: number;
    };
    add_column: {
        columnIndex: number;
        columnCount: number;
        columns: ColumnsDefine;
    };
    delete_column: {
        deleteColIndexs: number[];
        columns: ColumnsDefine;
        deletedColumns?: ColumnsDefine;
        deletedRecordValues?: any[][];
    };
    merge_cells: {
        startCol: number;
        startRow: number;
        endCol: number;
        endRow: number;
    };
    unmerge_cells: {
        startCol: number;
        startRow: number;
        endCol: number;
        endRow: number;
    };
}
export interface DrillMenuEventInfo {
    dimensionKey: string | number;
    title: string;
    drillDown: boolean;
    drillUp: boolean;
    col: number;
    row: number;
    event: Event;
}
export interface TableEventHandlersReturnMap {
    selected_cell: void;
    selected_clear: void;
    click_cell: void;
    dblclick_cell: void;
    mouseenter_table: void;
    mouseleave_table: void;
    mousedown_table: void;
    mousemove_table: void;
    mouseenter_cell: void;
    mouseleave_cell: void;
    mouseout_cell: void;
    mousemove_cell: void;
    mousedown_cell: void;
    mouseup_cell: void;
    contextmenu_cell: void;
    contextmenu_canvas: void;
    before_keydown: void;
    keydown: void;
    scroll: void;
    can_scroll: void | boolean;
    focus_table: void;
    blur_table: void;
    resize_column: void;
    resize_column_end: void;
    resize_row: void;
    resize_row_end: void;
    change_header_position: void;
    change_header_position_start: void;
    changing_header_position: void;
    change_header_position_fail: void;
    sort_click: boolean;
    after_sort: void;
    freeze_click: void;
    dropdown_menu_click: void;
    mouseover_chart_symbol: void;
    drag_select_end: void;
    selected_changed: void;
    copy_data: void;
    drillmenu_click: void;
    dropdown_icon_click: void;
    dropdown_menu_clear: void;
    show_menu: void;
    hide_menu: void;
    icon_click: void;
    pivot_sort_click: void;
    tree_hierarchy_state_change: void;
    vchart_event_type: void;
    change_order: void;
    source_length_update: void;
    legend_item_click: void;
    legend_item_hover: void;
    legend_item_unHover: void;
    legend_change: void;
    mouseenter_axis: void;
    mouseleave_axis: void;
    checkbox_state_change: void;
    radio_state_change: void;
    switch_state_change: void;
    before_init: void;
    before_update_option: void;
    before_set_size: void;
    after_render: void;
    initialized: void;
    updated: void;
    after_update_cell_content_width: void;
    after_update_select_border_height: void;
    change_cell_value: void;
    change_cell_values: void;
    mousedown_fill_handle: void;
    drag_fill_handle_end: void;
    dblclick_fill_handle: void;
    scroll_vertical_end: void;
    scroll_horizontal_end: void;
    empty_tip_click: void;
    empty_tip_dblclick: void;
    button_click: void;
    before_cache_chart_image: void;
    pasted_data: void;
    plugin_event: void;
    add_record: void;
    delete_record: void;
    update_record: void;
    add_column: void;
    delete_column: void;
    merge_cells: void;
    unmerge_cells: void;
    filter_menu_show: {
        col: number;
        row: number;
    };
    filter_menu_hide: {
        col: number;
        row: number;
    };
}
