import { CanvasColor, ICanvasContext2D } from "./CanvasContext2D";
import { CustomFilter, CustomRowColStyle, CustomSort, ICanvasTableColumn, ICanvasTableColumnConf, ICanvasTableColumnSort, IEditRowItem, IUpdateRect } from "./CanvasTableColum";
import { CanvasTableMode } from "./CanvasTableMode";
import { ICanvasTableTouchEvent } from "./CanvasTableTouchEvent";
import { CanvasTableIndex, CanvasTableRowItem, CanvasTableRowItemSelect, ICanvasTableGroupItemColMode, ICanvasTableGroupItemRowMode, ICanvasTableIndexsRowMode, ICanvasTableRowItemSelectColMode } from "./CustomCanvasIndex";
import { IDrawable } from "./Drawable";
import { EventManagerClick, EventManagerClickHeader, EventManagerEdit, EventManagerReCalcForScrollView } from "./EventManager";
import { IScrollViewConfig, ScrollView } from "./ScrollView";
export interface IDrawConfig {
    drawOnly?: number[];
}
export interface ICanvasTableGroup {
    field: string;
    aggregate?: (data: ICanvasTableGroupItemRowMode | ICanvasTableGroupItemRowMode | ICanvasTableGroupItemColMode) => string;
    renderer?: (data: ICanvasTableGroupItemRowMode | ICanvasTableGroupItemColMode, canvasTable: CustomCanvasTable, context: ICanvasContext2D, left: number, top: number, right: number, bottom: number, width: number, height: number, r: number) => void;
}
export interface ICanvasRowTableGroup {
    field: string;
    aggregate?: (data: ICanvasTableIndexsRowMode) => string;
    renderer?: (data: ICanvasTableIndexsRowMode, canvasTable: CustomCanvasTable, context: ICanvasContext2D, left: number, top: number, right: number, bottom: number, width: number, height: number, r: number) => void;
}
/**
 * Interface to config style of CanvasTable
 */
export interface ICanvasTableConfig {
    /**
     * ScollView config
     */
    scrollView?: IScrollViewConfig;
    /**
     * FontName
     */
    font?: string;
    /**
     * Font Style
     */
    fontStyle?: string;
    /**
     * Font size in px
     */
    fontSize?: number;
    /**
     * Font color
     */
    fontColor?: CanvasColor;
    /**
     * Header font name
     */
    headerFont?: string;
    /**
     * Header font style
     */
    headerFontStyle?: string;
    /**
     * Header font size in px
     */
    headerFontSize?: number;
    /**
     * Header front color
     */
    headerFontColor?: CanvasColor;
    /**
     * Header Draw sort arrow
     */
    headerDrawSortArrow?: boolean;
    /**
     * Header draw sort arrow color
     */
    headerDrawSortArrowColor?: CanvasColor;
    /**
     * Header: background color in header
     */
    headerBackgroundColor?: CanvasColor;
    /**
     * Group item: font color
     */
    groupItemFontColor?: CanvasColor;
    /**
     * Group item: arrow color
     */
    groupItemArrowColor?: CanvasColor;
    /**
     * Group item: background color in group
     */
    groupItemBackgroundColor?: CanvasColor;
    /**
     * Row group item: font color
     */
    rowGroupItemFontColor?: CanvasColor;
    /**
     * Row group item: arrow color
     */
    rowGroupItemArrowColor?: CanvasColor;
    /**
     * Row group item: background color in group
     */
    rowGroupItemBackgroundColor?: CanvasColor;
    /**
     * Background color
     */
    backgroundColor?: CanvasColor;
    /**
     * color line in grid in CanvasTable
     */
    lineColor?: CanvasColor;
    /**
     * select line color in grid in CanvasTable
     */
    selectLineColor: CanvasColor;
    /**
     * Backgroud color when mouse is hover the row
     */
    howerBackgroundColor?: CanvasColor;
    /**
     * Every secound row can have another backgound color sepra
     */
    sepraBackgroundColor?: CanvasColor;
}
interface ICanvasTableConf {
    scrollView?: IScrollViewConfig;
    font: string;
    fontStyle: string;
    fontSize: number;
    fontColor: CanvasColor;
    headerFont: string;
    headerFontStyle: string;
    headerFontSize: number;
    headerFontColor: CanvasColor;
    headerDrawSortArrow: boolean;
    headerDrawSortArrowColor: CanvasColor;
    headerBackgroundColor: CanvasColor;
    groupItemFontColor: CanvasColor;
    groupItemArrowColor: CanvasColor;
    groupItemBackgroundColor: CanvasColor;
    rowGroupItemFontColor: CanvasColor;
    rowGroupItemArrowColor: CanvasColor;
    rowGroupItemBackgroundColor: CanvasColor;
    backgroundColor: CanvasColor;
    lineColor: CanvasColor;
    selectLineColor: CanvasColor;
    howerBackgroundColor: CanvasColor;
    sepraBackgroundColor: CanvasColor;
}
interface IColAndRowInRowMode<T> {
    row: ICanvasTableGroupItemRowMode | ICanvasTableIndexsRowMode;
    col: ICanvasTableColumn<T> | null;
}
export declare abstract class CustomCanvasTable<T = any> implements IDrawable {
    protected context?: ICanvasContext2D;
    protected requestAnimationFrame?: number;
    protected drawconf?: IDrawConfig & {
        fulldraw: boolean;
    };
    protected r: number;
    protected data: T[];
    protected allowEdit: boolean;
    protected scrollView?: ScrollView;
    protected headerHeight: number;
    protected cellHeight: number;
    protected dataIndex?: CanvasTableIndex;
    protected config: ICanvasTableConf;
    protected column: Array<ICanvasTableColumn<T>>;
    private eventDblClick;
    private eventClick;
    private eventClickHeader;
    private eventReCalcForScrollView;
    private eventEdit;
    private needToCalc;
    private needToCalcFont;
    private isFocus;
    private minFontWidth;
    private maxFontWidth;
    private orgColum;
    private customRowColStyle?;
    private customFilter?;
    private customSort?;
    private sortCol?;
    private groupByCol?;
    private rowTableGroup?;
    private overRowValue?;
    private selectRowValue;
    private selectColValue?;
    private columnResize?;
    private touchClick?;
    private lastCursor;
    private canvasHeight;
    private canvasWidth;
    private editData;
    private tableMode;
    constructor(config: ICanvasTableConfig | undefined);
    getScrollView(): ScrollView | undefined;
    /**
     * To customize style of CanvasTable
     * @param config config
     */
    updateConfig(config: ICanvasTableConfig | undefined): void;
    /**
     * Is CanvasTable goging to redraw in next frame
     */
    isPlanToRedraw(): boolean;
    /**
     * Let CanvasTable redraw
     * @param config
     */
    askForReDraw(config?: IDrawConfig): void;
    /**
     * Recalc index and then redraw
     * You need to call this if size of the data was change or columns witch was change is in active groupby or sort
     */
    askForReIndex(): void;
    setAllowEdit(allowEdit: boolean): void;
    setRowColStyle(style?: CustomRowColStyle<T> | null): void;
    setFilter(filter?: CustomFilter<T> | null): void;
    setCustomSort(customSort?: CustomSort<T> | null): void;
    setSort(sortCol?: Array<ICanvasTableColumnSort<T>>): void;
    /**
     * Set group by data
     * @param col
     */
    setGroupBy(col?: Array<string | ICanvasTableGroup>): void;
    setRowTableGroup(row?: string | ICanvasRowTableGroup): void;
    setTableMode(tableMode: CanvasTableMode): void;
    getTableMode(): CanvasTableMode;
    /**
     * Set new Data and then reindex and redraw
     * @param data new Data
     */
    setData(data?: T[]): void;
    /**
     * Change the visibility of the column
     * @param col index of colum or the column it self
     * @param visible show or hide the colum
     */
    setColumnVisible(col: number | ICanvasTableColumnConf<T>, visible: boolean): void;
    updateColumns(col: Array<ICanvasTableColumnConf<T>>): void;
    /**
     * Expend All data in tree mode
     */
    expendAll(): void;
    /**
     * Collapse All data in tree mode
     */
    collapseAll(): void;
    addEvent(EventName: "edit", event: EventManagerEdit): void;
    addEvent(eventName: "clickHeader", event: EventManagerClickHeader<T>): void;
    addEvent(eventName: "click" | "dblClick", event: EventManagerClick<T>): void;
    addEvent(eventName: "reCalcForScrollView", event: EventManagerReCalcForScrollView): void;
    removeEvent(EventName: "edit", event: EventManagerEdit): void;
    removeEvent(eventName: "clickHeader", event: EventManagerClickHeader<T>): void;
    removeEvent(eventName: "click" | "dblClick", event: EventManagerClick<T>): void;
    removeEvent(eventName: "reCalcForScrollView", event: EventManagerReCalcForScrollView): void;
    setUpdateData(row: number, field: string, data: any): void;
    getUpdateData(row: number, field: string): {
        data: any;
    } | undefined;
    getUpdateDataOrData(row: number, field: string): any;
    getEditData(): {
        [index: number]: IEditRowItem;
    };
    clearEditData(): void;
    abstract resize(): void;
    protected logError(value: string, value2?: any, value3?: any): void;
    protected setOverRow(value: number | undefined): void;
    protected setR(r: number): void;
    protected abstract setCursor(cusor: string): void;
    protected abstract askForExtentedMouseMoveAndMaouseUp(): void;
    protected abstract askForNormalMouseMoveAndMaouseUp(): void;
    protected abstract scrollViewChange(): void;
    protected getColumnByCanvasTableColumnConf(column: ICanvasTableColumnConf<T>): ICanvasTableColumn<T> | undefined;
    protected setIsFocus(isFocus: boolean): void;
    protected fireEdit(row: CanvasTableRowItem, col: string, newData: any, oldData: any): void;
    protected fireDblClick(row: CanvasTableRowItem, col: ICanvasTableColumn<T> | null): void;
    protected fireClick(row: CanvasTableRowItem, col: ICanvasTableColumn<T> | null): void;
    protected fireClickHeader(col: ICanvasTableColumn<T> | null): void;
    protected fireReCalcForScrollView(width: number, height: number): void;
    protected clickOnHeader(col: ICanvasTableColumn<T> | null): void;
    protected wheel(deltaMode: number, deltaX: number, deltaY: number): void;
    protected dblClick(x: number, y: number): void;
    protected abstract updateForEdit(orginalCol: ICanvasTableColumn<T>, row: number): void;
    protected mouseDown(x: number, y: number): void;
    protected mouseMove(x: number, y: number): void;
    protected mouseUp(x: number, y: number): void;
    protected mouseMoveExtended(x: number, y: number): void;
    protected mouseUpExtended(x: number, y: number): void;
    protected mouseLeave(): void;
    protected keydown(keycode: number): void;
    protected TouchStart(e: ICanvasTableTouchEvent, offsetLeft: number, offsetTop: number): void;
    protected TouchMove(e: ICanvasTableTouchEvent, offsetLeft: number, offsetTop: number): void;
    protected TouchEnd(e: ICanvasTableTouchEvent, offsetLeft: number, offsetTop: number): void;
    protected calcRect(col: ICanvasTableColumn<T>, row: number): IUpdateRect | undefined;
    protected findColSplit(x: number): number | null;
    protected findColAndRowInRowMode(x: number, y: number): IColAndRowInRowMode<T> | null;
    protected findColByPos(x: number): ICanvasTableColumn<T> | null;
    protected findRowByPos(y: number): CanvasTableRowItemSelect;
    protected findTopPosByRow(rowValue: number | ICanvasTableRowItemSelectColMode): number | undefined;
    protected reCalcIndexIfNeed(field: string): void;
    protected calcIndex(): void;
    protected reCalcForScrollView(): void;
    protected setCanvasSize(width: number, height: number): void;
    protected doReize(width: number, height: number): void;
    protected drawCanvas(): void;
    private calcColum;
    private updateCursor;
    private getEvent;
    private resizeColIfNeed;
    private clearTouchClick;
    private changeChildExpend;
    private drawGroupItemObject;
    private getGroupCaption;
    private group;
    private groupRow;
    private groupRowItem;
    private drawGroupRowsItem;
    private drawGroupRowItem;
    private drawGroupItem;
    private getDrawData;
    private drawRowItem;
}
export {};
