import { RemoveListener } from "@sheetxl/common";
import { TransactionStore, ITransaction } from "../transaction";
import { ListenerEmitter, Listener, ListenerOptions } from "../listener";
import { Run, RunCoords } from "../run/RunUtils";
import { ICellHeader, CellHeaderCreator, CellHeaderJSON, CellsHeaderAddressValuePair, CellHeaderUpdate, ISheetStyle, AutoFitOptions, CellHeaderRangeAddress, HeaderOrientation } from "../cell";
import { ISheetModel } from "./ISheetModel";
import { ISheetHeadersModel, SheetHeadersEvent, SheetHeaderJSON, SetHeaderOptions, ISheetHeaderRange } from "./ISheetHeadersModel";
export interface SheetHeadersModelOptions<T extends ICellHeader, P extends CellHeaderJSON> {
    createCellHeader: CellHeaderCreator<T>;
    orientation: HeaderOrientation;
    sheetModel: ISheetModel;
    transactionStore?: TransactionStore;
    /**
     * Takes a list of runs and returns the best sizes for each.
     */
    findBestFits?: (runs: RunCoords[], options: AutoFitOptions) => Run<number>[];
    getUpdateId?: () => number;
    isProtected?: () => boolean;
    defaultAutoFitOptions?: AutoFitOptions;
    getHeaderText?(index: number): string;
    /**
     * A number that represents a scaling factor.
     */
    scaleFactor?: () => number;
    defaultSize?: () => number;
    minSize?: number;
    maxSize?: number;
    maxIndex?: number;
    initialJSON?: SheetHeaderJSON<P>;
}
/**
 * For updating and working with headers (rows/columns)
 */
export default class SheetHeadersModel<T extends ICellHeader, P extends CellHeaderJSON, U extends CellHeaderUpdate> implements ISheetHeadersModel<T, P, U> {
    protected _emitter: ListenerEmitter;
    private _options;
    private _sheetModelListenerRemove;
    private _transactionStore;
    private _transactionStoreRemoveListener;
    private _emptyHeader;
    private _scaleFactor;
    private _indexedHeaderLocations;
    private _headerBounds;
    private _hasCustomFormats;
    private _hasCustomStyles;
    private _lastHeaderRead;
    private _lastHeaders;
    constructor(options: SheetHeadersModelOptions<T, P>);
    addEventListener(type: string, listener: Listener<SheetHeadersEvent>, options?: ListenerOptions): RemoveListener;
    private _onHeaderChange;
    sheetStyle(): ISheetStyle;
    sheet(): ISheetModel;
    orientation(): HeaderOrientation;
    getHeaderText(index: number): string;
    private _scanHeaders;
    getRange(address?: CellHeaderRangeAddress): ISheetHeaderRange<U>;
    getHeader(offset: number): T;
    setHeaderPairs(pairs: CellsHeaderAddressValuePair<U>[], options?: SetHeaderOptions): RunCoords[] | null;
    private _parseHeaderRangeAddress;
    update(address: CellHeaderRangeAddress, update: ICellHeader | U | null, options?: SetHeaderOptions): void;
    isProtected(): boolean;
    scaleFactor(): number;
    private get _headers();
    private _setHeaderPairsInternal;
    getHeaderBounds(): RunCoords;
    getMaxHeaderBounds(): RunCoords;
    hasCustomFormats(): boolean;
    hasCustomStyles(): boolean;
    autoFit(addresses: CellHeaderRangeAddress[] | CellHeaderRangeAddress, options?: AutoFitOptions): void;
    getDefaultHeaderSize(): number;
    getMaxHeaderSize(): number;
    getMinHeaderSize(): number;
    findOffset(index: number): number;
    findIndex(offset: number): number;
    getHeaderSize(indexFrom: number, indexTo?: number): number;
    hiddenHeadersAt(index: number, forward?: boolean): number;
    insertHeaders(index: number, amount: number): void;
    removeHeaders(index: number, amount: number): void;
    pushTransaction(description?: string): ITransaction;
    private _getTransactionState;
    private _pushTransaction;
    private _updateTransactionState;
    close(): void;
    fromJSON(json: SheetHeaderJSON<P>): void;
    toJSON(): SheetHeaderJSON<P>;
}
export { SheetHeadersModel };
//# sourceMappingURL=SheetHeadersModel.d.ts.map