import { ForwardedRef, FunctionComponent, HTMLAttributes, ReactElement, ReactNode } from "react";
import { Root } from "react-dom/client";
import { FitToOuter } from "../../styles/css-var";
import { LayoutContextProps } from "../../styles/layout-provider";
import { DomComponentClass } from "../../utils/dom";
import { InputAttributes } from "../../hooks/value";
export declare const listViewCn = "bh-lv";
export declare const listViewIptCn = "bh-lv_ipt";
declare type Data = {
    [key: string]: any;
};
export declare type ListViewSelectMode = "none" | "row" | "cell";
declare type TextAlign = "left" | "center" | "right";
declare type SortOrder = "" | "asc" | "desc";
export declare const listViewDefaultRowHeight: () => number;
export declare type ListViewHook<T = Data> = {
    focus: () => void;
    getItems: () => Array<T>;
    setItems: (items: Array<T>) => void;
    getFilteredItems: () => Array<$ListViewItem<T>>;
    setFilter: (filter: (itemData: T) => boolean) => void;
    getDisplayedItems: () => Array<$ListViewItem<T>>;
    getLength: () => number;
    getFilteredLength: () => number;
    select: (rowIndex: number, columnName?: string) => void;
    clearSelect: () => void;
    getSelectedRows: () => Array<{
        id: number;
        data: T;
    }>;
    getSelectedCells: () => Array<{
        id: number;
        data: T;
        columnName: string;
    }>;
    render: () => void;
};
export declare type ListViewItemParams<T = Data> = {
    rowNumber: number;
    id: number;
    data: T;
    columnName: string;
    columnLabel: string;
    columnWidth: number;
    originItems: () => Array<T>;
    selectMode: ListViewSelectMode;
    selected: boolean;
    getSelectedRows: () => Array<{
        id: number;
        data: T;
    }>;
    getSelectedCells: () => Array<{
        id: number;
        data: T;
        columnName: string;
    }>;
};
export declare type ListViewHeaderOrFooterCellClicked<T = Data> = (columnName: string, items: Array<$ListViewItem<T>>, renderCells: () => void) => void;
declare type ListViewReturnOrder = {
    rebind?: boolean;
    renderHeaderCell?: boolean;
    renderHeaderCells?: boolean;
    renderFooterCell?: boolean;
    renderFooterCells?: boolean;
    renderCell?: boolean;
    renderCells?: boolean;
    renderRow?: boolean;
    render?: boolean;
};
export declare type ListViewCellClickFunc<T = Data> = (params: ListViewItemParams<T>, e?: MouseEvent) => (ListViewReturnOrder | void);
export declare type ListViewColumnFunction<P, T = Data> = (props: P) => ListViewColumnProps<T>;
export declare type ListViewMultiStageRowItemProps<T = Data> = {
    columns: Array<ListViewColumnProps<T>>;
    header?: boolean;
    headerHeightFlexRate?: number;
    headerClassName?: string | Array<string>;
    footer?: boolean;
    footerHeightFlexRate?: number;
    footerClassName?: string | Array<string>;
    body?: boolean;
    bodyHeightFlexRate?: number;
    bodyClassName?: string | Array<string>;
};
export declare type ListViewEditTargetProps<T = Data> = {
    data: T;
    columnName: string;
    index: number;
    id: number;
};
export declare type ListViewEditParams<T = Data> = {
    target: ListViewEditTargetProps<T>;
    editElement: HTMLDivElement;
    endEdit: (commit?: boolean) => void;
    cell: $ListViewCell<T>;
    styleCtx: LayoutContextProps;
};
export declare type ListViewBeginEditFunc<T = Data> = (params: ListViewEditParams<T>) => {
    node: ReactNode;
    effect?: () => void;
};
export declare type ListViewEditInputAttributes<T extends InputAttributes<any, any>> = Omit<T, "$hook" | "$value" | "$dispatch" | "$bind" | "$name" | "placeholder" | "$resize" | "$source" | "style">;
export declare type ListViewColumnProps<T = Data> = {
    name: string;
    vName?: string;
    label?: string;
    dataType?: "string" | "number";
    initialize?: (props: ListViewColumnProps<T>, listView: ListViewClass<T>) => {
        [key: string]: any;
    };
    dispose?: (lv: ListViewClass<T>) => void;
    headerCellLabel?: string | ((cellElement: HTMLDivElement, displayedItems: Array<$ListViewItem<T>>, originItems: Array<T>) => void);
    headerCellInitialize?: (column: $ListViewColumn<T>, initializeParameters: {
        [key: string]: any;
    }) => void;
    headerCellTextAlign?: TextAlign;
    footerCellLabel?: string | ((cellElement: HTMLDivElement, displayedItems: Array<$ListViewItem<T>>, originItems: Array<T>) => void);
    footerCellInitialize?: (column: $ListViewColumn<T>, initializeParameters: {
        [key: string]: any;
    }) => void;
    footerCellTextAlign?: TextAlign;
    width?: number;
    cellInitialize?: (cell: $ListViewCell<T>, initializeParameters: {
        [key: string]: any;
    }, lv: ListViewClass<T>) => void;
    cellDispose?: (cell: $ListViewCell<T>, lv: ListViewClass<T>) => void;
    cellRender?: (cell: $ListViewCell<T>, initializeParameters: {
        [key: string]: any;
    }) => void;
    cellTextAlign?: TextAlign;
    appearance?: "label" | "anchor";
    sort?: boolean | ((order: SortOrder) => (data1: {
        data: T;
    }, data2: {
        data: T;
    }) => number);
    resize?: boolean;
    fill?: boolean;
    fixed?: boolean;
    tabStop?: boolean;
    notScrollFocusWhenTabStop?: boolean;
    disabled?: boolean;
    borderless?: boolean;
    clickHeaderCell?: ListViewHeaderOrFooterCellClicked<T>;
    clickFooterCell?: ListViewHeaderOrFooterCellClicked<T>;
    clickCell?: ListViewCellClickFunc<T>;
    clickRow?: ListViewCellClickFunc<T>;
    _preventClearSelected?: boolean;
    data?: {
        [key: string]: any;
    };
    bindedItems?: (originItems: Array<T>) => void;
    initializeRowData?: (data: T) => void | boolean;
    _beginEdit?: ListViewBeginEditFunc<T>;
    _endEdit?: (target: ListViewEditTargetProps<T>, commit: boolean, editElement: HTMLDivElement) => ListViewReturnOrder | void;
    editedRowData?: ((data: T) => void) | boolean;
    _rows?: Array<ListViewMultiStageRowItemProps<T>>;
    headerClassNames?: string | Array<string>;
    footerClassNames?: string | Array<string>;
    bodyClassNames?: string | Array<string>;
    jsxStyle?: JSX.Element;
    _lv?: (lv: ListViewClass) => void;
};
export declare type ListViewEditColumnProps<T> = ListViewColumnProps<Data> & {
    edit?: boolean;
    beganEdit?: (value: T, target: ListViewEditTargetProps<Data>) => void;
    endedEdit?: (values: {
        before: T;
        after: T;
    }, target: ListViewEditTargetProps<Data>, commit: boolean) => void;
};
export declare type ListViewOptions<T = Data> = {
    header?: boolean;
    headerHeight?: number;
    footer?: boolean;
    footerHeight?: number;
    rowHeight?: number;
    rowNumber?: boolean;
    selectMode?: ListViewSelectMode;
    multiSelect?: boolean;
    oddEven?: boolean;
    dragScroll?: boolean | "horizontal" | "vertical";
    rowBorderless?: boolean;
    colBorderless?: boolean;
    sort?: (itemData1: T, itemData2: T) => number;
    sorted?: (columnName: string, order: "asc" | "desc" | "", columnProps: ListViewColumnProps<T>) => void;
    externalSort?: boolean;
    filter?: (itemData: T) => boolean;
    clickCell?: ListViewCellClickFunc<T>;
    filtered?: (items: Array<$ListViewItem<T>>) => void;
    enterIsClick?: boolean;
    scrollTimeoutInterval?: number;
};
export declare type ListViewAttributes<T = Data> = HTMLAttributes<HTMLDivElement> & {
    ref?: ForwardedRef<HTMLDivElement>;
    $fto?: FitToOuter;
    $hook?: ListViewHook<T>;
    $items?: Array<T>;
    $columns?: Array<ListViewColumnProps<T>>;
    $preventColumnsMemo?: boolean;
    $options?: ListViewOptions<T>;
    $preventOptionsMemo?: boolean;
    $padding?: boolean;
    $border?: boolean;
    $radius?: boolean;
    $resize?: boolean | "x" | "y" | "xy";
};
interface ListViewFC extends FunctionComponent {
    <T extends {
        [key: string]: any;
    } = Data>(attrs: ListViewAttributes<T>, ref?: ForwardedRef<HTMLDivElement>): ReactElement<ListViewAttributes<T>>;
}
declare const ListView: ListViewFC;
export declare const useListView: <T extends {
    [key: string]: any;
} = any>() => ListViewHook<T>;
export declare type $ListViewMultiStageRowItem<T> = {
    columns: Array<$ListViewColumn<T>>;
    header: boolean;
    headerHeightFlexRate: number;
    headerClassName: Array<string>;
    footer: boolean;
    footerHeightFlexRate: number;
    footerClassName: Array<string>;
    body: boolean;
    bodyHeightFlexRate: number;
    bodyClassName: Array<string>;
};
export declare type $ListViewColumn<T> = {
    prop?: ListViewColumnProps<T>;
    name: string;
    vName: string;
    label: string;
    dataType: "string" | "number";
    cells: Array<$ListViewCell<T>>;
    width: number;
    minWidth: number;
    initializeParameters: {
        [key: string]: any;
    };
    dispose: (lv: ListViewClass<T>) => void;
    headerCellElement: HTMLDivElement;
    headerCellLabelElement?: HTMLDivElement;
    renderHeaderCell?: (cellElement: HTMLDivElement, displayedItems: Array<$ListViewItem<T>>, originItems: Array<T>) => void;
    sortElement?: HTMLDivElement;
    resizeElement?: HTMLDivElement;
    footerCellElement: HTMLDivElement;
    footerCellLabelElement?: HTMLDivElement;
    renderFooterCell?: (cellElement: HTMLDivElement, displayedItems: Array<$ListViewItem<T>>, originItems: Array<T>) => void;
    cellInitialize: (cell: $ListViewCell<T>, initializeParameters: {
        [key: string]: any;
    }, lv: ListViewClass<T>) => void;
    disposeCell?: (cell: $ListViewCell<T>, lv: ListViewClass<T>) => void;
    renderCell: (cell: $ListViewCell<T>, initializeParameters: {
        [key: string]: any;
    }) => void;
    textAlign: TextAlign;
    appearance?: "label" | "anchor";
    sort: (order: SortOrder) => (itemData1: {
        data: T;
    }, itemData2: {
        data: T;
    }) => number;
    sortOrder: SortOrder;
    resize: boolean;
    fill: boolean;
    fixed: boolean;
    fixedLeft: number;
    left: number;
    tabStop: boolean;
    notScrollFocusWhenTabStop: boolean;
    render: boolean;
    disabled: boolean;
    borderless?: boolean;
    clickHeaderCell?: ListViewHeaderOrFooterCellClicked<T>;
    clickFooterCell?: ListViewHeaderOrFooterCellClicked<T>;
    clickCell?: ListViewCellClickFunc<T>;
    clickRow?: ListViewCellClickFunc<T>;
    preventClearSelected: boolean;
    bindedItems?: (originItems: Array<T>) => void;
    initializeRowData?: (data: T) => void | boolean;
    rows?: Array<$ListViewMultiStageRowItem<T>>;
    parent?: $ListViewColumn<T>;
    beginEdit?: ListViewBeginEditFunc<T>;
    endEdit?: (target: ListViewEditTargetProps<T>, commit: boolean, editElement: HTMLDivElement) => ListViewReturnOrder | void;
    editedRowData: ((data: T) => void) | boolean;
    headerClassNames?: Array<string>;
    footerClassNames?: Array<string>;
    bodyClassNames?: Array<string>;
    built: boolean;
};
declare type $ListViewItem<T> = {
    data: T;
    id: number;
    rowSelected: boolean;
    cellSelected: {
        [key: string]: boolean;
    };
};
declare type $ListViewRow<T> = {
    element: HTMLDivElement;
    index: number;
    id: number;
    cells: Array<$ListViewCell<T>>;
    item: $ListViewItem<T>;
    cache: {
        _lv_selected: boolean;
        _lv_oddEven: 0 | 1;
    };
};
declare type $ListViewCell<T> = {
    element: HTMLDivElement;
    contentElements: Array<HTMLElement>;
    column: $ListViewColumn<T>;
    row: $ListViewRow<T>;
    cache: {
        _lv_selected: boolean;
    } & {
        [key: string]: any;
    };
};
export declare class ListViewClass<T = Data> extends DomComponentClass {
    protected element: HTMLElement;
    protected layoutCtx: LayoutContextProps;
    protected initialized: boolean;
    protected resizeObserver: ResizeObserver;
    protected headerElement: HTMLDivElement;
    protected headerRowElement: HTMLDivElement;
    protected bodyElement: HTMLDivElement;
    protected dummyElement: HTMLDivElement;
    protected footerElement: HTMLDivElement;
    protected footerRowElement: HTMLDivElement;
    protected editElement: HTMLDivElement;
    protected editMaskElement: HTMLDivElement;
    protected editRoot: Root;
    protected columns: Array<$ListViewColumn<T>>;
    protected renderColumns: Array<$ListViewColumn<T>>;
    protected originItems: Array<T>;
    protected bindingItems: Array<$ListViewItem<T>>;
    protected filteredItems: Array<$ListViewItem<T>>;
    protected sortedItems: Array<$ListViewItem<T>>;
    protected rows: Array<$ListViewRow<T>>;
    protected selectedRows: {
        [key: string]: $ListViewItem<T>;
    };
    protected lastSelectedCell: {
        index: number;
        item: $ListViewItem<T>;
        column: $ListViewColumn<T>;
    };
    protected lastSelectedBaseCell: {
        index: number;
        item: $ListViewItem<T>;
        column: $ListViewColumn<T>;
    };
    protected lastScrolledTop: number;
    protected lastScrolledLeft: number;
    protected maxFirstIndex: number;
    protected firstIndex: number;
    protected lastChangedX: boolean;
    protected hasFillColumn: boolean;
    protected editTarget: {
        item: $ListViewItem<T>;
        column: $ListViewColumn<T>;
        index: number;
        useReact?: boolean;
    };
    protected scrollingMode: "stop" | "up" | "down";
    protected scrollingId: number;
    protected scrollingInterval: number;
    protected cloneBase: {
        div: HTMLDivElement;
        rowElem: HTMLDivElement;
        cellElem: HTMLDivElement;
        labelCellElem: HTMLDivElement;
    };
    protected rowNumberColumn: $ListViewColumn<T>;
    protected headerVisible: boolean;
    protected headerHeight: number;
    protected footerVisible: boolean;
    protected footerHeight: number;
    protected rowHeight: number;
    protected selectMode: ListViewSelectMode;
    protected multiSelect: boolean;
    protected oddEven: boolean;
    protected dragScroll: boolean | "horizontal" | "vertical";
    protected rowNumber: boolean;
    protected sort: (itemData1: {
        [key: string]: any;
    }, itemData2: {
        [key: string]: any;
    }) => number;
    protected sorted?: (columnName: string, order: "asc" | "desc" | "", columnProps: ListViewColumnProps<T>) => void;
    protected externalSort: boolean;
    protected filter: (itemData: {
        [key: string]: any;
    }) => boolean;
    protected clickCell: ListViewCellClickFunc<T>;
    protected filtered: (items: Array<$ListViewItem<T>>) => void;
    protected enterIsClick: boolean;
    protected colBorderless: boolean;
    protected rowBorderless: boolean;
    protected scrollTimeoutInterval: number;
    protected endEditEventListener: () => void;
    protected itemsCallBindedRev: number;
    protected colCallBindedRev: number;
    constructor(element: HTMLElement, props: ListViewAttributes<T>, layoutCtx: LayoutContextProps);
    dispose(): void;
    setOptions(options?: ListViewOptions<T>): this;
    protected optimizeElementsPosition(): void;
    setHeaderVisible(visible: boolean): this;
    setHeaderHeight(height: number): this;
    setFooterVisible(visible: boolean): this;
    setFooterHeight(height: number): this;
    setRowHeight(height: number): this;
    setRowNumber(visible: boolean): this;
    setSelectMode(selectMode: ListViewSelectMode): this;
    setMultiSelect(multiSelect: boolean): this;
    setOddEven(oddEven: boolean): this;
    setDragScroll(dragScroll: boolean | "horizontal" | "vertical"): this;
    setSort(func: (itemData1: {
        [key: string]: any;
    }, itemData2: {
        [key: string]: any;
    }) => number): this;
    setSorted(func: (columnName: string, order: "asc" | "desc" | "", columnProps: ListViewColumnProps<T>) => void): this;
    setExternalSort(external: boolean): this;
    setFilter(func: (itemData: {
        [key: string]: any;
    }) => boolean): this;
    setClickCell(func: ListViewCellClickFunc<T>): this;
    setFiltered(func: (items: Array<$ListViewItem<T>>) => void): this;
    setEnterIsClick(enterIsClick: boolean): this;
    setColBorderless(borderless: boolean): this;
    setRowBorderless(borderless: boolean): this;
    setScrollTimeoutInterval(interval: number): this;
    protected generateElements(): void;
    protected clearSelectedRows(render?: boolean): void;
    protected rangeSelectRow(item: $ListViewItem<T>, column: $ListViewColumn<T>, index: number): void;
    protected scrollToIndex(index: number, render?: boolean): void;
    protected scrollToColumn(column: $ListViewColumn<T>, render?: boolean, renderAbsolute?: boolean): boolean;
    protected arrowUpDown(updown: number, focusIndex: number, rangeSelect?: boolean): boolean;
    protected arrowUp(up?: number, rangeSelect?: boolean): boolean;
    protected arrowDown(down?: number, rangeSelect?: boolean): boolean;
    protected arrowLeftRightOptimize(index: number, column: $ListViewColumn<T>, rangeSelect?: boolean): boolean;
    protected arrowLeft(ctrlKey?: boolean, rangeSelect?: boolean): boolean;
    protected arrowRight(ctrlKey?: boolean, rangeSelect?: boolean): boolean;
    render(): this;
    protected renderHeaderCells(): this;
    protected renderFooterCells(): this;
    protected renderRow(row: $ListViewRow<T>, allColumn?: boolean): void;
    protected renderRowColumns(columns: Array<$ListViewColumn<T>>, row: $ListViewRow<T>): void;
    protected renderCell(cell: $ListViewCell<T>): void;
    protected renderWhenScrolled(absolute?: boolean): void;
    protected renderWhenResized(absolute?: boolean): boolean;
    protected generateCell(row: $ListViewRow<T>, col: $ListViewColumn<T>, rowElem: HTMLDivElement): $ListViewCell<T>;
    protected optimizeMaxFirstIndex(): void;
    protected optimizeRenderColumns(): boolean;
    protected optimizeRowNumberColumnWidth(): void;
    protected optimizeDummySize(): void;
    protected disposeRows(maxRowLen?: number): void;
    protected findColumn(func: (column: $ListViewColumn<T>) => boolean): $ListViewColumn<T>;
    protected findFirstColumn(): $ListViewColumn<T>;
    protected findLastColumn(): $ListViewColumn<T>;
    protected findPrevColumn(columnName: string): {
        column: $ListViewColumn<T>;
        nextRow: boolean;
    };
    protected findNextColumn(columnName: string): {
        column: $ListViewColumn<T>;
        nextRow: boolean;
    };
    protected disposeColumn(column: $ListViewColumn<T>): void;
    protected disposeColumns(): void;
    protected bindColumns(columns: Array<ListViewColumnProps<T>>): void;
    protected bindColumn(col: ListViewColumnProps<T>, fill: boolean): $ListViewColumn<T>;
    protected buildColumns(): void;
    protected buildColumn(column: $ListViewColumn<T>, element: {
        header: HTMLDivElement;
        footer: HTMLDivElement;
    }): void;
    setColumns(columns: Array<ListViewColumnProps<T>>): this;
    protected columnForEach(func: (column: $ListViewColumn<T>) => void | boolean): void;
    protected bindItems(items: Array<T>): void;
    executeColumnBindedItems(): void;
    protected filterItems(): void;
    protected sortItems(): void;
    setItems(items: Array<T>): this;
    protected cellClickedImpl(item: $ListViewItem<T>, column: $ListViewColumn<T>, index: number, ctrlKey: boolean, shiftKey: boolean, e?: MouseEvent): void;
    protected beginEditLastSelectedCell(lastScrollTop?: number): void;
    protected beginEdit(item: $ListViewItem<T>, column: $ListViewColumn<T>, index: number): void;
    protected endEdit(commit: boolean, options?: {
        unmountTimeout?: boolean;
        callback?: (edit: boolean) => void;
    }): void;
    getValue(): Array<T>;
    getFilteredValue(): Array<$ListViewItem<T>>;
    getSortedValue(): Array<$ListViewItem<T>>;
    getLength(): number;
    getFilteredLength(): number;
    select(rowIndex: number, columnName?: string): boolean;
    clearSelect(): void;
    getSelectedRows(): Array<{
        id: number;
        data: T;
    }>;
    getSelectedCells(): Array<{
        id: number;
        data: T;
        columnName: string;
    }>;
    focus(): this;
    getElement(): HTMLElement;
    getBodyElement(): HTMLDivElement;
    getRowHeight(): number;
    getDisplayedFirstRowIndex(): number;
    getBodyScrollTop(): number;
    clearSpaceRow(): this;
    startScrollContinue(order: "up" | "down", interval?: number, startCallback?: (interval: number) => void, endCallback?: (code: "stop" | "over" | "already") => void): void;
    stopScrollContinue(): void;
    protected scrollContinue(endCallback?: (code: "stop" | "over") => void): void;
    dragMovingRow(dragingRowIndex: number, top: number): this;
    dropMoveRow(dragingRowIndex: number, top: number): this;
    renderByOriginData(originData: T, callEditedRowData?: boolean): this;
    setStyleContext(ctx: LayoutContextProps): this;
}
export declare const ListViewStyle: JSX.Element;
export default ListView;
