@eclipse-glsp/client 2.2.0-next.329 → 2.2.0-next.330
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/css/change-bounds.css +15 -0
- package/css/glsp-sprotty.css +17 -0
- package/lib/base/drag-aware-mouse-listener.d.ts +5 -2
- package/lib/base/drag-aware-mouse-listener.d.ts.map +1 -1
- package/lib/base/drag-aware-mouse-listener.js +11 -0
- package/lib/base/drag-aware-mouse-listener.js.map +1 -1
- package/lib/base/feedback/css-feedback.d.ts +4 -0
- package/lib/base/feedback/css-feedback.d.ts.map +1 -1
- package/lib/base/feedback/css-feedback.js +4 -0
- package/lib/base/feedback/css-feedback.js.map +1 -1
- package/lib/base/feedback/feeback-emitter.d.ts +67 -0
- package/lib/base/feedback/feeback-emitter.d.ts.map +1 -0
- package/lib/base/feedback/feeback-emitter.js +109 -0
- package/lib/base/feedback/feeback-emitter.js.map +1 -0
- package/lib/base/feedback/feedback-action-dispatcher.d.ts +17 -5
- package/lib/base/feedback/feedback-action-dispatcher.d.ts.map +1 -1
- package/lib/base/feedback/feedback-action-dispatcher.js +23 -3
- package/lib/base/feedback/feedback-action-dispatcher.js.map +1 -1
- package/lib/base/feedback/index.d.ts +1 -0
- package/lib/base/feedback/index.d.ts.map +1 -1
- package/lib/base/feedback/index.js +1 -0
- package/lib/base/feedback/index.js.map +1 -1
- package/lib/base/selection-service.d.ts +3 -2
- package/lib/base/selection-service.d.ts.map +1 -1
- package/lib/base/selection-service.js.map +1 -1
- package/lib/features/accessibility/element-navigation/local-element-navigator.d.ts +3 -3
- package/lib/features/accessibility/element-navigation/local-element-navigator.d.ts.map +1 -1
- package/lib/features/accessibility/element-navigation/local-element-navigator.js.map +1 -1
- package/lib/features/accessibility/move-zoom/move-handler.d.ts +4 -2
- package/lib/features/accessibility/move-zoom/move-handler.d.ts.map +1 -1
- package/lib/features/accessibility/move-zoom/move-handler.js +10 -4
- package/lib/features/accessibility/move-zoom/move-handler.js.map +1 -1
- package/lib/features/accessibility/resize-key-tool/resize-key-handler.d.ts +4 -2
- package/lib/features/accessibility/resize-key-tool/resize-key-handler.d.ts.map +1 -1
- package/lib/features/accessibility/resize-key-tool/resize-key-handler.js +11 -3
- package/lib/features/accessibility/resize-key-tool/resize-key-handler.js.map +1 -1
- package/lib/features/change-bounds/model.d.ts +8 -8
- package/lib/features/change-bounds/model.d.ts.map +1 -1
- package/lib/features/change-bounds/model.js +17 -5
- package/lib/features/change-bounds/model.js.map +1 -1
- package/lib/features/change-bounds/movement-restrictor.d.ts +3 -2
- package/lib/features/change-bounds/movement-restrictor.d.ts.map +1 -1
- package/lib/features/change-bounds/movement-restrictor.js.map +1 -1
- package/lib/features/element-template/mouse-tracking-element-position-listener.d.ts +15 -5
- package/lib/features/element-template/mouse-tracking-element-position-listener.d.ts.map +1 -1
- package/lib/features/element-template/mouse-tracking-element-position-listener.js +27 -38
- package/lib/features/element-template/mouse-tracking-element-position-listener.js.map +1 -1
- package/lib/features/helper-lines/helper-line-manager-default.d.ts +4 -2
- package/lib/features/helper-lines/helper-line-manager-default.d.ts.map +1 -1
- package/lib/features/helper-lines/helper-line-manager-default.js +8 -12
- package/lib/features/helper-lines/helper-line-manager-default.js.map +1 -1
- package/lib/features/hints/type-hint-provider.d.ts +3 -0
- package/lib/features/hints/type-hint-provider.d.ts.map +1 -1
- package/lib/features/hints/type-hint-provider.js +10 -1
- package/lib/features/hints/type-hint-provider.js.map +1 -1
- package/lib/features/select/select-mouse-listener.d.ts +4 -3
- package/lib/features/select/select-mouse-listener.d.ts.map +1 -1
- package/lib/features/select/select-mouse-listener.js.map +1 -1
- package/lib/features/tools/base-tools.d.ts +23 -4
- package/lib/features/tools/base-tools.d.ts.map +1 -1
- package/lib/features/tools/base-tools.js +11 -6
- package/lib/features/tools/base-tools.js.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts +1 -35
- package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js +5 -206
- package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool-module.d.ts +1 -0
- package/lib/features/tools/change-bounds/change-bounds-tool-module.d.ts.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool-module.js +1 -0
- package/lib/features/tools/change-bounds/change-bounds-tool-module.js.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.d.ts +67 -0
- package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.d.ts.map +1 -0
- package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js +227 -0
- package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js.map +1 -0
- package/lib/features/tools/change-bounds/change-bounds-tool.d.ts +34 -24
- package/lib/features/tools/change-bounds/change-bounds-tool.d.ts.map +1 -1
- package/lib/features/tools/change-bounds/change-bounds-tool.js +172 -180
- package/lib/features/tools/change-bounds/change-bounds-tool.js.map +1 -1
- package/lib/features/tools/change-bounds/index.d.ts +1 -0
- package/lib/features/tools/change-bounds/index.d.ts.map +1 -1
- package/lib/features/tools/change-bounds/index.js +1 -0
- package/lib/features/tools/change-bounds/index.js.map +1 -1
- package/lib/features/tools/change-bounds/view.d.ts +1 -1
- package/lib/features/tools/change-bounds/view.d.ts.map +1 -1
- package/lib/features/tools/change-bounds/view.js +3 -0
- package/lib/features/tools/change-bounds/view.js.map +1 -1
- package/lib/features/tools/deletion/delete-tool.d.ts +16 -1
- package/lib/features/tools/deletion/delete-tool.d.ts.map +1 -1
- package/lib/features/tools/deletion/delete-tool.js +5 -2
- package/lib/features/tools/deletion/delete-tool.js.map +1 -1
- package/lib/features/tools/edge-creation/dangling-edge-feedback.d.ts +17 -1
- package/lib/features/tools/edge-creation/dangling-edge-feedback.d.ts.map +1 -1
- package/lib/features/tools/edge-creation/dangling-edge-feedback.js +3 -1
- package/lib/features/tools/edge-creation/dangling-edge-feedback.js.map +1 -1
- package/lib/features/tools/edge-creation/edge-creation-tool-feedback.d.ts +3 -1
- package/lib/features/tools/edge-creation/edge-creation-tool-feedback.d.ts.map +1 -1
- package/lib/features/tools/edge-creation/edge-creation-tool-feedback.js +4 -7
- package/lib/features/tools/edge-creation/edge-creation-tool-feedback.js.map +1 -1
- package/lib/features/tools/edge-creation/edge-creation-tool.d.ts +20 -2
- package/lib/features/tools/edge-creation/edge-creation-tool.d.ts.map +1 -1
- package/lib/features/tools/edge-creation/edge-creation-tool.js +23 -18
- package/lib/features/tools/edge-creation/edge-creation-tool.js.map +1 -1
- package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts +3 -1
- package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts.map +1 -1
- package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js +5 -8
- package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js.map +1 -1
- package/lib/features/tools/edge-edit/edge-edit-tool.d.ts +4 -4
- package/lib/features/tools/edge-edit/edge-edit-tool.d.ts.map +1 -1
- package/lib/features/tools/edge-edit/edge-edit-tool.js +27 -44
- package/lib/features/tools/edge-edit/edge-edit-tool.js.map +1 -1
- package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts +3 -2
- package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts.map +1 -1
- package/lib/features/tools/marquee-selection/marquee-mouse-tool.js +4 -2
- package/lib/features/tools/marquee-selection/marquee-mouse-tool.js.map +1 -1
- package/lib/features/tools/node-creation/node-creation-tool.d.ts +14 -5
- package/lib/features/tools/node-creation/node-creation-tool.d.ts.map +1 -1
- package/lib/features/tools/node-creation/node-creation-tool.js +58 -24
- package/lib/features/tools/node-creation/node-creation-tool.js.map +1 -1
- package/lib/features/validation/marker-navigator.d.ts +7 -6
- package/lib/features/validation/marker-navigator.d.ts.map +1 -1
- package/lib/features/validation/marker-navigator.js.map +1 -1
- package/lib/features/validation/validate.d.ts +2 -5
- package/lib/features/validation/validate.d.ts.map +1 -1
- package/lib/features/validation/validate.js +4 -16
- package/lib/features/validation/validate.js.map +1 -1
- package/lib/utils/gmodel-util.d.ts +27 -2
- package/lib/utils/gmodel-util.d.ts.map +1 -1
- package/lib/utils/gmodel-util.js +30 -1
- package/lib/utils/gmodel-util.js.map +1 -1
- package/lib/utils/layout-utils.d.ts +8 -7
- package/lib/utils/layout-utils.d.ts.map +1 -1
- package/lib/utils/layout-utils.js +2 -4
- package/lib/utils/layout-utils.js.map +1 -1
- package/lib/utils/viewpoint-util.d.ts +4 -4
- package/lib/utils/viewpoint-util.d.ts.map +1 -1
- package/lib/utils/viewpoint-util.js.map +1 -1
- package/package.json +3 -3
- package/src/base/drag-aware-mouse-listener.ts +16 -2
- package/src/base/feedback/css-feedback.ts +4 -0
- package/src/base/feedback/feeback-emitter.ts +112 -0
- package/src/base/feedback/feedback-action-dispatcher.ts +41 -6
- package/src/base/feedback/index.ts +1 -0
- package/src/base/selection-service.spec.ts +5 -0
- package/src/base/selection-service.ts +2 -3
- package/src/features/accessibility/element-navigation/local-element-navigator.ts +4 -4
- package/src/features/accessibility/move-zoom/move-handler.ts +10 -5
- package/src/features/accessibility/resize-key-tool/resize-key-handler.ts +11 -7
- package/src/features/change-bounds/model.ts +25 -13
- package/src/features/change-bounds/movement-restrictor.ts +5 -4
- package/src/features/element-template/mouse-tracking-element-position-listener.ts +44 -44
- package/src/features/helper-lines/helper-line-manager-default.ts +12 -21
- package/src/features/hints/type-hint-provider.spec.ts +4 -1
- package/src/features/hints/type-hint-provider.ts +9 -2
- package/src/features/select/select-mouse-listener.ts +4 -3
- package/src/features/tools/base-tools.ts +15 -8
- package/src/features/tools/change-bounds/change-bounds-tool-feedback.ts +6 -232
- package/src/features/tools/change-bounds/change-bounds-tool-module.ts +1 -0
- package/src/features/tools/change-bounds/change-bounds-tool-move-feedback.ts +254 -0
- package/src/features/tools/change-bounds/change-bounds-tool.ts +217 -226
- package/src/features/tools/change-bounds/index.ts +1 -0
- package/src/features/tools/change-bounds/view.tsx +4 -1
- package/src/features/tools/deletion/delete-tool.ts +6 -6
- package/src/features/tools/edge-creation/dangling-edge-feedback.ts +7 -4
- package/src/features/tools/edge-creation/edge-creation-tool-feedback.ts +9 -9
- package/src/features/tools/edge-creation/edge-creation-tool.ts +33 -23
- package/src/features/tools/edge-edit/edge-edit-tool-feedback.ts +8 -8
- package/src/features/tools/edge-edit/edge-edit-tool.ts +42 -49
- package/src/features/tools/marquee-selection/marquee-mouse-tool.ts +7 -6
- package/src/features/tools/node-creation/node-creation-tool.ts +69 -25
- package/src/features/validation/marker-navigator.ts +6 -8
- package/src/features/validation/validate.ts +5 -20
- package/src/utils/gmodel-util.ts +44 -1
- package/src/utils/layout-utils.ts +9 -20
- package/src/utils/viewpoint-util.ts +3 -4
|
@@ -13,24 +13,26 @@
|
|
|
13
13
|
*
|
|
14
14
|
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
|
15
15
|
********************************************************************************/
|
|
16
|
-
import { inject, injectable } from 'inversify';
|
|
17
16
|
import {
|
|
18
17
|
Action,
|
|
19
18
|
BindingContext,
|
|
20
19
|
CommandExecutionContext,
|
|
21
20
|
CommandReturn,
|
|
22
21
|
GChildElement,
|
|
22
|
+
GDanglingAnchor,
|
|
23
|
+
GEdgeSchema,
|
|
23
24
|
GModelRoot,
|
|
24
25
|
GRoutableElement,
|
|
25
26
|
TYPES,
|
|
26
27
|
configureCommand,
|
|
27
28
|
configureView,
|
|
29
|
+
deletableFeature,
|
|
28
30
|
findParentByFeature,
|
|
29
31
|
isBoundsAware,
|
|
30
|
-
isConnectable
|
|
31
|
-
GDanglingAnchor,
|
|
32
|
-
GEdgeSchema
|
|
32
|
+
isConnectable
|
|
33
33
|
} from '@eclipse-glsp/sprotty';
|
|
34
|
+
import { inject, injectable } from 'inversify';
|
|
35
|
+
import { feedbackFeature } from '../../../base';
|
|
34
36
|
import { FeedbackCommand } from '../../../base/feedback/feedback-command';
|
|
35
37
|
import { isRoutable } from '../../../utils/gmodel-util';
|
|
36
38
|
import { toAbsolutePosition } from '../../../utils/viewpoint-util';
|
|
@@ -103,6 +105,7 @@ export class RemoveFeedbackEdgeCommand extends FeedbackCommand {
|
|
|
103
105
|
}
|
|
104
106
|
|
|
105
107
|
export class FeedbackEdgeEnd extends GDanglingAnchor {
|
|
108
|
+
static override readonly DEFAULT_FEATURES = [deletableFeature, feedbackFeature];
|
|
106
109
|
static readonly TYPE = 'feedback-edge-end';
|
|
107
110
|
constructor(
|
|
108
111
|
readonly sourceId: string,
|
|
@@ -18,27 +18,31 @@ import {
|
|
|
18
18
|
AnchorComputerRegistry,
|
|
19
19
|
Bounds,
|
|
20
20
|
Disposable,
|
|
21
|
+
GConnectableElement,
|
|
22
|
+
GModelElement,
|
|
21
23
|
MouseListener,
|
|
22
24
|
MoveAction,
|
|
23
25
|
Point,
|
|
24
26
|
PolylineEdgeRouter,
|
|
25
|
-
GConnectableElement,
|
|
26
|
-
GModelElement,
|
|
27
27
|
findChildrenAtPosition,
|
|
28
28
|
findParentByFeature,
|
|
29
29
|
isBoundsAware,
|
|
30
30
|
isConnectable
|
|
31
31
|
} from '@eclipse-glsp/sprotty';
|
|
32
|
+
import { FeedbackEmitter } from '../../../base';
|
|
32
33
|
import { IFeedbackActionDispatcher } from '../../../base/feedback/feedback-action-dispatcher';
|
|
33
34
|
import { absoluteToParent, getAbsolutePosition, toAbsoluteBounds } from '../../../utils/viewpoint-util';
|
|
34
35
|
import { FeedbackEdgeEnd, feedbackEdgeEndId } from './dangling-edge-feedback';
|
|
35
36
|
|
|
36
37
|
export class FeedbackEdgeEndMovingMouseListener extends MouseListener implements Disposable {
|
|
38
|
+
protected feedback: FeedbackEmitter;
|
|
39
|
+
|
|
37
40
|
constructor(
|
|
38
41
|
protected anchorRegistry: AnchorComputerRegistry,
|
|
39
42
|
protected feedbackDispatcher: IFeedbackActionDispatcher
|
|
40
43
|
) {
|
|
41
44
|
super();
|
|
45
|
+
this.feedback = feedbackDispatcher.createEmitter();
|
|
42
46
|
}
|
|
43
47
|
|
|
44
48
|
override mouseMove(target: GModelElement, event: MouseEvent): Action[] {
|
|
@@ -57,14 +61,10 @@ export class FeedbackEdgeEndMovingMouseListener extends MouseListener implements
|
|
|
57
61
|
if (endAtMousePosition instanceof GConnectableElement && edge.source && isBoundsAware(edge.source)) {
|
|
58
62
|
const anchor = this.computeAbsoluteAnchor(endAtMousePosition, Bounds.center(toAbsoluteBounds(edge.source)));
|
|
59
63
|
if (Point.euclideanDistance(anchor, edgeEnd.position) > 1) {
|
|
60
|
-
this.
|
|
61
|
-
MoveAction.create([{ elementId: edgeEnd.id, toPosition: anchor }], { animate: false })
|
|
62
|
-
]);
|
|
64
|
+
this.feedback.add(MoveAction.create([{ elementId: edgeEnd.id, toPosition: anchor }], { animate: false })).submit();
|
|
63
65
|
}
|
|
64
66
|
} else {
|
|
65
|
-
this.
|
|
66
|
-
MoveAction.create([{ elementId: edgeEnd.id, toPosition: position }], { animate: false })
|
|
67
|
-
]);
|
|
67
|
+
this.feedback.add(MoveAction.create([{ elementId: edgeEnd.id, toPosition: position }], { animate: false })).submit();
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
return [];
|
|
@@ -87,6 +87,6 @@ export class FeedbackEdgeEndMovingMouseListener extends MouseListener implements
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
dispose(): void {
|
|
90
|
-
this.
|
|
90
|
+
this.feedback.dispose();
|
|
91
91
|
}
|
|
92
92
|
}
|
|
@@ -13,28 +13,29 @@
|
|
|
13
13
|
*
|
|
14
14
|
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
|
15
15
|
********************************************************************************/
|
|
16
|
-
import { inject, injectable } from 'inversify';
|
|
17
16
|
import {
|
|
18
17
|
Action,
|
|
19
18
|
AnchorComputerRegistry,
|
|
20
19
|
CreateEdgeOperation,
|
|
21
|
-
RequestCheckEdgeAction,
|
|
22
20
|
GModelElement,
|
|
21
|
+
RequestCheckEdgeAction,
|
|
23
22
|
TYPES,
|
|
24
23
|
TriggerEdgeCreationAction,
|
|
25
24
|
findParentByFeature,
|
|
26
25
|
isConnectable,
|
|
27
26
|
isCtrlOrCmd
|
|
28
27
|
} from '@eclipse-glsp/sprotty';
|
|
28
|
+
import { inject, injectable } from 'inversify';
|
|
29
|
+
import { FeedbackEmitter } from '../../../base';
|
|
29
30
|
import { GLSPActionDispatcher } from '../../../base/action-dispatcher';
|
|
30
31
|
import { DragAwareMouseListener } from '../../../base/drag-aware-mouse-listener';
|
|
31
32
|
import { CursorCSS, cursorFeedbackAction } from '../../../base/feedback/css-feedback';
|
|
32
33
|
import { EnableDefaultToolsAction } from '../../../base/tool-manager/tool';
|
|
34
|
+
import { GEdge } from '../../../model';
|
|
33
35
|
import { ITypeHintProvider } from '../../hints/type-hint-provider';
|
|
34
36
|
import { BaseCreationTool } from '../base-tools';
|
|
35
37
|
import { DrawFeedbackEdgeAction, RemoveFeedbackEdgeAction } from './dangling-edge-feedback';
|
|
36
38
|
import { FeedbackEdgeEndMovingMouseListener } from './edge-creation-tool-feedback';
|
|
37
|
-
import { GEdge } from '../../../model';
|
|
38
39
|
|
|
39
40
|
/**
|
|
40
41
|
* Tool to create connections in a Diagram, by selecting a source and target node.
|
|
@@ -55,16 +56,16 @@ export class EdgeCreationTool extends BaseCreationTool<TriggerEdgeCreationAction
|
|
|
55
56
|
|
|
56
57
|
doEnable(): void {
|
|
57
58
|
const mouseMovingFeedback = new FeedbackEdgeEndMovingMouseListener(this.anchorRegistry, this.feedbackDispatcher);
|
|
59
|
+
const toolFeedback = this.createFeedbackEmitter()
|
|
60
|
+
.add(cursorFeedbackAction(CursorCSS.OPERATION_NOT_ALLOWED), cursorFeedbackAction())
|
|
61
|
+
.submit();
|
|
62
|
+
const creationListener = new EdgeCreationToolMouseListener(this.triggerAction, this.actionDispatcher, this.typeHintProvider, this);
|
|
58
63
|
this.toDisposeOnDisable.push(
|
|
59
64
|
mouseMovingFeedback,
|
|
60
|
-
this.mouseTool.registerListener(
|
|
61
|
-
new EdgeCreationToolMouseListener(this.triggerAction, this.actionDispatcher, this.typeHintProvider, this)
|
|
62
|
-
),
|
|
63
65
|
this.mouseTool.registerListener(mouseMovingFeedback),
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
])
|
|
66
|
+
creationListener,
|
|
67
|
+
this.mouseTool.registerListener(creationListener),
|
|
68
|
+
toolFeedback
|
|
68
69
|
);
|
|
69
70
|
}
|
|
70
71
|
}
|
|
@@ -77,6 +78,8 @@ export class EdgeCreationToolMouseListener extends DragAwareMouseListener {
|
|
|
77
78
|
protected allowedTarget = false;
|
|
78
79
|
protected proxyEdge: GEdge;
|
|
79
80
|
protected pendingDynamicCheck = false;
|
|
81
|
+
protected cursorFeedback: FeedbackEmitter;
|
|
82
|
+
protected feedbackEdgeFeedback: FeedbackEmitter;
|
|
80
83
|
|
|
81
84
|
constructor(
|
|
82
85
|
protected triggerAction: TriggerEdgeCreationAction,
|
|
@@ -87,14 +90,8 @@ export class EdgeCreationToolMouseListener extends DragAwareMouseListener {
|
|
|
87
90
|
super();
|
|
88
91
|
this.proxyEdge = new GEdge();
|
|
89
92
|
this.proxyEdge.type = triggerAction.elementTypeId;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
protected reinitialize(): void {
|
|
93
|
-
this.source = undefined;
|
|
94
|
-
this.target = undefined;
|
|
95
|
-
this.currentTarget = undefined;
|
|
96
|
-
this.allowedTarget = false;
|
|
97
|
-
this.tool.registerFeedback([RemoveFeedbackEdgeAction.create()]);
|
|
93
|
+
this.cursorFeedback = tool.createFeedbackEmitter();
|
|
94
|
+
this.feedbackEdgeFeedback = tool.createFeedbackEmitter();
|
|
98
95
|
}
|
|
99
96
|
|
|
100
97
|
override nonDraggingMouseUp(_element: GModelElement, event: MouseEvent): Action[] {
|
|
@@ -103,9 +100,12 @@ export class EdgeCreationToolMouseListener extends DragAwareMouseListener {
|
|
|
103
100
|
if (!this.isSourceSelected()) {
|
|
104
101
|
if (this.currentTarget && this.allowedTarget) {
|
|
105
102
|
this.source = this.currentTarget.id;
|
|
106
|
-
this.
|
|
107
|
-
|
|
108
|
-
|
|
103
|
+
this.feedbackEdgeFeedback
|
|
104
|
+
.add(
|
|
105
|
+
DrawFeedbackEdgeAction.create({ elementTypeId: this.triggerAction.elementTypeId, sourceId: this.source }),
|
|
106
|
+
RemoveFeedbackEdgeAction.create()
|
|
107
|
+
)
|
|
108
|
+
.submit();
|
|
109
109
|
}
|
|
110
110
|
} else if (this.currentTarget && this.allowedTarget) {
|
|
111
111
|
this.target = this.currentTarget.id;
|
|
@@ -122,11 +122,11 @@ export class EdgeCreationToolMouseListener extends DragAwareMouseListener {
|
|
|
122
122
|
if (!isCtrlOrCmd(event)) {
|
|
123
123
|
result.push(EnableDefaultToolsAction.create());
|
|
124
124
|
} else {
|
|
125
|
-
this.
|
|
125
|
+
this.dispose();
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
128
|
} else if (event.button === 2) {
|
|
129
|
-
this.
|
|
129
|
+
this.dispose();
|
|
130
130
|
result.push(EnableDefaultToolsAction.create());
|
|
131
131
|
}
|
|
132
132
|
return result;
|
|
@@ -203,4 +203,14 @@ export class EdgeCreationToolMouseListener extends DragAwareMouseListener {
|
|
|
203
203
|
const typeHint = this.typeHintProvider.getEdgeTypeHint(edgeTypeId);
|
|
204
204
|
return typeHint?.dynamic ?? false;
|
|
205
205
|
}
|
|
206
|
+
|
|
207
|
+
override dispose(): void {
|
|
208
|
+
this.source = undefined;
|
|
209
|
+
this.target = undefined;
|
|
210
|
+
this.currentTarget = undefined;
|
|
211
|
+
this.allowedTarget = false;
|
|
212
|
+
this.feedbackEdgeFeedback.dispose();
|
|
213
|
+
this.cursorFeedback.dispose();
|
|
214
|
+
super.dispose();
|
|
215
|
+
}
|
|
206
216
|
}
|
|
@@ -40,16 +40,17 @@ import {
|
|
|
40
40
|
isSelected
|
|
41
41
|
} from '@eclipse-glsp/sprotty';
|
|
42
42
|
import { inject, injectable } from 'inversify';
|
|
43
|
+
import { FeedbackEmitter } from '../../../base';
|
|
43
44
|
import { IFeedbackActionDispatcher } from '../../../base/feedback/feedback-action-dispatcher';
|
|
44
45
|
import { FeedbackCommand } from '../../../base/feedback/feedback-command';
|
|
45
46
|
import { forEachElement, isRoutable, isRoutingHandle } from '../../../utils/gmodel-util';
|
|
46
47
|
import { getAbsolutePosition, toAbsoluteBounds } from '../../../utils/viewpoint-util';
|
|
48
|
+
import { PointPositionUpdater } from '../../change-bounds/point-position-updater';
|
|
47
49
|
import { PositionSnapper } from '../../change-bounds/position-snapper';
|
|
48
50
|
import { useSnap } from '../../change-bounds/snap';
|
|
49
51
|
import { addReconnectHandles, removeReconnectHandles } from '../../reconnect/model';
|
|
50
52
|
import { FeedbackEdgeEnd, feedbackEdgeEndId, feedbackEdgeId } from '../edge-creation/dangling-edge-feedback';
|
|
51
53
|
import { FeedbackEdgeEndMovingMouseListener } from '../edge-creation/edge-creation-tool-feedback';
|
|
52
|
-
import { PointPositionUpdater } from '../../change-bounds/point-position-updater';
|
|
53
54
|
|
|
54
55
|
/**
|
|
55
56
|
* RECONNECT HANDLES FEEDBACK
|
|
@@ -198,11 +199,14 @@ export class FeedbackEdgeTargetMovingMouseListener extends FeedbackEdgeEndMoving
|
|
|
198
199
|
}
|
|
199
200
|
|
|
200
201
|
export class FeedbackEdgeSourceMovingMouseListener extends MouseListener implements Disposable {
|
|
202
|
+
protected feedback: FeedbackEmitter;
|
|
203
|
+
|
|
201
204
|
constructor(
|
|
202
205
|
protected anchorRegistry: AnchorComputerRegistry,
|
|
203
206
|
protected feedbackDispatcher: IFeedbackActionDispatcher
|
|
204
207
|
) {
|
|
205
208
|
super();
|
|
209
|
+
this.feedback = feedbackDispatcher.createEmitter();
|
|
206
210
|
}
|
|
207
211
|
|
|
208
212
|
override mouseMove(target: GModelElement, event: MouseEvent): Action[] {
|
|
@@ -221,14 +225,10 @@ export class FeedbackEdgeSourceMovingMouseListener extends MouseListener impleme
|
|
|
221
225
|
if (endAtMousePosition instanceof GConnectableElement && edge.target && isBoundsAware(edge.target)) {
|
|
222
226
|
const anchor = this.computeAbsoluteAnchor(endAtMousePosition, Bounds.center(edge.target.bounds));
|
|
223
227
|
if (Point.euclideanDistance(anchor, edgeEnd.position) > 1) {
|
|
224
|
-
this.
|
|
225
|
-
MoveAction.create([{ elementId: edgeEnd.id, toPosition: anchor }], { animate: false })
|
|
226
|
-
]);
|
|
228
|
+
this.feedback.add(MoveAction.create([{ elementId: edgeEnd.id, toPosition: anchor }], { animate: false })).submit();
|
|
227
229
|
}
|
|
228
230
|
} else {
|
|
229
|
-
this.
|
|
230
|
-
MoveAction.create([{ elementId: edgeEnd.id, toPosition: position }], { animate: false })
|
|
231
|
-
]);
|
|
231
|
+
this.feedback.add(MoveAction.create([{ elementId: edgeEnd.id, toPosition: position }], { animate: false })).submit();
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
return [];
|
|
@@ -250,7 +250,7 @@ export class FeedbackEdgeSourceMovingMouseListener extends MouseListener impleme
|
|
|
250
250
|
}
|
|
251
251
|
|
|
252
252
|
dispose(): void {
|
|
253
|
-
this.
|
|
253
|
+
this.feedback.dispose();
|
|
254
254
|
}
|
|
255
255
|
}
|
|
256
256
|
|
|
@@ -18,7 +18,6 @@ import {
|
|
|
18
18
|
AnchorComputerRegistry,
|
|
19
19
|
ChangeRoutingPointsOperation,
|
|
20
20
|
Connectable,
|
|
21
|
-
Disposable,
|
|
22
21
|
EdgeRouterRegistry,
|
|
23
22
|
GModelElement,
|
|
24
23
|
GModelRoot,
|
|
@@ -31,6 +30,7 @@ import {
|
|
|
31
30
|
isSelected
|
|
32
31
|
} from '@eclipse-glsp/sprotty';
|
|
33
32
|
import { inject, injectable, optional } from 'inversify';
|
|
33
|
+
import { FeedbackEmitter } from '../../../base';
|
|
34
34
|
import { DragAwareMouseListener } from '../../../base/drag-aware-mouse-listener';
|
|
35
35
|
import { CursorCSS, cursorFeedbackAction } from '../../../base/feedback/css-feedback';
|
|
36
36
|
import { ISelectionListener, SelectionService } from '../../../base/selection-service';
|
|
@@ -76,7 +76,7 @@ export class EdgeEditTool extends BaseEditTool {
|
|
|
76
76
|
this.feedbackMovingListener = new FeedbackEdgeRouteMovingMouseListener(this.positionSnapper, this.edgeRouterRegistry);
|
|
77
77
|
|
|
78
78
|
this.toDisposeOnDisable.push(
|
|
79
|
-
|
|
79
|
+
this.edgeEditListener,
|
|
80
80
|
this.mouseTool.registerListener(this.edgeEditListener),
|
|
81
81
|
this.feedbackEdgeSourceMovingListener,
|
|
82
82
|
this.feedbackEdgeTargetMovingListener,
|
|
@@ -110,8 +110,11 @@ export class EdgeEditListener extends DragAwareMouseListener implements ISelecti
|
|
|
110
110
|
// active reconnect handle data
|
|
111
111
|
protected reconnectMode?: 'NEW_SOURCE' | 'NEW_TARGET';
|
|
112
112
|
|
|
113
|
+
protected editFeedback: FeedbackEmitter;
|
|
114
|
+
|
|
113
115
|
constructor(protected tool: EdgeEditTool) {
|
|
114
116
|
super();
|
|
117
|
+
this.editFeedback = this.tool.createFeedbackEmitter();
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
protected isValidEdge(edge?: GRoutableElement): edge is GRoutableElement {
|
|
@@ -119,21 +122,21 @@ export class EdgeEditListener extends DragAwareMouseListener implements ISelecti
|
|
|
119
122
|
}
|
|
120
123
|
|
|
121
124
|
protected setEdgeSelected(edge: GRoutableElement): void {
|
|
122
|
-
if (this.edge && this.edge.id !== edge.id) {
|
|
123
|
-
// reset from a previously selected edge
|
|
124
|
-
this.reset();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
125
|
this.edge = edge;
|
|
128
126
|
// note: order is important here as we want the reconnect handles to cover the routing handles
|
|
129
|
-
const feedbackActions = [];
|
|
130
127
|
if (canEditRouting(edge)) {
|
|
131
|
-
|
|
128
|
+
this.editFeedback.add(
|
|
129
|
+
SwitchRoutingModeAction.create({ elementsToActivate: [this.edge.id] }),
|
|
130
|
+
SwitchRoutingModeAction.create({ elementsToDeactivate: [this.edge.id] })
|
|
131
|
+
);
|
|
132
132
|
}
|
|
133
133
|
if (isReconnectable(edge)) {
|
|
134
|
-
|
|
134
|
+
this.editFeedback.add(
|
|
135
|
+
ShowEdgeReconnectHandlesFeedbackAction.create(this.edge.id),
|
|
136
|
+
HideEdgeReconnectHandlesFeedbackAction.create()
|
|
137
|
+
);
|
|
135
138
|
}
|
|
136
|
-
this.
|
|
139
|
+
this.editFeedback.submit();
|
|
137
140
|
}
|
|
138
141
|
|
|
139
142
|
protected isEdgeSelected(): boolean {
|
|
@@ -142,19 +145,24 @@ export class EdgeEditListener extends DragAwareMouseListener implements ISelecti
|
|
|
142
145
|
|
|
143
146
|
protected setReconnectHandleSelected(edge: GRoutableElement, reconnectHandle: GReconnectHandle): void {
|
|
144
147
|
if (this.edge && this.edge.target && this.edge.source) {
|
|
148
|
+
this.editFeedback.dispose();
|
|
145
149
|
if (isSourceRoutingHandle(edge, reconnectHandle)) {
|
|
146
|
-
this.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
150
|
+
this.editFeedback
|
|
151
|
+
.add(cursorFeedbackAction(CursorCSS.EDGE_RECONNECT), cursorFeedbackAction())
|
|
152
|
+
.add(
|
|
153
|
+
DrawFeedbackEdgeSourceAction.create({ elementTypeId: this.edge.type, targetId: this.edge.targetId }),
|
|
154
|
+
RemoveFeedbackEdgeAction.create()
|
|
155
|
+
)
|
|
156
|
+
.submit();
|
|
151
157
|
this.reconnectMode = 'NEW_SOURCE';
|
|
152
158
|
} else if (isTargetRoutingHandle(edge, reconnectHandle)) {
|
|
153
|
-
this.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
159
|
+
this.editFeedback
|
|
160
|
+
.add(cursorFeedbackAction(CursorCSS.EDGE_CREATION_TARGET), cursorFeedbackAction())
|
|
161
|
+
.add(
|
|
162
|
+
DrawFeedbackEdgeAction.create({ elementTypeId: this.edge.type, sourceId: this.edge.sourceId }),
|
|
163
|
+
RemoveFeedbackEdgeAction.create()
|
|
164
|
+
)
|
|
165
|
+
.submit();
|
|
158
166
|
this.reconnectMode = 'NEW_TARGET';
|
|
159
167
|
}
|
|
160
168
|
}
|
|
@@ -204,22 +212,20 @@ export class EdgeEditListener extends DragAwareMouseListener implements ISelecti
|
|
|
204
212
|
this.setRoutingHandleSelected(edge, routingHandle);
|
|
205
213
|
} else if (this.isValidEdge(edge)) {
|
|
206
214
|
// PHASE 1: Select edge
|
|
215
|
+
this.dispose();
|
|
207
216
|
this.tool.registerFeedbackListeners();
|
|
208
217
|
this.setEdgeSelected(edge);
|
|
209
218
|
}
|
|
210
219
|
} else if (event.button === 2) {
|
|
211
|
-
this.
|
|
220
|
+
this.dispose();
|
|
212
221
|
}
|
|
213
222
|
return result;
|
|
214
223
|
}
|
|
215
224
|
|
|
216
|
-
override
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
this.setNewConnectable(undefined);
|
|
221
|
-
}
|
|
222
|
-
return result;
|
|
225
|
+
protected override draggingMouseMove(target: GModelElement, event: MouseEvent): Action[] {
|
|
226
|
+
// reset any selected connectables when we are dragging, maybe the user is just panning
|
|
227
|
+
this.setNewConnectable(undefined);
|
|
228
|
+
return super.draggingMouseMove(target, event);
|
|
223
229
|
}
|
|
224
230
|
|
|
225
231
|
override mouseUp(target: GModelElement, event: MouseEvent): Action[] {
|
|
@@ -234,7 +240,7 @@ export class EdgeEditListener extends DragAwareMouseListener implements ISelecti
|
|
|
234
240
|
if (this.requiresReconnect(sourceElementId, targetElementId)) {
|
|
235
241
|
result.push(ReconnectEdgeOperation.create({ edgeElementId: this.edge.id, sourceElementId, targetElementId }));
|
|
236
242
|
}
|
|
237
|
-
this.
|
|
243
|
+
this.dispose();
|
|
238
244
|
} else if (this.edge && this.routingHandle) {
|
|
239
245
|
// we need to re-retrieve the edge as it might have changed due to a server update since we do not reset the state between
|
|
240
246
|
// reroute actions
|
|
@@ -258,11 +264,11 @@ export class EdgeEditListener extends DragAwareMouseListener implements ISelecti
|
|
|
258
264
|
(this.reconnectMode === 'NEW_SOURCE' && currentTarget.canConnect(this.edge, 'source')) ||
|
|
259
265
|
(this.reconnectMode === 'NEW_TARGET' && currentTarget.canConnect(this.edge, 'target'))
|
|
260
266
|
) {
|
|
261
|
-
this.
|
|
267
|
+
this.editFeedback.add(cursorFeedbackAction(CursorCSS.EDGE_RECONNECT), cursorFeedbackAction()).submit();
|
|
262
268
|
return [];
|
|
263
269
|
}
|
|
264
270
|
}
|
|
265
|
-
this.
|
|
271
|
+
this.editFeedback.add(cursorFeedbackAction(CursorCSS.OPERATION_NOT_ALLOWED), cursorFeedbackAction()).submit();
|
|
266
272
|
}
|
|
267
273
|
}
|
|
268
274
|
return [];
|
|
@@ -292,30 +298,17 @@ export class EdgeEditListener extends DragAwareMouseListener implements ISelecti
|
|
|
292
298
|
}
|
|
293
299
|
}
|
|
294
300
|
}
|
|
295
|
-
|
|
296
|
-
this.reset();
|
|
301
|
+
this.dispose();
|
|
297
302
|
}
|
|
298
303
|
}
|
|
299
304
|
|
|
300
|
-
|
|
301
|
-
this.resetFeedback();
|
|
302
|
-
this.resetData();
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
protected resetData(): void {
|
|
305
|
+
override dispose(): void {
|
|
306
306
|
this.edge = undefined;
|
|
307
307
|
this.reconnectMode = undefined;
|
|
308
308
|
this.newConnectable = undefined;
|
|
309
309
|
this.routingHandle = undefined;
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
protected resetFeedback(): void {
|
|
313
|
-
const result: Action[] = [];
|
|
314
|
-
if (this.edge) {
|
|
315
|
-
result.push(SwitchRoutingModeAction.create({ elementsToDeactivate: [this.edge.id] }));
|
|
316
|
-
}
|
|
317
|
-
result.push(...[HideEdgeReconnectHandlesFeedbackAction.create(), cursorFeedbackAction(), RemoveFeedbackEdgeAction.create()]);
|
|
318
|
-
this.tool.deregisterFeedback(undefined, result);
|
|
310
|
+
this.editFeedback.dispose();
|
|
319
311
|
this.tool.deregisterFeedbackListeners();
|
|
312
|
+
super.dispose();
|
|
320
313
|
}
|
|
321
314
|
}
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
********************************************************************************/
|
|
16
16
|
import {
|
|
17
17
|
Action,
|
|
18
|
-
BoundsAware,
|
|
19
18
|
DOMHelper,
|
|
20
19
|
GModelElement,
|
|
21
20
|
GModelRoot,
|
|
@@ -30,11 +29,12 @@ import { inject, injectable, optional } from 'inversify';
|
|
|
30
29
|
import { DragAwareMouseListener } from '../../../base/drag-aware-mouse-listener';
|
|
31
30
|
import { CursorCSS, cursorFeedbackAction } from '../../../base/feedback/css-feedback';
|
|
32
31
|
import { EnableDefaultToolsAction } from '../../../base/tool-manager/tool';
|
|
32
|
+
import { GEdge } from '../../../model';
|
|
33
|
+
import { BoundsAwareModelElement, SelectableBoundsAware, isSelectableAndBoundsAware } from '../../../utils';
|
|
33
34
|
import { getAbsolutePosition, toAbsoluteBounds } from '../../../utils/viewpoint-util';
|
|
34
35
|
import { BaseEditTool } from '../base-tools';
|
|
35
36
|
import { IMarqueeBehavior, MarqueeUtil } from './marquee-behavior';
|
|
36
37
|
import { RemoveMarqueeAction } from './marquee-tool-feedback';
|
|
37
|
-
import { GEdge } from '../../../model';
|
|
38
38
|
|
|
39
39
|
@injectable()
|
|
40
40
|
export class MarqueeMouseTool extends BaseEditTool {
|
|
@@ -53,7 +53,7 @@ export class MarqueeMouseTool extends BaseEditTool {
|
|
|
53
53
|
this.toDisposeOnDisable.push(
|
|
54
54
|
this.mouseTool.registerListener(new MarqueeMouseListener(this.domHelper, this.editorContext.modelRoot, this.marqueeBehavior)),
|
|
55
55
|
this.keyTool.registerListener(this.shiftKeyListener),
|
|
56
|
-
this.
|
|
56
|
+
this.createFeedbackEmitter().add(cursorFeedbackAction(CursorCSS.MARQUEE), cursorFeedbackAction()).submit()
|
|
57
57
|
);
|
|
58
58
|
}
|
|
59
59
|
}
|
|
@@ -61,7 +61,7 @@ export class MarqueeMouseTool extends BaseEditTool {
|
|
|
61
61
|
export class MarqueeMouseListener extends DragAwareMouseListener {
|
|
62
62
|
protected domHelper: DOMHelper;
|
|
63
63
|
protected marqueeUtil: MarqueeUtil;
|
|
64
|
-
protected nodes:
|
|
64
|
+
protected nodes: BoundsAwareModelElement[];
|
|
65
65
|
protected edges: SVGGElement[];
|
|
66
66
|
protected previouslySelected: string[];
|
|
67
67
|
protected isActive = false;
|
|
@@ -73,7 +73,7 @@ export class MarqueeMouseListener extends DragAwareMouseListener {
|
|
|
73
73
|
this.nodes = Array.from(
|
|
74
74
|
root.index
|
|
75
75
|
.all()
|
|
76
|
-
.map(e => e as
|
|
76
|
+
.map(e => e as BoundsAwareModelElement)
|
|
77
77
|
.filter(e => isSelectable(e))
|
|
78
78
|
.filter(e => e instanceof GNode)
|
|
79
79
|
);
|
|
@@ -94,7 +94,8 @@ export class MarqueeMouseListener extends DragAwareMouseListener {
|
|
|
94
94
|
this.previouslySelected = Array.from(
|
|
95
95
|
target.root.index
|
|
96
96
|
.all()
|
|
97
|
-
.
|
|
97
|
+
.filter(isSelectableAndBoundsAware)
|
|
98
|
+
.map(e => e as SelectableBoundsAware)
|
|
98
99
|
.filter(e => isSelected(e))
|
|
99
100
|
.map(e => e.id)
|
|
100
101
|
);
|