@eclipse-glsp/client 1.1.0-next.698b9de.254 → 1.1.0-next.69a77b0.259

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 (519) hide show
  1. package/lib/base/action-dispatcher.d.ts.map +1 -1
  2. package/lib/base/action-dispatcher.js +5 -3
  3. package/lib/base/action-dispatcher.js.map +1 -1
  4. package/lib/base/actions/focus-change-action.js +1 -1
  5. package/lib/base/actions/focus-change-action.js.map +1 -1
  6. package/lib/base/auto-complete/auto-complete-actions.js +1 -1
  7. package/lib/base/auto-complete/auto-complete-actions.js.map +1 -1
  8. package/lib/base/auto-complete/validation-decorator.js +1 -1
  9. package/lib/base/auto-complete/validation-decorator.js.map +1 -1
  10. package/lib/base/command-stack.d.ts +17 -2
  11. package/lib/base/command-stack.d.ts.map +1 -1
  12. package/lib/base/command-stack.js +43 -3
  13. package/lib/base/command-stack.js.map +1 -1
  14. package/lib/base/di.config.d.ts.map +1 -1
  15. package/lib/base/di.config.js +21 -3
  16. package/lib/base/di.config.js.map +1 -1
  17. package/lib/base/drag-aware-mouse-listener.d.ts +2 -2
  18. package/lib/base/drag-aware-mouse-listener.d.ts.map +1 -1
  19. package/lib/base/drag-aware-mouse-listener.js.map +1 -1
  20. package/lib/base/editor-context-service.d.ts +10 -7
  21. package/lib/base/editor-context-service.d.ts.map +1 -1
  22. package/lib/base/editor-context-service.js +27 -10
  23. package/lib/base/editor-context-service.js.map +1 -1
  24. package/lib/{features/tool-feedback → base/feedback}/css-feedback.d.ts +1 -1
  25. package/lib/base/feedback/css-feedback.d.ts.map +1 -0
  26. package/lib/{features/tool-feedback → base/feedback}/css-feedback.js +5 -6
  27. package/lib/base/feedback/css-feedback.js.map +1 -0
  28. package/lib/{features/tool-feedback → base/feedback}/feedback-action-dispatcher.d.ts +11 -9
  29. package/lib/base/feedback/feedback-action-dispatcher.d.ts.map +1 -0
  30. package/lib/{features/tool-feedback → base/feedback}/feedback-action-dispatcher.js +26 -20
  31. package/lib/base/feedback/feedback-action-dispatcher.js.map +1 -0
  32. package/lib/{features/tool-feedback/model.d.ts → base/feedback/feedback-command.d.ts} +1 -1
  33. package/lib/base/feedback/feedback-command.d.ts.map +1 -0
  34. package/lib/{features/tool-feedback/model.js → base/feedback/feedback-command.js} +1 -1
  35. package/lib/base/feedback/feedback-command.js.map +1 -0
  36. package/lib/base/{model → feedback}/update-model-command.d.ts +3 -15
  37. package/lib/base/feedback/update-model-command.d.ts.map +1 -0
  38. package/lib/base/{model → feedback}/update-model-command.js +3 -27
  39. package/lib/base/feedback/update-model-command.js.map +1 -0
  40. package/lib/base/focus-tracker.js +2 -3
  41. package/lib/base/focus-tracker.js.map +1 -1
  42. package/lib/base/model/model-registry.js +2 -3
  43. package/lib/base/model/model-registry.js.map +1 -1
  44. package/lib/base/model-initialization-constraint.js +4 -6
  45. package/lib/base/model-initialization-constraint.js.map +1 -1
  46. package/lib/base/ranked.d.ts +34 -0
  47. package/lib/base/ranked.d.ts.map +1 -0
  48. package/lib/base/ranked.js +38 -0
  49. package/lib/base/ranked.js.map +1 -0
  50. package/lib/base/selection-clearing-mouse-listener.js +2 -3
  51. package/lib/base/selection-clearing-mouse-listener.js.map +1 -1
  52. package/lib/{features/select → base}/selection-service.d.ts +34 -13
  53. package/lib/base/selection-service.d.ts.map +1 -0
  54. package/lib/{features/select → base}/selection-service.js +73 -29
  55. package/lib/base/selection-service.js.map +1 -0
  56. package/lib/base/selection-service.spec.d.ts +2 -0
  57. package/lib/base/selection-service.spec.d.ts.map +1 -0
  58. package/lib/base/selection-service.spec.js +281 -0
  59. package/lib/base/selection-service.spec.js.map +1 -0
  60. package/lib/base/tool-manager/glsp-tool-manager.d.ts +3 -3
  61. package/lib/base/tool-manager/glsp-tool-manager.d.ts.map +1 -1
  62. package/lib/base/tool-manager/glsp-tool-manager.js +5 -6
  63. package/lib/base/tool-manager/glsp-tool-manager.js.map +1 -1
  64. package/lib/base/view/key-tool.d.ts +5 -0
  65. package/lib/base/view/key-tool.d.ts.map +1 -0
  66. package/lib/base/view/key-tool.js +36 -0
  67. package/lib/base/view/key-tool.js.map +1 -0
  68. package/lib/base/view/mouse-tool.d.ts +19 -0
  69. package/lib/base/view/mouse-tool.d.ts.map +1 -0
  70. package/lib/{features/mouse-tool → base/view}/mouse-tool.js +14 -11
  71. package/lib/base/view/mouse-tool.js.map +1 -0
  72. package/lib/base/view/view-registry.js +2 -3
  73. package/lib/base/view/view-registry.js.map +1 -1
  74. package/lib/{base/container-modules.d.ts → container-modules.d.ts} +2 -2
  75. package/lib/container-modules.d.ts.map +1 -0
  76. package/lib/{base/container-modules.js → container-modules.js} +49 -41
  77. package/lib/container-modules.js.map +1 -0
  78. package/lib/features/accessibility/move-zoom/move-handler.js +6 -8
  79. package/lib/features/accessibility/move-zoom/move-handler.js.map +1 -1
  80. package/lib/features/accessibility/move-zoom/zoom-handler.js +6 -8
  81. package/lib/features/accessibility/move-zoom/zoom-handler.js.map +1 -1
  82. package/lib/features/accessibility/resize-key-tool/resize-key-handler.js +4 -5
  83. package/lib/features/accessibility/resize-key-tool/resize-key-handler.js.map +1 -1
  84. package/lib/features/accessibility/resize-key-tool/resize-key-tool.d.ts +1 -1
  85. package/lib/features/accessibility/resize-key-tool/resize-key-tool.d.ts.map +1 -1
  86. package/lib/features/accessibility/resize-key-tool/resize-key-tool.js +6 -8
  87. package/lib/features/accessibility/resize-key-tool/resize-key-tool.js.map +1 -1
  88. package/lib/features/accessibility/search/search-palette.js +3 -4
  89. package/lib/features/accessibility/search/search-palette.js.map +1 -1
  90. package/lib/features/accessibility/search/search-tool.js +2 -3
  91. package/lib/features/accessibility/search/search-tool.js.map +1 -1
  92. package/lib/features/accessibility/view-key-tools/deselect-key-tool.js +2 -3
  93. package/lib/features/accessibility/view-key-tools/deselect-key-tool.js.map +1 -1
  94. package/lib/features/accessibility/view-key-tools/movement-key-tool.d.ts +1 -1
  95. package/lib/features/accessibility/view-key-tools/movement-key-tool.d.ts.map +1 -1
  96. package/lib/features/accessibility/view-key-tools/movement-key-tool.js +5 -6
  97. package/lib/features/accessibility/view-key-tools/movement-key-tool.js.map +1 -1
  98. package/lib/features/accessibility/view-key-tools/zoom-key-tool.d.ts +1 -1
  99. package/lib/features/accessibility/view-key-tools/zoom-key-tool.d.ts.map +1 -1
  100. package/lib/features/accessibility/view-key-tools/zoom-key-tool.js +5 -6
  101. package/lib/features/accessibility/view-key-tools/zoom-key-tool.js.map +1 -1
  102. package/lib/features/autocomplete-palette/base-autocomplete-palette.js +1 -1
  103. package/lib/features/autocomplete-palette/base-autocomplete-palette.js.map +1 -1
  104. package/lib/features/bounds/freeform-layout.js +2 -3
  105. package/lib/features/bounds/freeform-layout.js.map +1 -1
  106. package/lib/features/bounds/freeform-layout.spec.d.ts +3 -0
  107. package/lib/features/bounds/freeform-layout.spec.d.ts.map +1 -0
  108. package/lib/features/bounds/freeform-layout.spec.js +201 -0
  109. package/lib/features/bounds/freeform-layout.spec.js.map +1 -0
  110. package/lib/features/bounds/glsp-hidden-bounds-updater.js +2 -3
  111. package/lib/features/bounds/glsp-hidden-bounds-updater.js.map +1 -1
  112. package/lib/features/bounds/hbox-layout.js +2 -3
  113. package/lib/features/bounds/hbox-layout.js.map +1 -1
  114. package/lib/features/bounds/hbox-layout.spec.d.ts +3 -0
  115. package/lib/features/bounds/hbox-layout.spec.d.ts.map +1 -0
  116. package/lib/features/bounds/hbox-layout.spec.js +160 -0
  117. package/lib/features/bounds/hbox-layout.spec.js.map +1 -0
  118. package/lib/features/bounds/layouter-test-util.spec.d.ts +32 -0
  119. package/lib/features/bounds/layouter-test-util.spec.d.ts.map +1 -0
  120. package/lib/features/bounds/layouter-test-util.spec.js +96 -0
  121. package/lib/features/bounds/layouter-test-util.spec.js.map +1 -0
  122. package/lib/features/bounds/layouter.js +2 -3
  123. package/lib/features/bounds/layouter.js.map +1 -1
  124. package/lib/features/bounds/vbox-layout.js +2 -3
  125. package/lib/features/bounds/vbox-layout.js.map +1 -1
  126. package/lib/features/bounds/vbox-layout.spec.d.ts +3 -0
  127. package/lib/features/bounds/vbox-layout.spec.d.ts.map +1 -0
  128. package/lib/features/bounds/vbox-layout.spec.js +160 -0
  129. package/lib/features/bounds/vbox-layout.spec.js.map +1 -0
  130. package/lib/features/change-bounds/model.js +2 -2
  131. package/lib/features/change-bounds/model.js.map +1 -1
  132. package/lib/features/change-bounds/movement-restrictor.d.ts +1 -1
  133. package/lib/features/change-bounds/movement-restrictor.d.ts.map +1 -1
  134. package/lib/features/change-bounds/movement-restrictor.js +3 -4
  135. package/lib/features/change-bounds/movement-restrictor.js.map +1 -1
  136. package/lib/features/change-bounds/snap.js +2 -3
  137. package/lib/features/change-bounds/snap.js.map +1 -1
  138. package/lib/features/{rank/model.d.ts → change-bounds/snap.spec.d.ts} +3 -8
  139. package/lib/features/change-bounds/snap.spec.d.ts.map +1 -0
  140. package/lib/features/change-bounds/snap.spec.js +82 -0
  141. package/lib/features/change-bounds/snap.spec.js.map +1 -0
  142. package/lib/features/command-palette/command-palette-tool.js +2 -3
  143. package/lib/features/command-palette/command-palette-tool.js.map +1 -1
  144. package/lib/features/command-palette/server-command-palette-provider.js +3 -4
  145. package/lib/features/command-palette/server-command-palette-provider.js.map +1 -1
  146. package/lib/features/context-menu/delete-element-context-menu.js +2 -3
  147. package/lib/features/context-menu/delete-element-context-menu.js.map +1 -1
  148. package/lib/features/context-menu/selection-service-aware-context-menu-mouse-listener.d.ts +1 -1
  149. package/lib/features/context-menu/selection-service-aware-context-menu-mouse-listener.d.ts.map +1 -1
  150. package/lib/features/context-menu/selection-service-aware-context-menu-mouse-listener.js +4 -5
  151. package/lib/features/context-menu/selection-service-aware-context-menu-mouse-listener.js.map +1 -1
  152. package/lib/features/context-menu/server-context-menu-provider.js +3 -4
  153. package/lib/features/context-menu/server-context-menu-provider.js.map +1 -1
  154. package/lib/features/copy-paste/copy-paste-context-menu.js +6 -8
  155. package/lib/features/copy-paste/copy-paste-context-menu.js.map +1 -1
  156. package/lib/features/copy-paste/copy-paste-handler.js +4 -6
  157. package/lib/features/copy-paste/copy-paste-handler.js.map +1 -1
  158. package/lib/features/decoration/decoration-placer.js +2 -3
  159. package/lib/features/decoration/decoration-placer.js.map +1 -1
  160. package/lib/features/edit-label/edit-label-tool.d.ts +0 -3
  161. package/lib/features/edit-label/edit-label-tool.d.ts.map +1 -1
  162. package/lib/features/edit-label/edit-label-tool.js +3 -11
  163. package/lib/features/edit-label/edit-label-tool.js.map +1 -1
  164. package/lib/features/edit-label/edit-label-validator.js +5 -7
  165. package/lib/features/edit-label/edit-label-validator.js.map +1 -1
  166. package/lib/features/export/glsp-svg-exporter.js +2 -3
  167. package/lib/features/export/glsp-svg-exporter.js.map +1 -1
  168. package/lib/features/hints/type-hints.d.ts +2 -2
  169. package/lib/features/hints/type-hints.d.ts.map +1 -1
  170. package/lib/features/hints/type-hints.js +9 -11
  171. package/lib/features/hints/type-hints.js.map +1 -1
  172. package/lib/features/hover/hover.d.ts.map +1 -1
  173. package/lib/features/hover/hover.js +3 -4
  174. package/lib/features/hover/hover.js.map +1 -1
  175. package/lib/features/layout/di.config.js +1 -1
  176. package/lib/features/layout/di.config.js.map +1 -1
  177. package/lib/features/layout/layout-elements-action.d.ts +1 -1
  178. package/lib/features/layout/layout-elements-action.d.ts.map +1 -1
  179. package/lib/features/layout/layout-elements-action.js +14 -17
  180. package/lib/features/layout/layout-elements-action.js.map +1 -1
  181. package/lib/features/layout/layout-elements-action.spec.d.ts +3 -0
  182. package/lib/features/layout/layout-elements-action.spec.d.ts.map +1 -0
  183. package/lib/features/layout/layout-elements-action.spec.js +321 -0
  184. package/lib/features/layout/layout-elements-action.spec.js.map +1 -0
  185. package/lib/features/navigation/navigation-action-handler.js +5 -6
  186. package/lib/features/navigation/navigation-action-handler.js.map +1 -1
  187. package/lib/features/navigation/navigation-target-resolver.js +2 -3
  188. package/lib/features/navigation/navigation-target-resolver.js.map +1 -1
  189. package/lib/features/navigation/navigation-target-resolver.spec.d.ts +3 -0
  190. package/lib/features/navigation/navigation-target-resolver.spec.d.ts.map +1 -0
  191. package/lib/features/navigation/navigation-target-resolver.spec.js +53 -0
  192. package/lib/features/navigation/navigation-target-resolver.spec.js.map +1 -0
  193. package/lib/features/routing/di.config.d.ts +22 -0
  194. package/lib/features/routing/di.config.d.ts.map +1 -0
  195. package/lib/features/routing/di.config.js +57 -0
  196. package/lib/features/routing/di.config.js.map +1 -0
  197. package/lib/features/routing/glsp-manhattan-edge-router.d.ts.map +1 -0
  198. package/lib/features/routing/glsp-manhattan-edge-router.js.map +1 -0
  199. package/lib/features/select/di.config.d.ts.map +1 -1
  200. package/lib/features/select/di.config.js +3 -5
  201. package/lib/features/select/di.config.js.map +1 -1
  202. package/lib/features/select/select-feedback-command.d.ts +12 -0
  203. package/lib/features/select/select-feedback-command.d.ts.map +1 -0
  204. package/lib/features/select/{select-feedback-action.js → select-feedback-command.js} +6 -30
  205. package/lib/features/select/select-feedback-command.js.map +1 -0
  206. package/lib/features/select/select-mouse-listener.d.ts +1 -1
  207. package/lib/features/select/select-mouse-listener.d.ts.map +1 -1
  208. package/lib/features/select/select-mouse-listener.js +2 -2
  209. package/lib/features/select/select-mouse-listener.js.map +1 -1
  210. package/lib/features/source-model-watcher/source-model-changed-action-handler.js +5 -7
  211. package/lib/features/source-model-watcher/source-model-changed-action-handler.js.map +1 -1
  212. package/lib/features/svg-metadata/metadata-placer.js +2 -3
  213. package/lib/features/svg-metadata/metadata-placer.js.map +1 -1
  214. package/lib/features/tool-palette/tool-palette.d.ts +4 -4
  215. package/lib/features/tool-palette/tool-palette.d.ts.map +1 -1
  216. package/lib/features/tool-palette/tool-palette.js +12 -13
  217. package/lib/features/tool-palette/tool-palette.js.map +1 -1
  218. package/lib/features/tools/base-glsp-creation-tool.d.ts +10 -0
  219. package/lib/features/tools/base-glsp-creation-tool.d.ts.map +1 -0
  220. package/lib/features/tools/base-glsp-creation-tool.js +45 -0
  221. package/lib/features/tools/base-glsp-creation-tool.js.map +1 -0
  222. package/lib/features/tools/base-glsp-tool.d.ts +26 -8
  223. package/lib/features/tools/base-glsp-tool.d.ts.map +1 -1
  224. package/lib/features/tools/base-glsp-tool.js +34 -11
  225. package/lib/features/tools/base-glsp-tool.js.map +1 -1
  226. package/lib/features/{tool-feedback → tools/change-bounds}/change-bounds-tool-feedback.d.ts +12 -5
  227. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts.map +1 -0
  228. package/lib/features/{tool-feedback → tools/change-bounds}/change-bounds-tool-feedback.js +45 -27
  229. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js.map +1 -0
  230. package/lib/features/tools/{change-bounds-tool.d.ts → change-bounds/change-bounds-tool.d.ts} +13 -14
  231. package/lib/features/tools/change-bounds/change-bounds-tool.d.ts.map +1 -0
  232. package/lib/features/tools/{change-bounds-tool.js → change-bounds/change-bounds-tool.js} +50 -35
  233. package/lib/features/tools/change-bounds/change-bounds-tool.js.map +1 -0
  234. package/lib/features/tools/change-bounds/di.config.d.ts +19 -0
  235. package/lib/features/tools/change-bounds/di.config.d.ts.map +1 -0
  236. package/lib/features/tools/change-bounds/di.config.js +32 -0
  237. package/lib/features/tools/change-bounds/di.config.js.map +1 -0
  238. package/lib/features/tools/change-bounds/view.d.ts +9 -0
  239. package/lib/features/tools/change-bounds/view.d.ts.map +1 -0
  240. package/lib/features/{tool-feedback → tools/change-bounds}/view.js +5 -21
  241. package/lib/features/tools/change-bounds/view.js.map +1 -0
  242. package/lib/features/tools/{delete-tool.d.ts → deletion/delete-tool.d.ts} +4 -9
  243. package/lib/features/tools/deletion/delete-tool.d.ts.map +1 -0
  244. package/lib/features/tools/{delete-tool.js → deletion/delete-tool.js} +13 -29
  245. package/lib/features/tools/deletion/delete-tool.js.map +1 -0
  246. package/lib/features/{tool-feedback → tools/deletion}/di.config.d.ts +2 -2
  247. package/lib/features/tools/deletion/di.config.d.ts.map +1 -0
  248. package/lib/features/{mouse-tool → tools/deletion}/di.config.js +7 -7
  249. package/lib/features/tools/deletion/di.config.js.map +1 -0
  250. package/lib/features/{tool-feedback/creation-tool-feedback.d.ts → tools/edge-creation/dangling-edge-feedback.d.ts} +5 -10
  251. package/lib/features/tools/edge-creation/dangling-edge-feedback.d.ts.map +1 -0
  252. package/lib/features/{tool-feedback/creation-tool-feedback.js → tools/edge-creation/dangling-edge-feedback.js} +25 -87
  253. package/lib/features/tools/edge-creation/dangling-edge-feedback.js.map +1 -0
  254. package/lib/features/tools/edge-creation/di.config.d.ts +19 -0
  255. package/lib/features/tools/edge-creation/di.config.d.ts.map +1 -0
  256. package/lib/features/tools/edge-creation/di.config.js +29 -0
  257. package/lib/features/tools/edge-creation/di.config.js.map +1 -0
  258. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.d.ts +26 -0
  259. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.d.ts.map +1 -0
  260. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.js +74 -0
  261. package/lib/features/tools/edge-creation/edge-creation-tool-feedback.js.map +1 -0
  262. package/lib/features/tools/{edge-creation-tool.d.ts → edge-creation/edge-creation-tool.d.ts} +6 -11
  263. package/lib/features/tools/edge-creation/edge-creation-tool.d.ts.map +1 -0
  264. package/lib/features/tools/{edge-creation-tool.js → edge-creation/edge-creation-tool.js} +29 -40
  265. package/lib/features/tools/edge-creation/edge-creation-tool.js.map +1 -0
  266. package/lib/features/tools/edge-creation/view.d.ts +10 -0
  267. package/lib/features/tools/edge-creation/view.d.ts.map +1 -0
  268. package/lib/features/tools/edge-creation/view.js +43 -0
  269. package/lib/features/tools/edge-creation/view.js.map +1 -0
  270. package/lib/features/{mouse-tool → tools/edge-edit}/di.config.d.ts +2 -2
  271. package/lib/features/tools/edge-edit/di.config.d.ts.map +1 -0
  272. package/lib/features/tools/edge-edit/di.config.js +35 -0
  273. package/lib/features/tools/edge-edit/di.config.js.map +1 -0
  274. package/lib/features/{tool-feedback → tools/edge-edit}/edge-edit-tool-feedback.d.ts +14 -8
  275. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts.map +1 -0
  276. package/lib/features/{tool-feedback → tools/edge-edit}/edge-edit-tool-feedback.js +42 -37
  277. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js.map +1 -0
  278. package/lib/features/tools/{edge-edit-tool.d.ts → edge-edit/edge-edit-tool.d.ts} +7 -9
  279. package/lib/features/tools/edge-edit/edge-edit-tool.d.ts.map +1 -0
  280. package/lib/features/tools/{edge-edit-tool.js → edge-edit/edge-edit-tool.js} +28 -33
  281. package/lib/features/tools/edge-edit/edge-edit-tool.js.map +1 -0
  282. package/lib/features/tools/enable-default-tools-on-focus-loss.d.ts +21 -0
  283. package/lib/features/tools/enable-default-tools-on-focus-loss.d.ts.map +1 -1
  284. package/lib/features/tools/enable-default-tools-on-focus-loss.js +9 -3
  285. package/lib/features/tools/enable-default-tools-on-focus-loss.js.map +1 -1
  286. package/lib/features/tools/marquee-selection/di.config.d.ts +19 -0
  287. package/lib/features/tools/marquee-selection/di.config.d.ts.map +1 -0
  288. package/lib/features/tools/marquee-selection/di.config.js +34 -0
  289. package/lib/features/tools/marquee-selection/di.config.js.map +1 -0
  290. package/lib/features/tools/{marquee-behavior.d.ts → marquee-selection/marquee-behavior.d.ts} +10 -10
  291. package/lib/features/tools/marquee-selection/marquee-behavior.d.ts.map +1 -0
  292. package/lib/features/tools/{marquee-behavior.js → marquee-selection/marquee-behavior.js} +2 -2
  293. package/lib/features/tools/marquee-selection/marquee-behavior.js.map +1 -0
  294. package/lib/features/tools/marquee-selection/marquee-behavior.spec.d.ts +17 -0
  295. package/lib/features/tools/marquee-selection/marquee-behavior.spec.d.ts.map +1 -0
  296. package/lib/features/tools/marquee-selection/marquee-behavior.spec.js +165 -0
  297. package/lib/features/tools/marquee-selection/marquee-behavior.spec.js.map +1 -0
  298. package/lib/features/tools/{marquee-mouse-tool.d.ts → marquee-selection/marquee-mouse-tool.d.ts} +4 -6
  299. package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts.map +1 -0
  300. package/lib/features/tools/{marquee-mouse-tool.js → marquee-selection/marquee-mouse-tool.js} +12 -22
  301. package/lib/features/tools/marquee-selection/marquee-mouse-tool.js.map +1 -0
  302. package/lib/features/{tool-feedback → tools/marquee-selection}/marquee-tool-feedback.d.ts +2 -2
  303. package/lib/features/tools/marquee-selection/marquee-tool-feedback.d.ts.map +1 -0
  304. package/lib/features/{tool-feedback → tools/marquee-selection}/marquee-tool-feedback.js +8 -10
  305. package/lib/features/tools/marquee-selection/marquee-tool-feedback.js.map +1 -0
  306. package/lib/features/tools/marquee-selection/marquee-tool.d.ts +12 -0
  307. package/lib/features/tools/marquee-selection/marquee-tool.d.ts.map +1 -0
  308. package/lib/features/tools/{marquee-tool.js → marquee-selection/marquee-tool.js} +8 -20
  309. package/lib/features/tools/marquee-selection/marquee-tool.js.map +1 -0
  310. package/lib/features/tools/{model.d.ts → marquee-selection/model.d.ts} +1 -1
  311. package/lib/features/tools/marquee-selection/model.d.ts.map +1 -0
  312. package/lib/features/tools/{model.js → marquee-selection/model.js} +2 -2
  313. package/lib/features/tools/marquee-selection/model.js.map +1 -0
  314. package/lib/features/tools/{view.d.ts → marquee-selection/view.d.ts} +1 -1
  315. package/lib/features/tools/marquee-selection/view.d.ts.map +1 -0
  316. package/lib/features/tools/{view.js → marquee-selection/view.js} +3 -4
  317. package/lib/features/tools/marquee-selection/view.js.map +1 -0
  318. package/lib/features/tools/node-creation/di.config.d.ts +19 -0
  319. package/lib/features/tools/node-creation/di.config.d.ts.map +1 -0
  320. package/lib/features/{rank/model.js → tools/node-creation/di.config.js} +12 -13
  321. package/lib/features/tools/node-creation/di.config.js.map +1 -0
  322. package/lib/features/tools/{node-creation-tool.d.ts → node-creation/node-creation-tool.d.ts} +7 -10
  323. package/lib/features/tools/node-creation/node-creation-tool.d.ts.map +1 -0
  324. package/lib/features/tools/{node-creation-tool.js → node-creation/node-creation-tool.js} +17 -30
  325. package/lib/features/tools/node-creation/node-creation-tool.js.map +1 -0
  326. package/lib/features/validation/marker-navigator.d.ts +4 -3
  327. package/lib/features/validation/marker-navigator.d.ts.map +1 -1
  328. package/lib/features/validation/marker-navigator.js +16 -20
  329. package/lib/features/validation/marker-navigator.js.map +1 -1
  330. package/lib/features/validation/marker-navigator.spec.d.ts +3 -0
  331. package/lib/features/validation/marker-navigator.spec.d.ts.map +1 -0
  332. package/lib/features/validation/marker-navigator.spec.js +182 -0
  333. package/lib/features/validation/marker-navigator.spec.js.map +1 -0
  334. package/lib/features/validation/validate.d.ts +2 -2
  335. package/lib/features/validation/validate.d.ts.map +1 -1
  336. package/lib/features/validation/validate.js +12 -17
  337. package/lib/features/validation/validate.js.map +1 -1
  338. package/lib/features/viewport/glsp-scroll-mouse-listener.js +3 -4
  339. package/lib/features/viewport/glsp-scroll-mouse-listener.js.map +1 -1
  340. package/lib/glsp-sprotty/index.d.ts +1 -1
  341. package/lib/glsp-sprotty/index.d.ts.map +1 -1
  342. package/lib/glsp-sprotty/index.js +26 -25
  343. package/lib/glsp-sprotty/index.js.map +1 -1
  344. package/lib/glsp-sprotty/types.d.ts +4 -8
  345. package/lib/glsp-sprotty/types.d.ts.map +1 -1
  346. package/lib/glsp-sprotty/types.js +1 -1
  347. package/lib/glsp-sprotty/types.js.map +1 -1
  348. package/lib/index.d.ts +36 -27
  349. package/lib/index.d.ts.map +1 -1
  350. package/lib/index.js +58 -46
  351. package/lib/index.js.map +1 -1
  352. package/lib/lib/model.js +1 -1
  353. package/lib/lib/model.js.map +1 -1
  354. package/lib/model-source/glsp-diagram-server.d.ts.map +1 -1
  355. package/lib/model-source/glsp-diagram-server.js +5 -3
  356. package/lib/model-source/glsp-diagram-server.js.map +1 -1
  357. package/lib/utils/argument-utils.js +3 -3
  358. package/lib/utils/argument-utils.js.map +1 -1
  359. package/lib/utils/marker.js +1 -1
  360. package/lib/utils/marker.js.map +1 -1
  361. package/lib/utils/smodel-util.spec.d.ts +2 -0
  362. package/lib/utils/smodel-util.spec.d.ts.map +1 -0
  363. package/lib/utils/smodel-util.spec.js +184 -0
  364. package/lib/utils/smodel-util.spec.js.map +1 -0
  365. package/lib/utils/viewpoint-util.d.ts +20 -1
  366. package/lib/utils/viewpoint-util.d.ts.map +1 -1
  367. package/lib/utils/viewpoint-util.js +30 -1
  368. package/lib/utils/viewpoint-util.js.map +1 -1
  369. package/lib/views/compartments.js +2 -3
  370. package/lib/views/compartments.js.map +1 -1
  371. package/lib/views/glsp-edge-view.js +2 -3
  372. package/lib/views/glsp-edge-view.js.map +1 -1
  373. package/lib/views/glsp-projection-view.js +2 -3
  374. package/lib/views/glsp-projection-view.js.map +1 -1
  375. package/lib/views/issue-marker-view.js +2 -3
  376. package/lib/views/issue-marker-view.js.map +1 -1
  377. package/lib/views/rounded-corner-view.js +2 -3
  378. package/lib/views/rounded-corner-view.js.map +1 -1
  379. package/package.json +3 -3
  380. package/src/base/action-dispatcher.ts +3 -1
  381. package/src/base/command-stack.ts +55 -3
  382. package/src/base/di.config.ts +34 -9
  383. package/src/base/drag-aware-mouse-listener.ts +2 -2
  384. package/src/base/editor-context-service.ts +28 -13
  385. package/src/{features/tool-feedback → base/feedback}/css-feedback.ts +1 -1
  386. package/src/{features/tool-feedback → base/feedback}/feedback-action-dispatcher.ts +31 -23
  387. package/src/base/{model → feedback}/update-model-command.ts +3 -29
  388. package/src/base/ranked.ts +42 -0
  389. package/src/{features/select → base}/selection-service.spec.ts +51 -121
  390. package/src/{features/select → base}/selection-service.ts +82 -31
  391. package/src/base/tool-manager/glsp-tool-manager.ts +4 -4
  392. package/src/{features/rank/model.ts → base/view/key-tool.ts} +9 -13
  393. package/src/{features/mouse-tool → base/view}/mouse-tool.ts +14 -15
  394. package/src/{base/container-modules.ts → container-modules.ts} +33 -26
  395. package/src/features/accessibility/resize-key-tool/resize-key-tool.ts +2 -2
  396. package/src/features/accessibility/search/search-palette.ts +1 -1
  397. package/src/features/accessibility/view-key-tools/movement-key-tool.ts +2 -2
  398. package/src/features/accessibility/view-key-tools/zoom-key-tool.ts +3 -3
  399. package/src/features/bounds/layouter-test-util.spec.ts +1 -1
  400. package/src/features/change-bounds/movement-restrictor.ts +1 -1
  401. package/src/features/context-menu/selection-service-aware-context-menu-mouse-listener.ts +2 -2
  402. package/src/features/copy-paste/copy-paste-context-menu.ts +1 -1
  403. package/src/features/edit-label/edit-label-tool.ts +4 -12
  404. package/src/features/hints/type-hints.ts +2 -2
  405. package/src/features/hover/hover.ts +2 -1
  406. package/src/features/layout/di.config.ts +1 -1
  407. package/src/features/layout/layout-elements-action.spec.ts +1 -3
  408. package/src/features/layout/layout-elements-action.ts +2 -2
  409. package/src/features/navigation/navigation-action-handler.ts +1 -1
  410. package/src/features/routing/di.config.ts +82 -0
  411. package/src/features/select/di.config.ts +2 -4
  412. package/src/features/select/{select-feedback-action.ts → select-feedback-command.ts} +2 -38
  413. package/src/features/select/select-mouse-listener.ts +2 -2
  414. package/src/features/source-model-watcher/source-model-changed-action-handler.ts +1 -1
  415. package/src/features/tool-palette/tool-palette.ts +12 -12
  416. package/src/features/tools/base-glsp-creation-tool.ts +40 -0
  417. package/src/features/tools/base-glsp-tool.ts +32 -10
  418. package/src/features/{tool-feedback → tools/change-bounds}/change-bounds-tool-feedback.ts +52 -21
  419. package/src/features/tools/{change-bounds-tool.ts → change-bounds/change-bounds-tool.ts} +64 -35
  420. package/src/features/tools/change-bounds/di.config.ts +31 -0
  421. package/src/features/{tool-feedback → tools/change-bounds}/view.tsx +2 -14
  422. package/src/features/tools/{delete-tool.ts → deletion/delete-tool.ts} +8 -18
  423. package/src/features/{mouse-tool → tools/deletion}/di.config.ts +7 -7
  424. package/src/features/{tool-feedback/creation-tool-feedback.ts → tools/edge-creation/dangling-edge-feedback.ts} +18 -88
  425. package/src/features/tools/edge-creation/di.config.ts +28 -0
  426. package/src/features/tools/edge-creation/edge-creation-tool-feedback.ts +89 -0
  427. package/src/features/tools/{edge-creation-tool.ts → edge-creation/edge-creation-tool.ts} +26 -43
  428. package/src/features/tools/edge-creation/view.tsx +33 -0
  429. package/src/features/tools/edge-edit/di.config.ts +41 -0
  430. package/src/features/{tool-feedback → tools/edge-edit}/edge-edit-tool-feedback.ts +27 -15
  431. package/src/features/tools/{edge-edit-tool.ts → edge-edit/edge-edit-tool.ts} +29 -27
  432. package/src/features/tools/enable-default-tools-on-focus-loss.ts +11 -2
  433. package/src/features/tools/marquee-selection/di.config.ts +35 -0
  434. package/src/features/tools/{marquee-behavior.ts → marquee-selection/marquee-behavior.ts} +9 -9
  435. package/src/features/tools/{marquee-mouse-tool.ts → marquee-selection/marquee-mouse-tool.ts} +11 -17
  436. package/src/features/{tool-feedback → tools/marquee-selection}/marquee-tool-feedback.ts +1 -1
  437. package/src/features/tools/{marquee-tool.ts → marquee-selection/marquee-tool.ts} +5 -11
  438. package/{lib/features/tools/di.config.d.ts → src/features/tools/node-creation/di.config.ts} +10 -12
  439. package/src/features/tools/{node-creation-tool.ts → node-creation/node-creation-tool.ts} +14 -31
  440. package/src/features/validation/marker-navigator.ts +5 -5
  441. package/src/features/validation/validate.ts +2 -2
  442. package/src/features/viewport/glsp-scroll-mouse-listener.ts +1 -1
  443. package/src/glsp-sprotty/index.ts +1 -1
  444. package/src/glsp-sprotty/types.ts +2 -4
  445. package/src/index.ts +63 -49
  446. package/src/model-source/glsp-diagram-server.ts +7 -1
  447. package/src/utils/smodel-util.spec.ts +3 -3
  448. package/src/utils/viewpoint-util.ts +32 -0
  449. package/lib/base/container-modules.d.ts.map +0 -1
  450. package/lib/base/container-modules.js.map +0 -1
  451. package/lib/base/model/update-model-command.d.ts.map +0 -1
  452. package/lib/base/model/update-model-command.js.map +0 -1
  453. package/lib/features/mouse-tool/di.config.d.ts.map +0 -1
  454. package/lib/features/mouse-tool/di.config.js.map +0 -1
  455. package/lib/features/mouse-tool/mouse-tool.d.ts +0 -22
  456. package/lib/features/mouse-tool/mouse-tool.d.ts.map +0 -1
  457. package/lib/features/mouse-tool/mouse-tool.js.map +0 -1
  458. package/lib/features/rank/model.d.ts.map +0 -1
  459. package/lib/features/rank/model.js.map +0 -1
  460. package/lib/features/select/select-feedback-action.d.ts +0 -25
  461. package/lib/features/select/select-feedback-action.d.ts.map +0 -1
  462. package/lib/features/select/select-feedback-action.js.map +0 -1
  463. package/lib/features/select/selection-service.d.ts.map +0 -1
  464. package/lib/features/select/selection-service.js.map +0 -1
  465. package/lib/features/tool-feedback/change-bounds-tool-feedback.d.ts.map +0 -1
  466. package/lib/features/tool-feedback/change-bounds-tool-feedback.js.map +0 -1
  467. package/lib/features/tool-feedback/creation-tool-feedback.d.ts.map +0 -1
  468. package/lib/features/tool-feedback/creation-tool-feedback.js.map +0 -1
  469. package/lib/features/tool-feedback/css-feedback.d.ts.map +0 -1
  470. package/lib/features/tool-feedback/css-feedback.js.map +0 -1
  471. package/lib/features/tool-feedback/di.config.d.ts.map +0 -1
  472. package/lib/features/tool-feedback/di.config.js +0 -53
  473. package/lib/features/tool-feedback/di.config.js.map +0 -1
  474. package/lib/features/tool-feedback/edge-edit-tool-feedback.d.ts.map +0 -1
  475. package/lib/features/tool-feedback/edge-edit-tool-feedback.js.map +0 -1
  476. package/lib/features/tool-feedback/feedback-action-dispatcher.d.ts.map +0 -1
  477. package/lib/features/tool-feedback/feedback-action-dispatcher.js.map +0 -1
  478. package/lib/features/tool-feedback/marquee-tool-feedback.d.ts.map +0 -1
  479. package/lib/features/tool-feedback/marquee-tool-feedback.js.map +0 -1
  480. package/lib/features/tool-feedback/model.d.ts.map +0 -1
  481. package/lib/features/tool-feedback/model.js.map +0 -1
  482. package/lib/features/tool-feedback/view.d.ts +0 -16
  483. package/lib/features/tool-feedback/view.d.ts.map +0 -1
  484. package/lib/features/tool-feedback/view.js.map +0 -1
  485. package/lib/features/tools/change-bounds-tool.d.ts.map +0 -1
  486. package/lib/features/tools/change-bounds-tool.js.map +0 -1
  487. package/lib/features/tools/delete-tool.d.ts.map +0 -1
  488. package/lib/features/tools/delete-tool.js.map +0 -1
  489. package/lib/features/tools/di.config.d.ts.map +0 -1
  490. package/lib/features/tools/di.config.js +0 -66
  491. package/lib/features/tools/di.config.js.map +0 -1
  492. package/lib/features/tools/edge-creation-tool.d.ts.map +0 -1
  493. package/lib/features/tools/edge-creation-tool.js.map +0 -1
  494. package/lib/features/tools/edge-edit-tool.d.ts.map +0 -1
  495. package/lib/features/tools/edge-edit-tool.js.map +0 -1
  496. package/lib/features/tools/glsp-manhattan-edge-router.d.ts.map +0 -1
  497. package/lib/features/tools/glsp-manhattan-edge-router.js.map +0 -1
  498. package/lib/features/tools/marquee-behavior.d.ts.map +0 -1
  499. package/lib/features/tools/marquee-behavior.js.map +0 -1
  500. package/lib/features/tools/marquee-mouse-tool.d.ts.map +0 -1
  501. package/lib/features/tools/marquee-mouse-tool.js.map +0 -1
  502. package/lib/features/tools/marquee-tool.d.ts +0 -14
  503. package/lib/features/tools/marquee-tool.d.ts.map +0 -1
  504. package/lib/features/tools/marquee-tool.js.map +0 -1
  505. package/lib/features/tools/model.d.ts.map +0 -1
  506. package/lib/features/tools/model.js.map +0 -1
  507. package/lib/features/tools/node-creation-tool.d.ts.map +0 -1
  508. package/lib/features/tools/node-creation-tool.js.map +0 -1
  509. package/lib/features/tools/view.d.ts.map +0 -1
  510. package/lib/features/tools/view.js.map +0 -1
  511. package/src/features/tool-feedback/di.config.ts +0 -65
  512. package/src/features/tools/di.config.ts +0 -77
  513. /package/lib/features/{tools → routing}/glsp-manhattan-edge-router.d.ts +0 -0
  514. /package/lib/features/{tools → routing}/glsp-manhattan-edge-router.js +0 -0
  515. /package/src/{features/tool-feedback/model.ts → base/feedback/feedback-command.ts} +0 -0
  516. /package/src/features/{tools → routing}/glsp-manhattan-edge-router.ts +0 -0
  517. /package/src/features/tools/{marquee-behavior.spec.ts → marquee-selection/marquee-behavior.spec.ts} +0 -0
  518. /package/src/features/tools/{model.ts → marquee-selection/model.ts} +0 -0
  519. /package/src/features/tools/{view.tsx → marquee-selection/view.tsx} +0 -0
@@ -17,27 +17,35 @@ import '@vscode/codicons/dist/codicon.css';
17
17
  import { Container, ContainerModule } from 'inversify';
18
18
  import {
19
19
  ActionHandlerRegistry,
20
- bindAsService,
21
- bindOrRebind,
22
- configureActionHandler,
23
- configureCommand,
24
20
  InitializeResult,
21
+ KeyTool,
22
+ LocationPostprocessor,
25
23
  ModelSource,
24
+ MouseTool,
25
+ MoveCommand,
26
26
  SetEditModeAction,
27
- SetModelCommand,
28
- TYPES
27
+ TYPES,
28
+ bindAsService,
29
+ bindOrRebind,
30
+ configureActionHandler,
31
+ configureCommand
29
32
  } from '~glsp-sprotty';
30
33
  import '../../css/glsp-sprotty.css';
31
34
  import { GLSPActionDispatcher } from './action-dispatcher';
32
35
  import { FocusStateChangedAction } from './actions/focus-change-action';
33
36
  import { GLSPCommandStack } from './command-stack';
34
37
  import { EditorContextService } from './editor-context-service';
38
+ import { ModifyCssFeedbackCommand } from './feedback/css-feedback';
39
+ import { FeedbackActionDispatcher } from './feedback/feedback-action-dispatcher';
40
+ import { FeedbackAwareUpdateModelCommand } from './feedback/update-model-command';
35
41
  import { FocusTracker } from './focus-tracker';
36
42
  import { DefaultModelInitializationConstraint, ModelInitializationConstraint } from './model-initialization-constraint';
37
43
  import { GLSPModelRegistry } from './model/model-registry';
38
- import { FeedbackAwareUpdateModelCommand, SetModelActionHandler } from './model/update-model-command';
39
44
  import { SelectionClearingMouseListener } from './selection-clearing-mouse-listener';
45
+ import { SelectionService } from './selection-service';
40
46
  import { GLSPToolManager } from './tool-manager/glsp-tool-manager';
47
+ import { GLSPKeyTool } from './view/key-tool';
48
+ import { GLSPMouseTool } from './view/mouse-tool';
41
49
  import { GLSPViewRegistry } from './view/view-registry';
42
50
 
43
51
  const defaultGLSPModule = new ContainerModule((bind, _unbind, isBound, rebind) => {
@@ -60,12 +68,17 @@ const defaultGLSPModule = new ContainerModule((bind, _unbind, isBound, rebind) =
60
68
  configureActionHandler(context, FocusStateChangedAction.KIND, FocusTracker);
61
69
 
62
70
  // Model update initialization ------------------------------------
71
+ bind(TYPES.IFeedbackActionDispatcher).to(FeedbackActionDispatcher).inSingletonScope();
63
72
  configureCommand(context, FeedbackAwareUpdateModelCommand);
64
- configureActionHandler(context, SetModelCommand.KIND, SetModelActionHandler);
73
+
74
+ bind(GLSPMouseTool).toSelf().inSingletonScope();
75
+ bindOrRebind(context, MouseTool).toService(GLSPMouseTool);
76
+ bind(GLSPKeyTool).toSelf().inSingletonScope();
77
+ bindOrRebind(context, KeyTool).toService(GLSPKeyTool);
65
78
 
66
79
  bindAsService(context, TYPES.MouseListener, SelectionClearingMouseListener);
67
80
 
68
- bindOrRebind(context, TYPES.ICommandStack).to(GLSPCommandStack);
81
+ bindOrRebind(context, TYPES.ICommandStack).to(GLSPCommandStack).inSingletonScope();
69
82
  bind(GLSPToolManager).toSelf().inSingletonScope();
70
83
  bindOrRebind(context, TYPES.IToolManager).toService(GLSPToolManager);
71
84
  bind(GLSPActionDispatcher).toSelf().inSingletonScope();
@@ -76,6 +89,18 @@ const defaultGLSPModule = new ContainerModule((bind, _unbind, isBound, rebind) =
76
89
  // support re-registration of model elements and views
77
90
  bindOrRebind(context, TYPES.SModelRegistry).to(GLSPModelRegistry).inSingletonScope();
78
91
  bindOrRebind(context, TYPES.ViewRegistry).to(GLSPViewRegistry).inSingletonScope();
92
+
93
+ bind(SelectionService).toSelf().inSingletonScope();
94
+ bind(TYPES.ISModelRootListener).toService(SelectionService);
95
+
96
+ // Feedback Support ------------------------------------
97
+ // Generic re-usable feedback modifying css classes
98
+ configureCommand(context, ModifyCssFeedbackCommand);
99
+ // We support using sprotty's MoveCommand as client-side visual feedback
100
+ configureCommand(context, MoveCommand);
101
+
102
+ bindAsService(context, TYPES.IVNodePostprocessor, LocationPostprocessor);
103
+ bind(TYPES.HiddenVNodePostprocessor).toService(LocationPostprocessor);
79
104
  });
80
105
 
81
106
  export default defaultGLSPModule;
@@ -24,8 +24,8 @@ import { Action, MouseListener, SModelElement } from '~glsp-sprotty';
24
24
  * of mouse up events.
25
25
  */
26
26
  export class DragAwareMouseListener extends MouseListener {
27
- private _isMouseDown = false;
28
- private _isMouseDrag = false;
27
+ protected _isMouseDown = false;
28
+ protected _isMouseDrag = false;
29
29
 
30
30
  override mouseDown(target: SModelElement, event: MouseEvent): Action[] {
31
31
  this._isMouseDown = true;
@@ -13,12 +13,16 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
- import { inject, injectable, multiInject, optional } from 'inversify';
16
+ import { inject, injectable, multiInject, optional, postConstruct, preDestroy } from 'inversify';
17
17
  import {
18
18
  Action,
19
19
  Args,
20
+ Disposable,
21
+ DisposableCollection,
20
22
  EditMode,
21
23
  EditorContext,
24
+ Emitter,
25
+ Event,
22
26
  IActionHandler,
23
27
  ModelSource,
24
28
  MousePositionTracker,
@@ -26,13 +30,12 @@ import {
26
30
  SModelRoot,
27
31
  SetEditModeAction,
28
32
  TYPES,
29
- distinctAdd,
30
- remove
33
+ ValueChange
31
34
  } from '~glsp-sprotty';
32
- import { SelectionService } from '../features/select/selection-service';
35
+ import { SelectionService } from './selection-service';
33
36
  import { isSourceUriAware } from './source-uri-aware';
34
37
 
35
- export interface EditModeListener {
38
+ export interface IEditModeListener {
36
39
  editModeChanged(newValue: string, oldValue: string): void;
37
40
  }
38
41
 
@@ -49,8 +52,8 @@ export interface EditModeListener {
49
52
  * position, etc.).
50
53
  */
51
54
  @injectable()
52
- export class EditorContextService implements IActionHandler {
53
- @inject(TYPES.SelectionService)
55
+ export class EditorContextService implements IActionHandler, Disposable {
56
+ @inject(SelectionService)
54
57
  protected selectionService: SelectionService;
55
58
 
56
59
  @inject(MousePositionTracker)
@@ -58,19 +61,31 @@ export class EditorContextService implements IActionHandler {
58
61
 
59
62
  @multiInject(TYPES.IEditModeListener)
60
63
  @optional()
61
- protected editModeListeners: EditModeListener[] = [];
64
+ protected editModeListeners: IEditModeListener[] = [];
62
65
 
63
66
  @inject(TYPES.ModelSourceProvider)
64
67
  protected modelSourceProvider: () => Promise<ModelSource>;
65
68
 
66
69
  protected _editMode: string;
67
70
 
68
- register(editModeListener: EditModeListener): void {
69
- distinctAdd(this.editModeListeners, editModeListener);
71
+ protected onEditModeChangedEmitter = new Emitter<ValueChange<string>>();
72
+ get onEditModeChanged(): Event<ValueChange<string>> {
73
+ return this.onEditModeChangedEmitter.event;
70
74
  }
71
75
 
72
- deregister(editModeListener: EditModeListener): void {
73
- remove(this.editModeListeners, editModeListener);
76
+ protected toDispose = new DisposableCollection();
77
+
78
+ @postConstruct()
79
+ protected initialize(): void {
80
+ this.toDispose.push(this.onEditModeChangedEmitter);
81
+ this.editModeListeners.forEach(listener =>
82
+ this.onEditModeChanged(change => listener.editModeChanged(change.newValue, change.oldValue))
83
+ );
84
+ }
85
+
86
+ @preDestroy()
87
+ dispose(): void {
88
+ this.toDispose.dispose();
74
89
  }
75
90
 
76
91
  get(args?: Args): EditorContext {
@@ -98,7 +113,7 @@ export class EditorContextService implements IActionHandler {
98
113
  }
99
114
 
100
115
  protected notifyEditModeListeners(oldValue: string): void {
101
- this.editModeListeners.forEach(listener => listener.editModeChanged(oldValue, this.editMode));
116
+ this.onEditModeChangedEmitter.fire({ newValue: this.editMode, oldValue });
102
117
  }
103
118
 
104
119
  async getSourceUri(): Promise<string | undefined> {
@@ -16,7 +16,7 @@
16
16
  import { inject, injectable } from 'inversify';
17
17
  import { Action, CommandExecutionContext, SModelElement, SModelRoot, TYPES, hasArrayProp } from '~glsp-sprotty';
18
18
  import { addCssClasses, getElements, removeCssClasses } from '../../utils/smodel-util';
19
- import { FeedbackCommand } from './model';
19
+ import { FeedbackCommand } from './feedback-command';
20
20
 
21
21
  export interface ModifyCSSFeedbackAction extends Action {
22
22
  kind: typeof ModifyCSSFeedbackAction.KIND;
@@ -14,7 +14,7 @@
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
16
  import { inject, injectable } from 'inversify';
17
- import { Action, IActionDispatcher, ILogger, TYPES } from '~glsp-sprotty';
17
+ import { Action, Disposable, IActionDispatcher, ILogger, TYPES } from '~glsp-sprotty';
18
18
 
19
19
  export interface IFeedbackEmitter {}
20
20
 
@@ -35,21 +35,23 @@ export interface IFeedbackActionDispatcher {
35
35
  /**
36
36
  * Registers `actions` to be sent out by a `feedbackEmitter`.
37
37
  * @param feedbackEmitter the emitter sending out feedback actions.
38
- * @param actions the actions to be sent out.
38
+ * @param feedbackActions the actions to be sent out.
39
+ * @param cleanupActions the actions to be sent out when the feedback is de-registered through the returned Disposable.
40
+ * @returns A 'Disposable' that de-registers the feedback and cleans up any pending feedback with the given `cleanupActions`.
39
41
  */
40
- registerFeedback(feedbackEmitter: IFeedbackEmitter, actions: Action[]): void;
42
+ registerFeedback(feedbackEmitter: IFeedbackEmitter, feedbackActions: Action[], cleanupActions?: Action[]): Disposable;
41
43
 
42
44
  /**
43
45
  * Deregisters a `feedbackEmitter` from this dispatcher and thereafter
44
46
  * dispatches the provided `actions`.
45
47
  * @param feedbackEmitter the emitter to be deregistered.
46
- * @param actions the actions to be dispatched right after the deregistration.
48
+ * @param cleanupActions the actions to be dispatched right after the deregistration.
47
49
  * These actions do not have to be related to the actions sent out by the
48
50
  * deregistered `feedbackEmitter`. The purpose of these actions typically is
49
51
  * to reset the normal state of the diagram without the feedback (e.g., reset a
50
52
  * CSS class that was set by a feedbackEmitter).
51
53
  */
52
- deregisterFeedback(feedbackEmitter: IFeedbackEmitter, actions: Action[]): void;
54
+ deregisterFeedback(feedbackEmitter: IFeedbackEmitter, cleanupActions?: Action[]): void;
53
55
 
54
56
  /**
55
57
  * Retrieve all `actions` sent out by currently registered `feedbackEmitter`.
@@ -59,41 +61,47 @@ export interface IFeedbackActionDispatcher {
59
61
 
60
62
  @injectable()
61
63
  export class FeedbackActionDispatcher implements IFeedbackActionDispatcher {
62
- protected feedbackEmitters: Map<IFeedbackEmitter, Action[]> = new Map();
64
+ protected registeredFeedback: Map<IFeedbackEmitter, Action[]> = new Map();
63
65
 
64
66
  @inject(TYPES.IActionDispatcherProvider) protected actionDispatcher: () => Promise<IActionDispatcher>;
65
67
  @inject(TYPES.ILogger) protected logger: ILogger;
66
68
 
67
- registerFeedback(feedbackEmitter: IFeedbackEmitter, actions: Action[]): void {
68
- this.feedbackEmitters.set(feedbackEmitter, actions);
69
- this.dispatch(actions, feedbackEmitter);
69
+ registerFeedback(feedbackEmitter: IFeedbackEmitter, feedbackActions: Action[], cleanupActions?: Action[] | undefined): Disposable {
70
+ this.registeredFeedback.set(feedbackEmitter, feedbackActions);
71
+ this.dispatchFeedback(feedbackActions, feedbackEmitter);
72
+ return Disposable.create(() => this.deregisterFeedback(feedbackEmitter, cleanupActions));
70
73
  }
71
74
 
72
- deregisterFeedback(feedbackEmitter: IFeedbackEmitter, actions: Action[]): void {
73
- this.feedbackEmitters.delete(feedbackEmitter);
74
- this.dispatch(actions, feedbackEmitter);
75
- }
76
-
77
- private dispatch(actions: Action[], feedbackEmitter: IFeedbackEmitter): void {
78
- this.actionDispatcher()
79
- .then(dispatcher => dispatcher.dispatchAll(actions))
80
- .then(() => this.logger.info(this, `Dispatched feedback actions for ${feedbackEmitter}`))
81
- .catch(reason => this.logger.error(this, 'Failed to dispatch feedback actions', reason));
75
+ deregisterFeedback(feedbackEmitter: IFeedbackEmitter, cleanupActions?: Action[] | undefined): void {
76
+ this.registeredFeedback.delete(feedbackEmitter);
77
+ if (cleanupActions) {
78
+ this.dispatchFeedback(cleanupActions, feedbackEmitter);
79
+ }
82
80
  }
83
81
 
84
82
  getRegisteredFeedback(): Action[] {
85
83
  const result: Action[] = [];
86
- this.feedbackEmitters.forEach((value, key) => result.push(...value));
84
+ this.registeredFeedback.forEach(actions => result.push(...actions));
87
85
  return result;
88
86
  }
89
87
 
90
88
  getRegisteredFeedbackEmitters(action: Action): IFeedbackEmitter[] {
91
89
  const result: IFeedbackEmitter[] = [];
92
- this.feedbackEmitters.forEach((value, key) => {
93
- if (value.find(a => a === action)) {
94
- result.push(key);
90
+ this.registeredFeedback.forEach((actions, emitter) => {
91
+ if (actions.includes(action)) {
92
+ result.push(emitter);
95
93
  }
96
94
  });
97
95
  return result;
98
96
  }
97
+
98
+ protected async dispatchFeedback(actions: Action[], feedbackEmitter: IFeedbackEmitter): Promise<void> {
99
+ try {
100
+ const actionDispatcher = await this.actionDispatcher();
101
+ await actionDispatcher.dispatchAll(actions);
102
+ this.logger.info(this, `Dispatched feedback actions for ${feedbackEmitter}`);
103
+ } catch (reason) {
104
+ this.logger.error(this, 'Failed to dispatch feedback actions', reason);
105
+ }
106
+ }
99
107
  }
@@ -13,46 +13,25 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
- import { inject, injectable, multiInject, optional } from 'inversify';
16
+ import { inject, injectable, optional } from 'inversify';
17
17
  import {
18
- Action,
19
18
  ActionHandlerRegistry,
20
19
  Animation,
21
20
  Command,
22
21
  CommandActionHandler,
23
22
  CommandExecutionContext,
24
23
  CommandReturn,
25
- IActionHandler,
26
24
  ILogger,
27
25
  MorphEdgesAnimation,
28
26
  SModelRoot,
29
- SetModelAction,
30
27
  TYPES,
31
28
  UpdateAnimationData,
32
29
  UpdateModelAction,
33
30
  UpdateModelCommand,
34
31
  toTypeGuard
35
32
  } from '~glsp-sprotty';
36
- import { IFeedbackActionDispatcher } from '../../features/tool-feedback/feedback-action-dispatcher';
37
- import { FeedbackCommand } from '../../features/tool-feedback/model';
38
-
39
- /**
40
- * ActionHandler that transforms a {@link SetModelAction} into an {@link UpdateModelAction} that can be handled
41
- * by the {@link FeedbackAwareUpdateModelCommand}. This can be done because in sprotty an {@link UpdateModelCommand} and
42
- * a {@link SetModelCommand} have the same behavior of no model is present yet.
43
- */
44
- @injectable()
45
- export class SetModelActionHandler implements IActionHandler {
46
- handle(action: Action): Action | void {
47
- if (SetModelAction.is(action)) {
48
- return UpdateModelAction.create(action.newRoot, { animate: false });
49
- }
50
- }
51
- }
52
-
53
- export interface SModelRootListener {
54
- modelRootChanged(root: Readonly<SModelRoot>): void;
55
- }
33
+ import { IFeedbackActionDispatcher } from './feedback-action-dispatcher';
34
+ import { FeedbackCommand } from './feedback-command';
56
35
 
57
36
  /**
58
37
  * A special {@link UpdateModelCommand} that retrieves all registered {@link Action}s from the {@link IFeedbackActionDispatcher}
@@ -68,10 +47,6 @@ export class FeedbackAwareUpdateModelCommand extends UpdateModelCommand {
68
47
  @optional()
69
48
  protected feedbackActionDispatcher: IFeedbackActionDispatcher;
70
49
 
71
- @multiInject(TYPES.SModelRootListener)
72
- @optional()
73
- protected modelRootListeners: SModelRootListener[] = [];
74
-
75
50
  protected actionHandlerRegistry?: ActionHandlerRegistry;
76
51
 
77
52
  constructor(
@@ -96,7 +71,6 @@ export class FeedbackAwareUpdateModelCommand extends UpdateModelCommand {
96
71
  feedbackCommands.forEach(command => command.execute(tempContext));
97
72
  }
98
73
 
99
- this.modelRootListeners.forEach(listener => listener.modelRootChanged(newRoot));
100
74
  return super.performUpdate(oldRoot, newRoot, context);
101
75
  }
102
76
 
@@ -0,0 +1,42 @@
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
+
17
+ import { AnyObject, hasNumberProp } from '~glsp-sprotty';
18
+
19
+ /**
20
+ * A common interface for services/listeners that should be
21
+ * orderable by a type or rank/priority.
22
+ */
23
+ export interface Ranked {
24
+ rank: number;
25
+ }
26
+
27
+ export namespace Ranked {
28
+ export const DEFAULT_RANK = 0;
29
+ export function is(object: unknown): object is Ranked {
30
+ return AnyObject.is(object) && hasNumberProp(object, 'rank');
31
+ }
32
+
33
+ /**
34
+ * Tries to retrieve the rank form the given object. If the object
35
+ * implements the {@link Ranked} interface the corresponding rank is returned
36
+ * otherwise the {@link DEFAULT_RANK} is returned.
37
+ * @param object
38
+ */
39
+ export function getRank(object: unknown): number {
40
+ return is(object) ? object.rank : DEFAULT_RANK;
41
+ }
42
+ }
@@ -15,20 +15,30 @@
15
15
  ********************************************************************************/
16
16
  import { AssertionError, expect } from 'chai';
17
17
  import { Container, injectable } from 'inversify';
18
- import { Action, SGraphFactory, SModelElementSchema, SModelRoot, TYPES, defaultModule, initializeContainer } from '~glsp-sprotty';
19
- import { IFeedbackActionDispatcher, IFeedbackEmitter } from '../tool-feedback/feedback-action-dispatcher';
20
- import { SelectFeedbackAction } from './select-feedback-action';
21
- import { SelectionListener, SelectionService } from './selection-service';
18
+ import * as sinon from 'sinon';
19
+ import {
20
+ Action,
21
+ Disposable,
22
+ SGraphFactory,
23
+ SModelElementSchema,
24
+ SModelRoot,
25
+ TYPES,
26
+ defaultModule,
27
+ initializeContainer
28
+ } from '~glsp-sprotty';
29
+ import { IFeedbackActionDispatcher, IFeedbackEmitter } from './feedback/feedback-action-dispatcher';
30
+ import { ISelectionListener, SelectFeedbackAction, SelectionService } from './selection-service';
22
31
 
23
32
  @injectable()
24
33
  class MockFeedbackActionDispatcher implements IFeedbackActionDispatcher {
25
34
  protected feedbackEmitters: Map<IFeedbackEmitter, Action[]> = new Map();
26
35
 
27
- registerFeedback(feedbackEmitter: IFeedbackEmitter, actions: Action[]): void {
36
+ registerFeedback(feedbackEmitter: IFeedbackEmitter, actions: Action[]): Disposable {
28
37
  this.feedbackEmitters.set(feedbackEmitter, actions);
38
+ return Disposable.create(() => this.deregisterFeedback(feedbackEmitter));
29
39
  }
30
40
 
31
- deregisterFeedback(feedbackEmitter: IFeedbackEmitter, actions: Action[]): void {
41
+ deregisterFeedback(feedbackEmitter: IFeedbackEmitter, _actions?: Action[]): void {
32
42
  this.feedbackEmitters.delete(feedbackEmitter);
33
43
  }
34
44
 
@@ -44,27 +54,9 @@ class MockFeedbackActionDispatcher implements IFeedbackActionDispatcher {
44
54
  }
45
55
  }
46
56
 
47
- class MockSelectionListener implements SelectionListener {
48
- private called = 0;
49
- private root: SModelRoot;
50
- private selectedElements: string[] = [];
51
-
52
- selectionChanged(newRoot: Readonly<SModelRoot>, selectedElements: string[]): void {
53
- this.called++;
54
- this.root = newRoot;
55
- this.selectedElements = selectedElements;
56
- }
57
-
58
- getRoot(): SModelRoot {
59
- return this.root;
60
- }
61
-
62
- getSelectedElements(): string[] {
63
- return this.selectedElements;
64
- }
65
-
66
- getCalled(): number {
67
- return this.called;
57
+ class MockSelectionListener implements ISelectionListener {
58
+ selectionChanged(root: Readonly<SModelRoot>, selectedElements: string[], deselectedElements: string[] | undefined): void {
59
+ // no.op
68
60
  }
69
61
  }
70
62
 
@@ -74,7 +66,6 @@ function createContainer(): Container {
74
66
  container.rebind(TYPES.IModelFactory).to(SGraphFactory).inSingletonScope();
75
67
  container.bind(TYPES.IFeedbackActionDispatcher).to(MockFeedbackActionDispatcher).inSingletonScope();
76
68
  container.bind(SelectionService).toSelf().inSingletonScope();
77
- container.bind(TYPES.SelectionService).toService(SelectionService);
78
69
  return container;
79
70
  }
80
71
 
@@ -90,7 +81,7 @@ describe('SelectionService', () => {
90
81
  // eslint-disable-next-line deprecation/deprecation
91
82
  graphFactory = container.get<SGraphFactory>(TYPES.IModelFactory);
92
83
  root = createRoot('node1', 'node2', 'node3', 'node4', 'node5');
93
- selectionService = container.get<SelectionService>(TYPES.SelectionService);
84
+ selectionService = container.get<SelectionService>(SelectionService);
94
85
  feedbackDispatcher = container.get<MockFeedbackActionDispatcher>(TYPES.IFeedbackActionDispatcher);
95
86
  });
96
87
 
@@ -207,118 +198,56 @@ describe('SelectionService', () => {
207
198
  });
208
199
  });
209
200
  describe('Listeners', () => {
201
+ const sandbox = sinon.createSandbox();
202
+ const listener = sandbox.createStubInstance(MockSelectionListener);
203
+
204
+ beforeEach(() => {
205
+ selectionService.onSelectionChanged(change =>
206
+ listener.selectionChanged(change.root, change.selectedElements, change.deselectedElements)
207
+ );
208
+ });
209
+
210
+ afterEach(() => {
211
+ selectionService.dispose();
212
+ sandbox.reset();
213
+ });
210
214
  it('A registered listener should be notified of a single selection change.', () => {
211
- const listener: MockSelectionListener = new MockSelectionListener();
212
- selectionService.register(listener);
213
- assertListener(listener, undefined, [], 0);
214
215
  selectionService.updateSelection(root, ['node1', 'node1'], []);
215
- assertListener(listener, root, ['node1'], 1);
216
+ assertListener(listener, root, ['node1'], [], 1);
216
217
  });
217
218
  it('A registered listener should be notified of a multi-selection change.', () => {
218
- const listener: MockSelectionListener = new MockSelectionListener();
219
- selectionService.register(listener);
220
- assertListener(listener, undefined, [], 0);
221
219
  selectionService.updateSelection(root, ['node1', 'node2', 'node3'], []);
222
- assertListener(listener, root, ['node1', 'node2', 'node3'], 1);
220
+ assertListener(listener, root, ['node1', 'node2', 'node3'], [], 1);
223
221
  });
224
222
  it('A registered listener should be notified of series of selection changes.', () => {
225
- const listener: MockSelectionListener = new MockSelectionListener();
226
- selectionService.register(listener);
227
- assertListener(listener, undefined, [], 0);
228
223
  selectionService.updateSelection(root, ['node1'], []);
229
- assertListener(listener, root, ['node1'], 1);
224
+ assertListener(listener, root, ['node1'], [], 1);
230
225
  selectionService.updateSelection(root, ['node2'], ['node1']);
231
- assertListener(listener, root, ['node2'], 2);
226
+ assertListener(listener, root, ['node2'], ['node1'], 2);
232
227
  selectionService.updateSelection(root, ['node3', 'node4'], []);
233
- assertListener(listener, root, ['node2', 'node3', 'node4'], 3);
228
+ assertListener(listener, root, ['node2', 'node3', 'node4'], [], 3);
234
229
  selectionService.updateSelection(root, [], ['node4']);
235
- assertListener(listener, root, ['node2', 'node3'], 4);
236
- });
237
- it('A registered listener should receive the selected elements in the right order.', () => {
238
- const listener: MockSelectionListener = new MockSelectionListener();
239
- selectionService.register(listener);
240
- assertListener(listener, undefined, [], 0);
241
- selectionService.updateSelection(root, ['node2', 'node1'], []);
242
- expect(() => assertListener(listener, root, ['node1', 'node2'], 1)).to.throw(AssertionError, 'ordered members');
230
+ assertListener(listener, root, ['node2', 'node3'], ['node4'], 4);
243
231
  });
244
232
  it('A registered listener should be notified of root changes.', () => {
245
- const listener: MockSelectionListener = new MockSelectionListener();
246
- selectionService.register(listener);
247
- assertListener(listener, undefined, [], 0);
248
233
  selectionService.updateSelection(root, [], []);
249
- assertListener(listener, root, [], 1);
234
+ assertListener(listener, root, [], [], 1);
250
235
 
251
236
  const newRoot = createRoot('node1', 'newNode2', 'newNode3');
252
237
  selectionService.updateSelection(newRoot, [], []);
253
- assertListener(listener, newRoot, [], 2);
254
- });
255
- it('Registering an already registered listener should have no effect.', () => {
256
- const listener: MockSelectionListener = new MockSelectionListener();
257
- selectionService.register(listener);
258
- selectionService.register(listener);
259
- selectionService.register(listener);
260
- assertListener(listener, undefined, [], 0);
261
- selectionService.updateSelection(root, ['node1', 'node2', 'node3'], []);
262
- assertListener(listener, root, ['node1', 'node2', 'node3'], 1);
263
- selectionService.register(listener);
264
- selectionService.updateSelection(root, [], ['node2']);
265
- assertListener(listener, root, ['node1', 'node3'], 2);
238
+ assertListener(listener, newRoot, [], [], 2);
266
239
  });
267
240
  it('Selecting the same elements consecutively should not trigger a listener update.', () => {
268
- const listener: MockSelectionListener = new MockSelectionListener();
269
- selectionService.register(listener);
270
- assertListener(listener, undefined, [], 0);
271
241
  selectionService.updateSelection(root, ['node1'], []);
272
- assertListener(listener, root, ['node1'], 1);
242
+ assertListener(listener, root, ['node1'], [], 1);
273
243
  selectionService.updateSelection(root, ['node1'], []);
274
- assertListener(listener, root, ['node1'], 1);
244
+ assertListener(listener, root, ['node1'], [], 1);
275
245
  });
276
246
  it('Selecting a not-existing elements should not trigger a listener update.', () => {
277
- const listener: MockSelectionListener = new MockSelectionListener();
278
- selectionService.register(listener);
279
- assertListener(listener, undefined, [], 0);
280
247
  selectionService.updateSelection(root, ['node1'], []);
281
- assertListener(listener, root, ['node1'], 1);
248
+ assertListener(listener, root, ['node1'], [], 1);
282
249
  selectionService.updateSelection(root, ['not-existing'], []);
283
- assertListener(listener, root, ['node1'], 1);
284
- });
285
- it('All registered listeners should be called on selection changes.', () => {
286
- const listener: MockSelectionListener = new MockSelectionListener();
287
- const listener2: MockSelectionListener = new MockSelectionListener();
288
- selectionService.register(listener);
289
- selectionService.register(listener2);
290
- assertListener(listener, undefined, [], 0);
291
- assertListener(listener2, undefined, [], 0);
292
- selectionService.updateSelection(root, ['node1'], []);
293
- assertListener(listener, root, ['node1'], 1);
294
- assertListener(listener2, root, ['node1'], 1);
295
- selectionService.updateSelection(root, ['node2'], ['node1']);
296
- assertListener(listener, root, ['node2'], 2);
297
- assertListener(listener2, root, ['node2'], 2);
298
- selectionService.updateSelection(root, ['node3', 'node4'], []);
299
- assertListener(listener, root, ['node2', 'node3', 'node4'], 3);
300
- assertListener(listener2, root, ['node2', 'node3', 'node4'], 3);
301
- selectionService.updateSelection(root, [], ['node4']);
302
- assertListener(listener, root, ['node2', 'node3'], 4);
303
- assertListener(listener2, root, ['node2', 'node3'], 4);
304
- });
305
- it('A deregistered listener should not receive further updates.', () => {
306
- const listener: MockSelectionListener = new MockSelectionListener();
307
- selectionService.register(listener);
308
- assertListener(listener, undefined, [], 0);
309
- selectionService.updateSelection(root, ['node1'], []);
310
- assertListener(listener, root, ['node1'], 1);
311
- selectionService.deregister(listener);
312
- selectionService.updateSelection(root, ['node2'], ['node1']);
313
- assertListener(listener, root, ['node1'], 1);
314
- selectionService.updateSelection(root, ['node3', 'node4'], []);
315
- assertListener(listener, root, ['node1'], 1);
316
- selectionService.updateSelection(root, [], ['node4']);
317
- assertListener(listener, root, ['node1'], 1);
318
-
319
- const newRoot = createRoot('node1', 'newNode2', 'newNode3');
320
- selectionService.updateSelection(newRoot, [], []);
321
- assertListener(listener, root, ['node1'], 1);
250
+ assertListener(listener, root, ['node1'], [], 1);
322
251
  });
323
252
  });
324
253
 
@@ -363,14 +292,15 @@ describe('SelectionService', () => {
363
292
  }
364
293
 
365
294
  function assertListener(
366
- listener: MockSelectionListener,
295
+ listener: sinon.SinonStubbedInstance<MockSelectionListener>,
367
296
  expectedRoot: SModelRoot | undefined,
368
297
  expectedSelection: string[],
298
+ expectedDeselection: string[],
369
299
  expectedCalled: number
370
300
  ): void {
371
- expect(listener.getRoot()).to.equal(expectedRoot);
372
- expect(listener.getSelectedElements()).to.have.lengthOf(expectedSelection.length);
373
- expect(listener.getSelectedElements()).to.have.ordered.members(expectedSelection);
374
- expect(listener.getCalled()).to.equal(expectedCalled);
301
+ expect(listener.selectionChanged.callCount).to.be.equal(expectedCalled);
302
+ expect(listener.selectionChanged.lastCall.args[0]).to.be.deep.equals(expectedRoot);
303
+ expect(listener.selectionChanged.lastCall.args[1]).to.be.deep.equals(expectedSelection);
304
+ expect(listener.selectionChanged.lastCall.args[2]).to.be.deep.equals(expectedDeselection);
375
305
  }
376
306
  });