/**
 * Copyright 2023-present DreamNum Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import type { ICellWithCoord, IRangeWithCoord, Nullable, ThemeService } from '@univerjs/core';
import type { Scene, SpreadsheetSkeleton } from '@univerjs/engine-render';
import type { ISelectionStyle, ISelectionWidgetConfig, ISelectionWithCoord } from '@univerjs/sheets';
import type { ISelectionShapeExtensionOption } from './selection-shape-extension';
import { Disposable, RANGE_TYPE } from '@univerjs/core';
import { Group, Rect } from '@univerjs/engine-render';
import { Subject } from 'rxjs';
import { SelectionRenderModel } from './selection-render-model';
import { SelectionShapeExtension } from './selection-shape-extension';
export declare enum SELECTION_MANAGER_KEY {
    Selection = "__SpreadsheetSelectionShape__",
    top = "__SpreadsheetSelectionTopControl__",
    bottom = "__SpreadsheetSelectionBottomControl__",
    left = "__SpreadsheetSelectionShapeLeftControl__",
    right = "__SpreadsheetSelectionShapeRightControl__",
    backgroundTop = "__SpreadsheetSelectionBackgroundControlTop__",
    backgroundMiddleLeft = "__SpreadsheetSelectionBackgroundControlMiddleLeft__",
    backgroundMiddleRight = "__SpreadsheetSelectionBackgroundControlMiddleRight__",
    backgroundBottom = "__SpreadsheetSelectionBackgroundControlBottom__",
    fill = "__SpreadsheetSelectionFillControl__",
    fillTopLeft = "__SpreadsheetSelectionFillControlTopLeft__",
    fillBottomRight = "__SpreadsheetSelectionFillControlBottomRight__",
    fillTopLeftInner = "__SpreadsheetSelectionFillControlTopLeftInner__",
    fillBottomRightInner = "__SpreadsheetSelectionFillControlBottomRightInner__",
    lineMain = "__SpreadsheetDragLineMainControl__",
    lineContent = "__SpreadsheetDragLineContentControl__",
    line = "__SpreadsheetDragLineControl__",
    dash = "__SpreadsheetDragDashControl__",
    rowHeaderBackground = "__SpreadSheetSelectionRowHeaderBackground__",
    rowHeaderBorder = "__SpreadSheetSelectionRowHeaderBorder__",
    rowHeaderGroup = "__SpreadSheetSelectionRowHeaderGroup__",
    columnHeaderBackground = "__SpreadSheetSelectionColumnHeaderBackground__",
    columnHeaderBorder = "__SpreadSheetSelectionColumnHeaderBorder__",
    columnHeaderGroup = "__SpreadSheetSelectionColumnHeaderGroup__",
    topLeftWidget = "__SpreadSheetSelectionTopLeftWidget__",
    topCenterWidget = "__SpreadSheetSelectionTopCenterWidget__",
    topRightWidget = "__SpreadSheetSelectionTopRightWidget__",
    middleLeftWidget = "__SpreadSheetSelectionMiddleLeftWidget__",
    middleRightWidget = "__SpreadSheetSelectionMiddleRightWidget__",
    bottomLeftWidget = "__SpreadSheetSelectionBottomLeftWidget__",
    bottomCenterWidget = "__SpreadSheetSelectionBottomCenterWidget__",
    bottomRightWidget = "__SpreadSheetSelectionBottomRightWidget__"
}
/**
 * The main selection canvas component, includes leftControl,rightControl,topControl,bottomControl,backgroundControlTop,backgroundControlMiddleLeft,backgroundControlMiddleRight,backgroundControlBottom,fillControl
 */
export declare class SelectionControl extends Disposable {
    protected _scene: Scene;
    protected _zIndex: number;
    protected readonly _themeService: ThemeService;
    private _isHelperSelection;
    /**
     * For ref selections, there is no auto fill.
     */
    protected _enableAutoFill: boolean;
    /**
     * Only normal selections with primary cell has auto fill.
     * This works for multiple normal selections. Only last selection has primary cell and auto fill.
     */
    private _showAutoFill;
    /**
     * If rowHeader & col Header would be highlighted with selection.
     */
    protected _highlightHeader: boolean;
    protected _selectionRenderModel: SelectionRenderModel;
    private _leftBorder;
    private _rightBorder;
    private _topBorder;
    private _bottomBorder;
    private _backgroundControlTop;
    private _backgroundControlBottom;
    private _backgroundControlMiddleLeft;
    private _backgroundControlMiddleRight;
    private _autoFillControl;
    private _selectionShapeGroup;
    private _rowHeaderBackground;
    private _rowHeaderBorder;
    private _rowHeaderGroup;
    private _columnHeaderBackground;
    private _columnHeaderBorder;
    private _columnHeaderGroup;
    private _dashedRect;
    private _topLeftWidget;
    private _topCenterWidget;
    private _topRightWidget;
    private _middleLeftWidget;
    private _middleRightWidget;
    private _bottomLeftWidget;
    private _bottomCenterWidget;
    private _bottomRightWidget;
    private _defaultStyle;
    private _currentStyle;
    protected _rowHeaderWidth: number;
    protected _columnHeaderHeight: number;
    protected _rowHeaderOffsetX: number;
    protected _columnHeaderOffsetY: number;
    protected _widgetRects: Rect[];
    protected _controlExtension: Nullable<SelectionShapeExtension>;
    private _dispose$;
    readonly dispose$: import("rxjs").Observable<SelectionControl>;
    /**
     * eventSource: selectionShapeExtension selectionMoving$.next,
     * Observer: prompt.controller
     */
    readonly selectionMoving$: Subject<IRangeWithCoord>;
    readonly selectionMoveEnd$: Subject<IRangeWithCoord>;
    readonly selectionScaling$: Subject<IRangeWithCoord>;
    readonly selectionScaled$: Subject<Nullable<IRangeWithCoord>>;
    readonly selectionFilling$: Subject<Nullable<IRangeWithCoord>>;
    private readonly _selectionFilled$;
    readonly selectionFilled$: import("rxjs").Observable<Nullable<IRangeWithCoord>>;
    constructor(_scene: Scene, _zIndex: number, _themeService: ThemeService, options?: {
        highlightHeader?: boolean;
        enableAutoFill?: boolean;
        rowHeaderWidth: number;
        columnHeaderHeight: number;
        rowHeaderOffsetX?: number;
        columnHeaderOffsetY?: number;
        rangeType?: RANGE_TYPE;
    });
    private _initializeSheetBody;
    private _initialHeader;
    private _initialWidget;
    get zIndex(): number;
    get leftControl(): Rect;
    get rightControl(): Rect;
    get topControl(): Rect;
    get bottomControl(): Rect;
    get fillControl(): Rect;
    get backgroundControlTop(): Rect;
    get backgroundControlBottom(): Rect;
    get backgroundControlMiddleLeft(): Rect;
    get backgroundControlMiddleRight(): Rect;
    get selectionShape(): Group;
    get columnHeaderGroup(): Group;
    get rowHeaderGroup(): Group;
    get selectionShapeGroup(): Group;
    get model(): SelectionRenderModel;
    get topLeftWidget(): Rect;
    get topCenterWidget(): Rect;
    get topRightWidget(): Rect;
    get middleLeftWidget(): Rect;
    get middleRightWidget(): Rect;
    get bottomLeftWidget(): Rect;
    get bottomCenterWidget(): Rect;
    get bottomRightWidget(): Rect;
    get themeService(): ThemeService;
    get selectionModel(): SelectionRenderModel;
    set selectionModel(model: SelectionRenderModel);
    get currentStyle(): ISelectionStyle;
    set currentStyle(style: ISelectionStyle);
    get dashedRect(): Rect;
    get isHelperSelection(): boolean;
    get rowHeaderWidth(): number;
    set rowHeaderWidth(width: number);
    get columnHeaderHeight(): number;
    set columnHeaderHeight(height: number);
    setControlExtension(options: ISelectionShapeExtensionOption): void;
    setControlExtensionDisable(disable: boolean): void;
    setEvent(state: boolean): void;
    refreshSelectionFilled(val: IRangeWithCoord): void;
    /**
     * Update Control Style And Position of SelectionControl
     * @param selectionStyle
     */
    protected _updateLayoutOfSelectionControl(selectionStyle?: Nullable<Partial<ISelectionStyle>>): void;
    /**
     * update selection control coordination by curr selection model
     */
    protected _updateControlCoord(): void;
    updateStyle(style: Partial<ISelectionStyle>): void;
    /**
     * Update range and primary range.
     *
     * highlight cell would update if primaryWithCoord has value.
     * highlight cell would be cleared if primaryWithCoord is null.
     * highlight would keep prev value if primaryWithCoord is undefined.
     * @param rangeWithCoord
     * @param primaryWithCoord
     */
    updateRange(rangeWithCoord: IRangeWithCoord, primaryWithCoord: Nullable<ICellWithCoord>): void;
    /**
     * Update range and primary range and style.
     * @param selectionWthCoord
     */
    updateRangeBySelectionWithCoord(selectionWthCoord: ISelectionWithCoord, sk?: SpreadsheetSkeleton): void;
    /**
     * Update selection model with new range & primary cell(aka: highlight/current), also update row/col selection size & style.
     *
     * @deprecated  use `updateRangeBySelectionWithCoord` and `updateStyle` to do same thing.
     *
     * @param newSelectionRange
     * @param rowHeaderWidth
     * @param columnHeaderHeight
     * @param style
     * @param primaryCell primary cell
     */
    update(newSelectionRange: IRangeWithCoord, rowHeaderWidth?: number, columnHeaderHeight?: number, style?: Nullable<ISelectionStyle>, primaryCell?: Nullable<ICellWithCoord>): void;
    /**
     * Update primary range.
     * highlight cell would update if primary cell has value.
     * highlight cell would be cleared if primary cell is null.
     * highlight would keep prev value if primary cell is undefined.
     *
     * @param primaryCell model.current (aka: highlight)
     */
    updateCurrCell(primaryCell: Nullable<ICellWithCoord>): void;
    clearHighlight(): void;
    getScene(): Scene;
    dispose(): void;
    /**
     * Get the cell information of the current selection, considering the case of merging cells
     */
    getCurrentCellInfo(): Nullable<IRangeWithCoord>;
    getValue(): ISelectionWithCoord;
    getRange(): IRangeWithCoord;
    enableHelperSelection(): void;
    disableHelperSelection(): void;
    private _updateHeaderBackground;
    private _updateBackgroundControl;
    private _updateWidgets;
    protected _hasWidgets(widgets: ISelectionWidgetConfig): boolean;
    private _getScale;
    private _antLineOffset;
    private _antRequestNewFrame;
    private _stopAntLineAnimation;
    private _startAntLineAnimation;
}
