/**
 * Copyright (c) 2018-2019 Aleksey Melnikov, True Directive Company.
 * @link https://truedirective.com/
 * @license MIT
*/
import { ElementRef, QueryList, ChangeDetectorRef, KeyValueDiffers, EventEmitter, DoCheck, OnDestroy } from '@angular/core';
import { Subject, Observable } from 'rxjs';
import { GridPart } from '@true-directive/base';
import { UIAction } from '@true-directive/base';
import { Column, CellPosition, GridSettings, RowLayout, DataQuery, SortInfo, Filter, Selection } from '@true-directive/base';
import { RowCalculator } from '@true-directive/base';
import { ScrollerComponent } from './scroller.component';
import { BaseComponent } from './base.component';
import { RowDirective } from './row.directive';
import { GridStateService } from './grid-state.service';
import { InternationalizationService } from './internationalization/internationalization.service';
import { FilterPopupComponent } from './filters/filter-popup.component';
export declare class GridViewComponent extends BaseComponent implements DoCheck, OnDestroy {
    state: GridStateService;
    protected intl: InternationalizationService;
    protected elementRef: ElementRef;
    protected changeDetector: ChangeDetectorRef;
    protected keyValueDiffers: KeyValueDiffers;
    protected destroy$: Subject<boolean>;
    private _data;
    private _dataSubscription;
    /**
     * Grid data source. You can specify an observable object or array.
     */
    /**
    * Data source
    * @return Array of the rows or observable object
    */
    data: any[] | Observable<any[]>;
    /**
     * List of the rows to display
     * @return Array of the rows
     */
    readonly rows: any[];
    /**
     * Resulting list of rows after applying filters and sorting
     * @return Array of the rows
     */
    readonly resultRows: any[];
    /**
     * Current locale name
     */
    readonly locale: string;
    /**
     * List of the columns
     */
    columns: Column[];
    /**
     * Grid's settings
     */
    settings: GridSettings;
    /**
     * The maximum grid height, unless explicitly specified.
     */
    maxHeight: number;
    /**
     * Text search data for all columns
     */
    searchString: string;
    /**
     * Event that will trigger when data retrieval options are changed (filters,
     * sortings)
     * @param  'dataQuery' [description]
     * @return             [description]
     */
    dataQuery: EventEmitter<DataQuery>;
    queryChanged: EventEmitter<DataQuery>;
    startProcess: EventEmitter<string>;
    endProcess: EventEmitter<string>;
    scroller: ScrollerComponent;
    grid: any;
    gridHeader: any;
    gridData: any;
    dragItem: any;
    filterPopup: FilterPopupComponent;
    displayedRows_template: QueryList<RowDirective>;
    displayedRowsCenter: QueryList<RowDirective>;
    customTemplate: any;
    protected uiAction: UIAction;
    private _initialized;
    private _viewInitialized;
    private _lastUpdateTime;
    protected readonly _lastScroll: {
        pos: number;
        renderedPos: number;
        time: number;
    };
    dataUpdating: boolean;
    readonly displayedRows: QueryList<RowDirective>;
    protected need_recalc_page: boolean;
    private _prevOffset;
    private _prevLimit;
    /**
     * Current appearance css-class
     */
    private _currentAppearance;
    /**
     * List of rows to be rendered.
     */
    private _currentRendered;
    private _settingsDiffer;
    private _appearanceDiffer;
    viewPortLeft: number;
    viewPortWidth: number;
    RC: RowCalculator;
    readonly selection: Selection;
    protected readonly headerParts: BaseComponent[];
    protected readonly dataParts: Array<QueryList<RowDirective>>;
    protected _headerParts(): BaseComponent[];
    protected _dataParts(): Array<QueryList<RowDirective>>;
    immediateFilter(filter: string): void;
    /**
     * List of the rows to render
     * @return Array of the rows
     */
    readonly visibleRows: any[];
    private saveRowHeights;
    /**
     * Page refresh
     * @param  forceChanges Force update even if there was no scrolling
     * @param  overwork     The number of rows that will be rendered outside the viewport
     */
    updatePage(log?: string, forceChanges?: boolean, overwork?: any): void;
    /**
     * Force view update
     */
    updateView(): void;
    cellPosition(row: any, fieldName: string): CellPosition;
    startSelect(cp: CellPosition, add?: boolean): void;
    proceedToSelect(cp: CellPosition): void;
    /**
     * Hide all buttons in column headers
     */
    hideHeaderBtns(): void;
    /**
     * Asynchronous data update. The Observable returns, by subscribing to which
     * you can find out when this update ended.
     * @param  data The data (array of objects).
     * @return      Observable object whose event will occur immediately after processing.
     */
    updateDataAsync(data: any[]): Observable<any>;
    /**
     * Updating data with external or internal change.
     */
    updateData(async?: boolean): void;
    updateSummaries(): void;
    /**
     * Received data externally (from the parent component)
     * @param  query The request in response to which the data received.
     * @param  data  Data that received in response to a given request.
     */
    fetchData(query: DataQuery, data: any[]): void;
    protected renderData(): void;
    private _inProcess;
    protected updatePageByScroll(): void;
    /**
     * Scrolling data vertically
     * @param  e Scroll event
     */
    gridScroll(e: any): void;
    /**
     * Triggered by automatic scrolling during area selection
     * @param  dx How many pixels are scrolled horizontally?
     */
    gridAutoScrollX(dx: number): void;
    /**
     * We need call this method for the changes to take effect.
     * If dataAffected=true then re-filter and re-sort data.
     * @param  log          Reason for detecting changes
     * @param  dataAffected Is the data changed
     */
    detectChanges(log?: string, dataAffected?: boolean): void;
    protected displayedRowsByXY(x: number, y: number, place?: GridPart): QueryList<RowDirective>;
    protected rowLayouts(rows: QueryList<RowDirective>): RowLayout[];
    protected rowByXY(rows: QueryList<RowDirective>, x: number, y: number): RowLayout;
    protected cellByXY(x: number, y: number, place?: GridPart): CellPosition;
    protected refreshSelection(scrollTo: CellPosition): void;
    /**
     * Прокрутить скроллбоксы так, чтобы была видна ячейка, на которой находится
     * виртуальный фокус
     */
    scrollToFocused(): void;
    /**
     * Прокрутка к указанной ячейке.
     * Обычно вызываем после обработки нажатия клавиши, чтобы была видна строка
     * с фокусом.
     * Также вызывается после клика мышью по ячейке.. Если ячейка видна на экране
     * только частично - немного скроллим.
     * @param  cellPos Позиция ячейки, к которой прокручиваем грид
     */
    scrollTo(cellPos: CellPosition): void;
    protected toggleClass(v: boolean, c: string): void;
    /**
     * Проверить, нужно ли отобразить левую или правую область для зафиксированных
     * колонок
     * @param  xx         [description]
     * @param  scrollRect [description]
     * @param  target     [description]
     * @return            [description]
     */
    protected checkParts(xx: number, scrollRect: any, target: any): void;
    /**
     * Выделение заданной строки
     * @param  r Заданная строка
     * @return   Найдена ли заданная строка в списке отображаемых строк
     */
    locateRow(r: any): boolean;
    /**
     * Выделение строки по заданному значению ключевого поля
     * @param  keyValue Значение ключевого поля
     * @param  keyField Ключевое поле. Если не задано, то поле берется из settings
     * @return          Найдена ли строка с заданным ключом
     */
    locateByKey(keyValue: any, keyField?: string): void;
    /**
     * Очистка выделения
     */
    clearSelection(): void;
    /**
     * Трек отображаемых записей для более быстрого рендера ангуляром
     * @param  index Индекс строки
     * @param  data  Данные строки
     */
    trackRow(index: number, data: any): any;
    /**
     * При изменении размеров окна вызывается этот метод.
     * Если размер компонента изменяется какими-то действиями пользователя помимо
     * изменения размеров окна браузера (вьюпорта), то необходимо вызывать этот
     * метод.
     * Этот метод также следует вызывать при drop колонки, т.к. размер центральной
     * области меняется, если колонка переброшена в левую или правую фиксированную
     * область.
     * @param  update_page=false [description]
     * @return                   [description]
     */
    checkSize(update_page?: boolean): boolean;
    protected windowResize(e: any): void;
    /**
     * Показать кнопку заголовка для колонки по заданному полю
     * @param  fieldName Заданное поле
     */
    showHeaderBtn(fieldName: string): void;
    /**
     * Data sorting
     * @param  sortings List of sortings
     */
    sort(sortings: SortInfo[], update?: boolean): void;
    clearSorting(update?: boolean): void;
    /**
     * Data filtering
     * @param  result [description]
     * @return        [description]
     */
    filter(filters: Filter[], update?: boolean): void;
    filterToString(filter: Filter): string;
    filterClosed(result: any): void;
    setFilter(f: any): void;
    resetFilter(f: any): void;
    protected getFilterComponentType(filter: Filter): any;
    protected showFilter(e: any): void;
    focus(): void;
    /**
     * Установка класса внешнего вида
     * @param  appearanceClass Класс, который будет применен к компоненту
     */
    setAppearance(appearanceClass: string): void;
    ngOnInit(): void;
    ngAfterContentInit(): void;
    ngAfterViewInit(): void;
    ngDoCheck(): void;
    ngOnDestroy(): void;
    constructor(state: GridStateService, intl: InternationalizationService, elementRef: ElementRef, changeDetector: ChangeDetectorRef, keyValueDiffers: KeyValueDiffers);
}
