@eclipse-glsp/client 2.8.0-next.10 → 2.8.0-next.13

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 (239) hide show
  1. package/README.md +1 -1
  2. package/css/grid.css +2 -1
  3. package/lib/base/action-dispatcher.js +1 -4
  4. package/lib/base/action-dispatcher.js.map +1 -1
  5. package/lib/base/auto-complete/auto-complete-widget.js +4 -8
  6. package/lib/base/auto-complete/auto-complete-widget.js.map +1 -1
  7. package/lib/base/auto-complete/base-autocomplete-palette.js +1 -2
  8. package/lib/base/auto-complete/base-autocomplete-palette.js.map +1 -1
  9. package/lib/base/editor-context-service.js +4 -7
  10. package/lib/base/editor-context-service.js.map +1 -1
  11. package/lib/base/feedback/css-feedback.js +1 -1
  12. package/lib/base/feedback/css-feedback.js.map +1 -1
  13. package/lib/base/feedback/feedback-action-dispatcher.js +4 -6
  14. package/lib/base/feedback/feedback-action-dispatcher.js.map +1 -1
  15. package/lib/base/feedback/feedback-command.js +1 -2
  16. package/lib/base/feedback/feedback-command.js.map +1 -1
  17. package/lib/base/feedback/feedback-emitter.js +1 -2
  18. package/lib/base/feedback/feedback-emitter.js.map +1 -1
  19. package/lib/base/feedback/set-model-command.js +1 -2
  20. package/lib/base/feedback/set-model-command.js.map +1 -1
  21. package/lib/base/feedback/update-model-command.js +1 -2
  22. package/lib/base/feedback/update-model-command.js.map +1 -1
  23. package/lib/base/model/diagram-loader.js +4 -6
  24. package/lib/base/model/diagram-loader.js.map +1 -1
  25. package/lib/base/model/glsp-model-source.d.ts +1 -1
  26. package/lib/base/model/glsp-model-source.d.ts.map +1 -1
  27. package/lib/base/model/glsp-model-source.js +3 -5
  28. package/lib/base/model/glsp-model-source.js.map +1 -1
  29. package/lib/base/model/model-registry.js +1 -2
  30. package/lib/base/model/model-registry.js.map +1 -1
  31. package/lib/base/selection-service.js +3 -3
  32. package/lib/base/selection-service.js.map +1 -1
  33. package/lib/base/shortcuts/available-shortcuts-extension.js +3 -2
  34. package/lib/base/shortcuts/available-shortcuts-extension.js.map +1 -1
  35. package/lib/base/shortcuts/available-shortcuts-tool.js +3 -2
  36. package/lib/base/shortcuts/available-shortcuts-tool.js.map +1 -1
  37. package/lib/base/tool-manager/tool-manager.js +1 -1
  38. package/lib/base/tool-manager/tool-manager.js.map +1 -1
  39. package/lib/base/ui-extension/ui-extension.js +4 -6
  40. package/lib/base/ui-extension/ui-extension.js.map +1 -1
  41. package/lib/features/accessibility/edge-autocomplete/edge-autocomplete-palette.js +12 -17
  42. package/lib/features/accessibility/edge-autocomplete/edge-autocomplete-palette.js.map +1 -1
  43. package/lib/features/accessibility/edge-autocomplete/edge-autocomplete-tool.js +3 -2
  44. package/lib/features/accessibility/edge-autocomplete/edge-autocomplete-tool.js.map +1 -1
  45. package/lib/features/accessibility/element-navigation/diagram-navigation-tool.js +11 -15
  46. package/lib/features/accessibility/element-navigation/diagram-navigation-tool.js.map +1 -1
  47. package/lib/features/accessibility/element-navigation/left-right-top-bottom-navigator.js +2 -3
  48. package/lib/features/accessibility/element-navigation/left-right-top-bottom-navigator.js.map +1 -1
  49. package/lib/features/accessibility/element-navigation/local-element-navigator.js +2 -3
  50. package/lib/features/accessibility/element-navigation/local-element-navigator.js.map +1 -1
  51. package/lib/features/accessibility/focus-tracker/focus-tracker-tool.js +5 -4
  52. package/lib/features/accessibility/focus-tracker/focus-tracker-tool.js.map +1 -1
  53. package/lib/features/accessibility/global-keylistener-tool.js +4 -3
  54. package/lib/features/accessibility/global-keylistener-tool.js.map +1 -1
  55. package/lib/features/accessibility/keyboard-grid/keyboard-grid-search-palette.js +3 -2
  56. package/lib/features/accessibility/keyboard-grid/keyboard-grid-search-palette.js.map +1 -1
  57. package/lib/features/accessibility/keyboard-tool-palette/keyboard-tool-palette.js +5 -7
  58. package/lib/features/accessibility/keyboard-tool-palette/keyboard-tool-palette.js.map +1 -1
  59. package/lib/features/accessibility/toast/toast-handler.js +2 -4
  60. package/lib/features/accessibility/toast/toast-handler.js.map +1 -1
  61. package/lib/features/accessibility/toast/toast-tool.js +3 -2
  62. package/lib/features/accessibility/toast/toast-tool.js.map +1 -1
  63. package/lib/features/accessibility/view-key-tools/deselect-key-tool.js +3 -2
  64. package/lib/features/accessibility/view-key-tools/deselect-key-tool.js.map +1 -1
  65. package/lib/features/accessibility/view-key-tools/grid-cell-zoom-key-tool.js +4 -3
  66. package/lib/features/accessibility/view-key-tools/grid-cell-zoom-key-tool.js.map +1 -1
  67. package/lib/features/bounds/freeform-layout.js +1 -1
  68. package/lib/features/bounds/freeform-layout.js.map +1 -1
  69. package/lib/features/bounds/hbox-layout.js +7 -10
  70. package/lib/features/bounds/hbox-layout.js.map +1 -1
  71. package/lib/features/bounds/layout-data.js +2 -4
  72. package/lib/features/bounds/layout-data.js.map +1 -1
  73. package/lib/features/bounds/local-bounds.js +3 -4
  74. package/lib/features/bounds/local-bounds.js.map +1 -1
  75. package/lib/features/bounds/set-bounds-feedback-command.js +2 -3
  76. package/lib/features/bounds/set-bounds-feedback-command.js.map +1 -1
  77. package/lib/features/bounds/vbox-layout.js +7 -10
  78. package/lib/features/bounds/vbox-layout.js.map +1 -1
  79. package/lib/features/change-bounds/model.js +1 -1
  80. package/lib/features/change-bounds/model.js.map +1 -1
  81. package/lib/features/change-bounds/move-element-handler.js +1 -2
  82. package/lib/features/change-bounds/move-element-handler.js.map +1 -1
  83. package/lib/features/change-bounds/movement-restrictor.js +1 -2
  84. package/lib/features/change-bounds/movement-restrictor.js.map +1 -1
  85. package/lib/features/change-bounds/point-position-updater.js +1 -1
  86. package/lib/features/change-bounds/point-position-updater.js.map +1 -1
  87. package/lib/features/change-bounds/resize/resize-default-tool.js +4 -3
  88. package/lib/features/change-bounds/resize/resize-default-tool.js.map +1 -1
  89. package/lib/features/change-bounds/resize/resize-handler.js +1 -2
  90. package/lib/features/change-bounds/resize/resize-handler.js.map +1 -1
  91. package/lib/features/change-bounds/resize/resize-tool.js +4 -3
  92. package/lib/features/change-bounds/resize/resize-tool.js.map +1 -1
  93. package/lib/features/change-bounds/tracker.js +1 -2
  94. package/lib/features/change-bounds/tracker.js.map +1 -1
  95. package/lib/features/command-palette/command-palette-tool.js +3 -2
  96. package/lib/features/command-palette/command-palette-tool.js.map +1 -1
  97. package/lib/features/command-palette/command-palette.js +2 -3
  98. package/lib/features/command-palette/command-palette.js.map +1 -1
  99. package/lib/features/context-menu/glsp-context-menu-mouse-listener.js +2 -3
  100. package/lib/features/context-menu/glsp-context-menu-mouse-listener.js.map +1 -1
  101. package/lib/features/copy-paste/copy-paste-handler.js +1 -2
  102. package/lib/features/copy-paste/copy-paste-handler.js.map +1 -1
  103. package/lib/features/copy-paste/copy-paste-standalone.js +6 -9
  104. package/lib/features/copy-paste/copy-paste-standalone.js.map +1 -1
  105. package/lib/features/debug/debug-bounds-decorator.js +9 -12
  106. package/lib/features/debug/debug-bounds-decorator.js.map +1 -1
  107. package/lib/features/debug/debug-model.js +1 -1
  108. package/lib/features/debug/debug-model.js.map +1 -1
  109. package/lib/features/decoration/decoration-placer.js +3 -2
  110. package/lib/features/decoration/decoration-placer.js.map +1 -1
  111. package/lib/features/element-template/add-template-element.js +3 -4
  112. package/lib/features/element-template/add-template-element.js.map +1 -1
  113. package/lib/features/element-template/mouse-tracking-element-position-listener.js +1 -1
  114. package/lib/features/element-template/mouse-tracking-element-position-listener.js.map +1 -1
  115. package/lib/features/element-template/remove-template-element.js +1 -1
  116. package/lib/features/element-template/remove-template-element.js.map +1 -1
  117. package/lib/features/export/default-png-diagram-exporter.js +4 -7
  118. package/lib/features/export/default-png-diagram-exporter.js.map +1 -1
  119. package/lib/features/export/diagram-export-postprocessor.js +1 -2
  120. package/lib/features/export/diagram-export-postprocessor.js.map +1 -1
  121. package/lib/features/export/glsp-svg-exporter.js +4 -4
  122. package/lib/features/export/glsp-svg-exporter.js.map +1 -1
  123. package/lib/features/export/request-export-command.js +1 -1
  124. package/lib/features/export/request-export-command.js.map +1 -1
  125. package/lib/features/grid/grid-model.js +1 -1
  126. package/lib/features/grid/grid-model.js.map +1 -1
  127. package/lib/features/helper-lines/helper-line-feedback.js +7 -8
  128. package/lib/features/helper-lines/helper-line-feedback.js.map +1 -1
  129. package/lib/features/hints/type-hint-provider.js +3 -5
  130. package/lib/features/hints/type-hint-provider.js.map +1 -1
  131. package/lib/features/label-edit/edit-label-tool.js +3 -2
  132. package/lib/features/label-edit/edit-label-tool.js.map +1 -1
  133. package/lib/features/label-edit-ui/label-edit-ui.js +2 -3
  134. package/lib/features/label-edit-ui/label-edit-ui.js.map +1 -1
  135. package/lib/features/navigation/navigation-target-resolver.js +1 -1
  136. package/lib/features/navigation/navigation-target-resolver.js.map +1 -1
  137. package/lib/features/routing/sticky-manhattan-anchors.js +9 -6
  138. package/lib/features/routing/sticky-manhattan-anchors.js.map +1 -1
  139. package/lib/features/routing/sticky-manhattan-edge-router.js +10 -12
  140. package/lib/features/routing/sticky-manhattan-edge-router.js.map +1 -1
  141. package/lib/features/search-palette/search-palette.js +3 -2
  142. package/lib/features/search-palette/search-palette.js.map +1 -1
  143. package/lib/features/search-palette/suggestions/edge-element-suggestions.js +2 -3
  144. package/lib/features/search-palette/suggestions/edge-element-suggestions.js.map +1 -1
  145. package/lib/features/search-palette/suggestions/named-element-suggestions.js +8 -11
  146. package/lib/features/search-palette/suggestions/named-element-suggestions.js.map +1 -1
  147. package/lib/features/select/select-feedback-command.js +1 -1
  148. package/lib/features/select/select-feedback-command.js.map +1 -1
  149. package/lib/features/select/select-mouse-listener.js +1 -2
  150. package/lib/features/select/select-mouse-listener.js.map +1 -1
  151. package/lib/features/status/status-overlay.js +4 -4
  152. package/lib/features/status/status-overlay.js.map +1 -1
  153. package/lib/features/tool-palette/tool-palette.js +14 -19
  154. package/lib/features/tool-palette/tool-palette.js.map +1 -1
  155. package/lib/features/tools/change-bounds/change-bounds-manager.js +4 -6
  156. package/lib/features/tools/change-bounds/change-bounds-manager.js.map +1 -1
  157. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js +3 -4
  158. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js.map +1 -1
  159. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js +4 -8
  160. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js.map +1 -1
  161. package/lib/features/tools/change-bounds/change-bounds-tool.js +6 -6
  162. package/lib/features/tools/change-bounds/change-bounds-tool.js.map +1 -1
  163. package/lib/features/tools/change-bounds/change-bounds-tracker.js +7 -10
  164. package/lib/features/tools/change-bounds/change-bounds-tracker.js.map +1 -1
  165. package/lib/features/tools/deletion/delete-tool.js +6 -4
  166. package/lib/features/tools/deletion/delete-tool.js.map +1 -1
  167. package/lib/features/tools/edge-creation/dangling-edge-feedback.js +4 -4
  168. package/lib/features/tools/edge-creation/dangling-edge-feedback.js.map +1 -1
  169. package/lib/features/tools/edge-creation/edge-creation-tool.js +5 -6
  170. package/lib/features/tools/edge-creation/edge-creation-tool.js.map +1 -1
  171. package/lib/features/tools/edge-creation/view.js +1 -2
  172. package/lib/features/tools/edge-creation/view.js.map +1 -1
  173. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js +4 -4
  174. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js.map +1 -1
  175. package/lib/features/tools/edge-edit/edge-edit-tool.js +3 -2
  176. package/lib/features/tools/edge-edit/edge-edit-tool.js.map +1 -1
  177. package/lib/features/tools/marquee-selection/marquee-mouse-tool.js +3 -2
  178. package/lib/features/tools/marquee-selection/marquee-mouse-tool.js.map +1 -1
  179. package/lib/features/tools/marquee-selection/marquee-tool-feedback.js +2 -2
  180. package/lib/features/tools/marquee-selection/marquee-tool-feedback.js.map +1 -1
  181. package/lib/features/tools/marquee-selection/marquee-tool.js +3 -2
  182. package/lib/features/tools/marquee-selection/marquee-tool.js.map +1 -1
  183. package/lib/features/tools/marquee-selection/model.js +1 -1
  184. package/lib/features/tools/marquee-selection/model.js.map +1 -1
  185. package/lib/features/tools/node-creation/container-manager.js +3 -4
  186. package/lib/features/tools/node-creation/container-manager.js.map +1 -1
  187. package/lib/features/tools/node-creation/insert-indicator.js +2 -2
  188. package/lib/features/tools/node-creation/insert-indicator.js.map +1 -1
  189. package/lib/features/tools/node-creation/node-creation-tool.js +5 -6
  190. package/lib/features/tools/node-creation/node-creation-tool.js.map +1 -1
  191. package/lib/features/tools/node-creation/node-creation-views.js +1 -2
  192. package/lib/features/tools/node-creation/node-creation-views.js.map +1 -1
  193. package/lib/features/validation/marker-navigator.js +1 -1
  194. package/lib/features/validation/marker-navigator.js.map +1 -1
  195. package/lib/features/validation/validate.js +4 -6
  196. package/lib/features/validation/validate.js.map +1 -1
  197. package/lib/features/viewport/origin-viewport.js +1 -1
  198. package/lib/features/viewport/origin-viewport.js.map +1 -1
  199. package/lib/features/viewport/reposition.js +2 -3
  200. package/lib/features/viewport/reposition.js.map +1 -1
  201. package/lib/features/viewport/viewport-handler.js +2 -3
  202. package/lib/features/viewport/viewport-handler.js.map +1 -1
  203. package/lib/features/viewport/viewport-tool.js +4 -3
  204. package/lib/features/viewport/viewport-tool.js.map +1 -1
  205. package/lib/features/zorder/bring-to-front-command.js +1 -2
  206. package/lib/features/zorder/bring-to-front-command.js.map +1 -1
  207. package/lib/model.js +2 -2
  208. package/lib/model.js.map +1 -1
  209. package/lib/utils/argument-utils.js +5 -5
  210. package/lib/utils/argument-utils.js.map +1 -1
  211. package/lib/utils/gmodel-util.js +4 -6
  212. package/lib/utils/gmodel-util.js.map +1 -1
  213. package/lib/utils/layout-utils.js +1 -2
  214. package/lib/utils/layout-utils.js.map +1 -1
  215. package/lib/views/glsp-projection-view.js +1 -2
  216. package/lib/views/glsp-projection-view.js.map +1 -1
  217. package/package.json +18 -17
  218. package/src/base/feedback/feedback-command.ts +1 -1
  219. package/src/base/model/glsp-model-source.ts +1 -1
  220. package/src/features/accessibility/README.md +5 -5
  221. package/src/features/accessibility/keyboard-tool-palette/keyboard-tool-palette.ts +1 -1
  222. package/src/base/action-dispatcher.spec.ts +0 -366
  223. package/src/base/feedback/feedback-emitter.spec.ts +0 -176
  224. package/src/base/model/model-initialization-constraint.spec.ts +0 -95
  225. package/src/base/selection-service.spec.ts +0 -318
  226. package/src/default-modules.spec.ts +0 -56
  227. package/src/features/bounds/freeform-layout.spec.ts +0 -216
  228. package/src/features/bounds/hbox-layout.spec.ts +0 -170
  229. package/src/features/bounds/layouter-test-util.spec.ts +0 -127
  230. package/src/features/bounds/vbox-layout.spec.ts +0 -170
  231. package/src/features/change-bounds/point-position-updater.spec.ts +0 -81
  232. package/src/features/grid/grid-snapper.spec.ts +0 -30
  233. package/src/features/hints/type-hint-provider.spec.ts +0 -360
  234. package/src/features/layout/layout-elements-action.spec.ts +0 -426
  235. package/src/features/navigation/navigation-target-resolver.spec.ts +0 -56
  236. package/src/features/routing/sticky-manhattan-edge-router.spec.ts +0 -212
  237. package/src/features/tools/marquee-selection/marquee-behavior.spec.ts +0 -176
  238. package/src/features/validation/marker-navigator.spec.ts +0 -183
  239. package/src/utils/gmodel-util.spec.ts +0 -221
@@ -1,81 +0,0 @@
1
- /********************************************************************************
2
- * Copyright (c) 2022-2026 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
- /* eslint-disable import-x/no-deprecated */
17
- /* eslint-disable @typescript-eslint/no-deprecated */
18
-
19
- import { GModelElement } from '@eclipse-glsp/sprotty';
20
- import { expect } from 'chai';
21
- import { GridSnapper } from './../grid/grid-snapper';
22
- import { PointPositionUpdater } from './point-position-updater';
23
-
24
- describe('PointPositionUpdater', () => {
25
- it('updatePosition with no last drag position', () => {
26
- const element = new GModelElement();
27
- const updater = new PointPositionUpdater();
28
- expect(updater.updatePosition(element, { x: 0, y: 0 }, false)).to.be.undefined;
29
- expect(updater.updatePosition(element, { x: 0, y: 0 }, true)).to.be.undefined;
30
- });
31
-
32
- it('update last position and reset', () => {
33
- const updater = new PointPositionUpdater();
34
- expect(updater.isLastDragPositionUndefined()).to.be.true;
35
- updater.updateLastDragPosition({ x: 0, y: 0 });
36
- expect(updater.isLastDragPositionUndefined()).to.be.false;
37
- updater.resetPosition();
38
- expect(updater.isLastDragPositionUndefined()).to.be.true;
39
- });
40
-
41
- it('updatePosition with no snapper', () => {
42
- const element = new GModelElement();
43
- const updater = new PointPositionUpdater();
44
- resetUpdater(updater);
45
- expect(updater.updatePosition(element, { x: 0, y: 0 }, false)).to.be.undefined;
46
- expect(updater.updatePosition(element, { x: 0, y: 0 }, true)).to.be.undefined;
47
-
48
- resetUpdater(updater);
49
- expect(updater.updatePosition(element, { x: 5, y: 3 }, false)).to.be.deep.equals({ x: 5, y: 3 });
50
- expect(updater.updatePosition(element, { x: 5, y: 3 }, true)).to.be.undefined;
51
- expect(updater.updatePosition(element, { x: 11, y: 6 }, false)).to.be.deep.equals({ x: 6, y: 3 });
52
- expect(updater.updatePosition(element, { x: -3, y: 2 }, true)).to.be.deep.equals({ x: -14, y: -4 });
53
- });
54
-
55
- it('updatePosition with snapper', () => {
56
- const element = new GModelElement();
57
- const snapper = new GridSnapper();
58
- const updater = new PointPositionUpdater(snapper);
59
- resetUpdater(updater);
60
- expect(updater.updatePosition(element, { x: 0, y: 0 }, false)).to.be.undefined;
61
- expect(updater.updatePosition(element, { x: 0, y: 0 }, true)).to.be.undefined;
62
-
63
- resetUpdater(updater);
64
- expect(updater.updatePosition(element, { x: 5, y: 3 }, true)).to.be.deep.equals({ x: 10, y: 0 });
65
- expect(updater.updatePosition(element, { x: 5, y: 3 }, true)).to.be.undefined;
66
- expect(updater.updatePosition(element, { x: 11, y: 6 }, true)).to.be.deep.equals({ x: 0, y: 10 });
67
- expect(updater.updatePosition(element, { x: -3, y: 2 }, true)).to.be.deep.equals({ x: -10, y: -10 });
68
-
69
- // disable snapping (alt key)
70
- resetUpdater(updater);
71
- expect(updater.updatePosition(element, { x: 5, y: 3 }, false)).to.be.deep.equals({ x: 5, y: 3 });
72
- expect(updater.updatePosition(element, { x: 5, y: 3 }, false)).to.be.undefined;
73
- expect(updater.updatePosition(element, { x: 11, y: 6 }, false)).to.be.deep.equals({ x: 6, y: 3 });
74
- expect(updater.updatePosition(element, { x: -3, y: 2 }, false)).to.be.deep.equals({ x: -14, y: -4 });
75
- });
76
-
77
- function resetUpdater(updater: PointPositionUpdater): void {
78
- updater.resetPosition();
79
- updater.updateLastDragPosition({ x: 0, y: 0 });
80
- }
81
- });
@@ -1,30 +0,0 @@
1
- /********************************************************************************
2
- * Copyright (c) 2022-2024 EclipseSource and others.
3
- *
4
- * This program and the accompanying materials are made available under the
5
- * terms of the Eclipse Public License v. 2.0 which is available at
6
- * http://www.eclipse.org/legal/epl-2.0.
7
- *
8
- * This Source Code may also be made available under the following Secondary
9
- * Licenses when the conditions for such availability set forth in the Eclipse
10
- * Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
- * with the GNU Classpath Exception which is available at
12
- * https://www.gnu.org/software/classpath/license.html.
13
- *
14
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
- ********************************************************************************/
16
-
17
- import { GModelElement } from '@eclipse-glsp/sprotty';
18
- import { expect } from 'chai';
19
- import { GridSnapper } from './grid-snapper';
20
-
21
- describe('GridSnapper', () => {
22
- it('snap', () => {
23
- const element = new GModelElement();
24
- const snapper = new GridSnapper();
25
- expect(snapper.snap({ x: 0, y: 0 }, element)).to.be.deep.equals({ x: 0, y: 0 });
26
- expect(snapper.snap({ x: 4, y: 5 }, element)).to.be.deep.equals({ x: 0, y: 10 });
27
- expect(snapper.snap({ x: 8, y: 11 }, element)).to.be.deep.equals({ x: 10, y: 10 });
28
- expect(snapper.snap({ x: -7, y: -4 }, element)).to.be.deep.equals({ x: -10, y: -0 });
29
- });
30
- });
@@ -1,360 +0,0 @@
1
- /********************************************************************************
2
- * Copyright (c) 2023-2024 EclipseSource and others.
3
- *
4
- * This program and the accompanying materials are made available under the
5
- * terms of the Eclipse Public License v. 2.0 which is available at
6
- * http://www.eclipse.org/legal/epl-2.0.
7
- *
8
- * This Source Code may also be made available under the following Secondary
9
- * Licenses when the conditions for such availability set forth in the Eclipse
10
- * Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
- * with the GNU Classpath Exception which is available at
12
- * https://www.gnu.org/software/classpath/license.html.
13
- *
14
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
- ********************************************************************************/
16
- import {
17
- AnimationFrameSyncer,
18
- CommandExecutionContext,
19
- ConsoleLogger,
20
- EdgeTypeHint,
21
- GChildElement,
22
- GModelFactory,
23
- GModelRoot,
24
- GNode,
25
- SetTypeHintsAction,
26
- ShapeTypeHint,
27
- TYPES,
28
- Writable,
29
- bindOrRebind,
30
- createFeatureSet,
31
- editFeature,
32
- isDeletable,
33
- isMoveable
34
- } from '@eclipse-glsp/sprotty';
35
- import { expect } from 'chai';
36
- import { Container } from 'inversify';
37
- import * as sinon from 'sinon';
38
- import { GLSPActionDispatcher } from '../../base/action-dispatcher';
39
- import { FeedbackActionDispatcher } from '../../base/feedback/feedback-action-dispatcher';
40
- import { FeedbackEmitter } from '../../base/feedback/feedback-emitter';
41
- import { GEdge } from '../../model';
42
- import { isResizable } from '../change-bounds/model';
43
- import { isReconnectable } from '../reconnect/model';
44
- import { Containable, isContainable, isReparentable } from './model';
45
- import { ApplyTypeHintsAction, ApplyTypeHintsCommand, ITypeHintProvider, TypeHintProvider } from './type-hint-provider';
46
- describe('TypeHintProvider', () => {
47
- const container = new Container();
48
- container.bind(GLSPActionDispatcher).toConstantValue(sinon.createStubInstance(GLSPActionDispatcher));
49
- container.bind(TYPES.IActionDispatcher).toService(GLSPActionDispatcher);
50
- const stub = sinon.createStubInstance(FeedbackActionDispatcher);
51
- stub.createEmitter.returns(new FeedbackEmitter(stub));
52
- container.bind(TYPES.IFeedbackActionDispatcher).toConstantValue(stub);
53
- const typeHintProvider = container.resolve(TypeHintProvider);
54
-
55
- describe('getShapeTypeHint', () => {
56
- const nodeHint: ShapeTypeHint = {
57
- deletable: true,
58
- elementTypeId: 'node',
59
- reparentable: false,
60
- repositionable: true,
61
- resizable: true
62
- };
63
- const taskHint: ShapeTypeHint = {
64
- deletable: true,
65
- elementTypeId: 'node:task',
66
- reparentable: false,
67
- repositionable: true,
68
- resizable: true
69
- };
70
-
71
- it('should return `undefined` if no `SetTypeHintsAction` has been handled yet', () => {
72
- expect(typeHintProvider.getShapeTypeHint('some')).to.be.undefined;
73
- });
74
- it('should return `undefined` if no hint is registered for the given type (exact type match)', () => {
75
- typeHintProvider.handle(SetTypeHintsAction.create({ shapeHints: [nodeHint], edgeHints: [] }));
76
- expect(typeHintProvider.getShapeTypeHint('port')).to.be.undefined;
77
- });
78
- it('should return the corresponding type hint for the given type (exact type match)', () => {
79
- typeHintProvider.handle(SetTypeHintsAction.create({ shapeHints: [nodeHint, taskHint], edgeHints: [] }));
80
- expect(typeHintProvider.getShapeTypeHint('node')).to.equal(nodeHint);
81
- expect(typeHintProvider.getShapeTypeHint('node:task')).to.equal(taskHint);
82
- });
83
- it('should return the corresponding type hint for the given type (sub type match)', () => {
84
- typeHintProvider.handle(SetTypeHintsAction.create({ shapeHints: [nodeHint, taskHint], edgeHints: [] }));
85
- expect(typeHintProvider.getShapeTypeHint('node:task:manual')).to.equal(taskHint);
86
- expect(typeHintProvider.getShapeTypeHint('node:task:manual:foo')).to.equal(taskHint);
87
- expect(typeHintProvider.getShapeTypeHint('node:event')).to.equal(nodeHint);
88
- expect(typeHintProvider.getShapeTypeHint('node:event:initial')).to.equal(nodeHint);
89
- });
90
- });
91
- describe('getEdgeTypeHint', () => {
92
- const edgeHint: EdgeTypeHint = {
93
- deletable: true,
94
- elementTypeId: 'edge',
95
- repositionable: true,
96
- routable: true,
97
- dynamic: false
98
- };
99
- const fooEdgeHint: EdgeTypeHint = {
100
- deletable: true,
101
- elementTypeId: 'edge:foo',
102
- repositionable: true,
103
- routable: true,
104
- dynamic: true
105
- };
106
- it('should return `undefined` if no `SetTypeHintsAction` has been handled yet', () => {
107
- expect(typeHintProvider.getEdgeTypeHint('some')).to.be.undefined;
108
- });
109
- it('should return `undefined` if no hint is registered for the given type (exact type match)', () => {
110
- typeHintProvider.handle(SetTypeHintsAction.create({ shapeHints: [], edgeHints: [edgeHint] }));
111
- expect(typeHintProvider.getEdgeTypeHint('link')).to.be.undefined;
112
- });
113
- it('should return the corresponding type hint for the given type (exact type match)', () => {
114
- typeHintProvider.handle(SetTypeHintsAction.create({ shapeHints: [], edgeHints: [edgeHint, fooEdgeHint] }));
115
- expect(typeHintProvider.getEdgeTypeHint('edge')).to.equal(edgeHint);
116
- expect(typeHintProvider.getEdgeTypeHint('edge:foo')).to.equal(fooEdgeHint);
117
- });
118
- it('should return the corresponding type hint for the given type (sub type match)', () => {
119
- typeHintProvider.handle(SetTypeHintsAction.create({ shapeHints: [], edgeHints: [edgeHint, fooEdgeHint] }));
120
- expect(typeHintProvider.getEdgeTypeHint('edge:foo:bar')).to.equal(fooEdgeHint);
121
- expect(typeHintProvider.getEdgeTypeHint('edge:foo:bar:baz')).to.equal(fooEdgeHint);
122
- expect(typeHintProvider.getEdgeTypeHint('edge:some')).to.equal(edgeHint);
123
- expect(typeHintProvider.getEdgeTypeHint('edge:some:other')).to.equal(edgeHint);
124
- });
125
- });
126
- });
127
- describe('ApplyTypeHintCommand', () => {
128
- function createCommandExecutionContext(child: GChildElement): CommandExecutionContext {
129
- const root = new GModelRoot();
130
- root.id = 'root';
131
- root.type = 'root';
132
- root.add(child);
133
- return {
134
- root,
135
- modelFactory,
136
- duration: 0,
137
- modelChanged: undefined!,
138
- logger: new ConsoleLogger(),
139
- syncer: new AnimationFrameSyncer()
140
- };
141
- }
142
-
143
- function createNode(type?: string): GNode {
144
- const node = new GNode();
145
- node.type = type ?? 'node';
146
- node.id = 'node';
147
- node.features = createFeatureSet(GNode.DEFAULT_FEATURES);
148
- return node;
149
- }
150
-
151
- function createEdge(type?: string): GEdge {
152
- const edge = new GEdge();
153
- edge.type = type ?? 'edge';
154
- edge.id = 'edge';
155
- edge.features = createFeatureSet(GEdge.DEFAULT_FEATURES);
156
- return edge;
157
- }
158
-
159
- const sandbox = sinon.createSandbox();
160
- const container = new Container();
161
- const modelFactory = sinon.createStubInstance(GModelFactory);
162
- const typeHintProviderMock = sandbox.stub<ITypeHintProvider>({
163
- getEdgeTypeHint: () => undefined,
164
- getShapeTypeHint: () => undefined
165
- });
166
- container.bind(GLSPActionDispatcher).toConstantValue(sandbox.createStubInstance(GLSPActionDispatcher));
167
- container.bind(TYPES.IActionDispatcher).toService(GLSPActionDispatcher);
168
- container.bind(TYPES.IFeedbackActionDispatcher).toConstantValue(sandbox.createStubInstance(FeedbackActionDispatcher));
169
- container.bind(TYPES.ITypeHintProvider).toConstantValue(typeHintProviderMock);
170
- bindOrRebind(container, TYPES.Action).toConstantValue(ApplyTypeHintsAction.create());
171
- const command = container.resolve(ApplyTypeHintsCommand);
172
-
173
- beforeEach(() => {
174
- sandbox.reset();
175
- });
176
-
177
- describe('test hints to model feature translation (after command execution)`', () => {
178
- describe('ShapeTypeHint', () => {
179
- const allEnabledHint: ShapeTypeHint = {
180
- elementTypeId: 'node',
181
- deletable: true,
182
- reparentable: true,
183
- repositionable: true,
184
- resizable: true,
185
- containableElementTypeIds: []
186
- };
187
- const allDisabledHint: ShapeTypeHint = {
188
- elementTypeId: 'node',
189
- deletable: false,
190
- reparentable: false,
191
- repositionable: false,
192
- resizable: false,
193
- containableElementTypeIds: []
194
- };
195
- it('should not modify feature set of model element with no applicable type hint', () => {
196
- typeHintProviderMock.getShapeTypeHint.returns(undefined);
197
- const result = command.execute(createCommandExecutionContext(createNode()));
198
- const element = result.children[0];
199
- expect(GNode.DEFAULT_FEATURES, 'Element should have default feature set').to.have.same.members([
200
- ...(element.features as Set<symbol>)
201
- ]);
202
- });
203
- it('should add all enabled (`true`) features, derived from the applied type hint, to the model', () => {
204
- typeHintProviderMock.getShapeTypeHint.returns(allEnabledHint);
205
- const result = command.execute(createCommandExecutionContext(createNode()));
206
- const element = result.children[0];
207
- expect(isDeletable(element), 'Element should have deletable feature').to.be.true;
208
- expect(isReparentable(element), 'Element should have reparentable feature').to.be.true;
209
- expect(isMoveable(element), 'Element should have moveable feature').to.be.true;
210
- expect(isContainable(element), 'Element should have containable feature').to.be.true;
211
- expect(isResizable(element), 'Element should have resizeable feature').to.be.true;
212
- });
213
- it('should remove all disabled (`false`) features, derived from the applied type hint, from the model', () => {
214
- typeHintProviderMock.getShapeTypeHint.returns(allDisabledHint);
215
- const result = command.execute(createCommandExecutionContext(createNode()));
216
- const element = result.children[0];
217
- expect(isDeletable(element), 'Element should not have deletable feature').to.be.false;
218
- expect(isReparentable(element), 'Element should not have reparentable feature').to.be.false;
219
- expect(isMoveable(element), 'Element should not have moveable feature').to.be.false;
220
- expect(isResizable(element), 'Element should not have resizeable feature').to.be.false;
221
- });
222
- describe('`isConnectable` (after hint has been applied to element)', () => {
223
- const shapeHint: Writable<ShapeTypeHint> = {
224
- deletable: false,
225
- elementTypeId: 'node',
226
- reparentable: false,
227
- repositionable: false,
228
- resizable: false
229
- };
230
- const edgeHint: Writable<EdgeTypeHint> = {
231
- deletable: false,
232
- elementTypeId: 'edge',
233
- repositionable: false,
234
- routable: false
235
- };
236
- it('should return `true` if source/target elements are not defined in edge hint', () => {
237
- typeHintProviderMock.getShapeTypeHint.returns(shapeHint);
238
- typeHintProviderMock.getEdgeTypeHint.returns(edgeHint);
239
- const result = command.execute(createCommandExecutionContext(createNode()));
240
- const element = result.children[0] as GNode;
241
- const edge = createEdge();
242
- expect(element.canConnect(edge, 'source')).to.be.true;
243
- expect(element.canConnect(edge, 'target')).to.be.true;
244
- });
245
- it('should return `false` if element type is not in source/target elements of edge hint', () => {
246
- typeHintProviderMock.getShapeTypeHint.returns(shapeHint);
247
- typeHintProviderMock.getEdgeTypeHint.returns(edgeHint);
248
- edgeHint.sourceElementTypeIds = [];
249
- edgeHint.targetElementTypeIds = [];
250
- const result = command.execute(createCommandExecutionContext(createNode()));
251
- const element = result.children[0] as GNode;
252
- const edge = createEdge();
253
- expect(element.canConnect(edge, 'source')).to.be.false;
254
- expect(element.canConnect(edge, 'target')).to.be.false;
255
- });
256
- it('should return `true` if element type is in source/target elements of edge hint (exact type)', () => {
257
- typeHintProviderMock.getShapeTypeHint.returns(shapeHint);
258
- typeHintProviderMock.getEdgeTypeHint.returns(edgeHint);
259
- edgeHint.sourceElementTypeIds = ['node'];
260
- edgeHint.targetElementTypeIds = ['node'];
261
- const result = command.execute(createCommandExecutionContext(createNode()));
262
- const element = result.children[0] as GNode;
263
- const edge = createEdge();
264
- expect(element.canConnect(edge, 'source')).to.be.true;
265
- expect(element.canConnect(edge, 'target')).to.be.true;
266
- });
267
- it('should return `true` if element super type is in source/target elements of edge hint (super type)', () => {
268
- typeHintProviderMock.getShapeTypeHint.returns(shapeHint);
269
- typeHintProviderMock.getEdgeTypeHint.returns(edgeHint);
270
- edgeHint.sourceElementTypeIds = ['node'];
271
- edgeHint.targetElementTypeIds = ['node'];
272
- const result = command.execute(createCommandExecutionContext(createNode('node:task:automated')));
273
- const element = result.children[0] as GNode;
274
- const edge = createEdge();
275
- expect(element.canConnect(edge, 'source')).to.be.true;
276
- expect(element.canConnect(edge, 'target')).to.be.true;
277
- });
278
- it('should fallback to class-level `canConnect` implementation if no edge hint is applicable to routable', () => {
279
- typeHintProviderMock.getEdgeTypeHint.returns(undefined);
280
- typeHintProviderMock.getShapeTypeHint.returns(shapeHint);
281
- const node = createNode();
282
- const originalCanConnectSpy = sinon.spy(node, 'canConnect');
283
- const result = command.execute(createCommandExecutionContext(node));
284
- const element = result.children[0] as GNode;
285
- const edge = createEdge();
286
- expect(element.canConnect(edge, 'source')).to.be.true;
287
- expect(element.canConnect(edge, 'target')).to.be.true;
288
- expect(originalCanConnectSpy.called).to.be.true;
289
- });
290
- });
291
- describe('`isContainable` (after hint has been applied to element)', () => {
292
- const shapeHint: Writable<ShapeTypeHint> = {
293
- deletable: false,
294
- elementTypeId: 'node',
295
- reparentable: false,
296
- repositionable: false,
297
- resizable: false
298
- };
299
- it('should return `false` if corresponding hint has no containable elements defined', () => {
300
- typeHintProviderMock.getShapeTypeHint.returns(shapeHint);
301
- const result = command.execute(createCommandExecutionContext(createNode('node')));
302
- const element = result.children[0] as GNode & Containable;
303
- expect(element.isContainableElement('other')).to.be.false;
304
- });
305
- it('should return `true` if corresponding hint has containable element with matching type', () => {
306
- typeHintProviderMock.getShapeTypeHint.returns(shapeHint);
307
- shapeHint.containableElementTypeIds = ['node'];
308
- const result = command.execute(createCommandExecutionContext(createNode('node')));
309
- const element = result.children[0] as GNode & Containable;
310
- expect(element.isContainableElement('node')).to.be.true;
311
- });
312
- it('should return `true` if corresponding hint as has containable element with matching super type', () => {
313
- typeHintProviderMock.getShapeTypeHint.returns(shapeHint);
314
- shapeHint.containableElementTypeIds = ['node'];
315
- const result = command.execute(createCommandExecutionContext(createNode('node')));
316
- const element = result.children[0] as GNode & Containable;
317
- expect(element.isContainableElement('node:task:automated')).to.be.true;
318
- });
319
- });
320
- });
321
- describe('EdgeTypeHint', () => {
322
- const allEnabledHint: EdgeTypeHint = {
323
- elementTypeId: 'edge',
324
- deletable: true,
325
- repositionable: true,
326
- routable: true
327
- };
328
- const allDisabledHint: EdgeTypeHint = {
329
- elementTypeId: 'edge',
330
- deletable: false,
331
- repositionable: false,
332
- routable: false
333
- };
334
- it('should not modify feature set of model element with no applicable type hint', () => {
335
- typeHintProviderMock.getEdgeTypeHint.returns(undefined);
336
- const result = command.execute(createCommandExecutionContext(createEdge()));
337
- const element = result.children[0];
338
- expect(GEdge.DEFAULT_FEATURES, 'Element should have default feature set').to.have.same.members([
339
- ...(element.features as Set<symbol>)
340
- ]);
341
- });
342
- it('should add all enabled (`true`) features, derived from the applied type hint, to the model', () => {
343
- typeHintProviderMock.getEdgeTypeHint.returns(allEnabledHint);
344
- const result = command.execute(createCommandExecutionContext(createEdge()));
345
- const element = result.children[0];
346
- expect(isDeletable(element), 'Element should have deletable feature').to.be.true;
347
- expect(element.hasFeature(editFeature), 'Element should have edit feature').to.be.true;
348
- expect(isReconnectable(element), 'Element should have reconnectable feature').to.be.true;
349
- });
350
- it('should remove all disabled (`false`) features, derived from the applied type hint, from the model', () => {
351
- typeHintProviderMock.getEdgeTypeHint.returns(allDisabledHint);
352
- const result = command.execute(createCommandExecutionContext(createEdge()));
353
- const element = result.children[0];
354
- expect(isDeletable(element), 'Element should not have deletable feature').to.be.false;
355
- expect(element.hasFeature(editFeature), 'Element should not have edit feature').to.be.false;
356
- expect(isReconnectable(element), 'Element should not have reconnectable feature').to.be.false;
357
- });
358
- });
359
- });
360
- });