@eclipse-glsp/client 2.2.0-next.328 → 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 (400) hide show
  1. package/css/change-bounds.css +15 -0
  2. package/css/glsp-sprotty.css +17 -0
  3. package/lib/base/action-dispatcher.js.map +1 -1
  4. package/lib/base/action-handler-registry.js.map +1 -1
  5. package/lib/base/args-feature.js.map +1 -1
  6. package/lib/base/auto-complete/auto-complete-widget.js.map +1 -1
  7. package/lib/base/auto-complete/validation-decorator.js.map +1 -1
  8. package/lib/base/command-stack.js.map +1 -1
  9. package/lib/base/drag-aware-mouse-listener.d.ts +5 -2
  10. package/lib/base/drag-aware-mouse-listener.d.ts.map +1 -1
  11. package/lib/base/drag-aware-mouse-listener.js +11 -0
  12. package/lib/base/drag-aware-mouse-listener.js.map +1 -1
  13. package/lib/base/editor-context-service.js.map +1 -1
  14. package/lib/base/feedback/css-feedback.d.ts +4 -0
  15. package/lib/base/feedback/css-feedback.d.ts.map +1 -1
  16. package/lib/base/feedback/css-feedback.js +4 -0
  17. package/lib/base/feedback/css-feedback.js.map +1 -1
  18. package/lib/base/feedback/feeback-emitter.d.ts +67 -0
  19. package/lib/base/feedback/feeback-emitter.d.ts.map +1 -0
  20. package/lib/base/feedback/feeback-emitter.js +109 -0
  21. package/lib/base/feedback/feeback-emitter.js.map +1 -0
  22. package/lib/base/feedback/feedback-action-dispatcher.d.ts +17 -5
  23. package/lib/base/feedback/feedback-action-dispatcher.d.ts.map +1 -1
  24. package/lib/base/feedback/feedback-action-dispatcher.js +23 -3
  25. package/lib/base/feedback/feedback-action-dispatcher.js.map +1 -1
  26. package/lib/base/feedback/index.d.ts +1 -0
  27. package/lib/base/feedback/index.d.ts.map +1 -1
  28. package/lib/base/feedback/index.js +1 -0
  29. package/lib/base/feedback/index.js.map +1 -1
  30. package/lib/base/focus/focus-tracker.js.map +1 -1
  31. package/lib/base/model/diagram-loader.js.map +1 -1
  32. package/lib/base/model/glsp-model-source.js.map +1 -1
  33. package/lib/base/model/model-initialization-constraint.js.map +1 -1
  34. package/lib/base/model/model-registry.js.map +1 -1
  35. package/lib/base/selection-clearing-mouse-listener.js.map +1 -1
  36. package/lib/base/selection-service.d.ts +3 -2
  37. package/lib/base/selection-service.d.ts.map +1 -1
  38. package/lib/base/selection-service.js.map +1 -1
  39. package/lib/base/tool-manager/index.d.ts +2 -2
  40. package/lib/base/tool-manager/index.d.ts.map +1 -1
  41. package/lib/base/tool-manager/index.js +2 -2
  42. package/lib/base/tool-manager/index.js.map +1 -1
  43. package/lib/base/tool-manager/tool-manager.js.map +1 -1
  44. package/lib/base/view/mouse-tool.js.map +1 -1
  45. package/lib/base/view/view-registry.js.map +1 -1
  46. package/lib/default-modules.d.ts +1 -1
  47. package/lib/default-modules.js +1 -1
  48. package/lib/default-modules.js.map +1 -1
  49. package/lib/features/accessibility/edge-autocomplete/edge-autocomplete-palette.js.map +1 -1
  50. package/lib/features/accessibility/edge-autocomplete/edge-autocomplete-tool.js.map +1 -1
  51. package/lib/features/accessibility/element-navigation/diagram-navigation-tool.js.map +1 -1
  52. package/lib/features/accessibility/element-navigation/left-right-top-bottom-navigator.js.map +1 -1
  53. package/lib/features/accessibility/element-navigation/local-element-navigator.d.ts +3 -3
  54. package/lib/features/accessibility/element-navigation/local-element-navigator.d.ts.map +1 -1
  55. package/lib/features/accessibility/element-navigation/local-element-navigator.js.map +1 -1
  56. package/lib/features/accessibility/element-navigation/position-navigator.js.map +1 -1
  57. package/lib/features/accessibility/focus-tracker/focus-tracker-tool.js.map +1 -1
  58. package/lib/features/accessibility/global-keylistener-tool.js.map +1 -1
  59. package/lib/features/accessibility/key-shortcut/accessible-key-shortcut-tool.js.map +1 -1
  60. package/lib/features/accessibility/key-shortcut/accessible-key-shortcut.js.map +1 -1
  61. package/lib/features/accessibility/key-shortcut/index.d.ts +2 -2
  62. package/lib/features/accessibility/key-shortcut/index.d.ts.map +1 -1
  63. package/lib/features/accessibility/key-shortcut/index.js +2 -2
  64. package/lib/features/accessibility/key-shortcut/index.js.map +1 -1
  65. package/lib/features/accessibility/keyboard-grid/index.d.ts +2 -2
  66. package/lib/features/accessibility/keyboard-grid/index.d.ts.map +1 -1
  67. package/lib/features/accessibility/keyboard-grid/index.js +2 -2
  68. package/lib/features/accessibility/keyboard-grid/index.js.map +1 -1
  69. package/lib/features/accessibility/keyboard-grid/keyboard-grid.js.map +1 -1
  70. package/lib/features/accessibility/keyboard-grid/keyboard-node-grid.js.map +1 -1
  71. package/lib/features/accessibility/keyboard-pointer/index.d.ts +2 -2
  72. package/lib/features/accessibility/keyboard-pointer/index.d.ts.map +1 -1
  73. package/lib/features/accessibility/keyboard-pointer/index.js +2 -2
  74. package/lib/features/accessibility/keyboard-pointer/index.js.map +1 -1
  75. package/lib/features/accessibility/keyboard-pointer/keyboard-pointer-listener.d.ts +1 -1
  76. package/lib/features/accessibility/keyboard-pointer/keyboard-pointer-listener.d.ts.map +1 -1
  77. package/lib/features/accessibility/keyboard-pointer/keyboard-pointer-listener.js +1 -1
  78. package/lib/features/accessibility/keyboard-pointer/keyboard-pointer-listener.js.map +1 -1
  79. package/lib/features/accessibility/keyboard-pointer/keyboard-pointer.js.map +1 -1
  80. package/lib/features/accessibility/keyboard-tool-palette/index.d.ts +2 -2
  81. package/lib/features/accessibility/keyboard-tool-palette/index.d.ts.map +1 -1
  82. package/lib/features/accessibility/keyboard-tool-palette/index.js +2 -2
  83. package/lib/features/accessibility/keyboard-tool-palette/index.js.map +1 -1
  84. package/lib/features/accessibility/keyboard-tool-palette/keyboard-tool-palette.js.map +1 -1
  85. package/lib/features/accessibility/move-zoom/move-handler.d.ts +4 -2
  86. package/lib/features/accessibility/move-zoom/move-handler.d.ts.map +1 -1
  87. package/lib/features/accessibility/move-zoom/move-handler.js +10 -4
  88. package/lib/features/accessibility/move-zoom/move-handler.js.map +1 -1
  89. package/lib/features/accessibility/move-zoom/zoom-handler.js.map +1 -1
  90. package/lib/features/accessibility/resize-key-tool/resize-key-handler.d.ts +4 -2
  91. package/lib/features/accessibility/resize-key-tool/resize-key-handler.d.ts.map +1 -1
  92. package/lib/features/accessibility/resize-key-tool/resize-key-handler.js +11 -3
  93. package/lib/features/accessibility/resize-key-tool/resize-key-handler.js.map +1 -1
  94. package/lib/features/accessibility/resize-key-tool/resize-key-tool.js.map +1 -1
  95. package/lib/features/accessibility/search/index.d.ts +2 -2
  96. package/lib/features/accessibility/search/index.d.ts.map +1 -1
  97. package/lib/features/accessibility/search/index.js +2 -2
  98. package/lib/features/accessibility/search/index.js.map +1 -1
  99. package/lib/features/accessibility/search/search-palette.js.map +1 -1
  100. package/lib/features/accessibility/search/search-tool.js.map +1 -1
  101. package/lib/features/accessibility/toast/toast-tool.js.map +1 -1
  102. package/lib/features/accessibility/view-key-tools/deselect-key-tool.js.map +1 -1
  103. package/lib/features/accessibility/view-key-tools/movement-key-tool.js.map +1 -1
  104. package/lib/features/accessibility/view-key-tools/zoom-key-tool.js.map +1 -1
  105. package/lib/features/bounds/freeform-layout.js.map +1 -1
  106. package/lib/features/bounds/glsp-hidden-bounds-updater.js.map +1 -1
  107. package/lib/features/bounds/hbox-layout.js.map +1 -1
  108. package/lib/features/bounds/layouter.js.map +1 -1
  109. package/lib/features/bounds/local-bounds.js.map +1 -1
  110. package/lib/features/bounds/set-bounds-feedback-command.js.map +1 -1
  111. package/lib/features/bounds/vbox-layout.js.map +1 -1
  112. package/lib/features/change-bounds/model.d.ts +8 -8
  113. package/lib/features/change-bounds/model.d.ts.map +1 -1
  114. package/lib/features/change-bounds/model.js +17 -5
  115. package/lib/features/change-bounds/model.js.map +1 -1
  116. package/lib/features/change-bounds/movement-restrictor.d.ts +3 -2
  117. package/lib/features/change-bounds/movement-restrictor.d.ts.map +1 -1
  118. package/lib/features/change-bounds/movement-restrictor.js.map +1 -1
  119. package/lib/features/change-bounds/point-position-updater.js.map +1 -1
  120. package/lib/features/change-bounds/position-snapper.js.map +1 -1
  121. package/lib/features/command-palette/command-palette-module.d.ts +1 -1
  122. package/lib/features/command-palette/command-palette-module.js +1 -1
  123. package/lib/features/command-palette/command-palette.js.map +1 -1
  124. package/lib/features/command-palette/index.d.ts +1 -1
  125. package/lib/features/command-palette/index.js +1 -1
  126. package/lib/features/command-palette/server-command-palette-provider.js.map +1 -1
  127. package/lib/features/context-menu/context-menu-module.js.map +1 -1
  128. package/lib/features/context-menu/glsp-context-menu-mouse-listener.js.map +1 -1
  129. package/lib/features/context-menu/server-context-menu-provider.js.map +1 -1
  130. package/lib/features/copy-paste/copy-paste-context-menu.js.map +1 -1
  131. package/lib/features/copy-paste/copy-paste-handler.js.map +1 -1
  132. package/lib/features/copy-paste/copy-paste-standalone.js.map +1 -1
  133. package/lib/features/decoration/decoration-placer.js.map +1 -1
  134. package/lib/features/element-template/add-template-element.js.map +1 -1
  135. package/lib/features/element-template/mouse-tracking-element-position-listener.d.ts +15 -5
  136. package/lib/features/element-template/mouse-tracking-element-position-listener.d.ts.map +1 -1
  137. package/lib/features/element-template/mouse-tracking-element-position-listener.js +27 -38
  138. package/lib/features/element-template/mouse-tracking-element-position-listener.js.map +1 -1
  139. package/lib/features/element-template/remove-template-element.js.map +1 -1
  140. package/lib/features/export/glsp-svg-exporter.js.map +1 -1
  141. package/lib/features/helper-lines/helper-line-feedback.js.map +1 -1
  142. package/lib/features/helper-lines/helper-line-manager-default.d.ts +4 -2
  143. package/lib/features/helper-lines/helper-line-manager-default.d.ts.map +1 -1
  144. package/lib/features/helper-lines/helper-line-manager-default.js +8 -12
  145. package/lib/features/helper-lines/helper-line-manager-default.js.map +1 -1
  146. package/lib/features/helper-lines/index.d.ts +2 -2
  147. package/lib/features/helper-lines/index.d.ts.map +1 -1
  148. package/lib/features/helper-lines/index.js +2 -2
  149. package/lib/features/helper-lines/index.js.map +1 -1
  150. package/lib/features/helper-lines/model.js.map +1 -1
  151. package/lib/features/helper-lines/view.js.map +1 -1
  152. package/lib/features/hints/type-hint-provider.d.ts +3 -0
  153. package/lib/features/hints/type-hint-provider.d.ts.map +1 -1
  154. package/lib/features/hints/type-hint-provider.js +10 -1
  155. package/lib/features/hints/type-hint-provider.js.map +1 -1
  156. package/lib/features/hover/hover.js.map +1 -1
  157. package/lib/features/hover/index.d.ts +2 -2
  158. package/lib/features/hover/index.d.ts.map +1 -1
  159. package/lib/features/hover/index.js +2 -2
  160. package/lib/features/hover/index.js.map +1 -1
  161. package/lib/features/index.d.ts +2 -1
  162. package/lib/features/index.d.ts.map +1 -1
  163. package/lib/features/index.js +2 -1
  164. package/lib/features/index.js.map +1 -1
  165. package/lib/features/label-edit/edit-label-validator.js.map +1 -1
  166. package/lib/features/label-edit-ui/label-edit-ui.js.map +1 -1
  167. package/lib/features/layout/layout-elements-action.js.map +1 -1
  168. package/lib/features/navigation/navigation-action-handler.js.map +1 -1
  169. package/lib/features/navigation/navigation-target-resolver.js.map +1 -1
  170. package/lib/features/reconnect/model.js.map +1 -1
  171. package/lib/features/routing/glsp-manhattan-edge-router.js.map +1 -1
  172. package/lib/features/save/save-keylistener.js.map +1 -1
  173. package/lib/features/select/select-mouse-listener.d.ts +4 -3
  174. package/lib/features/select/select-mouse-listener.d.ts.map +1 -1
  175. package/lib/features/select/select-mouse-listener.js.map +1 -1
  176. package/lib/features/source-model-watcher/source-model-changed-action-handler.js.map +1 -1
  177. package/lib/features/status/status-overlay.js.map +1 -1
  178. package/lib/features/svg-metadata/metadata-placer.js.map +1 -1
  179. package/lib/features/tool-palette/index.d.ts +2 -2
  180. package/lib/features/tool-palette/index.d.ts.map +1 -1
  181. package/lib/features/tool-palette/index.js +2 -2
  182. package/lib/features/tool-palette/index.js.map +1 -1
  183. package/lib/features/tool-palette/tool-palette.js.map +1 -1
  184. package/lib/features/tools/base-tools.d.ts +23 -4
  185. package/lib/features/tools/base-tools.d.ts.map +1 -1
  186. package/lib/features/tools/base-tools.js +11 -6
  187. package/lib/features/tools/base-tools.js.map +1 -1
  188. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts +1 -35
  189. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts.map +1 -1
  190. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js +5 -206
  191. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js.map +1 -1
  192. package/lib/features/tools/change-bounds/change-bounds-tool-module.d.ts +1 -0
  193. package/lib/features/tools/change-bounds/change-bounds-tool-module.d.ts.map +1 -1
  194. package/lib/features/tools/change-bounds/change-bounds-tool-module.js +1 -0
  195. package/lib/features/tools/change-bounds/change-bounds-tool-module.js.map +1 -1
  196. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.d.ts +67 -0
  197. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.d.ts.map +1 -0
  198. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js +227 -0
  199. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js.map +1 -0
  200. package/lib/features/tools/change-bounds/change-bounds-tool.d.ts +34 -24
  201. package/lib/features/tools/change-bounds/change-bounds-tool.d.ts.map +1 -1
  202. package/lib/features/tools/change-bounds/change-bounds-tool.js +172 -180
  203. package/lib/features/tools/change-bounds/change-bounds-tool.js.map +1 -1
  204. package/lib/features/tools/change-bounds/index.d.ts +3 -2
  205. package/lib/features/tools/change-bounds/index.d.ts.map +1 -1
  206. package/lib/features/tools/change-bounds/index.js +3 -2
  207. package/lib/features/tools/change-bounds/index.js.map +1 -1
  208. package/lib/features/tools/change-bounds/view.d.ts +1 -1
  209. package/lib/features/tools/change-bounds/view.d.ts.map +1 -1
  210. package/lib/features/tools/change-bounds/view.js +3 -0
  211. package/lib/features/tools/change-bounds/view.js.map +1 -1
  212. package/lib/features/tools/deletion/delete-tool.d.ts +16 -1
  213. package/lib/features/tools/deletion/delete-tool.d.ts.map +1 -1
  214. package/lib/features/tools/deletion/delete-tool.js +5 -2
  215. package/lib/features/tools/deletion/delete-tool.js.map +1 -1
  216. package/lib/features/tools/edge-creation/dangling-edge-feedback.d.ts +17 -1
  217. package/lib/features/tools/edge-creation/dangling-edge-feedback.d.ts.map +1 -1
  218. package/lib/features/tools/edge-creation/dangling-edge-feedback.js +3 -1
  219. package/lib/features/tools/edge-creation/dangling-edge-feedback.js.map +1 -1
  220. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.d.ts +4 -2
  221. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.d.ts.map +1 -1
  222. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.js +5 -8
  223. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.js.map +1 -1
  224. package/lib/features/tools/edge-creation/edge-creation-tool.d.ts +20 -2
  225. package/lib/features/tools/edge-creation/edge-creation-tool.d.ts.map +1 -1
  226. package/lib/features/tools/edge-creation/edge-creation-tool.js +23 -18
  227. package/lib/features/tools/edge-creation/edge-creation-tool.js.map +1 -1
  228. package/lib/features/tools/edge-creation/index.d.ts +2 -2
  229. package/lib/features/tools/edge-creation/index.d.ts.map +1 -1
  230. package/lib/features/tools/edge-creation/index.js +2 -2
  231. package/lib/features/tools/edge-creation/index.js.map +1 -1
  232. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts +3 -1
  233. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts.map +1 -1
  234. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js +5 -8
  235. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js.map +1 -1
  236. package/lib/features/tools/edge-edit/edge-edit-tool.d.ts +4 -4
  237. package/lib/features/tools/edge-edit/edge-edit-tool.d.ts.map +1 -1
  238. package/lib/features/tools/edge-edit/edge-edit-tool.js +27 -44
  239. package/lib/features/tools/edge-edit/edge-edit-tool.js.map +1 -1
  240. package/lib/features/tools/edge-edit/index.d.ts +2 -2
  241. package/lib/features/tools/edge-edit/index.d.ts.map +1 -1
  242. package/lib/features/tools/edge-edit/index.js +2 -2
  243. package/lib/features/tools/edge-edit/index.js.map +1 -1
  244. package/lib/features/tools/marquee-selection/index.d.ts +2 -2
  245. package/lib/features/tools/marquee-selection/index.d.ts.map +1 -1
  246. package/lib/features/tools/marquee-selection/index.js +2 -2
  247. package/lib/features/tools/marquee-selection/index.js.map +1 -1
  248. package/lib/features/tools/marquee-selection/marquee-behavior.js.map +1 -1
  249. package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts +3 -2
  250. package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts.map +1 -1
  251. package/lib/features/tools/marquee-selection/marquee-mouse-tool.js +4 -2
  252. package/lib/features/tools/marquee-selection/marquee-mouse-tool.js.map +1 -1
  253. package/lib/features/tools/marquee-selection/marquee-tool-feedback.js.map +1 -1
  254. package/lib/features/tools/marquee-selection/marquee-tool.js.map +1 -1
  255. package/lib/features/tools/node-creation/node-creation-tool.d.ts +14 -5
  256. package/lib/features/tools/node-creation/node-creation-tool.d.ts.map +1 -1
  257. package/lib/features/tools/node-creation/node-creation-tool.js +58 -24
  258. package/lib/features/tools/node-creation/node-creation-tool.js.map +1 -1
  259. package/lib/features/tools/tool-focus-loss-module.js.map +1 -1
  260. package/lib/features/undo-redo/undo-redo-key-listener.js.map +1 -1
  261. package/lib/features/validation/issue-marker.js.map +1 -1
  262. package/lib/features/validation/marker-navigator.d.ts +7 -6
  263. package/lib/features/validation/marker-navigator.d.ts.map +1 -1
  264. package/lib/features/validation/marker-navigator.js.map +1 -1
  265. package/lib/features/validation/validate.d.ts +2 -5
  266. package/lib/features/validation/validate.d.ts.map +1 -1
  267. package/lib/features/validation/validate.js +4 -16
  268. package/lib/features/validation/validate.js.map +1 -1
  269. package/lib/features/viewport/glsp-scroll-mouse-listener.js.map +1 -1
  270. package/lib/features/viewport/reposition.js.map +1 -1
  271. package/lib/features/viewport/viewport-handler.js.map +1 -1
  272. package/lib/model.js.map +1 -1
  273. package/lib/standalone-modules.js.map +1 -1
  274. package/lib/utils/argument-utils.js.map +1 -1
  275. package/lib/utils/geometry-util.d.ts +1 -1
  276. package/lib/utils/geometry-util.d.ts.map +1 -1
  277. package/lib/utils/gmodel-util.d.ts +27 -2
  278. package/lib/utils/gmodel-util.d.ts.map +1 -1
  279. package/lib/utils/gmodel-util.js +30 -1
  280. package/lib/utils/gmodel-util.js.map +1 -1
  281. package/lib/utils/html-utils.js.map +1 -1
  282. package/lib/utils/layout-utils.d.ts +8 -7
  283. package/lib/utils/layout-utils.d.ts.map +1 -1
  284. package/lib/utils/layout-utils.js +2 -4
  285. package/lib/utils/layout-utils.js.map +1 -1
  286. package/lib/utils/marker.js.map +1 -1
  287. package/lib/utils/viewpoint-util.d.ts +4 -4
  288. package/lib/utils/viewpoint-util.d.ts.map +1 -1
  289. package/lib/utils/viewpoint-util.js.map +1 -1
  290. package/lib/views/compartments.js.map +1 -1
  291. package/lib/views/gedge-view.js.map +1 -1
  292. package/lib/views/glsp-projection-view.js.map +1 -1
  293. package/lib/views/index.d.ts +2 -2
  294. package/lib/views/index.d.ts.map +1 -1
  295. package/lib/views/index.js +2 -2
  296. package/lib/views/index.js.map +1 -1
  297. package/lib/views/issue-marker-view.js.map +1 -1
  298. package/lib/views/rounded-corner-view.js.map +1 -1
  299. package/lib/views/rounded-corner.d.ts +1 -1
  300. package/lib/views/rounded-corner.d.ts.map +1 -1
  301. package/lib/views/rounded-corner.js.map +1 -1
  302. package/package.json +3 -3
  303. package/src/base/drag-aware-mouse-listener.ts +16 -2
  304. package/src/base/feedback/css-feedback.ts +4 -0
  305. package/src/base/feedback/feeback-emitter.ts +112 -0
  306. package/src/base/feedback/feedback-action-dispatcher.ts +41 -6
  307. package/src/base/feedback/index.ts +1 -0
  308. package/src/base/selection-service.spec.ts +5 -0
  309. package/src/base/selection-service.ts +2 -3
  310. package/src/features/accessibility/element-navigation/local-element-navigator.ts +4 -4
  311. package/src/features/accessibility/move-zoom/move-handler.ts +11 -6
  312. package/src/features/accessibility/resize-key-tool/resize-key-handler.ts +11 -7
  313. package/src/features/change-bounds/model.ts +25 -13
  314. package/src/features/change-bounds/movement-restrictor.ts +6 -22
  315. package/src/features/element-template/mouse-tracking-element-position-listener.ts +55 -45
  316. package/src/features/helper-lines/helper-line-feedback.ts +50 -57
  317. package/src/features/helper-lines/helper-line-manager-default.ts +12 -21
  318. package/src/features/helper-lines/model.ts +6 -25
  319. package/src/features/hints/type-hint-provider.spec.ts +4 -1
  320. package/src/features/hints/type-hint-provider.ts +9 -2
  321. package/src/features/layout/layout-elements-action.ts +10 -7
  322. package/src/features/select/select-mouse-listener.ts +4 -3
  323. package/src/features/tools/base-tools.ts +15 -8
  324. package/src/features/tools/change-bounds/change-bounds-tool-feedback.ts +6 -232
  325. package/src/features/tools/change-bounds/change-bounds-tool-module.ts +1 -0
  326. package/src/features/tools/change-bounds/change-bounds-tool-move-feedback.ts +254 -0
  327. package/src/features/tools/change-bounds/change-bounds-tool.ts +217 -226
  328. package/src/features/tools/change-bounds/index.ts +1 -0
  329. package/src/features/tools/change-bounds/view.tsx +4 -1
  330. package/src/features/tools/deletion/delete-tool.ts +6 -6
  331. package/src/features/tools/edge-creation/dangling-edge-feedback.ts +7 -4
  332. package/src/features/tools/edge-creation/edge-creation-tool-feedback.ts +9 -9
  333. package/src/features/tools/edge-creation/edge-creation-tool.ts +33 -23
  334. package/src/features/tools/edge-edit/edge-edit-tool-feedback.ts +8 -8
  335. package/src/features/tools/edge-edit/edge-edit-tool.ts +42 -49
  336. package/src/features/tools/marquee-selection/marquee-mouse-tool.ts +7 -6
  337. package/src/features/tools/node-creation/node-creation-tool.ts +69 -25
  338. package/src/features/validation/marker-navigator.ts +6 -8
  339. package/src/features/validation/validate.ts +5 -20
  340. package/src/features/viewport/reposition.ts +11 -14
  341. package/src/utils/geometry-util.ts +45 -64
  342. package/src/utils/gmodel-util.ts +45 -2
  343. package/src/utils/layout-utils.ts +9 -20
  344. package/src/utils/viewpoint-util.ts +13 -25
  345. package/lib/base/action-dispatcher.spec.d.ts +0 -2
  346. package/lib/base/action-dispatcher.spec.d.ts.map +0 -1
  347. package/lib/base/action-dispatcher.spec.js +0 -78
  348. package/lib/base/action-dispatcher.spec.js.map +0 -1
  349. package/lib/base/model/model-initialization-constraint.spec.d.ts +0 -2
  350. package/lib/base/model/model-initialization-constraint.spec.d.ts.map +0 -1
  351. package/lib/base/model/model-initialization-constraint.spec.js +0 -97
  352. package/lib/base/model/model-initialization-constraint.spec.js.map +0 -1
  353. package/lib/base/selection-service.spec.d.ts +0 -2
  354. package/lib/base/selection-service.spec.d.ts.map +0 -1
  355. package/lib/base/selection-service.spec.js +0 -287
  356. package/lib/base/selection-service.spec.js.map +0 -1
  357. package/lib/features/bounds/freeform-layout.spec.d.ts +0 -3
  358. package/lib/features/bounds/freeform-layout.spec.d.ts.map +0 -1
  359. package/lib/features/bounds/freeform-layout.spec.js +0 -201
  360. package/lib/features/bounds/freeform-layout.spec.js.map +0 -1
  361. package/lib/features/bounds/hbox-layout.spec.d.ts +0 -3
  362. package/lib/features/bounds/hbox-layout.spec.d.ts.map +0 -1
  363. package/lib/features/bounds/hbox-layout.spec.js +0 -160
  364. package/lib/features/bounds/hbox-layout.spec.js.map +0 -1
  365. package/lib/features/bounds/layouter-test-util.spec.d.ts +0 -32
  366. package/lib/features/bounds/layouter-test-util.spec.d.ts.map +0 -1
  367. package/lib/features/bounds/layouter-test-util.spec.js +0 -96
  368. package/lib/features/bounds/layouter-test-util.spec.js.map +0 -1
  369. package/lib/features/bounds/vbox-layout.spec.d.ts +0 -3
  370. package/lib/features/bounds/vbox-layout.spec.d.ts.map +0 -1
  371. package/lib/features/bounds/vbox-layout.spec.js +0 -160
  372. package/lib/features/bounds/vbox-layout.spec.js.map +0 -1
  373. package/lib/features/change-bounds/snap.spec.d.ts +0 -17
  374. package/lib/features/change-bounds/snap.spec.d.ts.map +0 -1
  375. package/lib/features/change-bounds/snap.spec.js +0 -83
  376. package/lib/features/change-bounds/snap.spec.js.map +0 -1
  377. package/lib/features/hints/type-hint-provider.spec.d.ts +0 -2
  378. package/lib/features/hints/type-hint-provider.spec.d.ts.map +0 -1
  379. package/lib/features/hints/type-hint-provider.spec.js +0 -333
  380. package/lib/features/hints/type-hint-provider.spec.js.map +0 -1
  381. package/lib/features/layout/layout-elements-action.spec.d.ts +0 -3
  382. package/lib/features/layout/layout-elements-action.spec.d.ts.map +0 -1
  383. package/lib/features/layout/layout-elements-action.spec.js +0 -329
  384. package/lib/features/layout/layout-elements-action.spec.js.map +0 -1
  385. package/lib/features/navigation/navigation-target-resolver.spec.d.ts +0 -3
  386. package/lib/features/navigation/navigation-target-resolver.spec.d.ts.map +0 -1
  387. package/lib/features/navigation/navigation-target-resolver.spec.js +0 -53
  388. package/lib/features/navigation/navigation-target-resolver.spec.js.map +0 -1
  389. package/lib/features/tools/marquee-selection/marquee-behavior.spec.d.ts +0 -17
  390. package/lib/features/tools/marquee-selection/marquee-behavior.spec.d.ts.map +0 -1
  391. package/lib/features/tools/marquee-selection/marquee-behavior.spec.js +0 -165
  392. package/lib/features/tools/marquee-selection/marquee-behavior.spec.js.map +0 -1
  393. package/lib/features/validation/marker-navigator.spec.d.ts +0 -3
  394. package/lib/features/validation/marker-navigator.spec.d.ts.map +0 -1
  395. package/lib/features/validation/marker-navigator.spec.js +0 -166
  396. package/lib/features/validation/marker-navigator.spec.js.map +0 -1
  397. package/lib/utils/gmodel-util.spec.d.ts +0 -2
  398. package/lib/utils/gmodel-util.spec.d.ts.map +0 -1
  399. package/lib/utils/gmodel-util.spec.js +0 -186
  400. package/lib/utils/gmodel-util.spec.js.map +0 -1
@@ -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 { SResizeHandle, addResizeHandles, isResizable, removeResizeHandles } from '../../change-bounds/model';
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
- if (this.action.elementId) {
95
- const resizeElement = index.getById(this.action.elementId);
96
- if (resizeElement && isResizable(resizeElement)) {
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
+ }