@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
@@ -1 +1 @@
1
- {"version":3,"file":"viewpoint-util.d.ts","sourceRoot":"","sources":["../../src/utils/viewpoint-util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAElF,OAAO,EACH,MAAM,EACN,WAAW,EACX,SAAS,EACT,aAAa,EACb,aAAa,EACb,UAAU,EACV,KAAK,EACL,QAAQ,EAMX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAG,KAAK,CAExF;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAYrF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAI/E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,WAAW,GAAG,MAAM,CAO7E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,KAAK,CAE7E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,SAAS,CAE7E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa,EAAE,aAAa,EAAE,KAAK,GAAG,KAAK,CAM9G;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,KAAK,GAAG,KAAK,CAG7F;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAOxF"}
1
+ {"version":3,"file":"viewpoint-util.d.ts","sourceRoot":"","sources":["../../src/utils/viewpoint-util.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;kFAckF;AAElF,OAAO,EACH,MAAM,EACN,SAAS,EACT,aAAa,EACb,aAAa,EACb,UAAU,EACV,KAAK,EACL,QAAQ,EAMX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAExD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAG,KAAK,CAExF;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,CAYrF;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAI/E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAOzE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,GAAG,KAAK,CAEzE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,uBAAuB,GAAG,SAAS,CAEzE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,aAAa,EAAE,aAAa,EAAE,KAAK,GAAG,KAAK,CAM9G;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,uBAAuB,EAAE,aAAa,EAAE,KAAK,GAAG,KAAK,CAG7F;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,OAAO,CAOxF"}
@@ -1 +1 @@
1
- {"version":3,"file":"viewpoint-util.js","sourceRoot":"","sources":["../../src/utils/viewpoint-util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viewpoint-util.js","sourceRoot":"","sources":["../../src/utils/viewpoint-util.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eclipse-glsp/client",
3
- "version": "2.2.0-next.329+d53e2e2",
3
+ "version": "2.2.0-next.330+bf4b88a",
4
4
  "description": "A sprotty-based client for GLSP",
5
5
  "keywords": [
6
6
  "eclipse",
@@ -46,7 +46,7 @@
46
46
  "watch": "tsc -w"
47
47
  },
48
48
  "dependencies": {
49
- "@eclipse-glsp/sprotty": "2.2.0-next.329+d53e2e2",
49
+ "@eclipse-glsp/sprotty": "2.2.0-next.330+bf4b88a",
50
50
  "autocompleter": "^9.1.0",
51
51
  "file-saver": "^2.0.5",
52
52
  "lodash": "4.17.21"
@@ -61,5 +61,5 @@
61
61
  "publishConfig": {
62
62
  "access": "public"
63
63
  },
64
- "gitHead": "d53e2e2ab356951621fb85eea3d0a32541ff9b23"
64
+ "gitHead": "bf4b88a15d066b5c7869870afa43e161dc097007"
65
65
  }
@@ -13,7 +13,7 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
- import { Action, MouseListener, GModelElement } from '@eclipse-glsp/sprotty';
16
+ import { Action, Disposable, GModelElement, MouseListener } from '@eclipse-glsp/sprotty';
17
17
 
18
18
  /**
19
19
  * A mouse listener that is aware of prior mouse dragging.
@@ -23,7 +23,7 @@ import { Action, MouseListener, GModelElement } from '@eclipse-glsp/sprotty';
23
23
  * `draggingMouseUp` and/or `nonDraggingMouseUp` to react to only these specific kinds
24
24
  * of mouse up events.
25
25
  */
26
- export class DragAwareMouseListener extends MouseListener {
26
+ export class DragAwareMouseListener extends MouseListener implements Disposable {
27
27
  protected _isMouseDown = false;
28
28
  protected _isMouseDrag = false;
29
29
 
@@ -35,7 +35,16 @@ export class DragAwareMouseListener extends MouseListener {
35
35
  override mouseMove(target: GModelElement, event: MouseEvent): Action[] {
36
36
  if (this._isMouseDown) {
37
37
  this._isMouseDrag = true;
38
+ return this.draggingMouseMove(target, event);
38
39
  }
40
+ return this.nonDraggingMouseMove(target, event);
41
+ }
42
+
43
+ protected draggingMouseMove(target: GModelElement, event: MouseEvent): Action[] {
44
+ return [];
45
+ }
46
+
47
+ protected nonDraggingMouseMove(target: GModelElement, event: MouseEvent): Action[] {
39
48
  return [];
40
49
  }
41
50
 
@@ -64,4 +73,9 @@ export class DragAwareMouseListener extends MouseListener {
64
73
  get isMouseDown(): boolean {
65
74
  return this._isMouseDown;
66
75
  }
76
+
77
+ dispose(): void {
78
+ this._isMouseDrag = false;
79
+ this._isMouseDown = false;
80
+ }
67
81
  }
@@ -84,6 +84,10 @@ export enum CursorCSS {
84
84
  ELEMENT_DELETION = 'element-deletion-mode',
85
85
  RESIZE_NESW = 'resize-nesw-mode',
86
86
  RESIZE_NWSE = 'resize-nwse-mode',
87
+ RESIZE_NW = 'resize-nw-mode',
88
+ RESIZE_NE = 'resize-ne-mode',
89
+ RESIZE_SW = 'resize-sw-mode',
90
+ RESIZE_SE = 'resize-se-mode',
87
91
  MOVE = 'move-mode',
88
92
  MARQUEE = 'marquee-mode'
89
93
  }
@@ -0,0 +1,112 @@
1
+ /********************************************************************************
2
+ * Copyright (c) 2024 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
+
17
+ import { Action, Disposable, arrayOf } from '@eclipse-glsp/sprotty';
18
+ import { IFeedbackActionDispatcher, IFeedbackEmitter, MaybeActions } from './feedback-action-dispatcher';
19
+
20
+ /**
21
+ * A helper object to collect, submit and undo feedback consisting of several actions.
22
+ */
23
+ export class FeedbackEmitter implements IFeedbackEmitter, Disposable {
24
+ protected feedbackActions: (Action | undefined)[] = [];
25
+ protected cleanupActions: MaybeActions[] = [];
26
+ protected deregistration?: Disposable;
27
+
28
+ constructor(protected feedbackDispatcher: IFeedbackActionDispatcher) {}
29
+
30
+ /**
31
+ * Adds an action as part of this emitters feedback. Please note that the action is only applied as feedback
32
+ * once the {@link submit} method is called.
33
+ *
34
+ * @param action feedback action
35
+ * @param cleanupAction action that undoes the feedback action. This is only triggered when {@link revert} is called.
36
+ */
37
+ add(action: Action, cleanupAction?: MaybeActions): this {
38
+ const idx = this.feedbackActions.length;
39
+ this.feedbackActions[idx] = action;
40
+ if (cleanupAction) {
41
+ this.cleanupActions[idx] = cleanupAction;
42
+ }
43
+ return this;
44
+ }
45
+
46
+ /**
47
+ * Removes the action as part of this emitters feedback. If the action cannot be found, this is a no-op.
48
+ * Please note that this also removed the corresponding cleanup action.
49
+ * If the feedback has already been submitted as part of the {@link submit} method, the whole feedback must be de-registered
50
+ * or a new feedback without the given action needs to be registered.
51
+ *
52
+ * @param action feedback action
53
+ */
54
+ remove(action: Action): this {
55
+ const idx = this.feedbackActions.indexOf(action);
56
+ if (idx) {
57
+ delete this.feedbackActions[idx];
58
+ delete this.cleanupActions[idx];
59
+ }
60
+ return this;
61
+ }
62
+
63
+ /**
64
+ * Clears any, not yet registered feedback actions and their corresponding cleanup actions.
65
+ */
66
+ clear(): this {
67
+ this.feedbackActions = [];
68
+ this.cleanupActions = [];
69
+ return this;
70
+ }
71
+
72
+ /**
73
+ * Registers any pending actions as feedback. Any previously submitted feedback becomes invalid.
74
+ */
75
+ submit(): this {
76
+ // with 'arrayOf' we skip undefined entries that are created for non-cleanup actions
77
+ const actions = arrayOf(...this.feedbackActions);
78
+ const cleanupActions = arrayOf(...this.cleanupActions);
79
+ this.deregistration = this.feedbackDispatcher.registerFeedback(this, actions, () => cleanupActions.flatMap(MaybeActions.asArray));
80
+ this.clear();
81
+ return this;
82
+ }
83
+
84
+ /**
85
+ * Removes the registered feedback WITHOUT calling any potential cleanup actions
86
+ * Any pending actions can still be registerd with the {@link submit} method.
87
+ */
88
+ discard(): this {
89
+ this.feedbackDispatcher.deregisterFeedback(this);
90
+ this.deregistration = undefined;
91
+ return this;
92
+ }
93
+
94
+ /**
95
+ * Removes the registered feedback and calls the registered cleanup actions.
96
+ * Any pending actions can still be registerd with the {@link submit} method.
97
+ */
98
+ revert(): this {
99
+ this.deregistration?.dispose();
100
+ this.deregistration = undefined;
101
+ return this;
102
+ }
103
+
104
+ /**
105
+ * Disposes any registered feedback and any pending, not yet registered feedback actions.
106
+ */
107
+ dispose(): this {
108
+ this.revert();
109
+ this.clear();
110
+ return this;
111
+ }
112
+ }
@@ -20,17 +20,34 @@ import {
20
20
  CommandActionHandler,
21
21
  CommandExecutionContext,
22
22
  Disposable,
23
+ GModelElement,
23
24
  IActionDispatcher,
24
25
  ICommand,
25
26
  ILogger,
27
+ MaybeFunction,
26
28
  TYPES,
29
+ call,
30
+ asArray as toArray,
27
31
  toTypeGuard
28
32
  } from '@eclipse-glsp/sprotty';
29
33
  import { inject, injectable } from 'inversify';
30
34
  import { getFeedbackRank } from './feedback-command';
35
+ import { FeedbackEmitter } from './feeback-emitter';
31
36
 
32
37
  export interface IFeedbackEmitter {}
33
38
 
39
+ export const feedbackFeature = Symbol('feedbackFeature');
40
+
41
+ export type MaybeActions = MaybeFunction<Action[] | Action | undefined>;
42
+
43
+ export namespace MaybeActions {
44
+ // eslint-disable-next-line @typescript-eslint/no-shadow
45
+ export function asArray(actions?: MaybeActions): Action[] {
46
+ const cleanup = actions ? call(actions) : [];
47
+ return cleanup ? toArray(cleanup) : [];
48
+ }
49
+ }
50
+
34
51
  /**
35
52
  * Dispatcher for actions that are meant to show visual feedback on
36
53
  * the diagram that is not part of the diagram sent from the server
@@ -52,7 +69,7 @@ export interface IFeedbackActionDispatcher {
52
69
  * @param cleanupActions the actions to be sent out when the feedback is de-registered through the returned Disposable.
53
70
  * @returns A 'Disposable' that de-registers the feedback and cleans up any pending feedback with the given `cleanupActions`.
54
71
  */
55
- registerFeedback(feedbackEmitter: IFeedbackEmitter, feedbackActions: Action[], cleanupActions?: Action[]): Disposable;
72
+ registerFeedback(feedbackEmitter: IFeedbackEmitter, feedbackActions: Action[], cleanupActions?: MaybeActions): Disposable;
56
73
 
57
74
  /**
58
75
  * Deregisters a `feedbackEmitter` from this dispatcher and thereafter
@@ -64,7 +81,7 @@ export interface IFeedbackActionDispatcher {
64
81
  * to reset the normal state of the diagram without the feedback (e.g., reset a
65
82
  * CSS class that was set by a feedbackEmitter).
66
83
  */
67
- deregisterFeedback(feedbackEmitter: IFeedbackEmitter, cleanupActions?: Action[]): void;
84
+ deregisterFeedback(feedbackEmitter: IFeedbackEmitter, cleanupActions?: MaybeActions): void;
68
85
 
69
86
  /**
70
87
  * Retrieve all `actions` sent out by currently registered `feedbackEmitter`.
@@ -80,6 +97,12 @@ export interface IFeedbackActionDispatcher {
80
97
  * Applies all current feedback commands to the given command execution context.
81
98
  */
82
99
  applyFeedbackCommands(context: CommandExecutionContext): Promise<void>;
100
+
101
+ /**
102
+ * Creates a new feedback emitter helper object. While anything can serve as a feedback emitter,
103
+ * this method ensures that the emitter is stable and does not change between model updates.
104
+ */
105
+ createEmitter(): FeedbackEmitter;
83
106
  }
84
107
 
85
108
  @injectable()
@@ -91,7 +114,14 @@ export class FeedbackActionDispatcher implements IFeedbackActionDispatcher {
91
114
 
92
115
  @inject(ActionHandlerRegistry) protected actionHandlerRegistry: ActionHandlerRegistry;
93
116
 
94
- registerFeedback(feedbackEmitter: IFeedbackEmitter, feedbackActions: Action[], cleanupActions?: Action[] | undefined): Disposable {
117
+ registerFeedback(feedbackEmitter: IFeedbackEmitter, feedbackActions: Action[], cleanupActions?: MaybeActions): Disposable {
118
+ if (feedbackEmitter instanceof GModelElement) {
119
+ this.logger.log(
120
+ this,
121
+ // eslint-disable-next-line max-len
122
+ 'GModelElements as feedback emitters are discouraged, as they usually change between model updates and are considered unstable.'
123
+ );
124
+ }
95
125
  if (feedbackActions.length > 0) {
96
126
  this.registeredFeedback.set(feedbackEmitter, feedbackActions);
97
127
  this.dispatchFeedback(feedbackActions, feedbackEmitter);
@@ -99,10 +129,11 @@ export class FeedbackActionDispatcher implements IFeedbackActionDispatcher {
99
129
  return Disposable.create(() => this.deregisterFeedback(feedbackEmitter, cleanupActions));
100
130
  }
101
131
 
102
- deregisterFeedback(feedbackEmitter: IFeedbackEmitter, cleanupActions?: Action[] | undefined): void {
132
+ deregisterFeedback(feedbackEmitter: IFeedbackEmitter, cleanupActions?: MaybeActions): void {
103
133
  this.registeredFeedback.delete(feedbackEmitter);
104
- if (cleanupActions && cleanupActions.length > 0) {
105
- this.dispatchFeedback(cleanupActions, feedbackEmitter);
134
+ const actions = MaybeActions.asArray(cleanupActions);
135
+ if (actions.length > 0) {
136
+ this.dispatchFeedback(actions, feedbackEmitter);
106
137
  }
107
138
  }
108
139
 
@@ -145,6 +176,10 @@ export class FeedbackActionDispatcher implements IFeedbackActionDispatcher {
145
176
  );
146
177
  }
147
178
 
179
+ createEmitter(): FeedbackEmitter {
180
+ return new FeedbackEmitter(this);
181
+ }
182
+
148
183
  protected async dispatchFeedback(actions: Action[], feedbackEmitter: IFeedbackEmitter): Promise<void> {
149
184
  try {
150
185
  const actionDispatcher = await this.actionDispatcher();
@@ -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
  export * from './css-feedback';
17
+ export * from './feeback-emitter';
17
18
  export * from './feedback-action-dispatcher';
18
19
  export * from './feedback-command';
19
20
  export * from './set-model-command';
@@ -18,6 +18,7 @@ import { AssertionError, expect } from 'chai';
18
18
  import { Container, injectable } from 'inversify';
19
19
  import * as sinon from 'sinon';
20
20
  import { defaultModule } from './default.module';
21
+ import { FeedbackEmitter } from './feedback/feeback-emitter';
21
22
  import { IFeedbackActionDispatcher, IFeedbackEmitter } from './feedback/feedback-action-dispatcher';
22
23
  import { ISelectionListener, SelectFeedbackAction, SelectionService } from './selection-service';
23
24
 
@@ -49,6 +50,10 @@ class MockFeedbackActionDispatcher implements IFeedbackActionDispatcher {
49
50
  return [];
50
51
  }
51
52
 
53
+ createEmitter(): FeedbackEmitter {
54
+ return new FeedbackEmitter(this);
55
+ }
56
+
52
57
  async applyFeedbackCommands(context: CommandExecutionContext): Promise<void> {}
53
58
  }
54
59
 
@@ -28,7 +28,6 @@ import {
28
28
  LazyInjector,
29
29
  SelectAction,
30
30
  SelectAllAction,
31
- Selectable,
32
31
  SprottySelectAllCommand,
33
32
  SprottySelectCommand,
34
33
  TYPES,
@@ -37,7 +36,7 @@ import {
37
36
  pluck
38
37
  } from '@eclipse-glsp/sprotty';
39
38
  import { inject, injectable, postConstruct, preDestroy } from 'inversify';
40
- import { getElements, getMatchingElements } from '../utils/gmodel-util';
39
+ import { SelectableElement, getElements, getMatchingElements } from '../utils/gmodel-util';
41
40
  import { IGModelRootListener } from './editor-context-service';
42
41
  import { IFeedbackActionDispatcher } from './feedback/feedback-action-dispatcher';
43
42
  import { IDiagramStartup } from './model';
@@ -164,7 +163,7 @@ export class SelectionService implements IGModelRootListener, Disposable, IDiagr
164
163
  return this.root;
165
164
  }
166
165
 
167
- getSelectedElements(): Readonly<GModelElement & Selectable>[] {
166
+ getSelectedElements(): Readonly<SelectableElement>[] {
168
167
  return !this.root ? [] : getElements(this.root.index, Array.from(this.selectedElementIDs), isSelectable);
169
168
  }
170
169
 
@@ -13,13 +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 { BoundsAware, EdgeRouterRegistry, GConnectableElement, GModelElement, GModelRoot, TYPES } from '@eclipse-glsp/sprotty';
16
+ import { EdgeRouterRegistry, GConnectableElement, GModelElement, GModelRoot, TYPES } from '@eclipse-glsp/sprotty';
17
17
  import { inject, injectable, optional } from 'inversify';
18
18
  import { GLSPActionDispatcher } from '../../../base/action-dispatcher';
19
19
  import { applyCssClasses, deleteCssClasses } from '../../../base/feedback/css-feedback';
20
- import { SelectableBoundsAware } from '../../../utils/gmodel-util';
21
- import { ElementNavigator } from './element-navigator';
22
20
  import { GEdge } from '../../../model';
21
+ import { BoundsAwareModelElement, SelectableBoundsAware } from '../../../utils/gmodel-util';
22
+ import { ElementNavigator } from './element-navigator';
23
23
 
24
24
  @injectable()
25
25
  export class LocalElementNavigator implements ElementNavigator {
@@ -91,7 +91,7 @@ export class LocalElementNavigator implements ElementNavigator {
91
91
 
92
92
  protected getIterables(
93
93
  current: SelectableBoundsAware,
94
- previousCurrent?: GModelElement & BoundsAware,
94
+ previousCurrent?: BoundsAwareModelElement,
95
95
  predicate: (element: GModelElement) => boolean = () => true
96
96
  ): GModelElement[] {
97
97
  const elements: GModelElement[] = [];
@@ -17,7 +17,6 @@
17
17
  import {
18
18
  Action,
19
19
  ChangeBoundsOperation,
20
- DisposableCollection,
21
20
  ElementAndBounds,
22
21
  ElementMove,
23
22
  GModelRoot,
@@ -34,8 +33,9 @@ import {
34
33
  isBoundsAware,
35
34
  isViewport
36
35
  } from '@eclipse-glsp/sprotty';
37
- import { inject, injectable, optional } from 'inversify';
36
+ import { inject, injectable, optional, postConstruct } from 'inversify';
38
37
  import { DebouncedFunc, debounce } from 'lodash';
38
+ import { FeedbackEmitter } from '../../../base';
39
39
  import { EditorContextService } from '../../../base/editor-context-service';
40
40
  import { IFeedbackActionDispatcher } from '../../../base/feedback/feedback-action-dispatcher';
41
41
  import { SelectableBoundsAware, getElements, isSelectableAndBoundsAware } from '../../../utils/gmodel-util';
@@ -164,7 +164,12 @@ export class MoveElementHandler implements IActionHandler {
164
164
  readonly movementRestrictor?: IMovementRestrictor;
165
165
 
166
166
  protected debouncedChangeBounds?: DebouncedFunc<() => void>;
167
- protected disposableFeedback = new DisposableCollection();
167
+ protected moveFeedback: FeedbackEmitter;
168
+
169
+ @postConstruct()
170
+ protected init(): void {
171
+ this.moveFeedback = this.feedbackDispatcher.createEmitter();
172
+ }
168
173
 
169
174
  handle(action: Action): void | Action | ICommand {
170
175
  if (MoveElementAction.is(action)) {
@@ -199,7 +204,7 @@ export class MoveElementHandler implements IActionHandler {
199
204
 
200
205
  this.dispatcher.dispatchAll(viewportActions);
201
206
  const moveAction = MoveAction.create(elementMoves, { animate: false });
202
- this.disposableFeedback.push(this.feedbackDispatcher.registerFeedback(this, [moveAction]));
207
+ this.moveFeedback.add(moveAction).submit();
203
208
 
204
209
  this.scheduleChangeBounds(this.toElementAndBounds(elementMoves));
205
210
  }
@@ -219,7 +224,7 @@ export class MoveElementHandler implements IActionHandler {
219
224
  protected scheduleChangeBounds(elementAndBounds: ElementAndBounds[]): void {
220
225
  this.debouncedChangeBounds?.cancel();
221
226
  this.debouncedChangeBounds = debounce(() => {
222
- this.disposableFeedback.dispose();
227
+ this.moveFeedback.dispose();
223
228
  this.dispatcher.dispatchAll([ChangeBoundsOperation.create(elementAndBounds)]);
224
229
  this.debouncedChangeBounds = undefined;
225
230
  }, 300);
@@ -18,7 +18,6 @@ import {
18
18
  Action,
19
19
  ChangeBoundsOperation,
20
20
  Dimension,
21
- DisposableCollection,
22
21
  ElementAndBounds,
23
22
  GModelElement,
24
23
  GParentElement,
@@ -30,13 +29,13 @@ import {
30
29
  SetBoundsAction,
31
30
  TYPES
32
31
  } from '@eclipse-glsp/sprotty';
33
- import { inject, injectable, optional } from 'inversify';
32
+ import { inject, injectable, optional, postConstruct } from 'inversify';
34
33
  import { DebouncedFunc, debounce } from 'lodash';
34
+ import { FeedbackEmitter } from '../../../base';
35
35
  import { EditorContextService } from '../../../base/editor-context-service';
36
36
  import { IFeedbackActionDispatcher } from '../../../base/feedback/feedback-action-dispatcher';
37
- import { SelectableBoundsAware, getElements, isSelectableAndBoundsAware, toElementAndBounds } from '../../../utils/gmodel-util';
37
+ import { Resizable, SelectableBoundsAware, getElements, isSelectableAndBoundsAware, toElementAndBounds } from '../../../utils/gmodel-util';
38
38
  import { isValidMove, isValidSize, minHeight, minWidth } from '../../../utils/layout-utils';
39
- import { Resizable } from '../../change-bounds/model';
40
39
  import { GridSnapper } from '../../change-bounds/snap';
41
40
 
42
41
  export enum ResizeType {
@@ -79,7 +78,7 @@ export class ResizeElementHandler implements IActionHandler {
79
78
  protected feedbackDispatcher: IFeedbackActionDispatcher;
80
79
 
81
80
  protected debouncedChangeBounds?: DebouncedFunc<() => void>;
82
- protected disposableFeedback = new DisposableCollection();
81
+ protected resizeFeedback: FeedbackEmitter;
83
82
 
84
83
  // Default x resize used if GridSnapper is not provided
85
84
  static readonly defaultResizeX = 20;
@@ -96,6 +95,11 @@ export class ResizeElementHandler implements IActionHandler {
96
95
  }
97
96
  }
98
97
 
98
+ @postConstruct()
99
+ protected init(): void {
100
+ this.resizeFeedback = this.feedbackDispatcher.createEmitter();
101
+ }
102
+
99
103
  handle(action: Action): void | Action | ICommand {
100
104
  if (ResizeElementAction.is(action)) {
101
105
  this.handleResizeElement(action);
@@ -106,11 +110,11 @@ export class ResizeElementHandler implements IActionHandler {
106
110
  const elements = getElements(this.editorContextService.modelRoot.index, action.elementIds, isSelectableAndBoundsAware);
107
111
  const elementAndBounds = this.computeElementAndBounds(elements, action);
108
112
 
109
- this.disposableFeedback.push(this.feedbackDispatcher.registerFeedback(this, [SetBoundsAction.create(elementAndBounds)]));
113
+ this.resizeFeedback.add(SetBoundsAction.create(elementAndBounds)).submit();
110
114
 
111
115
  this.debouncedChangeBounds?.cancel();
112
116
  this.debouncedChangeBounds = debounce(() => {
113
- this.disposableFeedback.dispose();
117
+ this.resizeFeedback.dispose();
114
118
  this.dispatcher.dispatchAll([ChangeBoundsOperation.create(elementAndBounds)]);
115
119
  this.debouncedChangeBounds = undefined;
116
120
  }, 300);
@@ -14,24 +14,20 @@
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
16
  import {
17
- BoundsAware,
18
17
  GChildElement,
19
18
  GModelElement,
20
19
  GParentElement,
21
20
  Hoverable,
22
- Locateable,
23
- Selectable,
24
21
  hoverFeedbackFeature,
25
22
  isBoundsAware,
26
23
  isMoveable,
27
24
  isSelectable
28
25
  } from '@eclipse-glsp/sprotty';
26
+ import { BoundsAwareModelElement, MoveableElement, ResizableModelElement } from '../../utils';
29
27
 
30
28
  export const resizeFeature = Symbol('resizeFeature');
31
29
 
32
- export interface Resizable extends BoundsAware, Selectable {}
33
-
34
- export function isResizable(element: GModelElement): element is GParentElement & Resizable {
30
+ export function isResizable(element: GModelElement): element is ResizableModelElement {
35
31
  return isBoundsAware(element) && isSelectable(element) && element instanceof GParentElement && element.hasFeature(resizeFeature);
36
32
  }
37
33
 
@@ -43,15 +39,17 @@ export enum ResizeHandleLocation {
43
39
  BottomRight = 'bottom-right'
44
40
  }
45
41
 
46
- export function isBoundsAwareMoveable(element: GModelElement): element is GModelElement & Locateable & BoundsAware {
42
+ export function isBoundsAwareMoveable(element: GModelElement): element is BoundsAwareModelElement & MoveableElement {
47
43
  return isMoveable(element) && isBoundsAware(element);
48
44
  }
49
45
 
50
46
  export class SResizeHandle extends GChildElement implements Hoverable {
51
47
  static readonly TYPE = 'resize-handle';
52
48
 
49
+ override readonly parent: ResizableModelElement;
50
+
53
51
  constructor(
54
- readonly location?: ResizeHandleLocation,
52
+ readonly location: ResizeHandleLocation,
55
53
  override readonly type: string = SResizeHandle.TYPE,
56
54
  readonly hoverFeedback: boolean = false
57
55
  ) {
@@ -87,11 +85,25 @@ export class SResizeHandle extends GChildElement implements Hoverable {
87
85
  }
88
86
  }
89
87
 
90
- export function addResizeHandles(element: GParentElement): void {
91
- element.add(new SResizeHandle(ResizeHandleLocation.TopLeft));
92
- element.add(new SResizeHandle(ResizeHandleLocation.TopRight));
93
- element.add(new SResizeHandle(ResizeHandleLocation.BottomLeft));
94
- element.add(new SResizeHandle(ResizeHandleLocation.BottomRight));
88
+ export function addResizeHandles(
89
+ element: ResizableModelElement,
90
+ locations: ResizeHandleLocation[] = [
91
+ ResizeHandleLocation.TopLeft,
92
+ ResizeHandleLocation.TopRight,
93
+ ResizeHandleLocation.BottomLeft,
94
+ ResizeHandleLocation.BottomRight
95
+ ]
96
+ ): void {
97
+ for (const location of Object.values(ResizeHandleLocation)) {
98
+ const existing = element.children.find(child => child instanceof SResizeHandle && child.location === location);
99
+ if (locations.includes(location) && !existing) {
100
+ // add missing handle
101
+ element.add(new SResizeHandle(location));
102
+ } else if (!locations.includes(location) && existing) {
103
+ // remove existing handle
104
+ element.remove(existing);
105
+ }
106
+ }
95
107
  }
96
108
 
97
109
  export function removeResizeHandles(element: GParentElement): void {
@@ -13,9 +13,10 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
- import { Bounds, BoundsAware, GModelElement, GNode, GParentElement, Point } from '@eclipse-glsp/sprotty';
16
+ import { Bounds, GModelElement, GNode, GParentElement, Point } from '@eclipse-glsp/sprotty';
17
17
  import { injectable } from 'inversify';
18
18
  import { ModifyCSSFeedbackAction } from '../../base/feedback/css-feedback';
19
+ import { BoundsAwareModelElement } from '../../utils';
19
20
  import { toAbsoluteBounds } from '../../utils/viewpoint-util';
20
21
  import { SResizeHandle, isBoundsAwareMoveable } from './model';
21
22
 
@@ -51,7 +52,7 @@ export class NoOverlapMovementRestrictor implements IMovementRestrictor {
51
52
  return false;
52
53
  }
53
54
  // Create ghost element at the newLocation
54
- const ghostElement = Object.create(element) as GModelElement & BoundsAware;
55
+ const ghostElement = Object.create(element) as BoundsAwareModelElement;
55
56
  ghostElement.bounds = {
56
57
  x: newLocation.x,
57
58
  y: newLocation.y,
@@ -64,11 +65,11 @@ export class NoOverlapMovementRestrictor implements IMovementRestrictor {
64
65
  element.root.index
65
66
  .all()
66
67
  .filter(e => e.id !== ghostElement.id && e !== ghostElement.root && e instanceof GNode)
67
- .map(e => e as GModelElement & BoundsAware)
68
+ .map(e => e as BoundsAwareModelElement)
68
69
  ).some(e => this.areOverlapping(e, ghostElement));
69
70
  }
70
71
 
71
- protected areOverlapping(element1: GModelElement & BoundsAware, element2: GModelElement & BoundsAware): boolean {
72
+ protected areOverlapping(element1: BoundsAwareModelElement, element2: BoundsAwareModelElement): boolean {
72
73
  return Bounds.overlap(toAbsoluteBounds(element1), toAbsoluteBounds(element2));
73
74
  }
74
75
  }