/********************************************************************************
 * Copyright (c) 2019-2024 EclipseSource 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 { Action, AnchorComputerRegistry, CommandExecutionContext, CommandReturn, Disposable, EdgeRouterRegistry, GConnectableElement, GModelElement, GRoutingHandle, MouseListener, Point, SwitchEditModeAction, SwitchEditModeCommand } from '@eclipse-glsp/sprotty';
import { DragAwareMouseListener } from '../../../base/drag-aware-mouse-listener';
import { IFeedbackActionDispatcher } from '../../../base/feedback/feedback-action-dispatcher';
import { FeedbackCommand } from '../../../base/feedback/feedback-command';
import { FeedbackEmitter } from '../../../base/feedback/feedback-emitter';
import { IChangeBoundsManager } from '../change-bounds/change-bounds-manager';
import { ChangeBoundsTracker, MoveableRoutingHandle } from '../change-bounds/change-bounds-tracker';
import { FeedbackEdgeEndMovingMouseListener } from '../edge-creation/edge-creation-tool-feedback';
/**
 * RECONNECT HANDLES FEEDBACK
 */
export interface ShowEdgeReconnectHandlesFeedbackAction extends Action {
    kind: typeof ShowEdgeReconnectHandlesFeedbackAction.KIND;
    readonly elementId: string;
}
export declare namespace ShowEdgeReconnectHandlesFeedbackAction {
    const KIND = "showReconnectHandlesFeedback";
    function is(object: any): object is ShowEdgeReconnectHandlesFeedbackAction;
    function create(elementId: string): ShowEdgeReconnectHandlesFeedbackAction;
}
export interface HideEdgeReconnectHandlesFeedbackAction extends Action {
    kind: typeof HideEdgeReconnectHandlesFeedbackAction.KIND;
}
export declare namespace HideEdgeReconnectHandlesFeedbackAction {
    const KIND = "hideReconnectHandlesFeedback";
    function is(object: any): object is HideEdgeReconnectHandlesFeedbackAction;
    function create(): HideEdgeReconnectHandlesFeedbackAction;
}
export declare class ShowEdgeReconnectHandlesFeedbackCommand extends FeedbackCommand {
    protected action: ShowEdgeReconnectHandlesFeedbackAction;
    static readonly KIND = "showReconnectHandlesFeedback";
    constructor(action: ShowEdgeReconnectHandlesFeedbackAction);
    execute(context: CommandExecutionContext): CommandReturn;
}
export declare class HideEdgeReconnectHandlesFeedbackCommand extends FeedbackCommand {
    protected action: HideEdgeReconnectHandlesFeedbackAction;
    static readonly KIND = "hideReconnectHandlesFeedback";
    constructor(action: HideEdgeReconnectHandlesFeedbackAction);
    execute(context: CommandExecutionContext): CommandReturn;
}
/**
 * ROUTING FEEDBACK
 */
export interface SwitchRoutingModeAction extends Omit<SwitchEditModeAction, 'kind'> {
    kind: typeof SwitchRoutingModeAction.KIND;
}
export declare namespace SwitchRoutingModeAction {
    const KIND = "switchRoutingMode";
    function create(options: {
        elementsToActivate?: string[];
        elementsToDeactivate?: string[];
    }): SwitchRoutingModeAction;
}
export declare class SwitchRoutingModeCommand extends SwitchEditModeCommand {
    static KIND: string;
    constructor(action: SwitchRoutingModeAction);
}
/**
 * SOURCE AND TARGET EDGE FEEDBACK
 */
export interface DrawFeedbackEdgeSourceAction extends Action {
    kind: typeof DrawFeedbackEdgeSourceAction.KIND;
    elementTypeId: string;
    targetId: string;
}
export declare namespace DrawFeedbackEdgeSourceAction {
    const KIND = "drawFeedbackEdgeSource";
    function is(object: any): object is DrawFeedbackEdgeSourceAction;
    function create(options: {
        elementTypeId: string;
        targetId: string;
    }): DrawFeedbackEdgeSourceAction;
}
export declare class DrawFeedbackEdgeSourceCommand extends FeedbackCommand {
    protected action: DrawFeedbackEdgeSourceAction;
    static readonly KIND = "drawFeedbackEdgeSource";
    constructor(action: DrawFeedbackEdgeSourceAction);
    execute(context: CommandExecutionContext): CommandReturn;
}
/**
 * SOURCE AND TARGET MOUSE MOVE LISTENER
 */
export declare class FeedbackEdgeTargetMovingMouseListener extends FeedbackEdgeEndMovingMouseListener {
    constructor(anchorRegistry: AnchorComputerRegistry, feedbackDispatcher: IFeedbackActionDispatcher);
}
export declare class FeedbackEdgeSourceMovingMouseListener extends MouseListener implements Disposable {
    protected anchorRegistry: AnchorComputerRegistry;
    protected feedbackDispatcher: IFeedbackActionDispatcher;
    protected feedback: FeedbackEmitter;
    constructor(anchorRegistry: AnchorComputerRegistry, feedbackDispatcher: IFeedbackActionDispatcher);
    mouseMove(target: GModelElement, event: MouseEvent): Action[];
    protected computeAbsoluteAnchor(element: GConnectableElement, referencePoint: Point, offset?: number): Point;
    dispose(): void;
}
export declare class FeedbackEdgeRouteMovingMouseListener extends DragAwareMouseListener {
    protected changeBoundsManager: IChangeBoundsManager;
    protected edgeRouterRegistry?: EdgeRouterRegistry | undefined;
    protected tracker: ChangeBoundsTracker;
    constructor(changeBoundsManager: IChangeBoundsManager, edgeRouterRegistry?: EdgeRouterRegistry | undefined);
    mouseDown(target: GModelElement, event: MouseEvent): Action[];
    draggingMouseMove(target: GModelElement, event: MouseEvent): Action[];
    protected moveRoutingHandles(target: GModelElement, event: MouseEvent): Action[];
    protected getRoutingHandlesToMove(context: GModelElement): MoveableRoutingHandle[];
    protected getHandlePosition(handle: GRoutingHandle): Point | undefined;
    nonDraggingMouseUp(element: GModelElement, event: MouseEvent): Action[];
    draggingMouseUp(_target: GModelElement, _event: MouseEvent): Action[];
    dispose(): void;
}
/**
 * UTILITY FUNCTIONS
 */
export declare function drawFeedbackEdgeSource(context: CommandExecutionContext, targetId: string, elementTypeId: string): void;
//# sourceMappingURL=edge-edit-tool-feedback.d.ts.map