/****************************************************************************
 * Copyright 2021 EPAM Systems
 *
 * 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 { BaseMonomer, Vec2 } from "../../../domain/entities";
import { CoreEditor } from "../internal";
import { BaseTool } from "./Tool";
import { MonomersAlignment } from "./..";
declare class SelectRectangle implements BaseTool {
    private editor;
    private brush;
    private brushArea;
    private moveStarted;
    private mousePositionAfterMove;
    private mousePositionBeforeMove;
    private canvasResizeObserver?;
    private history;
    private previousSelectedEntities;
    constructor(editor: CoreEditor);
    private createBrush;
    private startMoveIfNeeded;
    mousedown(event: MouseEvent): void;
    static calculateAngleSnap(cursorPosition: Vec2, connectedPosition: Vec2, snapAngle: number, snappedDistance?: number): {
        angleSnapPosition: null;
        snappedAngleRad?: undefined;
    } | {
        angleSnapPosition: Vec2;
        snappedAngleRad: number;
    };
    static calculateBondLengthSnap(cursorPosition: Vec2, connectedPosition: Vec2, snappedAngle: number | undefined): {
        bondLengthSnapPosition: null;
    } | {
        bondLengthSnapPosition: Vec2;
    };
    static determineAlignment(firstPosition: Vec2, secondPosition: Vec2): MonomersAlignment | null;
    static checkMonomersAlignment(firstMonomer: BaseMonomer, secondMonomer: BaseMonomer, snapAlignment: MonomersAlignment, distance: number): boolean;
    static getNextMonomers(currentMonomer: BaseMonomer, visitedMonomers: Set<number>): (BaseMonomer | undefined)[];
    static findRemainingAlignedMonomers(startingMonomer: BaseMonomer, initialState: BaseMonomer[], alignment: MonomersAlignment, distance: number): BaseMonomer[];
    static calculateSideDistanceSnap(cursorPosition: Vec2, initialMonomer: BaseMonomer, connectedMonomer: BaseMonomer): {
        distanceSnapPosition: null;
        snapDistance?: undefined;
        alignment?: undefined;
        alignedMonomers?: undefined;
    } | {
        snapDistance: number;
        distanceSnapPosition: Vec2;
        alignment: "horizontal" | "vertical";
        alignedMonomers: BaseMonomer[];
    };
    static calculateInBetweenDistanceSnap(cursorPosition: Vec2, initialMonomer: BaseMonomer, firstConnectedMonomer: BaseMonomer, secondConnectedMonomer: BaseMonomer, alignment: MonomersAlignment): {
        distanceSnapPosition: null;
        snapDistance?: undefined;
        alignment?: undefined;
        alignedMonomers?: undefined;
    } | {
        snapDistance: number;
        distanceSnapPosition: Vec2;
        alignment: MonomersAlignment;
        alignedMonomers: BaseMonomer[];
    };
    static calculateDistanceSnap(cursorPosition: Vec2, initialMonomer: BaseMonomer, connectedMonomer: BaseMonomer): {
        distanceSnapPosition: null;
        snapDistance?: undefined;
        alignment?: undefined;
        alignedMonomers?: undefined;
    } | {
        snapDistance: number;
        distanceSnapPosition: Vec2;
        alignment: "horizontal" | "vertical";
        alignedMonomers: BaseMonomer[];
    };
    private tryToSnap;
    mousemove(event: MouseEvent): void;
    mouseup(event: MouseEvent): void;
    mouseOverDrawingEntity(event: any): void;
    mouseLeaveDrawingEntity(event: any): void;
    mouseOverPolymerBond(event: any): void;
    mouseLeavePolymerBond(event: any): void;
    setSelectedEntities(): void;
    destroy(): void;
    stopMovement(): void;
}
export { SelectRectangle };
