@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.
Files changed (174) hide show
  1. package/css/change-bounds.css +15 -0
  2. package/css/glsp-sprotty.css +17 -0
  3. package/lib/base/drag-aware-mouse-listener.d.ts +5 -2
  4. package/lib/base/drag-aware-mouse-listener.d.ts.map +1 -1
  5. package/lib/base/drag-aware-mouse-listener.js +11 -0
  6. package/lib/base/drag-aware-mouse-listener.js.map +1 -1
  7. package/lib/base/feedback/css-feedback.d.ts +4 -0
  8. package/lib/base/feedback/css-feedback.d.ts.map +1 -1
  9. package/lib/base/feedback/css-feedback.js +4 -0
  10. package/lib/base/feedback/css-feedback.js.map +1 -1
  11. package/lib/base/feedback/feeback-emitter.d.ts +67 -0
  12. package/lib/base/feedback/feeback-emitter.d.ts.map +1 -0
  13. package/lib/base/feedback/feeback-emitter.js +109 -0
  14. package/lib/base/feedback/feeback-emitter.js.map +1 -0
  15. package/lib/base/feedback/feedback-action-dispatcher.d.ts +17 -5
  16. package/lib/base/feedback/feedback-action-dispatcher.d.ts.map +1 -1
  17. package/lib/base/feedback/feedback-action-dispatcher.js +23 -3
  18. package/lib/base/feedback/feedback-action-dispatcher.js.map +1 -1
  19. package/lib/base/feedback/index.d.ts +1 -0
  20. package/lib/base/feedback/index.d.ts.map +1 -1
  21. package/lib/base/feedback/index.js +1 -0
  22. package/lib/base/feedback/index.js.map +1 -1
  23. package/lib/base/selection-service.d.ts +3 -2
  24. package/lib/base/selection-service.d.ts.map +1 -1
  25. package/lib/base/selection-service.js.map +1 -1
  26. package/lib/features/accessibility/element-navigation/local-element-navigator.d.ts +3 -3
  27. package/lib/features/accessibility/element-navigation/local-element-navigator.d.ts.map +1 -1
  28. package/lib/features/accessibility/element-navigation/local-element-navigator.js.map +1 -1
  29. package/lib/features/accessibility/move-zoom/move-handler.d.ts +4 -2
  30. package/lib/features/accessibility/move-zoom/move-handler.d.ts.map +1 -1
  31. package/lib/features/accessibility/move-zoom/move-handler.js +10 -4
  32. package/lib/features/accessibility/move-zoom/move-handler.js.map +1 -1
  33. package/lib/features/accessibility/resize-key-tool/resize-key-handler.d.ts +4 -2
  34. package/lib/features/accessibility/resize-key-tool/resize-key-handler.d.ts.map +1 -1
  35. package/lib/features/accessibility/resize-key-tool/resize-key-handler.js +11 -3
  36. package/lib/features/accessibility/resize-key-tool/resize-key-handler.js.map +1 -1
  37. package/lib/features/change-bounds/model.d.ts +8 -8
  38. package/lib/features/change-bounds/model.d.ts.map +1 -1
  39. package/lib/features/change-bounds/model.js +17 -5
  40. package/lib/features/change-bounds/model.js.map +1 -1
  41. package/lib/features/change-bounds/movement-restrictor.d.ts +3 -2
  42. package/lib/features/change-bounds/movement-restrictor.d.ts.map +1 -1
  43. package/lib/features/change-bounds/movement-restrictor.js.map +1 -1
  44. package/lib/features/element-template/mouse-tracking-element-position-listener.d.ts +15 -5
  45. package/lib/features/element-template/mouse-tracking-element-position-listener.d.ts.map +1 -1
  46. package/lib/features/element-template/mouse-tracking-element-position-listener.js +27 -38
  47. package/lib/features/element-template/mouse-tracking-element-position-listener.js.map +1 -1
  48. package/lib/features/helper-lines/helper-line-manager-default.d.ts +4 -2
  49. package/lib/features/helper-lines/helper-line-manager-default.d.ts.map +1 -1
  50. package/lib/features/helper-lines/helper-line-manager-default.js +8 -12
  51. package/lib/features/helper-lines/helper-line-manager-default.js.map +1 -1
  52. package/lib/features/hints/type-hint-provider.d.ts +3 -0
  53. package/lib/features/hints/type-hint-provider.d.ts.map +1 -1
  54. package/lib/features/hints/type-hint-provider.js +10 -1
  55. package/lib/features/hints/type-hint-provider.js.map +1 -1
  56. package/lib/features/select/select-mouse-listener.d.ts +4 -3
  57. package/lib/features/select/select-mouse-listener.d.ts.map +1 -1
  58. package/lib/features/select/select-mouse-listener.js.map +1 -1
  59. package/lib/features/tools/base-tools.d.ts +23 -4
  60. package/lib/features/tools/base-tools.d.ts.map +1 -1
  61. package/lib/features/tools/base-tools.js +11 -6
  62. package/lib/features/tools/base-tools.js.map +1 -1
  63. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts +1 -35
  64. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts.map +1 -1
  65. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js +5 -206
  66. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js.map +1 -1
  67. package/lib/features/tools/change-bounds/change-bounds-tool-module.d.ts +1 -0
  68. package/lib/features/tools/change-bounds/change-bounds-tool-module.d.ts.map +1 -1
  69. package/lib/features/tools/change-bounds/change-bounds-tool-module.js +1 -0
  70. package/lib/features/tools/change-bounds/change-bounds-tool-module.js.map +1 -1
  71. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.d.ts +67 -0
  72. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.d.ts.map +1 -0
  73. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js +227 -0
  74. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js.map +1 -0
  75. package/lib/features/tools/change-bounds/change-bounds-tool.d.ts +34 -24
  76. package/lib/features/tools/change-bounds/change-bounds-tool.d.ts.map +1 -1
  77. package/lib/features/tools/change-bounds/change-bounds-tool.js +172 -180
  78. package/lib/features/tools/change-bounds/change-bounds-tool.js.map +1 -1
  79. package/lib/features/tools/change-bounds/index.d.ts +1 -0
  80. package/lib/features/tools/change-bounds/index.d.ts.map +1 -1
  81. package/lib/features/tools/change-bounds/index.js +1 -0
  82. package/lib/features/tools/change-bounds/index.js.map +1 -1
  83. package/lib/features/tools/change-bounds/view.d.ts +1 -1
  84. package/lib/features/tools/change-bounds/view.d.ts.map +1 -1
  85. package/lib/features/tools/change-bounds/view.js +3 -0
  86. package/lib/features/tools/change-bounds/view.js.map +1 -1
  87. package/lib/features/tools/deletion/delete-tool.d.ts +16 -1
  88. package/lib/features/tools/deletion/delete-tool.d.ts.map +1 -1
  89. package/lib/features/tools/deletion/delete-tool.js +5 -2
  90. package/lib/features/tools/deletion/delete-tool.js.map +1 -1
  91. package/lib/features/tools/edge-creation/dangling-edge-feedback.d.ts +17 -1
  92. package/lib/features/tools/edge-creation/dangling-edge-feedback.d.ts.map +1 -1
  93. package/lib/features/tools/edge-creation/dangling-edge-feedback.js +3 -1
  94. package/lib/features/tools/edge-creation/dangling-edge-feedback.js.map +1 -1
  95. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.d.ts +3 -1
  96. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.d.ts.map +1 -1
  97. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.js +4 -7
  98. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.js.map +1 -1
  99. package/lib/features/tools/edge-creation/edge-creation-tool.d.ts +20 -2
  100. package/lib/features/tools/edge-creation/edge-creation-tool.d.ts.map +1 -1
  101. package/lib/features/tools/edge-creation/edge-creation-tool.js +23 -18
  102. package/lib/features/tools/edge-creation/edge-creation-tool.js.map +1 -1
  103. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts +3 -1
  104. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts.map +1 -1
  105. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js +5 -8
  106. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js.map +1 -1
  107. package/lib/features/tools/edge-edit/edge-edit-tool.d.ts +4 -4
  108. package/lib/features/tools/edge-edit/edge-edit-tool.d.ts.map +1 -1
  109. package/lib/features/tools/edge-edit/edge-edit-tool.js +27 -44
  110. package/lib/features/tools/edge-edit/edge-edit-tool.js.map +1 -1
  111. package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts +3 -2
  112. package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts.map +1 -1
  113. package/lib/features/tools/marquee-selection/marquee-mouse-tool.js +4 -2
  114. package/lib/features/tools/marquee-selection/marquee-mouse-tool.js.map +1 -1
  115. package/lib/features/tools/node-creation/node-creation-tool.d.ts +14 -5
  116. package/lib/features/tools/node-creation/node-creation-tool.d.ts.map +1 -1
  117. package/lib/features/tools/node-creation/node-creation-tool.js +58 -24
  118. package/lib/features/tools/node-creation/node-creation-tool.js.map +1 -1
  119. package/lib/features/validation/marker-navigator.d.ts +7 -6
  120. package/lib/features/validation/marker-navigator.d.ts.map +1 -1
  121. package/lib/features/validation/marker-navigator.js.map +1 -1
  122. package/lib/features/validation/validate.d.ts +2 -5
  123. package/lib/features/validation/validate.d.ts.map +1 -1
  124. package/lib/features/validation/validate.js +4 -16
  125. package/lib/features/validation/validate.js.map +1 -1
  126. package/lib/utils/gmodel-util.d.ts +27 -2
  127. package/lib/utils/gmodel-util.d.ts.map +1 -1
  128. package/lib/utils/gmodel-util.js +30 -1
  129. package/lib/utils/gmodel-util.js.map +1 -1
  130. package/lib/utils/layout-utils.d.ts +8 -7
  131. package/lib/utils/layout-utils.d.ts.map +1 -1
  132. package/lib/utils/layout-utils.js +2 -4
  133. package/lib/utils/layout-utils.js.map +1 -1
  134. package/lib/utils/viewpoint-util.d.ts +4 -4
  135. package/lib/utils/viewpoint-util.d.ts.map +1 -1
  136. package/lib/utils/viewpoint-util.js.map +1 -1
  137. package/package.json +3 -3
  138. package/src/base/drag-aware-mouse-listener.ts +16 -2
  139. package/src/base/feedback/css-feedback.ts +4 -0
  140. package/src/base/feedback/feeback-emitter.ts +112 -0
  141. package/src/base/feedback/feedback-action-dispatcher.ts +41 -6
  142. package/src/base/feedback/index.ts +1 -0
  143. package/src/base/selection-service.spec.ts +5 -0
  144. package/src/base/selection-service.ts +2 -3
  145. package/src/features/accessibility/element-navigation/local-element-navigator.ts +4 -4
  146. package/src/features/accessibility/move-zoom/move-handler.ts +10 -5
  147. package/src/features/accessibility/resize-key-tool/resize-key-handler.ts +11 -7
  148. package/src/features/change-bounds/model.ts +25 -13
  149. package/src/features/change-bounds/movement-restrictor.ts +5 -4
  150. package/src/features/element-template/mouse-tracking-element-position-listener.ts +44 -44
  151. package/src/features/helper-lines/helper-line-manager-default.ts +12 -21
  152. package/src/features/hints/type-hint-provider.spec.ts +4 -1
  153. package/src/features/hints/type-hint-provider.ts +9 -2
  154. package/src/features/select/select-mouse-listener.ts +4 -3
  155. package/src/features/tools/base-tools.ts +15 -8
  156. package/src/features/tools/change-bounds/change-bounds-tool-feedback.ts +6 -232
  157. package/src/features/tools/change-bounds/change-bounds-tool-module.ts +1 -0
  158. package/src/features/tools/change-bounds/change-bounds-tool-move-feedback.ts +254 -0
  159. package/src/features/tools/change-bounds/change-bounds-tool.ts +217 -226
  160. package/src/features/tools/change-bounds/index.ts +1 -0
  161. package/src/features/tools/change-bounds/view.tsx +4 -1
  162. package/src/features/tools/deletion/delete-tool.ts +6 -6
  163. package/src/features/tools/edge-creation/dangling-edge-feedback.ts +7 -4
  164. package/src/features/tools/edge-creation/edge-creation-tool-feedback.ts +9 -9
  165. package/src/features/tools/edge-creation/edge-creation-tool.ts +33 -23
  166. package/src/features/tools/edge-edit/edge-edit-tool-feedback.ts +8 -8
  167. package/src/features/tools/edge-edit/edge-edit-tool.ts +42 -49
  168. package/src/features/tools/marquee-selection/marquee-mouse-tool.ts +7 -6
  169. package/src/features/tools/node-creation/node-creation-tool.ts +69 -25
  170. package/src/features/validation/marker-navigator.ts +6 -8
  171. package/src/features/validation/validate.ts +5 -20
  172. package/src/utils/gmodel-util.ts +44 -1
  173. package/src/utils/layout-utils.ts +9 -20
  174. package/src/utils/viewpoint-util.ts +3 -4
@@ -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
+ }