import { OnInit, EventEmitter } from '@angular/core';
import { AbstractDataEditorView } from './AbstractDataEditorView';
import { IDataEditorViewProvider } from './IDataEditorViewProvider';
import { IDataEditorActionProvider } from './IDataEditorActionProvider';
import { IEditorSettingServiceFactory } from './IEditorSettingServiceFactory';
import { IDataServiceFactory } from './IDataServiceFactory';
import { ViewWrapper } from './editor.internal/ViewWrapper.component';
import { IDataService } from './IDataService';
import { IEditorSettingService } from './IEditorSettingService';
import { ViewModel, ActionModel, PhloxAppInfo } from '../model/models';
import { DataSchema } from '../../share/model/models';
import { IMenuModelFactory } from '../../component/IMenuModelFactory';
import { IDataComparator } from '../../component/IDataComparator';
import { PhloxAppInfoService } from '../../service/PhloxAppInfoService.service';
import { DialogService } from '../../service/DialogService.service';
import { BackgroundProcessManager } from '../../service/BackgroundProcessManager.service';
import { IPageLoad } from '../../share/IPageLoad';
import { AbstractI18NApplicable } from '../../share/AbstractI18NApplicable';
/**
 * <p style="text-indent: 2em;">
 * An abstract base class for <code>data editor</code> page component. A single <code>data editor</code> may contain one or more <code>data view</code>s ([[ViewModel]]).
 * All <code>data view</code>s must manipulate with the same data set in that editor. For an instance, when a user edit data from one view and switch to another view, the data
 * shown in the second view must always be identical the same as the first one. An editor may contain a set of <code>action</code>s ([[ActionModel]]) which user can perform
 * on editor's data. For more information about creating your own editor page, please see the documentation below.
 * </p>
 * <section style="padding-top: 7pt;">
 * <header style="font-weight: bold;">
 * Data View
 * </header>
 * <p style="text-indent: 2em;">
 * To specify the list of views in an editor, you have to provide a <code>view provider</code> ([[IDataEditorViewProvider]]) into editor's constructor. The editor's constructor
 * will call [[IDataEditorViewProvider.getViewModels]] to obtain the list of <code>data view</code>s being displayed in this editor. The concept behind <code>data view</code> is that
 * to provide user the different perspectives on the same data set. For example, if you're going to build a customer data editor page, you may want to provide user a <code>list view</code>
 * which allows user to easily search a customer by typing into search text box, then, it'll show customer data in tabular form. Therefore, in some sense, you may want to provide
 * a <code>calendar view</code> displaying customer's birth date to the user --letting he/she to take less efforts on organizing a CRM work plan. For this kind of use, using <code>
 * data view</code>, instead of building seperate pages, is the best choice to build your application.
 * </p>
 * </section>
 * <section style="padding-top: 7pt;">
 * <header style="font-weight: bold;">
 * Action
 * </header>
 * <p style="text-indent: 2em;">
 * abcdef
 * </p>
 * </section>
 *
 * @author shiorin, tee4cute
 * @see [[ViewModel]]
 * @see [[ActionModel]]
 * @see [[IDataEditorViewProvider]]
 * @see [[IDataEditorActionProvider]]
 * @see [[IDataServiceFactory]]
 */
export declare abstract class AbstractDataEditor extends AbstractI18NApplicable implements OnInit, IPageLoad {
    protected viewModels: ViewModel[];
    protected actionModels: ActionModel[];
    protected dataSchema: DataSchema;
    protected dataCreateEvent: EventEmitter<any>;
    protected dataUpdateEvent: EventEmitter<any>;
    protected dataDeleteEvent: EventEmitter<any>;
    protected dataRevertEvent: EventEmitter<any>;
    protected dataQueryEvent: EventEmitter<any>;
    protected dataReloadEvent: EventEmitter<any>;
    protected dataSchemaLoadEvent: EventEmitter<any>;
    protected viewShowEvent: EventEmitter<any>;
    protected viewHideEvent: EventEmitter<any>;
    protected viewChangeEvent: EventEmitter<any>;
    private PAGE_LOOP_TIMEOUT;
    private showViewDelayTimer;
    protected viewProvider: IDataEditorViewProvider;
    protected viewWrappers: ViewWrapper[];
    protected actionProvider: IDataEditorActionProvider;
    protected settingServiceFactory: IEditorSettingServiceFactory;
    protected dataServiceFactory: IDataServiceFactory;
    protected data: any[];
    protected dataService: IDataService;
    protected editorSetting: IEditorSettingService;
    protected dialogService: DialogService;
    protected phloxAppService: PhloxAppInfoService;
    protected views: AbstractDataEditorView[];
    protected viewShowHandlerFunction: Function;
    protected viewHideHandlerFunction: Function;
    protected viewChangeHandlerFunction: Function;
    protected menuModelFactory: IMenuModelFactory;
    protected dataComparator: IDataComparator<any>;
    protected currentView: AbstractDataEditorView;
    protected phloxAppInfo: PhloxAppInfo;
    protected bgProcessMgr: BackgroundProcessManager;
    protected query: any;
    constructor(actionProvider: IDataEditorActionProvider, viewProvider: IDataEditorViewProvider, dataFactory: IDataServiceFactory, settingServiceFactory: IEditorSettingServiceFactory, phloxAppService: PhloxAppInfoService, dialogService: DialogService, bgProcessMgr: BackgroundProcessManager);
    ngOnInit(): void;
    protected initPage(): void;
    private getI18NMessage(key);
    private onViewShowHandler(event);
    private onViewHideHandler(event);
    private onViewChangeHandler(event);
    protected removeData(data: any): boolean;
    protected getRevertData(checkData: any): any;
    protected getViewComponentFromModel(viewModel: ViewModel): AbstractDataEditorView;
    setActionModels(actionModels: ActionModel[]): void;
    reInit(): void;
    getObjectIdField(): string;
    getLanguageField(): string;
    getAppSetting(): any;
    recreateDataService(): Promise<IDataService>;
    getData(): any[];
    getCurrentView(): AbstractDataEditorView;
    getViewModelIndex(view: ViewModel): number;
    getViewComponentFromType(viewType: string): AbstractDataEditorView;
    showView(view: ViewModel): Promise<boolean>;
    private _showView(view);
    private getDataFromObjectId(objId);
    private editData(data);
    private getSavePromise(dataProm);
    getDialogService(): DialogService;
    showViewByType(viewType: string): Promise<boolean>;
    addViewComponent(view: AbstractDataEditorView): void;
    removeViewComponent(view: AbstractDataEditorView): void;
    reloadData(): Promise<any>;
    reloadEditorSetting(): Promise<any>;
    reloadViewSetting(): void;
    createData(data: any): Promise<any>;
    createDataWithConfirmDialog(data: any): Promise<any>;
    saveSelectedData(): Promise<any>;
    saveDirtyData(): Promise<any>;
    saveSelectedDataWithConfirmDialog(): Promise<any>;
    saveDirtyDataWithConfirmDialog(): Promise<any>;
    updateSelectedData(): Promise<any>;
    updateDirtyData(): Promise<any>;
    updateData(data: any): Promise<any>;
    updateDataWithConfirmDialog(data: any): Promise<any>;
    updateDirtyDataWithConfirmDialog(): Promise<any>;
    updateSelectedDataWithConfirmDialog(): Promise<any>;
    deleteSelectedData(): Promise<any>;
    deleteData(data: any): Promise<any>;
    deleteDataWithConfirmDialog(data: any): Promise<any>;
    deleteSelectedDataWithConfirmDialog(): Promise<any>;
    revertDirtyData(): Promise<any>;
    revertSelectedData(): Promise<any>;
    revertData(data: any): Promise<any>;
    revertDataWithConfirmDialog(data: any): Promise<any>;
    revertSelectedDataWithConfirmDialog(): Promise<any>;
    revertDirtyDataWithConfirmDialog(): Promise<any>;
    searchData(): Promise<any>;
    queryData(queryObject: any): Promise<any>;
    addViewWrapper(viewWrapper: ViewWrapper): void;
    removeViewWrapper(viewWrapper: ViewWrapper): void;
    hideDialog(): void;
    getI18NObject(key: string): any;
    applyI18N(value: any): void;
    setOptions(options: any): void;
    setDataSchema(dataSchema: DataSchema): void;
    getDataSchema(): DataSchema;
    getDataService(): IDataService;
    setViewShowEvent(event: EventEmitter<any>): void;
    setViewHideEvent(event: EventEmitter<any>): void;
    setViewChangeEvent(event: EventEmitter<any>): void;
    setDataCreateEvent(event: EventEmitter<any>): void;
    setDataUpdateEvent(event: EventEmitter<any>): void;
    setDataDeleteEvent(event: EventEmitter<any>): void;
    setDataRevertEvent(event: EventEmitter<any>): void;
    setDataReloadEvent(dataReloadEvent: EventEmitter<any>): void;
    setDataQueryEvent(dataQueryEvent: EventEmitter<any>): void;
    setDataSchemaLoadEvent(dataSchemaLoadEvent: EventEmitter<any>): void;
    getViewShowEvent(): EventEmitter<any>;
    getViewHideEvent(): EventEmitter<any>;
    getViewChangeEvent(): EventEmitter<any>;
    getDataCreateEvent(): EventEmitter<any>;
    getDataUpdateEvent(): EventEmitter<any>;
    getDataDeleteEvent(): EventEmitter<any>;
    getDataRevertEvent(): EventEmitter<any>;
    getDataReloadEvent(): EventEmitter<any>;
    getDataQueryEvent(): EventEmitter<any>;
    getDataSchemaLoadEvent(): EventEmitter<any>;
    getActionModels(): ActionModel[];
    getViewModels(): ViewModel[];
    getViewShowHandler(): Function;
    getViewHideHandler(): Function;
    getViewChangeHandler(): Function;
    setQuery(query: any): void;
    getQuery(): any;
    protected abstract onEditorSettingLoaded(settings: any): void;
    abstract getMenuModelFactory(): IMenuModelFactory;
    abstract getDataComparator(): IDataComparator<any>;
    abstract newDataObject(): any;
    abstract isPageLoaded(): boolean;
}
export * from './editor.internal/ViewButton.component';
