@eclipse-glsp/client 2.2.0-next.329 → 2.2.0-next.331
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 +22 -0
- package/lib/base/default.module.js +1 -1
- package/lib/base/default.module.js.map +1 -1
- 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/index.d.ts +1 -1
- package/lib/base/index.d.ts.map +1 -1
- package/lib/base/index.js +1 -1
- package/lib/base/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/routing/glsp-manhattan-edge-router.d.ts → base/ui-extension/index.d.ts} +4 -6
- package/lib/base/ui-extension/index.d.ts.map +1 -0
- package/lib/base/ui-extension/index.js +34 -0
- package/lib/base/ui-extension/index.js.map +1 -0
- package/lib/base/{ui-extension-registry.d.ts → ui-extension/ui-extension-registry.d.ts} +1 -1
- package/lib/base/ui-extension/ui-extension-registry.d.ts.map +1 -0
- package/lib/base/ui-extension/ui-extension-registry.js.map +1 -0
- package/lib/base/ui-extension/ui-extension.d.ts +39 -0
- package/lib/base/ui-extension/ui-extension.d.ts.map +1 -0
- package/lib/base/ui-extension/ui-extension.js +120 -0
- package/lib/base/ui-extension/ui-extension.js.map +1 -0
- 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/command-palette/command-palette.d.ts.map +1 -1
- package/lib/features/command-palette/command-palette.js +4 -3
- package/lib/features/command-palette/command-palette.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/label-edit-ui/label-edit-ui.d.ts.map +1 -1
- package/lib/features/label-edit-ui/label-edit-ui.js +4 -3
- package/lib/features/label-edit-ui/label-edit-ui.js.map +1 -1
- package/lib/features/routing/edge-router.d.ts +30 -0
- package/lib/features/routing/edge-router.d.ts.map +1 -0
- package/lib/features/routing/edge-router.js +116 -0
- package/lib/features/routing/edge-router.js.map +1 -0
- package/lib/features/routing/index.d.ts +1 -1
- package/lib/features/routing/index.d.ts.map +1 -1
- package/lib/features/routing/index.js +1 -1
- package/lib/features/routing/index.js.map +1 -1
- package/lib/features/routing/routing-module.d.ts.map +1 -1
- package/lib/features/routing/routing-module.js +4 -4
- package/lib/features/routing/routing-module.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/default.module.ts +1 -1
- 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/index.ts +1 -1
- package/src/base/selection-service.spec.ts +5 -0
- package/src/base/selection-service.ts +2 -3
- package/src/base/ui-extension/index.ts +17 -0
- package/src/base/{ui-extension-registry.ts → ui-extension/ui-extension-registry.ts} +1 -1
- package/src/base/ui-extension/ui-extension.ts +119 -0
- 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/command-palette/command-palette.ts +2 -1
- 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/label-edit-ui/label-edit-ui.ts +2 -1
- package/src/features/routing/{glsp-manhattan-edge-router.ts → edge-router.ts} +72 -2
- package/src/features/routing/index.ts +1 -1
- package/src/features/routing/routing-module.ts +3 -5
- 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
- package/lib/base/ui-extension-registry.d.ts.map +0 -1
- package/lib/base/ui-extension-registry.js.map +0 -1
- package/lib/features/routing/glsp-manhattan-edge-router.d.ts.map +0 -1
- package/lib/features/routing/glsp-manhattan-edge-router.js +0 -68
- package/lib/features/routing/glsp-manhattan-edge-router.js.map +0 -1
- /package/lib/base/{ui-extension-registry.js → ui-extension/ui-extension-registry.js} +0 -0
|
@@ -13,11 +13,12 @@
|
|
|
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 { Action, Disposable, DisposableCollection, IActionHandler, TYPES } from '@eclipse-glsp/sprotty';
|
|
17
|
+
import { inject, injectable } from 'inversify';
|
|
18
18
|
import { GLSPActionDispatcher } from '../../base/action-dispatcher';
|
|
19
19
|
import { EditorContextService } from '../../base/editor-context-service';
|
|
20
|
-
import {
|
|
20
|
+
import { FeedbackEmitter } from '../../base/feedback/feeback-emitter';
|
|
21
|
+
import { IFeedbackActionDispatcher, IFeedbackEmitter, MaybeActions } from '../../base/feedback/feedback-action-dispatcher';
|
|
21
22
|
import { EnableToolsAction, Tool } from '../../base/tool-manager/tool';
|
|
22
23
|
import { GLSPKeyTool } from '../../base/view/key-tool';
|
|
23
24
|
import { GLSPMouseTool } from '../../base/view/mouse-tool';
|
|
@@ -47,8 +48,12 @@ export abstract class BaseEditTool implements Tool {
|
|
|
47
48
|
return true;
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
dispatchActions(actions: Action[]): void {
|
|
51
|
-
this.actionDispatcher.dispatchAll(actions);
|
|
51
|
+
dispatchActions(actions: Action[]): Promise<void> {
|
|
52
|
+
return this.actionDispatcher.dispatchAll(actions);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
createFeedbackEmitter(): FeedbackEmitter {
|
|
56
|
+
return this.feedbackDispatcher.createEmitter();
|
|
52
57
|
}
|
|
53
58
|
|
|
54
59
|
/**
|
|
@@ -59,9 +64,10 @@ export abstract class BaseEditTool implements Tool {
|
|
|
59
64
|
* @param feedbackEmitter the emitter sending out feedback actions (this tool by default).
|
|
60
65
|
* @param cleanupActions the actions to be sent out when the feedback is de-registered through the returned Disposable.
|
|
61
66
|
* @returns A 'Disposable' that de-registers the feedback and cleans up any pending feedback with the given `cleanupActions`.
|
|
67
|
+
* @deprecated It is recommended to create a {@link createFeedbackEmitter dedicated emitter} per feedback instead of using the tool.
|
|
62
68
|
*/
|
|
63
|
-
registerFeedback(feedbackActions: Action[], feedbackEmitter
|
|
64
|
-
return this.feedbackDispatcher.registerFeedback(feedbackEmitter
|
|
69
|
+
registerFeedback(feedbackActions: Action[], feedbackEmitter: IFeedbackEmitter = this, cleanupActions?: MaybeActions): Disposable {
|
|
70
|
+
return this.feedbackDispatcher.registerFeedback(feedbackEmitter, feedbackActions, cleanupActions);
|
|
65
71
|
}
|
|
66
72
|
|
|
67
73
|
/**
|
|
@@ -70,9 +76,10 @@ export abstract class BaseEditTool implements Tool {
|
|
|
70
76
|
*
|
|
71
77
|
* @param feedbackEmitter the emitter to be deregistered (this tool by default).
|
|
72
78
|
* @param cleanupActions the actions to be dispatched right after the deregistration to clean up any pending feedback.
|
|
79
|
+
* @deprecated It is recommended to create a {@link createFeedbackEmitter dedicated emitter} per feedback and dispose it like that.
|
|
73
80
|
*/
|
|
74
|
-
deregisterFeedback(feedbackEmitter
|
|
75
|
-
this.feedbackDispatcher.deregisterFeedback(feedbackEmitter
|
|
81
|
+
deregisterFeedback(feedbackEmitter: IFeedbackEmitter = this, cleanupActions?: MaybeActions): void {
|
|
82
|
+
this.feedbackDispatcher.deregisterFeedback(feedbackEmitter, cleanupActions);
|
|
76
83
|
}
|
|
77
84
|
}
|
|
78
85
|
|
|
@@ -13,35 +13,13 @@
|
|
|
13
13
|
*
|
|
14
14
|
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
|
15
15
|
********************************************************************************/
|
|
16
|
-
import {
|
|
17
|
-
Action,
|
|
18
|
-
CommandExecutionContext,
|
|
19
|
-
CommandReturn,
|
|
20
|
-
Disposable,
|
|
21
|
-
ElementMove,
|
|
22
|
-
GChildElement,
|
|
23
|
-
GModelElement,
|
|
24
|
-
GModelRoot,
|
|
25
|
-
MoveAction,
|
|
26
|
-
Point,
|
|
27
|
-
TYPES,
|
|
28
|
-
findParentByFeature,
|
|
29
|
-
hasStringProp,
|
|
30
|
-
isMoveable,
|
|
31
|
-
isSelectable
|
|
32
|
-
} from '@eclipse-glsp/sprotty';
|
|
16
|
+
import { Action, CommandExecutionContext, CommandReturn, TYPES, hasStringProp } from '@eclipse-glsp/sprotty';
|
|
33
17
|
import { inject, injectable } from 'inversify';
|
|
34
18
|
|
|
35
|
-
import { DebouncedFunc, debounce } from 'lodash';
|
|
36
|
-
import { DragAwareMouseListener } from '../../../base/drag-aware-mouse-listener';
|
|
37
|
-
import { CursorCSS, cursorFeedbackAction } from '../../../base/feedback/css-feedback';
|
|
38
19
|
import { FeedbackCommand } from '../../../base/feedback/feedback-command';
|
|
39
20
|
import { OptionalAction } from '../../../base/model/glsp-model-source';
|
|
40
21
|
import { forEachElement } from '../../../utils/gmodel-util';
|
|
41
|
-
import {
|
|
42
|
-
import { createMovementRestrictionFeedback, removeMovementRestrictionFeedback } from '../../change-bounds/movement-restrictor';
|
|
43
|
-
import { PointPositionUpdater } from '../../change-bounds/point-position-updater';
|
|
44
|
-
import { ChangeBoundsTool } from './change-bounds-tool';
|
|
22
|
+
import { addResizeHandles, isResizable, removeResizeHandles } from '../../change-bounds/model';
|
|
45
23
|
|
|
46
24
|
export interface ShowChangeBoundsToolResizeFeedbackAction extends Action {
|
|
47
25
|
kind: typeof ShowChangeBoundsToolResizeFeedbackAction.KIND;
|
|
@@ -89,13 +67,11 @@ export class ShowChangeBoundsToolResizeFeedbackCommand extends FeedbackCommand {
|
|
|
89
67
|
execute(context: CommandExecutionContext): CommandReturn {
|
|
90
68
|
const index = context.root.index;
|
|
91
69
|
|
|
92
|
-
forEachElement(index, isResizable, removeResizeHandles);
|
|
70
|
+
forEachElement(index, isResizable, element => element.id !== this.action.elementId && removeResizeHandles(element));
|
|
93
71
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
addResizeHandles(resizeElement);
|
|
98
|
-
}
|
|
72
|
+
const resizeElement = index.getById(this.action.elementId);
|
|
73
|
+
if (resizeElement && isResizable(resizeElement)) {
|
|
74
|
+
addResizeHandles(resizeElement);
|
|
99
75
|
}
|
|
100
76
|
return context.root;
|
|
101
77
|
}
|
|
@@ -145,205 +121,3 @@ export namespace MoveFinishedEventAction {
|
|
|
145
121
|
return OptionalAction.mark({ kind: KIND });
|
|
146
122
|
}
|
|
147
123
|
}
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* This mouse listener provides visual feedback for moving by sending client-side
|
|
151
|
-
* `MoveAction`s while elements are selected and dragged. This will also update
|
|
152
|
-
* their bounds, which is important, as it is not only required for rendering
|
|
153
|
-
* the visual feedback but also the basis for sending the change to the server
|
|
154
|
-
* (see also `tools/MoveTool`).
|
|
155
|
-
*/
|
|
156
|
-
export class FeedbackMoveMouseListener extends DragAwareMouseListener implements Disposable {
|
|
157
|
-
protected rootElement?: GModelRoot;
|
|
158
|
-
protected positionUpdater;
|
|
159
|
-
protected elementId2startPos = new Map<string, Point>();
|
|
160
|
-
protected pendingMoveInitialized?: DebouncedFunc<() => void>;
|
|
161
|
-
protected moveInitialized = false;
|
|
162
|
-
|
|
163
|
-
constructor(protected tool: ChangeBoundsTool) {
|
|
164
|
-
super();
|
|
165
|
-
this.positionUpdater = new PointPositionUpdater(tool.positionSnapper);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
override mouseDown(target: GModelElement, event: MouseEvent): Action[] {
|
|
169
|
-
if (event.button === 0 && !(target instanceof SResizeHandle)) {
|
|
170
|
-
const moveable = findParentByFeature(target, isMoveable);
|
|
171
|
-
if (moveable !== undefined && !(target instanceof SResizeHandle)) {
|
|
172
|
-
this.positionUpdater.updateLastDragPosition(event);
|
|
173
|
-
this.scheduleMoveInitialized();
|
|
174
|
-
} else {
|
|
175
|
-
this.positionUpdater.resetPosition();
|
|
176
|
-
}
|
|
177
|
-
this._isMouseDrag = false;
|
|
178
|
-
}
|
|
179
|
-
return [];
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
protected scheduleMoveInitialized(): void {
|
|
183
|
-
this.moveInitialized = false;
|
|
184
|
-
this.pendingMoveInitialized?.cancel();
|
|
185
|
-
this.pendingMoveInitialized = debounce(() => {
|
|
186
|
-
this.tool.registerFeedback([MoveInitializedEventAction.create()], this);
|
|
187
|
-
this.pendingMoveInitialized = undefined;
|
|
188
|
-
this.moveInitialized = true;
|
|
189
|
-
}, 750);
|
|
190
|
-
this.pendingMoveInitialized();
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
override mouseMove(target: GModelElement, event: MouseEvent): Action[] {
|
|
194
|
-
const result: Action[] = [];
|
|
195
|
-
if (event.buttons === 0) {
|
|
196
|
-
this.mouseUp(target, event);
|
|
197
|
-
} else if (!this.positionUpdater.isLastDragPositionUndefined()) {
|
|
198
|
-
if (this.elementId2startPos.size === 0) {
|
|
199
|
-
this.collectStartPositions(target.root);
|
|
200
|
-
}
|
|
201
|
-
this._isMouseDrag = true;
|
|
202
|
-
const moveAction = this.getElementMoves(target, event, false);
|
|
203
|
-
if (moveAction) {
|
|
204
|
-
this.pendingMoveInitialized?.cancel();
|
|
205
|
-
result.push(moveAction);
|
|
206
|
-
result.push(cursorFeedbackAction(CursorCSS.MOVE));
|
|
207
|
-
this.tool.registerFeedback(result, this);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
return [];
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
protected collectStartPositions(root: GModelRoot): void {
|
|
214
|
-
this.rootElement = root;
|
|
215
|
-
const selectedElements = root.index.all().filter(element => isSelectable(element) && element.selected);
|
|
216
|
-
const elementsSet = new Set(selectedElements);
|
|
217
|
-
selectedElements
|
|
218
|
-
.filter(element => !this.isChildOfSelected(elementsSet, element))
|
|
219
|
-
.forEach(element => {
|
|
220
|
-
if (isMoveable(element)) {
|
|
221
|
-
this.elementId2startPos.set(element.id, element.position);
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
protected isChildOfSelected(selectedElements: Set<GModelElement>, element: GModelElement): boolean {
|
|
227
|
-
while (element instanceof GChildElement) {
|
|
228
|
-
element = element.parent;
|
|
229
|
-
if (selectedElements.has(element)) {
|
|
230
|
-
return true;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return false;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
protected getElementMoves(target: GModelElement, event: MouseEvent, finished: boolean): MoveAction | undefined {
|
|
237
|
-
const delta = this.positionUpdater.updatePosition(target, event);
|
|
238
|
-
if (!delta) {
|
|
239
|
-
return undefined;
|
|
240
|
-
}
|
|
241
|
-
const elementMoves: ElementMove[] = this.getElementMovesForDelta(target, delta, finished);
|
|
242
|
-
if (elementMoves.length > 0) {
|
|
243
|
-
return MoveAction.create(elementMoves, { animate: false, finished });
|
|
244
|
-
} else {
|
|
245
|
-
return undefined;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
protected getElementMovesForDelta(target: GModelElement, delta: Point, finished: boolean): ElementMove[] {
|
|
250
|
-
const elementMoves: ElementMove[] = [];
|
|
251
|
-
this.elementId2startPos.forEach((startPosition, elementId) => {
|
|
252
|
-
const element = target.root.index.getById(elementId);
|
|
253
|
-
if (element) {
|
|
254
|
-
if (isMoveable(element)) {
|
|
255
|
-
const targetPosition = Point.add(element.position, delta);
|
|
256
|
-
const toPosition = this.validateMove(startPosition, targetPosition, element, finished);
|
|
257
|
-
elementMoves.push({ elementId: element.id, fromPosition: element.position, toPosition });
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
});
|
|
261
|
-
return elementMoves;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
protected validateMove(startPosition: Point, toPosition: Point, element: GModelElement, isFinished: boolean): Point {
|
|
265
|
-
let newPosition = toPosition;
|
|
266
|
-
if (this.tool.movementRestrictor) {
|
|
267
|
-
const valid = this.tool.movementRestrictor.validate(element, toPosition);
|
|
268
|
-
let action;
|
|
269
|
-
if (!valid) {
|
|
270
|
-
action = createMovementRestrictionFeedback(element, this.tool.movementRestrictor);
|
|
271
|
-
if (isFinished) {
|
|
272
|
-
newPosition = startPosition;
|
|
273
|
-
}
|
|
274
|
-
} else {
|
|
275
|
-
action = removeMovementRestrictionFeedback(element, this.tool.movementRestrictor);
|
|
276
|
-
}
|
|
277
|
-
this.tool.registerFeedback([action], this);
|
|
278
|
-
}
|
|
279
|
-
return newPosition;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
override mouseEnter(target: GModelElement, event: MouseEvent): Action[] {
|
|
283
|
-
if (target instanceof GModelRoot && event.buttons === 0 && this.positionUpdater.isLastDragPositionUndefined()) {
|
|
284
|
-
this.mouseUp(target, event);
|
|
285
|
-
}
|
|
286
|
-
return [];
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
override nonDraggingMouseUp(element: GModelElement, event: MouseEvent): Action[] {
|
|
290
|
-
this.reset(true);
|
|
291
|
-
return [];
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
override draggingMouseUp(target: GModelElement, event: MouseEvent): Action[] {
|
|
295
|
-
const result: Action[] = [];
|
|
296
|
-
if (this.positionUpdater.isLastDragPositionUndefined()) {
|
|
297
|
-
this.reset(true);
|
|
298
|
-
return result;
|
|
299
|
-
} else {
|
|
300
|
-
const moveAction = this.getElementMoves(target, event, true);
|
|
301
|
-
if (moveAction) {
|
|
302
|
-
result.push(moveAction);
|
|
303
|
-
}
|
|
304
|
-
const resetFeedback: Action[] = [];
|
|
305
|
-
if (this.tool.movementRestrictor) {
|
|
306
|
-
resetFeedback.push(removeMovementRestrictionFeedback(target, this.tool.movementRestrictor));
|
|
307
|
-
}
|
|
308
|
-
resetFeedback.push(cursorFeedbackAction(CursorCSS.DEFAULT));
|
|
309
|
-
this.tool.deregisterFeedback(this, resetFeedback);
|
|
310
|
-
}
|
|
311
|
-
this.reset();
|
|
312
|
-
return result;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
protected resetMoveFeedback(): ElementMove[] {
|
|
316
|
-
const elementMoves: ElementMove[] = [];
|
|
317
|
-
this.elementId2startPos.forEach((startPosition, elementId) => {
|
|
318
|
-
const element = this.rootElement!.index.getById(elementId);
|
|
319
|
-
if (element) {
|
|
320
|
-
if (isMoveable(element)) {
|
|
321
|
-
elementMoves.push({ elementId: element.id, fromPosition: element.position, toPosition: startPosition });
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
});
|
|
325
|
-
return elementMoves;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
protected reset(resetFeedback = false): void {
|
|
329
|
-
this.pendingMoveInitialized?.cancel();
|
|
330
|
-
if (this.rootElement && resetFeedback) {
|
|
331
|
-
const elementMoves: ElementMove[] = this.resetMoveFeedback();
|
|
332
|
-
if (elementMoves.length > 0) {
|
|
333
|
-
const moveAction = MoveAction.create(elementMoves, { animate: false, finished: true });
|
|
334
|
-
this.tool.deregisterFeedback(this, [moveAction]);
|
|
335
|
-
}
|
|
336
|
-
} else if (resetFeedback && this.moveInitialized) {
|
|
337
|
-
this.tool.deregisterFeedback(this, [MoveFinishedEventAction.create()]);
|
|
338
|
-
}
|
|
339
|
-
this.positionUpdater.resetPosition();
|
|
340
|
-
this._isMouseDrag = false;
|
|
341
|
-
this.moveInitialized = false;
|
|
342
|
-
this.rootElement = undefined;
|
|
343
|
-
this.elementId2startPos.clear();
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
dispose(): void {
|
|
347
|
-
this.reset(true);
|
|
348
|
-
}
|
|
349
|
-
}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
|
15
15
|
********************************************************************************/
|
|
16
16
|
import { FeatureModule, TYPES, bindAsService, configureCommand, configureView } from '@eclipse-glsp/sprotty';
|
|
17
|
+
import '../../../../css/change-bounds.css';
|
|
17
18
|
import { SResizeHandle } from '../../change-bounds/model';
|
|
18
19
|
import { ChangeBoundsTool } from './change-bounds-tool';
|
|
19
20
|
import { HideChangeBoundsToolResizeFeedbackCommand, ShowChangeBoundsToolResizeFeedbackCommand } from './change-bounds-tool-feedback';
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (c) 2019-2023 EclipseSource and others.
|
|
3
|
+
*
|
|
4
|
+
* This program and the accompanying materials are made available under the
|
|
5
|
+
* terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
* http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
*
|
|
8
|
+
* This Source Code may also be made available under the following Secondary
|
|
9
|
+
* Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
* Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
* with the GNU Classpath Exception which is available at
|
|
12
|
+
* https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
*
|
|
14
|
+
* SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
|
|
15
|
+
********************************************************************************/
|
|
16
|
+
import { Action, Disposable, ElementMove, GModelElement, GModelRoot, MoveAction, Point, findParentByFeature } from '@eclipse-glsp/sprotty';
|
|
17
|
+
|
|
18
|
+
import { DebouncedFunc, debounce } from 'lodash';
|
|
19
|
+
import { DragAwareMouseListener } from '../../../base/drag-aware-mouse-listener';
|
|
20
|
+
import { CursorCSS, cursorFeedbackAction } from '../../../base/feedback/css-feedback';
|
|
21
|
+
import { FeedbackEmitter } from '../../../base/feedback/feeback-emitter';
|
|
22
|
+
import { MoveableElement, filter, getElements, isNonRoutableSelectedMovableBoundsAware, removeDescendants } from '../../../utils';
|
|
23
|
+
import { PointPositionUpdater } from '../../change-bounds';
|
|
24
|
+
import { SResizeHandle } from '../../change-bounds/model';
|
|
25
|
+
import { createMovementRestrictionFeedback, removeMovementRestrictionFeedback } from '../../change-bounds/movement-restrictor';
|
|
26
|
+
import { ChangeBoundsTool } from './change-bounds-tool';
|
|
27
|
+
import { MoveFinishedEventAction, MoveInitializedEventAction } from './change-bounds-tool-feedback';
|
|
28
|
+
|
|
29
|
+
export interface ValidatedElementMove extends ElementMove {
|
|
30
|
+
valid: boolean;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export namespace ValidatedElementMove {
|
|
34
|
+
export function isValid(move: ElementMove): boolean {
|
|
35
|
+
return (move as ValidatedElementMove).valid ?? true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* This mouse listener provides visual feedback for moving by sending client-side
|
|
41
|
+
* `MoveAction`s while elements are selected and dragged. This will also update
|
|
42
|
+
* their bounds, which is important, as it is not only required for rendering
|
|
43
|
+
* the visual feedback but also the basis for sending the change to the server
|
|
44
|
+
* (see also `tools/MoveTool`).
|
|
45
|
+
*/
|
|
46
|
+
export class FeedbackMoveMouseListener extends DragAwareMouseListener implements Disposable {
|
|
47
|
+
protected rootElement?: GModelRoot;
|
|
48
|
+
protected positionUpdater;
|
|
49
|
+
protected elementId2startPos = new Map<string, Point>();
|
|
50
|
+
|
|
51
|
+
protected pendingMoveInitialized?: DebouncedFunc<() => void>;
|
|
52
|
+
|
|
53
|
+
protected moveInitializedFeedback: FeedbackEmitter;
|
|
54
|
+
protected moveFeedback: FeedbackEmitter;
|
|
55
|
+
|
|
56
|
+
constructor(protected tool: ChangeBoundsTool) {
|
|
57
|
+
super();
|
|
58
|
+
this.positionUpdater = new PointPositionUpdater(tool.positionSnapper);
|
|
59
|
+
this.moveInitializedFeedback = tool.createFeedbackEmitter();
|
|
60
|
+
this.moveFeedback = tool.createFeedbackEmitter();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
override mouseDown(target: GModelElement, event: MouseEvent): Action[] {
|
|
64
|
+
super.mouseDown(target, event);
|
|
65
|
+
if (event.button === 0) {
|
|
66
|
+
this.initializeMove(target, event);
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
this.positionUpdater.resetPosition();
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
protected initializeMove(target: GModelElement, event: MouseEvent): void {
|
|
74
|
+
if (target instanceof SResizeHandle) {
|
|
75
|
+
// avoid conflict with resize tool
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const moveable = findParentByFeature(target, this.isValidMoveable);
|
|
79
|
+
if (moveable !== undefined) {
|
|
80
|
+
this.positionUpdater.updateLastDragPosition(event);
|
|
81
|
+
this.scheduleMoveInitialized();
|
|
82
|
+
} else {
|
|
83
|
+
this.positionUpdater.resetPosition();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
protected scheduleMoveInitialized(): void {
|
|
88
|
+
this.pendingMoveInitialized?.cancel();
|
|
89
|
+
this.pendingMoveInitialized = debounce(() => {
|
|
90
|
+
this.moveInitialized();
|
|
91
|
+
this.pendingMoveInitialized = undefined;
|
|
92
|
+
}, 750);
|
|
93
|
+
this.pendingMoveInitialized();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
protected moveInitializationTimeout(): number {
|
|
97
|
+
return 750;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
protected moveInitialized(): void {
|
|
101
|
+
if (this.isMouseDown) {
|
|
102
|
+
this.moveInitializedFeedback
|
|
103
|
+
.add(MoveInitializedEventAction.create(), MoveFinishedEventAction.create())
|
|
104
|
+
.add(cursorFeedbackAction(CursorCSS.MOVE), cursorFeedbackAction(CursorCSS.DEFAULT))
|
|
105
|
+
.submit();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
protected isValidMoveable(element?: GModelElement): element is MoveableElement {
|
|
110
|
+
return !!element && isNonRoutableSelectedMovableBoundsAware(element) && !(element instanceof SResizeHandle);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
override nonDraggingMouseUp(element: GModelElement, event: MouseEvent): Action[] {
|
|
114
|
+
// should reset everything that may have happend on mouse down
|
|
115
|
+
this.moveInitializedFeedback.dispose();
|
|
116
|
+
this.positionUpdater.resetPosition();
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
override mouseMove(target: GModelElement, event: MouseEvent): Action[] {
|
|
121
|
+
super.mouseMove(target, event);
|
|
122
|
+
if (event.buttons === 0) {
|
|
123
|
+
return this.mouseUp(target, event);
|
|
124
|
+
} else if (!this.positionUpdater.isLastDragPositionUndefined()) {
|
|
125
|
+
return this.moveElements(target, event);
|
|
126
|
+
}
|
|
127
|
+
return [];
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
protected moveElements(target: GModelElement, event: MouseEvent): Action[] {
|
|
131
|
+
if (this.elementId2startPos.size === 0) {
|
|
132
|
+
this.initializeElementsToMove(target.root);
|
|
133
|
+
}
|
|
134
|
+
const moveAction = this.getElementMoves(target, event, false);
|
|
135
|
+
if (!moveAction) {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
// cancel any pending move
|
|
139
|
+
this.pendingMoveInitialized?.cancel();
|
|
140
|
+
this.moveFeedback.add(moveAction, () => this.resetElementPositions(target));
|
|
141
|
+
this.addMovementFeedback(moveAction, target);
|
|
142
|
+
this.moveFeedback.submit();
|
|
143
|
+
return [];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
protected addMovementFeedback(movement: MoveAction, ctx: GModelElement): void {
|
|
147
|
+
// cursor feedback
|
|
148
|
+
this.moveFeedback.add(cursorFeedbackAction(CursorCSS.MOVE), cursorFeedbackAction(CursorCSS.DEFAULT));
|
|
149
|
+
|
|
150
|
+
// restriction feedback
|
|
151
|
+
movement.moves.forEach(move => {
|
|
152
|
+
const element = ctx.root.index.getById(move.elementId);
|
|
153
|
+
if (element && this.tool.movementRestrictor) {
|
|
154
|
+
if (!ValidatedElementMove.isValid(move)) {
|
|
155
|
+
this.moveFeedback.add(createMovementRestrictionFeedback(element, this.tool.movementRestrictor), () =>
|
|
156
|
+
removeMovementRestrictionFeedback(element, this.tool.movementRestrictor!)
|
|
157
|
+
);
|
|
158
|
+
} else {
|
|
159
|
+
this.moveFeedback.add(removeMovementRestrictionFeedback(element, this.tool.movementRestrictor));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
protected initializeElementsToMove(root: GModelRoot): void {
|
|
166
|
+
const elementsToMove = this.collectElementsToMove(root);
|
|
167
|
+
elementsToMove.forEach(element => this.elementId2startPos.set(element.id, element.position));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
protected collectElementsToMove(root: GModelRoot): MoveableElement[] {
|
|
171
|
+
const moveableElements = filter(root.index, this.isValidMoveable);
|
|
172
|
+
const topLevelElements = removeDescendants(moveableElements);
|
|
173
|
+
return Array.from(topLevelElements);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
protected getElementsToMove(context: GModelElement): MoveableElement[] {
|
|
177
|
+
return getElements(context.root.index, Array.from(this.elementId2startPos.keys()), this.isValidMoveable);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
protected getElementMoves(target: GModelElement, event: MouseEvent, finished: boolean): MoveAction | undefined {
|
|
181
|
+
const delta = this.positionUpdater.updatePosition(target, event);
|
|
182
|
+
if (!delta) {
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
const elementMoves: ElementMove[] = this.getElementMovesForDelta(target, delta, finished).filter(move =>
|
|
186
|
+
this.filterElementMove(move)
|
|
187
|
+
);
|
|
188
|
+
if (elementMoves.length > 0) {
|
|
189
|
+
// we never want to animate the move action as this interferes with the move feedback
|
|
190
|
+
return MoveAction.create(elementMoves, { animate: false, finished });
|
|
191
|
+
} else {
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
protected filterElementMove(elementMove: ValidatedElementMove): boolean {
|
|
197
|
+
return !!elementMove.fromPosition && !Point.equals(elementMove.fromPosition, elementMove.toPosition);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
protected getElementMovesForDelta(target: GModelElement, delta: Point, finished: boolean): ValidatedElementMove[] {
|
|
201
|
+
return this.getElementsToMove(target).flatMap<ValidatedElementMove>(element => {
|
|
202
|
+
const startPosition = this.elementId2startPos.get(element.id);
|
|
203
|
+
if (!startPosition) {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
const targetPosition = Point.add(element.position, delta);
|
|
207
|
+
const valid = this.tool.movementRestrictor?.validate(element, targetPosition) ?? true;
|
|
208
|
+
return [this.createElementMove(element, targetPosition, valid, finished)];
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
protected createElementMove(element: MoveableElement, toPosition: Point, valid: boolean, finished: boolean): ValidatedElementMove {
|
|
213
|
+
// if we are finished and have an invalid move, we want to move the element back to its start position
|
|
214
|
+
return !valid && finished
|
|
215
|
+
? { elementId: element.id, fromPosition: element.position, toPosition: element.position, valid }
|
|
216
|
+
: { elementId: element.id, fromPosition: element.position, toPosition, valid };
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
protected resetElementPositions(context: GModelElement): MoveAction | undefined {
|
|
220
|
+
const elementMoves: ElementMove[] = this.revertElementMoves(context);
|
|
221
|
+
return MoveAction.create(elementMoves, { animate: false, finished: true });
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
protected revertElementMoves(context?: GModelElement): ElementMove[] {
|
|
225
|
+
const elementMoves: ElementMove[] = [];
|
|
226
|
+
if (context?.root?.index) {
|
|
227
|
+
const movableElements = this.getElementsToMove(context);
|
|
228
|
+
movableElements.forEach(element =>
|
|
229
|
+
elementMoves.push({ elementId: element.id, toPosition: this.elementId2startPos.get(element.id)! })
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
return elementMoves;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
override draggingMouseUp(target: GModelElement, event: MouseEvent): Action[] {
|
|
236
|
+
if (this.positionUpdater.isLastDragPositionUndefined()) {
|
|
237
|
+
return [];
|
|
238
|
+
}
|
|
239
|
+
// only reset the move of invalid elements, the others will be handled by the change bounds tool itself
|
|
240
|
+
const moves = this.getElementMovesForDelta(target, Point.ORIGIN, false);
|
|
241
|
+
moves.filter(move => move.valid).forEach(move => this.elementId2startPos.delete(move.elementId));
|
|
242
|
+
this.dispose();
|
|
243
|
+
return [];
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
override dispose(): void {
|
|
247
|
+
this.pendingMoveInitialized?.cancel();
|
|
248
|
+
this.moveInitializedFeedback.dispose();
|
|
249
|
+
this.moveFeedback.dispose();
|
|
250
|
+
this.positionUpdater.resetPosition();
|
|
251
|
+
this.elementId2startPos.clear();
|
|
252
|
+
super.dispose();
|
|
253
|
+
}
|
|
254
|
+
}
|