import { default as default_2 } from 'react';
import { ReactNode } from 'react';
import * as RealGrid from 'realgrid';

declare abstract class ComponentBase<T extends IComponentBase> extends default_2.Component<T> {
    protected $parent?: RealBaseReact<{}>;
    protected $model?: any;
    constructor(props: T);
    protected abstract mountCB: () => void;
    protected abstract unMountCB: () => void;
    protected _type: string;
    protected _doUpdate(): void;
    componentDidMount(): void;
    componentWillUnmount(): void;
    componentDidUpdate(prevProps: Readonly<{
        [key in keyof T]: T[key];
    }>, prevState: Readonly<{}>, snapshot?: any): void;
    render(): default_2.FunctionComponentElement<{
        children?: default_2.ReactNode;
    }>;
}

declare type GridType<G> = G extends RealGrid.GridView ? RealGrid.GridView : G extends RealGrid.TreeView ? RealGrid.TreeView : any;

declare interface IComponentBase {
    children?: ReactNode;
    $grid?: RealBaseReact<{}>;
}

declare interface IRealGridBaseProps<G> extends Omit<IComponentBase, '$grid'> {
    /**
     * DataField생성 여부.
     *
     * @remarks
     * `true`이면 Column생성시 DataField도 생성한다.
     *
     * @defaultValue `false`
     */
    autoGenerateField?: boolean;
    /**
     * 그리드에 표시할 Data
     */
    rows?: RealGrid.DataValues[];
    /**
     * 그리드가 생성된 이후 호출된다.
     *
     * @param grid - 그리드 객체
     * @returns
     */
    onInitialized?: (grid: GridType<G>) => void;
    /**
     * 그리드가 제거되기 직전에 호출된다.
     * @param grid - 그리드 객체
     * @returns
     */
    onDestroy?: (grid: GridType<G>) => void;
    /**
     * 행 스타일 변경을 위한 콜백
     */
    rowStyleCallback?: RealGrid.RowStyleCallback;
    /**
     * 셀 스타일 변경을 위한 콜백
     */
    cellStyleCallback?: RealGrid.CellStyleCallback;
    /**
     * RGDataColumn이 변경되었을때 호출되는 콜백
     */
    onRGDataColumnsChanged?: (grid: GridType<G>) => void;
    gridProps?: RealGrid.GridOptions;
    layout?: (string | Exclude<RealGrid.CellLayoutGroupItem, Function> | RealGrid.CellLayoutColumnItem)[];
    onCurrentChanging?: (grid: GridType<G>, oldIndex: RealGrid.CellIndex, newIndex: RealGrid.CellIndex) => boolean;
    onCurrentChanged?: (grid: GridType<G>, newIndex: RealGrid.CellIndex) => void;
    onCurrentRowChanged?: (grid: GridType<G>, oldRow: number, newRow: number) => void;
    onValidateColumn?: (grid: GridType<G>, column: RealGrid.DataColumn, inserting: boolean, value: any, itemIndex: number, dataRow: number) => RealGrid.ValidationError | undefined;
    onValidateRow?: (grid: GridType<G>, itemIndex: number, dataRow: number, inserting: boolean, values: any[]) => RealGrid.ValidationError;
    onValidationFail?: (grid: GridType<G>, itemIndex: number, column: RealGrid.GridColumn, error: RealGrid.ValidationError) => RealGrid.ValidationError;
    onColumnCheckedChanged?: (grid: GridType<G>, column: RealGrid.GridColumn, checked: boolean) => void;
    onMenuItemClicked?: (grid: GridType<G>, item: RealGrid.PopupMenuItem, clickData: RealGrid.ClickData) => void;
    onContextMenuPopup?: (grid: GridType<G>, x: number, y: number, clickData: RealGrid.ClickData, menu: string, rightClick: boolean) => boolean | string;
    onContextMenuItemClicked?: (grid: GridType<G>, item: RealGrid.PopupMenuItem, clickData: RealGrid.ClickData) => void;
    onCellButtonClicked?: (grid: GridType<G>, index: RealGrid.CellIndex, column: RealGrid.GridColumn) => void;
    onScrollToBottom?: (grid: GridType<G>) => void;
    onTopIndexChanged?: (grid: GridType<G>, itemIndex: number) => void;
    onTopIndexChanging?: (grid: GridType<G>, currentTop: number, delta: number, focusing: boolean, adjust: boolean) => number;
    onLeftPosChanged?: (grid: GridType<G>, pos: number) => void;
    onRowsDeleting?: (grid: GridType<G>, rows: number[]) => boolean;
    onRowInserting?: (grid: GridType<G>, itemIndex: number, dataRow: number) => boolean;
    onSelectionCleared?: (grid: GridType<G>) => void;
    onSelectionChanged?: (grid: GridType<G>, selection: Selection) => void;
    onSelectionAdded?: (grid: GridType<G>, selection: Selection) => void;
    onSelectionEnded?: (grid: GridType<G>, selection: Selection) => void;
    onShowEditor?: (grid: GridType<G>, index: RealGrid.CellIndex, props: any, attrs: any) => boolean;
    onShowEditCommand?: (grid: GridType<G>, index: RealGrid.CellIndex) => boolean;
    onHideEditor?: (grid: GridType<G>, index: RealGrid.CellIndex) => void;
    onEditChange?: (grid: GridType<G>, index: RealGrid.CellIndex, value: any) => void;
    onGetEditValue?: (grid: GridType<G>, index: RealGrid.CellIndex, editResult: Object) => void | boolean;
    onEditCommit?: (grid: GridType<G>, index: RealGrid.CellIndex, oldValue: any, newValue: any) => boolean;
    onEditCanceled?: (grid: GridType<G>, index: RealGrid.CellIndex) => void;
    onItemEditCanceled?: (grid: GridType<G>, itemIndex: number, state: string) => void;
    onItemEditCancel?: (grid: GridType<G>, itemIndex: number, state: string) => boolean;
    onEditSearch?: (grid: GridType<G>, index: RealGrid.CellIndex, text: string) => void;
    onSearchCellButtonClick?: (grid: GridType<G>, index: RealGrid.CellIndex, text: string) => void;
    onCellEdited?: (grid: GridType<G>, itemIndex: number, row: number, field: number) => void;
    onEditRowChanged?: (grid: GridType<G>, itemIndex: number, row: number, field: number, oldValue: any, newValue: any) => void;
    onEditRowPasted?: (grid: GridType<G>, itemIndex: number, row: number, fields: number[], oldValues: any[], newValues: any[]) => void;
    onRowsPasted?: (grid: GridType<G>, items: number[]) => void;
    onCellPasting?: (grid: GridType<G>, index: RealGrid.CellIndex, value: any, editResult: RealGrid.EditResult) => boolean;
    onItemChecked?: (grid: GridType<G>, itemIndex: number, checked: boolean) => void;
    onItemAllChecked?: (grid: GridType<G>, checked: boolean) => void;
    onErrorClicked?: (grid: GridType<G>, error: string) => void;
    onSorting?: (grid: GridType<G>, fields: number[], directions: string[]) => boolean;
    onSortingChanged?: (grid: GridType<G>) => void;
    onFiltering?: (grid: GridType<G>) => boolean;
    onFilteringChanged?: (grid: GridType<G>, column: RealGrid.GridColumn, filter: RealGrid.ColumnFilter, reset: boolean) => void;
    onWheel?: (grid: GridType<G>, event: WheelEvent) => boolean;
    onKeyDown?: (grid: GridType<G>, event: KeyboardEvent) => boolean;
    onKeyPress?: (grid: GridType<G>, event: KeyboardEvent) => void;
    onKeyUp?: (grid: GridType<G>, event: KeyboardEvent) => void;
    onShowTooltip?: (grid: GridType<G>, index: RealGrid.CellIndex, value: any) => boolean | string;
    onShowHeaderTooltip?: (grid: GridType<G>, column: RealGrid.GridColumn, value: any, layout: RealGrid.CellLayoutItem) => string;
    onColumnPropertyChanged?: (grid: GridType<G>, column: RealGrid.GridColumn, property: string, newValue: any, oldValue: any) => void;
    onLayoutPropertyChanged?: (grid: GridType<G>, layout: RealGrid.CellLayoutItem, property: string, newValue: any, oldValue: any) => void;
    onGridActivated?: (grid: GridType<G>) => void;
    onCopy?: (grid: GridType<G>, selection: Selection | Selection[], event: ClipboardEvent) => boolean;
    onCut?: (grid: GridType<G>, selection: Selection | Selection[], event: ClipboardEvent) => boolean;
    onPaste?: (grid: GridType<G>, index: RealGrid.CellIndex, event: ClipboardEvent) => boolean;
    onPasted?: (grid: GridType<G>) => void;
    onItemsChecked?: (grid: GridType<G>, items: number[], checked: boolean) => void;
    onCellClicked?: (grid: GridType<G>, clickData: RealGrid.ClickData) => void;
    onCellDblClicked?: (grid: GridType<G>, clickData: RealGrid.ClickData) => void;
    onCellItemClicked?: (grid: GridType<G>, index: RealGrid.CellIndex, clickData: RealGrid.ClickData) => boolean;
    onCommandStackChanged?: (grid: GridType<G>, undoable: boolean, redoable: boolean) => void;
    onDataLoadComplated?: (grid: GridType<G>) => void;
    onLayoutExpanding?: (grid: GridType<G>, layout: RealGrid.CellLayoutGroupItem) => boolean;
    onLayoutExpanded?: (grid: GridType<G>, layout: RealGrid.CellLayoutGroupItem) => void;
    onLayoutCollapsing?: (grid: GridType<G>, layout: RealGrid.CellLayoutGroupItem) => boolean;
    onLayoutCollapsed?: (grid: GridType<G>, layout: RealGrid.CellLayoutGroupItem) => void;
    onGridFocusChanged?: (grid: GridType<G>, focused: boolean, event: Event) => void;
    dataProps?: RealGrid.DataOptions;
}

declare interface IRealGridCheckBar extends IComponentBase, RealGrid.CheckBar {
}

declare interface IRealGridDataColumn extends RealGrid.DataColumn {
    field?: RealGrid.DataField;
}

declare interface IRealGridDataField extends IComponentBase, RealGrid.DataField {
}

declare interface IRealGridFilterPanel extends IComponentBase, RealGrid.FilterPanel {
}

declare interface IRealGridFooter extends IComponentBase, RealGrid.GridFooter {
}

declare interface IRealGridFooters extends IComponentBase, RealGrid.GridFooterCollection {
}

declare interface IRealGridGroupPanel extends IComponentBase, RealGrid.GroupPanel {
}

declare interface IRealGridHeader extends IComponentBase, RealGrid.GridHeader {
}

declare interface IRealGridheaderSummaries extends IComponentBase, RealGrid.HeaderSummaryCollection {
}

declare interface IRealGridHeaderSummary extends IComponentBase, RealGrid.HeaderSummary {
}

declare interface IRealGridLiteralColumn extends IComponentBase, RealGrid.LiteralColumn {
}

declare interface IRealGridRowIndicator extends IComponentBase, RealGrid.RowIndicator {
}

declare interface IRealGridSeriesColumn extends IComponentBase, RealGrid.SeriesColumn {
}

declare interface IRealGridStateBar extends IComponentBase, RealGrid.StateBar {
}

declare interface IRealGridTreeProps extends IRealGridBaseProps<RealGrid.TreeView> {
    treeOptions?: RealGrid.TreeOptions;
    treeField?: string;
    needSorting?: boolean;
    childrenField?: string;
    iconField?: string;
    json?: any;
    rowsProp?: string;
    childrenProp?: string;
    iconProp?: string;
    onTreeItemExpanding?: (tree: RealGrid.TreeView, itemIndex: number, rowId: number) => boolean;
    onTreeItemExpanded?: (tree: RealGrid.TreeView, itemIndex: number, rowId: number) => void;
    onTreeItemCollapsing?: (tree: RealGrid.TreeView, itemIndex: number, rowId: number) => void;
    onTreeItemCollapsed?: (tree: RealGrid.TreeView, itemIndex: number, rowId: number) => void;
    onTreeItemChanged?: (tree: RealGrid.TreeView, itemIndex: number, rowId: number) => void;
    onRowCountChanged?: (provider: RealGrid.LocalTreeDataProvider, newCount: number) => void;
    onRowAdding?: (provider: RealGrid.LocalTreeDataProvider, row: number, index: number, child: any) => boolean;
    onRowAdded?: (provider: RealGrid.LocalTreeDataProvider, row: number) => void;
    onRowsAdded?: (provider: RealGrid.LocalTreeDataProvider, parent: number, rows: number[]) => void;
    onRowDeleting?: (provider: RealGrid.LocalTreeDataProvider, row: number) => boolean;
    onRowDeleted?: (provider: RealGrid.LocalTreeDataProvider, row: number) => void;
    onRowsDeleted?: (provider: RealGrid.LocalTreeDataProvider, rows: number[]) => void;
    onRowUpdating?: (provider: RealGrid.LocalTreeDataProvider, row: number, oldValues: RealGrid.RowValues, newValues: RealGrid.RowValues) => boolean;
    onRowUpdated?: (provider: RealGrid.LocalTreeDataProvider, row: number) => void;
    onRowsUpdating?: (provider: RealGrid.LocalTreeDataProvider, rows: number[]) => boolean;
    onRowsUpdated?: (provider: RealGrid.LocalTreeDataProvider, rows: number[]) => void;
    onValueChanged?: (provider: RealGrid.LocalTreeDataProvider, row: number, field: number) => void;
    onDataChanged?: (provider: RealGrid.LocalTreeDataProvider) => void;
    onRowStateChanged?: (provider: RealGrid.LocalTreeDataProvider, row: number) => void;
    onRowStatesChanged?: (provider: RealGrid.LocalTreeDataProvider, rows: number[]) => void;
    onRowSiblingMoving?: (provider: RealGrid.LocalTreeDataProvider, row: number, offset: number) => boolean;
    onRowSiblingMoved?: (provider: RealGrid.LocalTreeDataProvider, row: number, offset: number) => void;
    onRowsSiblingMoving?: (provider: RealGrid.LocalTreeDataProvider, rows: number[], offset: number) => boolean;
    onRowsSiblingMoved?: (provider: RealGrid.LocalTreeDataProvider, rows: number[], offset: number) => void;
    onRowParentChanging?: (provider: RealGrid.LocalTreeDataProvider, row: number, parent: number, index: number) => boolean;
    onRowParentChanged?: (provider: RealGrid.LocalTreeDataProvider, row: number, parent: number, index: number) => void;
}

declare interface IRealGridViewProps extends IRealGridBaseProps<RealGrid.GridView> {
    gridProps?: RealGrid.ViewOptions;
    accessibility?: boolean;
    waiOptions?: RealGrid.WaiOptions;
    onPageChanging?: (grid: RealGrid.GridView, page: number) => boolean;
    onPageChanged?: (grid: RealGrid.GridView, page: number) => void;
    onPageCountChanged?: (grid: RealGrid.GridView, pageCount: number) => void;
    onGrouping?: (grid: RealGrid.GridView, fields: number[]) => boolean;
    onGrouped?: (grid: RealGrid.GridView) => void;
    onExpanding?: (grid: RealGrid.GridView, itemIndex: number) => boolean;
    onExpanded?: (grid: RealGrid.GridView, itemIndex: number) => void;
    onCollapsing?: (grid: RealGrid.GridView, itemIndex: number) => boolean;
    onCollapsed?: (grid: RealGrid.GridView, itemIndex: number) => void;
    onRowCountChanged?: (provider: RealGrid.LocalDataProvider, newCount: number) => void;
    onRowUpdating?: (provider: RealGrid.LocalDataProvider, row: number, oldValues: RealGrid.RowValues, newValues: RealGrid.RowValues) => boolean;
    onRowUpdated?: (provider: RealGrid.LocalDataProvider, row: number) => void;
    onRowsUpdated?: (provider: RealGrid.LocalDataProvider, row: number, count: number) => void;
    onRowListUpdated?: (provider: RealGrid.LocalDataProvider, rows: number[]) => void;
    onDataRowInserting?: (provider: RealGrid.LocalDataProvider, row: number, values: RealGrid.DataValues) => boolean;
    onRowInserted?: (provider: RealGrid.LocalDataProvider, row: number) => void;
    onRowsInserted?: (provider: RealGrid.LocalDataProvider, row: number, count: number) => void;
    onRowDeleting?: (provider: RealGrid.LocalDataProvider, row: number) => boolean;
    onRowDeleted?: (provider: RealGrid.LocalDataProvider, row: number) => void;
    onRowsDeleted?: (provider: RealGrid.LocalDataProvider, rows: number[]) => void;
    onRowMoving?: (provider: RealGrid.LocalDataProvider, row: number, newRow: number) => boolean;
    onRowMoved?: (provider: RealGrid.LocalDataProvider, row: number, newRow: number) => void;
    onRowsMoving?: (provider: RealGrid.LocalDataProvider, row: number, count: number, newRow: number) => boolean;
    onRowsMoved?: (provider: RealGrid.LocalDataProvider, row: number, count: number, newRow: number) => void;
    onRowListMoving?: (provider: RealGrid.LocalDataProvider, rows: number[], newRow: number) => boolean;
    onRowListMoved?: (provider: RealGrid.LocalDataProvider, rows: number[], newRow: number) => void;
    onValueChanged?: (provider: RealGrid.LocalDataProvider, row: number, field: number) => void;
    onDataChanged?: (provider: RealGrid.LocalDataProvider) => void;
    onRowStateChanged?: (provider: RealGrid.LocalDataProvider, row: number) => void;
    onRowStatesChanged?: (provider: RealGrid.LocalDataProvider, rows: number[]) => void;
    onRowStatesCleared?: (provider: RealGrid.LocalDataProvider) => void;
    onRestoreRows?: (provider: RealGrid.LocalDataProvider, rows: number[]) => void;
}

declare abstract class RealBaseReact<G, T = {}> extends default_2.Component<T & Omit<IRealGridBaseProps<G>, '$grid'>> {
    protected _gridView: GridType<G> | null;
    protected _dataProvider: RealGrid.DataProviderBase | null;
    private _mountCBs;
    private _mountTimer;
    protected _columnsChanged: boolean;
    protected gridContainer: default_2.LegacyRef<HTMLDivElement>;
    constructor(props: T);
    abstract get gridView(): GridType<G>;
    abstract get dataProvider(): RealGrid.LocalDataProvider | RealGrid.LocalTreeDataProvider;
    protected abstract createObject: () => {
        grid: GridType<G>;
        dataProvider: RealGrid.DataProviderBase;
        props: any;
    };
    protected abstract beforeDestroy: () => {
        props: any;
    };
    protected getProps(props: T): T;
    private $_connectEvents;
    private $_executeCallback;
    addCallback(callback: Function, type: string): void;
    removeCallback(callback: Function): void;
    componentDidMount(): void;
    componentWillUnmount(): void;
    componentDidUpdate(prevProps: IRealGridBaseProps<G>, prevState: Readonly<{}>, snapshot?: any): void;
    render(): default_2.ReactNode;
}

export declare class RealGridReact extends RealBaseReact<GridType<RealGrid.GridView>, IRealGridViewProps> {
    get gridView(): RealGrid.GridView;
    get dataProvider(): RealGrid.LocalDataProvider;
    protected createObject: () => {
        grid: RealGrid.GridView;
        dataProvider: RealGrid.LocalDataProvider;
        props: any;
    };
    protected beforeDestroy: () => {
        props: any;
    };
    componentDidMount(): void;
    componentDidUpdate(prevProps: IRealGridViewProps, prevState: Readonly<{
        isChildMounted: boolean;
    }>, snapshot?: any): void;
}

export declare class RealTreeReact extends RealBaseReact<GridType<RealGrid.TreeView>, IRealGridTreeProps> {
    get gridView(): RealGrid.TreeView;
    get dataProvider(): RealGrid.LocalTreeDataProvider;
    protected createObject: () => {
        grid: GridType<RealGrid.TreeView>;
        dataProvider: RealGrid.LocalTreeDataProvider;
        props: any;
    };
    protected beforeDestroy: () => {
        props: any;
    };
    componentDidMount(): void;
    componentDidUpdate(prevProps: IRealGridTreeProps, prevState: Readonly<{}>, snapshot?: any): void;
}

export declare class RGCheckBar extends ComponentBase<IRealGridCheckBar> {
    protected mountCB: () => void;
    protected unMountCB: () => void;
}

/**
 * DataColumn을 추가한다.
 * 그리드의 autoGenerateField속성이 true이면 컬럼과 Field를 동시에 추가한다.
 * textField외 dateField등 추가적인 값이 필요하면 field에 필요한 값들을 적어준다.
 * field생성후에는 fieldName을 변경하기 위해서는 browser를 refresh해야 한다.
 * <RGDataColumn field={{fieldName: "field", dataType: "date", datetimeFormat: "yyyyMMdd"}} .../>
 */
export declare class RGDataColumn extends ComponentBase<IComponentBase & IRealGridDataColumn> implements IRealGridDataColumn {
    static readonly CType = "$$RGColumn$$";
    fieldName?: string;
    mounted?: boolean;
    private _column;
    protected mountCB: () => void;
    protected unMountCB: () => void;
    componentDidMount(): void;
    componentWillUnmount(): void;
    componentDidUpdate(prevProps: Readonly<{
        [key in keyof IRealGridDataColumn]: IRealGridDataColumn[key];
    }>, prevState: Readonly<{}>, snapshot?: any): void;
}

/**
 * DataField를 추가한다.
 *
 */
export declare class RGDataField extends ComponentBase<IRealGridDataField> {
    private _field;
    protected mountCB: () => void;
    protected unMountCB: () => void;
}

export declare class RGFilterPanel extends ComponentBase<Exclude<IRealGridFilterPanel, Function>> {
    protected mountCB: () => void;
    protected unMountCB: () => void;
}

/**
 * Footer의 속성을 변경할때 사용한다.
 */
export declare class RGFooter extends ComponentBase<IRealGridFooter> {
    protected mountCB: () => void;
    protected unMountCB: () => void;
}

/**
 * Footer를 여러개 만들때 사용한다.
 */
export declare class RGFooters extends ComponentBase<Exclude<IRealGridFooters, Function>> {
    protected mountCB: () => void;
    protected unMountCB: () => void;
}

export declare class RGGroupPanel extends ComponentBase<IRealGridGroupPanel> {
    protected mountCB: () => void;
    protected unMountCB: () => void;
}

export declare class RGHeader extends ComponentBase<IRealGridHeader> {
    protected mountCB: () => void;
    protected unMountCB: () => void;
}

/**
 * 여러개의 headerSummary를 만들때 사용한다.
 */
export declare class RGHeaderSummaries extends ComponentBase<Exclude<IRealGridheaderSummaries, Function>> {
    protected mountCB: () => void;
    protected unMountCB: () => void;
    componentDidMount(): void;
    componentWillUnmount(): void;
}

/**
 * headerSummary의 속성을 변경한다.
 */
export declare class RGHeaderSummary extends ComponentBase<IRealGridHeaderSummary> {
    protected mountCB: () => void;
    protected unMountCB: () => void;
}

export declare class RGLiteralColumn extends ComponentBase<IRealGridLiteralColumn> {
    static readonly CType = "$$RGColumn$$";
    private _column;
    protected mountCB: () => void;
    protected unMountCB: () => void;
    componentDidMount(): void;
    componentWillUnmount(): void;
    componentDidUpdate(prevProps: Readonly<{
        [key in keyof IRealGridLiteralColumn]: IRealGridLiteralColumn[key];
    }>, prevState: Readonly<{}>, snapshot?: any): void;
}

export declare class RGRowIndicator extends ComponentBase<IRealGridRowIndicator> {
    protected mountCB: () => void;
    protected unMountCB: () => void;
}

/**
 * SeriesColumn을 추가한다.
 */
export declare class RGSeriesColumn extends ComponentBase<IRealGridSeriesColumn> {
    static readonly CType = "$$RGColumn$$";
    private _column;
    protected mountCB: () => void;
    protected unMountCB: () => void;
    componentDidMount(): void;
    componentWillUnmount(): void;
    componentDidUpdate(prevProps: Readonly<{
        [key in keyof IRealGridSeriesColumn]: IRealGridSeriesColumn[key];
    }>, prevState: Readonly<{}>, snapshot?: any): void;
}

export declare class RGStateBar extends ComponentBase<IRealGridStateBar> {
    protected mountCB: () => void;
    protected unMountCB: () => void;
}

export { }
