/********************************************************************************
 * Copyright (c) 2024 Axon Ivy AG and others.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the Eclipse
 * Public License v. 2.0 are satisfied: GNU General Public License, version 2
 * with the GNU Classpath Exception which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 ********************************************************************************/
import { Dimension, GModelElement, ISnapper, KeyboardModifier, MousePositionTracker, Movement, Point, Vector } from '@eclipse-glsp/sprotty';
import { FeedbackEmitter } from '../../../base/feedback/feedback-emitter';
import { ResizeHandleLocation } from '../../change-bounds/model';
import { IMovementRestrictor } from '../../change-bounds/movement-restrictor';
import { IGridManager } from '../../grid/grid-manager';
import { IHelperLineManager } from '../../helper-lines/helper-line-manager';
import { ChangeBoundsTracker, TrackedElementMove, TrackedElementResize, TrackedMove, TrackedResize } from './change-bounds-tracker';
export declare const CSS_RESIZE_MODE = "resize-mode";
export declare const CSS_RESTRICTED_RESIZE = "resize-not-allowed";
export declare const CSS_ACTIVE_HANDLE = "active";
export interface IChangeBoundsManager {
    /**
     * Unsnap the modifier used for changing bounds.
     * @returns The unsnapped keyboard modifier, or undefined if no modifier was snapped.
     */
    unsnapModifier(): KeyboardModifier | undefined;
    /**
     * Determine whether to use position snap for changing bounds.
     * @param arg - The event argument.
     * @returns True if position snap should be used, false otherwise.
     */
    usePositionSnap(arg: MouseEvent | KeyboardEvent | any): boolean;
    /**
     * Snap the position of an element.
     * @param element - The element to snap.
     * @param position - The position to snap.
     * @returns The snapped position.
     */
    snapPosition(element: GModelElement, position: Point): Point;
    /**
     * Check if an element is valid for changing bounds.
     * @param element - The element to check.
     * @returns True if the element is valid, false otherwise.
     */
    isValid(element: GModelElement): boolean;
    /**
     * Check if an element has a valid position for changing bounds.
     * @param element - The element to check.
     * @param position - The position to check.
     * @returns True if the element has a valid position, false otherwise.
     */
    hasValidPosition(element: GModelElement, position?: Point): boolean;
    /**
     * Check if an element has a valid size for changing bounds.
     * @param element - The element to check.
     * @param size - The size to check.
     * @returns True if the element has a valid size, false otherwise.
     */
    hasValidSize(element: GModelElement, size?: Dimension): boolean;
    /**
     * Get the minimum size of an element for changing bounds.
     * @param element - The element to get the minimum size for.
     * @returns The minimum size of the element.
     */
    getMinimumSize(element: GModelElement): Dimension;
    /**
     * Determine whether to use movement restriction for changing bounds.
     * @param arg - The event argument.
     * @returns True if movement restriction should be used, false otherwise.
     */
    useMovementRestriction(arg: MouseEvent | KeyboardEvent | any): boolean;
    /**
     * Restrict the movement of an element.
     * @param element - The element to restrict movement for.
     * @param movement - The movement to restrict.
     * @returns The restricted movement.
     */
    restrictMovement(element: GModelElement, movement: Movement): Movement;
    /**
     * Add move feedback for changing bounds.
     * @param feedback - The feedback emitter.
     * @param trackedMove - The tracked move.
     * @param ctx - The context element. (optional)
     * @param event - The mouse event. (optional)
     * @returns The feedback emitter.
     */
    addMoveFeedback(feedback: FeedbackEmitter, trackedMove: TrackedMove, ctx?: GModelElement, event?: MouseEvent): FeedbackEmitter;
    /**
     * Add resize feedback for changing bounds.
     * @param feedback - The feedback emitter.
     * @param resize - The tracked resize.
     * @param ctx - The context element. (optional)
     * @param event - The mouse event. (optional)
     * @returns The feedback emitter.
     */
    addResizeFeedback(feedback: FeedbackEmitter, resize: TrackedResize, ctx?: GModelElement, event?: MouseEvent): FeedbackEmitter;
    /**
     * Add move restriction feedback for changing bounds.
     * @param feedback - The feedback emitter.
     * @param change - The tracked element resize or move.
     * @param ctx - The context element. (optional)
     * @param event - The mouse event. (optional)
     * @returns The feedback emitter.
     */
    addMoveRestrictionFeedback(feedback: FeedbackEmitter, change: TrackedElementResize | TrackedElementMove, ctx?: GModelElement, event?: MouseEvent): FeedbackEmitter;
    /**
     * Get the default resize locations for changing bounds.
     * @returns The default resize handle locations.
     */
    defaultResizeLocations(): ResizeHandleLocation[];
    /**
     * Determine whether to use symmetric resize for changing bounds.
     * @param arg - The event argument.
     * @returns True if symmetric resize should be used, false otherwise.
     */
    useSymmetricResize(arg: MouseEvent | KeyboardEvent | any): boolean;
    /**
     * Create a tracker for changing bounds.
     * @returns The change bounds tracker.
     */
    createTracker(): ChangeBoundsTracker;
}
/**
 * The default {@link IChangeBoundsManager} implementation. It is responsible for managing
 * the change of bounds for {@link GModelElement}s.
 */
export declare class ChangeBoundsManager implements IChangeBoundsManager {
    readonly positionTracker: MousePositionTracker;
    readonly movementRestrictor?: IMovementRestrictor | undefined;
    readonly snapper?: ISnapper | undefined;
    readonly helperLineManager?: IHelperLineManager | undefined;
    protected gridManager?: IGridManager | undefined;
    constructor(positionTracker: MousePositionTracker, movementRestrictor?: IMovementRestrictor | undefined, snapper?: ISnapper | undefined, helperLineManager?: IHelperLineManager | undefined, gridManager?: IGridManager | undefined);
    unsnapModifier(): KeyboardModifier | undefined;
    usePositionSnap(arg: MouseEvent | KeyboardEvent | any): boolean;
    snapPosition(element: GModelElement, position: Point): Point;
    isValid(element: GModelElement): boolean;
    hasValidPosition(element: GModelElement, position?: Point): boolean;
    hasValidSize(element: GModelElement, size?: Dimension): boolean;
    getMinimumSize(element: GModelElement): Dimension;
    useMovementRestriction(arg: MouseEvent | KeyboardEvent | any): boolean;
    restrictMovement(element: GModelElement, movement: Movement): Movement;
    protected getMinimumMovement(element: GModelElement, movement: Movement): Vector | undefined;
    addMoveFeedback(feedback: FeedbackEmitter, trackedMove: TrackedMove, ctx?: GModelElement, event?: MouseEvent): FeedbackEmitter;
    addResizeFeedback(feedback: FeedbackEmitter, resize: TrackedResize, ctx?: GModelElement, event?: MouseEvent): FeedbackEmitter;
    addMoveRestrictionFeedback(feedback: FeedbackEmitter, change: TrackedElementResize | TrackedElementMove, ctx?: GModelElement, event?: MouseEvent): FeedbackEmitter;
    defaultResizeLocations(): ResizeHandleLocation[];
    useSymmetricResize(arg: MouseEvent | KeyboardEvent | any): boolean;
    createTracker(): ChangeBoundsTracker;
}
//# sourceMappingURL=change-bounds-manager.d.ts.map