import { BehaviorSubject, Observable, ReplaySubject, Subject } from 'rxjs';
import { FieldsGroup } from './models/fields-group';
import { HeaderState, HeaderStateInterface } from './header-state';
import { OnDestroy } from '@angular/core';
import { HeaderChange } from './models/user-changes/header-change';
import { PetriNetReference } from '../resources/interface/petri-net-reference';
import { HeaderType } from './models/header-type';
import { HeaderMode } from './models/header-mode';
import { HeaderColumn } from './models/header-column';
import { UserPreferenceService } from '../user/services/user-preference.service';
import { LoggerService } from '../logger/services/logger.service';
import { LoadingEmitter } from '../utility/loading-emitter';
import { SortDirection } from '@angular/material/sort';
import { ViewIdService } from '../user/services/view-id.service';
import { Net } from '../process/net';
import { OverflowService } from './services/overflow.service';
import * as i0 from "@angular/core";
export declare abstract class AbstractHeaderService implements OnDestroy {
    protected _headerType: HeaderType;
    protected _preferences: UserPreferenceService;
    protected _logger: LoggerService;
    private _viewIdService;
    protected _overflowService: OverflowService;
    static readonly DEFAULT_HEADER_COUNT = 5;
    static readonly DEFAULT_HEADER_RESPONSIVITY = true;
    protected _headerColumnCount$: BehaviorSubject<number>;
    protected _preferenceColumnCount$: ReplaySubject<number>;
    protected _responsiveHeaders$: BehaviorSubject<boolean>;
    protected _headerState: HeaderState;
    protected _headerChange$: Subject<HeaderChange>;
    protected _clearHeaderSearch$: Subject<number>;
    private _initDefaultHeaders;
    private _initializedCount;
    loading: LoadingEmitter;
    fieldsGroup: Array<FieldsGroup>;
    protected constructor(_headerType: HeaderType, _preferences: UserPreferenceService, _logger: LoggerService, _viewIdService: ViewIdService, _overflowService: OverflowService);
    /**
     * Provides Observable for all changes in header
     */
    get headerChange$(): Observable<HeaderChange>;
    get selectedHeaders$(): Observable<Array<HeaderColumn>>;
    get headerState(): HeaderStateInterface;
    get headerType(): HeaderType;
    get overflowMode(): boolean;
    get headerColumnCount(): number;
    set headerColumnCount(maxColumns: number);
    get headerColumnCount$(): Observable<number>;
    get responsiveHeaders(): boolean;
    set responsiveHeaders(responsiveHeaders: boolean);
    get responsiveHeaders$(): Observable<boolean>;
    get clearHeaderSearch$(): Observable<number>;
    set initDefaultHeaders(defaultHeaders: Array<string>);
    get initDefaultHeaders(): Array<string>;
    get preferenceColumnCount$(): Observable<number>;
    private initializeHeaderState;
    protected initializeDefaultHeaderState(): void;
    /**
     * Adds `null` headers if the new count is greater than the current count.
     *
     * Removes extra headers if the new count is smaller than the current count.
     */
    protected updateHeaderColumnCount(): void;
    setAllowedNets(allowedNets: Array<PetriNetReference>): void;
    setTaskAllowedNets(allowedNets: Array<Net>): void;
    /**
     * If this view has som headers stored in it's preferences attempts to load them.
     * If the preferences contain nonexistent headers they will be skipped.
     *
     * This function is NOT called by the abstract class' constructor.
     * It is the responsibility of the child class to call it at an appropriate moment.
     */
    protected loadHeadersFromPreferences(): void;
    protected abstract createMetaHeaders(): Array<HeaderColumn>;
    /**
     * Change sort mode for selected column all other column are set to default sort mode
     * Emit request for sorted panels
     * @param columnIndex index of the column that caused the sort change
     * @param active Represents column identifier
     * @param direction Represent one of sort modes: asd, desc and ''
     */
    sortHeaderChanged(columnIndex: number, active: string, direction: SortDirection): void;
    /**
     * Saves the search value in the appropriate column in the header
     * Emit request for searched panels by user input query
     */
    headerSearchInputChanged(columnIndex: number, searchInput: any): void;
    /**
     * Change active header and titles of panels
     */
    headerColumnSelected(columnIndex: number, newHeaderColumn: HeaderColumn): void;
    /**
     * Change selected header mode there are three possible modes: SORT, SEARCH and EDIT
     * @param newMode the mode that the header should change to
     * @param saveLastMode whether the last state should be remembered.
     * It can be restored with the [HeaderState.restoreLastMode()]{@link HeaderState#restoreLastMode} method.
     */
    changeMode(newMode: HeaderMode, saveLastMode?: boolean): void;
    confirmEditMode(): void;
    /**
     * When user cancels the edit mode, the last saved headers state is loaded and emitted
     * Last mode in header is reloaded as well. Possible reloaded modes: sort or search
     */
    revertEditMode(): void;
    ngOnDestroy(): void;
    /**
     * @param newMode the {@link HeaderMode} that is being selected as the next mode
     * @returnsa {@link HeaderChange} object with {@link ModeChangeDescription} object as it's `description`,
     * where the `previousMode` is set to the currently selected mode and the `currentMode` is set to the provided argument
     */
    protected modeChangeFromCurrent(newMode: HeaderMode): HeaderChange;
    /**
     * @returns a {@link HeaderChange} object with {@link ModeChangeDescription} object as it's `description`,
     * where the `previousMode` is set to [EDIT]{@link HeaderMode#EDIT} and the `currentMode` to the mode
     * that is currently selected
     */
    protected modeChangeAfterEdit(): HeaderChange;
    /**
     * @param oldMode the {@link HeaderMode} that was previously selected
     * @param newMode the {@link HeaderMode} that is selected now
     * @returns a {@link HeaderChange} object with {@link ModeChangeDescription} object as it's `description`
     * containing information about a change to the header mode
     */
    protected createModeChange(oldMode: HeaderMode, newMode: HeaderMode): HeaderChange;
    /**
     * Emits a new value into the [clearHeaderSearch$]{@link AbstractHeaderService#clearHeaderSearch$} stream, that notifies
     * the header search component, that it should clear the input for the specified column.
     * @param columnIndex the index of the column that should be cleared
     */
    clearHeaderSearch(columnIndex: number): void;
    /**
     * @returns the Id of the view, if the ViewIdService was injected. Returns `undefined` if the service was not injected.
     */
    protected getViewId(): string | undefined;
    protected abstract saveState(): any;
    protected abstract saveNewState(): any;
    protected abstract restoreLastState(): any;
    static ɵfac: i0.ɵɵFactoryDeclaration<AbstractHeaderService, [null, null, null, { optional: true; }, { optional: true; }]>;
    static ɵprov: i0.ɵɵInjectableDeclaration<AbstractHeaderService>;
}
