@finos/legend-extension-dsl-diagram 0.0.13 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/lib/DSLDiagram_Extension.d.ts +0 -5
  3. package/lib/DSLDiagram_Extension.d.ts.map +1 -1
  4. package/lib/DSLDiagram_Extension.js +0 -12
  5. package/lib/DSLDiagram_Extension.js.map +1 -1
  6. package/lib/DiagramRenderer.d.ts +9 -7
  7. package/lib/DiagramRenderer.d.ts.map +1 -1
  8. package/lib/DiagramRenderer.js +119 -90
  9. package/lib/DiagramRenderer.js.map +1 -1
  10. package/lib/components/studio/ClassDiagramPreview.js +1 -1
  11. package/lib/components/studio/ClassDiagramPreview.js.map +1 -1
  12. package/lib/components/studio/{DSLDiagram_StudioPlugin.d.ts → DSLDiagram_LegendStudioPlugin.d.ts} +5 -5
  13. package/lib/components/studio/DSLDiagram_LegendStudioPlugin.d.ts.map +1 -0
  14. package/lib/components/studio/{DSLDiagram_StudioPlugin.js → DSLDiagram_LegendStudioPlugin.js} +4 -4
  15. package/lib/components/studio/DSLDiagram_LegendStudioPlugin.js.map +1 -0
  16. package/lib/components/studio/DSLDiagram_LegendStudioPlugin_Extension.d.ts +30 -0
  17. package/lib/components/studio/DSLDiagram_LegendStudioPlugin_Extension.d.ts.map +1 -0
  18. package/lib/components/studio/DSLDiagram_LegendStudioPlugin_Extension.js +17 -0
  19. package/lib/components/studio/DSLDiagram_LegendStudioPlugin_Extension.js.map +1 -0
  20. package/lib/components/studio/DiagramEditor.d.ts.map +1 -1
  21. package/lib/components/studio/DiagramEditor.js +53 -39
  22. package/lib/components/studio/DiagramEditor.js.map +1 -1
  23. package/lib/graph/DSLDiagram_PureGraphPlugin.js +1 -1
  24. package/lib/graph/DSLDiagram_PureGraphPlugin.js.map +1 -1
  25. package/lib/index.css +1 -1
  26. package/lib/index.css.map +1 -1
  27. package/lib/index.d.ts +4 -1
  28. package/lib/index.d.ts.map +1 -1
  29. package/lib/index.js +4 -1
  30. package/lib/index.js.map +1 -1
  31. package/lib/models/metamodels/pure/packageableElements/diagram/RelationshipView.d.ts.map +1 -1
  32. package/lib/models/metamodels/pure/packageableElements/diagram/RelationshipView.js +3 -0
  33. package/lib/models/metamodels/pure/packageableElements/diagram/RelationshipView.js.map +1 -1
  34. package/lib/models/protocols/pure/DSLDiagram_PureProtocolProcessorPlugin.d.ts.map +1 -1
  35. package/lib/models/protocols/pure/DSLDiagram_PureProtocolProcessorPlugin.js +2 -2
  36. package/lib/models/protocols/pure/DSLDiagram_PureProtocolProcessorPlugin.js.map +1 -1
  37. package/lib/stores/studio/DiagramEditorState.d.ts +5 -0
  38. package/lib/stores/studio/DiagramEditorState.d.ts.map +1 -1
  39. package/lib/stores/studio/DiagramEditorState.js +28 -7
  40. package/lib/stores/studio/DiagramEditorState.js.map +1 -1
  41. package/package.json +17 -18
  42. package/src/DSLDiagram_Extension.ts +0 -15
  43. package/src/DiagramRenderer.ts +166 -134
  44. package/src/components/studio/{DSLDiagram_StudioPlugin.tsx → DSLDiagram_LegendStudioPlugin.tsx} +7 -7
  45. package/src/components/studio/DSLDiagram_LegendStudioPlugin_Extension.tsx +35 -0
  46. package/src/components/studio/DiagramEditor.tsx +54 -4
  47. package/src/graph/DSLDiagram_PureGraphPlugin.ts +1 -1
  48. package/src/index.ts +5 -1
  49. package/src/models/metamodels/pure/packageableElements/diagram/RelationshipView.ts +24 -14
  50. package/src/models/protocols/pure/DSLDiagram_PureProtocolProcessorPlugin.ts +2 -0
  51. package/src/stores/studio/DiagramEditorState.ts +34 -11
  52. package/tsconfig.json +3 -1
  53. package/tsconfig.package.json +1 -0
  54. package/lib/components/studio/DSLDiagram_StudioPlugin.d.ts.map +0 -1
  55. package/lib/components/studio/DSLDiagram_StudioPlugin.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # @finos/legend-extension-dsl-diagram
2
2
 
3
+ ## 1.0.1
4
+
5
+ ## 1.0.0
6
+
7
+ ### Major Changes
8
+
9
+ - [#692](https://github.com/finos/legend-studio/pull/692) [`caab0e67`](https://github.com/finos/legend-studio/commit/caab0e6772181e514b246fe6030a02e7169952cc) ([@akphi](https://github.com/akphi)) - **BREAKING CHANGE:** Remove `LegendStudioPreset` and `LegendQueryPreset` and expose `LegendStudioPlugin` and `LegendQueryPlugin` respectively as we now prefer the usage of `@finos/legend-graph-extension-collection` to better manage graph presets.
10
+
11
+ ## 0.1.2
12
+
13
+ ## 0.1.1
14
+
15
+ ## 0.1.0
16
+
17
+ ### Minor Changes
18
+
19
+ - [#584](https://github.com/finos/legend-studio/pull/584) [`b32e834b`](https://github.com/finos/legend-studio/commit/b32e834ba037658de53632403c79aa0f0f651971) ([@akphi](https://github.com/akphi)) - Support context menu for class views. Cleanup diagram renderer event handlers: they now align with the events that trigger them, not their purpose, e.g. we changed `handleEditClassView` to `onClassViewDoubleClick`.
20
+
3
21
  ## 0.0.13
4
22
 
5
23
  ## 0.0.12
@@ -15,13 +15,8 @@
15
15
  */
16
16
  import { AbstractPreset } from '@finos/legend-shared';
17
17
  import type { GraphPluginManager } from '@finos/legend-graph';
18
- import type { StudioPluginManager } from '@finos/legend-studio';
19
18
  export declare class DSLDiagram_GraphPreset extends AbstractPreset {
20
19
  constructor();
21
20
  install(pluginManager: GraphPluginManager): void;
22
21
  }
23
- export declare class DSLDiagram_StudioPreset extends AbstractPreset {
24
- constructor();
25
- install(pluginManager: StudioPluginManager): void;
26
- }
27
22
  //# sourceMappingURL=DSLDiagram_Extension.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DSLDiagram_Extension.d.ts","sourceRoot":"","sources":["../src/DSLDiagram_Extension.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAIhE,qBAAa,sBAAuB,SAAQ,cAAc;;IAKxD,OAAO,CAAC,aAAa,EAAE,kBAAkB,GAAG,IAAI;CAKjD;AAED,qBAAa,uBAAwB,SAAQ,cAAc;;IAKzD,OAAO,CAAC,aAAa,EAAE,mBAAmB,GAAG,IAAI;CAMlD"}
1
+ {"version":3,"file":"DSLDiagram_Extension.d.ts","sourceRoot":"","sources":["../src/DSLDiagram_Extension.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,qBAAa,sBAAuB,SAAQ,cAAc;;IAKxD,OAAO,CAAC,aAAa,EAAE,kBAAkB,GAAG,IAAI;CAKjD"}
@@ -17,7 +17,6 @@ import packageJson from '../package.json';
17
17
  import { AbstractPreset } from '@finos/legend-shared';
18
18
  import { DSLDiagram_PureGraphManagerPlugin } from './graphManager/DSLDiagram_PureGraphManagerPlugin';
19
19
  import { DSLDiagram_PureProtocolProcessorPlugin } from './models/protocols/pure/DSLDiagram_PureProtocolProcessorPlugin';
20
- import { DSLDiagram_StudioPlugin } from './components/studio/DSLDiagram_StudioPlugin';
21
20
  import { DSLDiagram_PureGraphPlugin } from './graph/DSLDiagram_PureGraphPlugin';
22
21
  export class DSLDiagram_GraphPreset extends AbstractPreset {
23
22
  constructor() {
@@ -29,15 +28,4 @@ export class DSLDiagram_GraphPreset extends AbstractPreset {
29
28
  new DSLDiagram_PureProtocolProcessorPlugin().install(pluginManager);
30
29
  }
31
30
  }
32
- export class DSLDiagram_StudioPreset extends AbstractPreset {
33
- constructor() {
34
- super(packageJson.extensions.studioPreset, packageJson.version);
35
- }
36
- install(pluginManager) {
37
- new DSLDiagram_StudioPlugin().install(pluginManager);
38
- new DSLDiagram_PureGraphPlugin().install(pluginManager);
39
- new DSLDiagram_PureGraphManagerPlugin().install(pluginManager);
40
- new DSLDiagram_PureProtocolProcessorPlugin().install(pluginManager);
41
- }
42
- }
43
31
  //# sourceMappingURL=DSLDiagram_Extension.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DSLDiagram_Extension.js","sourceRoot":"","sources":["../src/DSLDiagram_Extension.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iCAAiC,EAAE,MAAM,kDAAkD,CAAC;AACrG,OAAO,EAAE,sCAAsC,EAAE,MAAM,gEAAgE,CAAC;AAGxH,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAEhF,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IACxD;QACE,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,CAAC,aAAiC;QACvC,IAAI,0BAA0B,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,iCAAiC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/D,IAAI,sCAAsC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACtE,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,cAAc;IACzD;QACE,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,CAAC,aAAkC;QACxC,IAAI,uBAAuB,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACrD,IAAI,0BAA0B,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,iCAAiC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/D,IAAI,sCAAsC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACtE,CAAC;CACF"}
1
+ {"version":3,"file":"DSLDiagram_Extension.js","sourceRoot":"","sources":["../src/DSLDiagram_Extension.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iCAAiC,EAAE,MAAM,kDAAkD,CAAC;AACrG,OAAO,EAAE,sCAAsC,EAAE,MAAM,gEAAgE,CAAC;AAExH,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAEhF,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IACxD;QACE,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,CAAC,aAAiC;QACvC,IAAI,0BAA0B,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,iCAAiC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAC/D,IAAI,sCAAsC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACtE,CAAC;CACF"}
@@ -130,7 +130,7 @@ export declare class DiagramRenderer {
130
130
  selectedPoint?: Point | undefined;
131
131
  private _selectedClassesInitialPositions;
132
132
  startClassView?: ClassView | undefined;
133
- addRelationshipToDiagramFn?: ((start: ClassView, target: ClassView) => RelationshipView | undefined) | undefined;
133
+ handleAddRelationship?: ((start: ClassView, target: ClassView) => RelationshipView | undefined) | undefined;
134
134
  mouseOverClassCorner?: ClassView | undefined;
135
135
  mouseOverClassName?: ClassView | undefined;
136
136
  mouseOverClassView?: ClassView | undefined;
@@ -144,11 +144,13 @@ export declare class DiagramRenderer {
144
144
  clickY: number;
145
145
  positionBeforeLastMove: Point;
146
146
  onAddClassViewClick: (point: Point) => void;
147
+ onClassViewRightClick: (classView: ClassView, point: Point) => void;
147
148
  onBackgroundDoubleClick: (point: Point) => void;
148
- editClassView: (classView: ClassView) => void;
149
- editClassName: (classView: ClassView, point: Point) => void;
150
- editProperty: (property: AbstractProperty, point: Point, propertyHolderView: PropertyHolderView | undefined) => void;
151
- addSimpleProperty: (classView: ClassView) => void;
149
+ onClassViewDoubleClick: (classView: ClassView, point: Point) => void;
150
+ onClassNameDoubleClick: (classView: ClassView, point: Point) => void;
151
+ handleEditClassView: (classView: ClassView) => void;
152
+ handleEditProperty: (property: AbstractProperty, point: Point, propertyHolderView: PropertyHolderView | undefined) => void;
153
+ handleAddSimpleProperty: (classView: ClassView) => void;
152
154
  constructor(div: HTMLDivElement, diagram: Diagram);
153
155
  setIsReadOnly(val: boolean): void;
154
156
  setMouseOverClassView(val: ClassView | undefined): void;
@@ -212,14 +214,14 @@ export declare class DiagramRenderer {
212
214
  private drawLinePropertyText;
213
215
  private drawPropertyOrAssociation;
214
216
  private drawInheritance;
215
- keydown(e: KeyboardEvent): void;
216
- mouseup(e: MouseEvent): void;
217
217
  /**
218
218
  * Reorder will move the class view to the top of the class view array of the diagram,
219
219
  * This will bring it to front.
220
220
  */
221
221
  private reorderDiagramDomain;
222
222
  private potentiallyShiftRelationships;
223
+ keydown(e: KeyboardEvent): void;
224
+ mouseup(e: MouseEvent): void;
223
225
  mousedblclick(e: MouseEvent): void;
224
226
  mousedown(e: MouseEvent): void;
225
227
  mousewheel(e: WheelEvent): void;
@@ -1 +1 @@
1
- {"version":3,"file":"DiagramRenderer.d.ts","sourceRoot":"","sources":["../src/DiagramRenderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DiagramRenderer.d.ts","sourceRoot":"","sources":["../src/DiagramRenderer.ts"],"names":[],"mappings":"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"}
@@ -152,7 +152,7 @@ export class DiagramRenderer {
152
152
  _selectedClassesInitialPositions;
153
153
  // Relationship
154
154
  startClassView;
155
- addRelationshipToDiagramFn;
155
+ handleAddRelationship;
156
156
  mouseOverClassCorner;
157
157
  mouseOverClassName;
158
158
  mouseOverClassView;
@@ -167,11 +167,13 @@ export class DiagramRenderer {
167
167
  positionBeforeLastMove;
168
168
  // interactions
169
169
  onAddClassViewClick = noop();
170
+ onClassViewRightClick = noop();
170
171
  onBackgroundDoubleClick = noop();
171
- editClassView = noop();
172
- editClassName = noop();
173
- editProperty = noop();
174
- addSimpleProperty = noop();
172
+ onClassViewDoubleClick = noop();
173
+ onClassNameDoubleClick = noop();
174
+ handleEditClassView = noop();
175
+ handleEditProperty = noop();
176
+ handleAddSimpleProperty = noop();
175
177
  constructor(div, diagram) {
176
178
  makeObservable(this, {
177
179
  isReadOnly: observable,
@@ -413,7 +415,7 @@ export class DiagramRenderer {
413
415
  if (editMode === DIAGRAM_INTERACTION_MODE.ADD_RELATIONSHIP) {
414
416
  switch (relationshipMode) {
415
417
  case DIAGRAM_RELATIONSHIP_EDIT_MODE.INHERITANCE: {
416
- this.addRelationshipToDiagramFn = (startClassView, targetClassView) => {
418
+ this.handleAddRelationship = (startClassView, targetClassView) => {
417
419
  if (
418
420
  // Do not allow creating self-inheritance
419
421
  startClassView.class.value !== targetClassView.class.value &&
@@ -435,7 +437,7 @@ export class DiagramRenderer {
435
437
  break;
436
438
  }
437
439
  case DIAGRAM_RELATIONSHIP_EDIT_MODE.PROPERTY: {
438
- this.addRelationshipToDiagramFn = (startClassView, targetClassView) => {
440
+ this.handleAddRelationship = (startClassView, targetClassView) => {
439
441
  const property = new Property(`property_${startClassView.class.value.properties.length + 1}`, new Multiplicity(1, 1), GenericTypeExplicitReference.create(new GenericType(targetClassView.class.value)), startClassView.class.value);
440
442
  startClassView.class.value.addProperty(property);
441
443
  // only create property view if the classviews are different
@@ -487,12 +489,11 @@ export class DiagramRenderer {
487
489
  }
488
490
  manageVirtualScreen() {
489
491
  if (this.diagram.classViews.length) {
490
- let minX = this.diagram.classViews[0].position.x;
491
- let minY = this.diagram.classViews[0].position.y;
492
- let maxX = this.diagram.classViews[0].position.x +
493
- this.diagram.classViews[0].rectangle.width;
494
- let maxY = this.diagram.classViews[0].position.y +
495
- this.diagram.classViews[0].rectangle.height;
492
+ const firstClassView = guaranteeNonNullable(this.diagram.classViews[0]);
493
+ let minX = firstClassView.position.x;
494
+ let minY = firstClassView.position.y;
495
+ let maxX = firstClassView.position.x + firstClassView.rectangle.width;
496
+ let maxY = firstClassView.position.y + firstClassView.rectangle.height;
496
497
  for (const classView of this.diagram.classViews) {
497
498
  minX = Math.min(minX, classView.position.x);
498
499
  minY = Math.min(minY, classView.position.y);
@@ -506,7 +507,10 @@ export class DiagramRenderer {
506
507
  let fullPath = relationshipView.buildFullPath();
507
508
  fullPath = manageInsidePointsDynamically(fullPath, relationshipView.from.classView.value, relationshipView.to.classView.value);
508
509
  if (relationshipView instanceof PropertyView) {
509
- const box = this.drawLinePropertyText(fullPath[fullPath.length - 2], fullPath[fullPath.length - 1], relationshipView.to.classView.value, relationshipView.property.value, false);
510
+ const box = this.drawLinePropertyText(
511
+ // NOTE: by the way we compute the full path, it would guarantee
512
+ // to always have at least 2 points
513
+ fullPath[fullPath.length - 2], fullPath[fullPath.length - 1], relationshipView.to.classView.value, relationshipView.property.value, false);
510
514
  minX = Math.min(minX, box.position.x);
511
515
  minY = Math.min(minY, box.position.y);
512
516
  maxX = Math.max(maxX, box.edgePoint().x);
@@ -1155,7 +1159,10 @@ export class DiagramRenderer {
1155
1159
  fullPath = manageInsidePointsDynamically(fullPath, propertyView.from.classView.value, propertyView.to.classView.value);
1156
1160
  // const toProperty = asso instanceof.property ? asso.property : asso.association.properties[1];
1157
1161
  const toProperty = propertyView.property.value;
1158
- this.drawLinePropertyText(fullPath[fullPath.length - 2], fullPath[fullPath.length - 1], propertyView.to.classView.value, toProperty, false);
1162
+ this.drawLinePropertyText(
1163
+ // NOTE: by the way we compute the full path, it would guarantee
1164
+ // to always have at least 2 points
1165
+ fullPath[fullPath.length - 2], fullPath[fullPath.length - 1], propertyView.to.classView.value, toProperty, false);
1159
1166
  // if (asso.association) {
1160
1167
  // this.displayText(fullPath[1], fullPath[0], asso.from.classView, asso.association.properties[0], this.ctx);
1161
1168
  // }
@@ -1232,6 +1239,8 @@ export class DiagramRenderer {
1232
1239
  const rect = inheritance.to.classView.value.rectangle;
1233
1240
  let fullPath = inheritance.buildFullPath();
1234
1241
  fullPath = manageInsidePointsDynamically(fullPath, inheritance.from.classView.value, inheritance.to.classView.value);
1242
+ // NOTE: by the way we compute the full path, it would guarantee
1243
+ // to always have at least 2 points
1235
1244
  const startX = fullPath[fullPath.length - 2].x;
1236
1245
  const startY = fullPath[fullPath.length - 2].y;
1237
1246
  const endX = fullPath[fullPath.length - 1].x;
@@ -1310,22 +1319,48 @@ export class DiagramRenderer {
1310
1319
  angle = endX >= startX ? angle : angle + Math.PI;
1311
1320
  this.ctx.beginPath();
1312
1321
  this.ctx.moveTo(resultX +
1313
- (this.screenOffset.x + this.triangle[0].rotateX(angle)) * this.zoom, resultY +
1314
- (this.screenOffset.y + this.triangle[0].rotateY(angle)) * this.zoom);
1322
+ (this.screenOffset.x + this.triangle[0].rotateX(angle)) *
1323
+ this.zoom, resultY +
1324
+ (this.screenOffset.y + this.triangle[0].rotateY(angle)) *
1325
+ this.zoom);
1315
1326
  this.ctx.lineTo(resultX +
1316
- (this.screenOffset.x + this.triangle[1].rotateX(angle)) * this.zoom, resultY +
1317
- (this.screenOffset.y + this.triangle[1].rotateY(angle)) * this.zoom);
1327
+ (this.screenOffset.x + this.triangle[1].rotateX(angle)) *
1328
+ this.zoom, resultY +
1329
+ (this.screenOffset.y + this.triangle[1].rotateY(angle)) *
1330
+ this.zoom);
1318
1331
  this.ctx.lineTo(resultX +
1319
- (this.screenOffset.x + this.triangle[2].rotateX(angle)) * this.zoom, resultY +
1320
- (this.screenOffset.y + this.triangle[2].rotateY(angle)) * this.zoom);
1332
+ (this.screenOffset.x + this.triangle[2].rotateX(angle)) *
1333
+ this.zoom, resultY +
1334
+ (this.screenOffset.y + this.triangle[2].rotateY(angle)) *
1335
+ this.zoom);
1321
1336
  this.ctx.lineTo(resultX +
1322
- (this.screenOffset.x + this.triangle[0].rotateX(angle)) * this.zoom, resultY +
1323
- (this.screenOffset.y + this.triangle[0].rotateY(angle)) * this.zoom);
1337
+ (this.screenOffset.x + this.triangle[0].rotateX(angle)) *
1338
+ this.zoom, resultY +
1339
+ (this.screenOffset.y + this.triangle[0].rotateY(angle)) *
1340
+ this.zoom);
1324
1341
  this.ctx.fillStyle = this.generalizationViewInheritanceTriangeFillColor;
1325
1342
  this.ctx.fill();
1326
1343
  this.ctx.stroke();
1327
1344
  this.ctx.lineWidth = 1;
1328
1345
  }
1346
+ /**
1347
+ * Reorder will move the class view to the top of the class view array of the diagram,
1348
+ * This will bring it to front.
1349
+ */
1350
+ reorderDiagramDomain(firstClass, diagram) {
1351
+ const newClasses = diagram.classViews.filter((classView) => classView !== firstClass);
1352
+ newClasses.push(firstClass);
1353
+ return newClasses;
1354
+ }
1355
+ // TODO: add doc
1356
+ potentiallyShiftRelationships(assoViews, selectedClasses, newMovingDeltaX, newMovingDeltaY) {
1357
+ assoViews.forEach((assoView) => {
1358
+ if (selectedClasses.indexOf(assoView.from.classView.value) !== -1 &&
1359
+ selectedClasses.indexOf(assoView.to.classView.value) !== -1) {
1360
+ assoView.setPath(assoView.path.map((point) => new Point(point.x - newMovingDeltaX, point.y - newMovingDeltaY)));
1361
+ }
1362
+ });
1363
+ }
1329
1364
  keydown(e) {
1330
1365
  // Remove selected view(s)
1331
1366
  if ('Delete' === e.key) {
@@ -1360,20 +1395,20 @@ export class DiagramRenderer {
1360
1395
  // we need to call `preventDefault` to avoid typing `e` in the property name input
1361
1396
  else if ('e' === e.key) {
1362
1397
  if (this.selectedClassProperty) {
1363
- this.editProperty(this.selectedClassProperty.property, this.selectedClassProperty.selectionPoint, undefined);
1398
+ this.handleEditProperty(this.selectedClassProperty.property, this.selectedClassProperty.selectionPoint, undefined);
1364
1399
  e.preventDefault();
1365
1400
  }
1366
1401
  else if (this.selectedPropertyOrAssociation) {
1367
1402
  // TODO: we might want to revise this to allow edit property holder view
1368
1403
  // on the side panel instead of showing the inline property editor
1369
- this.editProperty(this.selectedPropertyOrAssociation.property.value, this.selectedPoint ??
1404
+ this.handleEditProperty(this.selectedPropertyOrAssociation.property.value, this.selectedPoint ??
1370
1405
  (this.selectedPropertyOrAssociation.path.length
1371
1406
  ? this.selectedPropertyOrAssociation.path[0]
1372
1407
  : this.selectedPropertyOrAssociation.from.classView.value.center()), this.selectedPropertyOrAssociation);
1373
1408
  e.preventDefault();
1374
1409
  }
1375
1410
  else if (this.selectedClasses.length === 1) {
1376
- this.editClassView(this.selectedClasses[0]);
1411
+ this.handleEditClassView(this.selectedClasses[0]);
1377
1412
  }
1378
1413
  }
1379
1414
  // Recenter
@@ -1456,7 +1491,7 @@ export class DiagramRenderer {
1456
1491
  // Add a new simple property to selected class
1457
1492
  else if (e.altKey && 'ArrowDown' === e.code) {
1458
1493
  if (!this.isReadOnly && this.selectedClasses.length === 1) {
1459
- this.addSimpleProperty(this.selectedClasses[0]);
1494
+ this.handleAddSimpleProperty(this.selectedClasses[0]);
1460
1495
  }
1461
1496
  }
1462
1497
  // Eject the property
@@ -1540,7 +1575,8 @@ export class DiagramRenderer {
1540
1575
  nextZoomLevel = Math.ceil(currentZoomLevel / 10) * 10 - 10;
1541
1576
  }
1542
1577
  else if (currentZoomLevel >=
1543
- DIAGRAM_ZOOM_LEVELS[DIAGRAM_ZOOM_LEVELS.length - 1] + 100) {
1578
+ DIAGRAM_ZOOM_LEVELS[DIAGRAM_ZOOM_LEVELS.length - 1] +
1579
+ 100) {
1544
1580
  nextZoomLevel = Math.ceil(currentZoomLevel / 100) * 100 - 100;
1545
1581
  }
1546
1582
  else {
@@ -1552,12 +1588,12 @@ export class DiagramRenderer {
1552
1588
  case DIAGRAM_INTERACTION_MODE.ADD_RELATIONSHIP: {
1553
1589
  if (this.startClassView &&
1554
1590
  this.selectionStart &&
1555
- this.addRelationshipToDiagramFn) {
1591
+ this.handleAddRelationship) {
1556
1592
  const eventPointInModelCoordinate = this.canvasCoordinateToModelCoordinate(this.eventCoordinateToCanvasCoordinate(new Point(e.x, e.y)));
1557
1593
  for (let i = this.diagram.classViews.length - 1; i >= 0; i--) {
1558
- if (this.diagram.classViews[i].contains(eventPointInModelCoordinate.x, eventPointInModelCoordinate.y)) {
1559
- const targetClassView = this.diagram.classViews[i];
1560
- const gview = this.addRelationshipToDiagramFn(this.startClassView, this.diagram.classViews[i]);
1594
+ const targetClassView = this.diagram.classViews[i];
1595
+ if (targetClassView.contains(eventPointInModelCoordinate.x, eventPointInModelCoordinate.y)) {
1596
+ const gview = this.handleAddRelationship(this.startClassView, targetClassView);
1561
1597
  if (gview) {
1562
1598
  gview.from.setOffsetX(-(this.startClassView.position.x +
1563
1599
  this.startClassView.rectangle.width / 2 -
@@ -1589,24 +1625,6 @@ export class DiagramRenderer {
1589
1625
  this.setSelectionStart(undefined);
1590
1626
  this.drawScreen();
1591
1627
  }
1592
- /**
1593
- * Reorder will move the class view to the top of the class view array of the diagram,
1594
- * This will bring it to front.
1595
- */
1596
- reorderDiagramDomain(firstClass, diagram) {
1597
- const newClasses = diagram.classViews.filter((classView) => classView !== firstClass);
1598
- newClasses.push(firstClass);
1599
- return newClasses;
1600
- }
1601
- // TODO: add doc
1602
- potentiallyShiftRelationships(assoViews, selectedClasses, newMovingDeltaX, newMovingDeltaY) {
1603
- assoViews.forEach((assoView) => {
1604
- if (selectedClasses.indexOf(assoView.from.classView.value) !== -1 &&
1605
- selectedClasses.indexOf(assoView.to.classView.value) !== -1) {
1606
- assoView.setPath(assoView.path.map((point) => new Point(point.x - newMovingDeltaX, point.y - newMovingDeltaY)));
1607
- }
1608
- });
1609
- }
1610
1628
  mousedblclick(e) {
1611
1629
  if ([
1612
1630
  DIAGRAM_INTERACTION_MODE.ADD_RELATIONSHIP,
@@ -1619,23 +1637,23 @@ export class DiagramRenderer {
1619
1637
  const eventPointInModelCoordinate = this.canvasCoordinateToModelCoordinate(this.eventCoordinateToCanvasCoordinate(new Point(e.x, e.y)));
1620
1638
  // Check double click on class property
1621
1639
  if (this.mouseOverClassProperty) {
1622
- this.editProperty(this.mouseOverClassProperty, eventPointInModelCoordinate, undefined);
1640
+ this.handleEditProperty(this.mouseOverClassProperty, eventPointInModelCoordinate, undefined);
1623
1641
  return;
1624
1642
  }
1625
1643
  // Check double click on class name
1626
1644
  if (this.mouseOverClassName) {
1627
- this.editClassName(this.mouseOverClassName, eventPointInModelCoordinate);
1645
+ this.onClassNameDoubleClick(this.mouseOverClassName, eventPointInModelCoordinate);
1628
1646
  return;
1629
1647
  }
1630
1648
  // Check double click on class view
1631
1649
  const selectedClass = this.diagram.classViews.find((classView) => classView.contains(eventPointInModelCoordinate.x, eventPointInModelCoordinate.y));
1632
1650
  if (selectedClass) {
1633
- this.editClassView(selectedClass);
1651
+ this.onClassViewDoubleClick(selectedClass, eventPointInModelCoordinate);
1634
1652
  return;
1635
1653
  }
1636
1654
  // Check double click on line property label
1637
1655
  if (this.mouseOverPropertyHolderViewLabel) {
1638
- this.editProperty(this.mouseOverPropertyHolderViewLabel.property.value, eventPointInModelCoordinate, this.mouseOverPropertyHolderViewLabel);
1656
+ this.handleEditProperty(this.mouseOverPropertyHolderViewLabel.property.value, eventPointInModelCoordinate, this.mouseOverPropertyHolderViewLabel);
1639
1657
  return;
1640
1658
  }
1641
1659
  // Check double click on background
@@ -1651,11 +1669,11 @@ export class DiagramRenderer {
1651
1669
  this.selectedClassProperty = undefined;
1652
1670
  this.selectedPoint = undefined;
1653
1671
  this.startClassView = undefined;
1672
+ const eventPointInCanvasCoordinate = this.eventCoordinateToCanvasCoordinate(new Point(e.x, e.y));
1673
+ const eventPointInModelCoordinate = this.canvasCoordinateToModelCoordinate(eventPointInCanvasCoordinate);
1654
1674
  // left click
1655
1675
  if (e.button === 0) {
1656
1676
  this.setLeftClick(true);
1657
- const eventPointInCanvasCoordinate = this.eventCoordinateToCanvasCoordinate(new Point(e.x, e.y));
1658
- const eventPointInModelCoordinate = this.canvasCoordinateToModelCoordinate(eventPointInCanvasCoordinate);
1659
1677
  switch (this.interactionMode) {
1660
1678
  case DIAGRAM_INTERACTION_MODE.PAN: {
1661
1679
  e.returnValue = false;
@@ -1666,7 +1684,8 @@ export class DiagramRenderer {
1666
1684
  // Check if the selection lies within the bottom right corner box of a box (so we can do resize of box here)
1667
1685
  // NOTE: Traverse backwards the class views to preserve z-index buffer
1668
1686
  for (let i = this.diagram.classViews.length - 1; i >= 0; i--) {
1669
- if (this.diagram.classViews[i]
1687
+ const targetClassView = this.diagram.classViews[i];
1688
+ if (targetClassView
1670
1689
  .buildBottomRightCornerBox()
1671
1690
  .contains(eventPointInModelCoordinate.x, eventPointInModelCoordinate.y)) {
1672
1691
  this.setSelectedClasses([]);
@@ -1692,11 +1711,11 @@ export class DiagramRenderer {
1692
1711
  let anyClassesSelected = false;
1693
1712
  // Traverse backwards the class views to preserve z-index buffer
1694
1713
  for (let i = this.diagram.classViews.length - 1; i >= 0; i--) {
1695
- if (this.diagram.classViews[i].contains(eventPointInModelCoordinate.x, eventPointInModelCoordinate.y)) {
1714
+ const targetClassView = this.diagram.classViews[i];
1715
+ if (targetClassView.contains(eventPointInModelCoordinate.x, eventPointInModelCoordinate.y)) {
1696
1716
  if (this.selectedClasses.length === 0 ||
1697
- this.selectedClasses.indexOf(this.diagram.classViews[i]) ===
1698
- -1) {
1699
- this.setSelectedClasses([this.diagram.classViews[i]]);
1717
+ this.selectedClasses.indexOf(targetClassView) === -1) {
1718
+ this.setSelectedClasses([targetClassView]);
1700
1719
  }
1701
1720
  if (!this.isReadOnly) {
1702
1721
  // Bring the class view to front
@@ -1773,8 +1792,9 @@ export class DiagramRenderer {
1773
1792
  this.setSelectionStart(eventPointInModelCoordinate);
1774
1793
  this.startClassView = undefined;
1775
1794
  for (let i = this.diagram.classViews.length - 1; i >= 0; i--) {
1776
- if (this.diagram.classViews[i].contains(eventPointInModelCoordinate.x, eventPointInModelCoordinate.y)) {
1777
- this.startClassView = this.diagram.classViews[i];
1795
+ const targetClassView = this.diagram.classViews[i];
1796
+ if (targetClassView.contains(eventPointInModelCoordinate.x, eventPointInModelCoordinate.y)) {
1797
+ this.startClassView = targetClassView;
1778
1798
  }
1779
1799
  }
1780
1800
  if (!this.startClassView) {
@@ -1786,10 +1806,7 @@ export class DiagramRenderer {
1786
1806
  break;
1787
1807
  }
1788
1808
  }
1789
- // NOTE: right now, in any mode, we allow to use middle click and
1790
- // right click to move the diagram. However, if we support context menu
1791
- // using right click in the future, we need to adjust to only allow
1792
- // middle click to move here.
1809
+ // middle click
1793
1810
  else if (e.button === 1) {
1794
1811
  e.returnValue = false;
1795
1812
  this.setMiddleClick(true);
@@ -1801,6 +1818,10 @@ export class DiagramRenderer {
1801
1818
  e.returnValue = false;
1802
1819
  this.setRightClick(true);
1803
1820
  this.positionBeforeLastMove = new Point(e.x, e.y);
1821
+ if (this.mouseOverClassView) {
1822
+ this.onClassViewRightClick(this.mouseOverClassView, eventPointInModelCoordinate);
1823
+ this.setRightClick(false);
1824
+ }
1804
1825
  return;
1805
1826
  }
1806
1827
  this.clearScreen();
@@ -1998,7 +2019,10 @@ export class DiagramRenderer {
1998
2019
  for (const propertyHolderView of propertyHolderViews) {
1999
2020
  let fullPath = propertyHolderView.buildFullPath();
2000
2021
  fullPath = manageInsidePointsDynamically(fullPath, propertyHolderView.from.classView.value, propertyHolderView.to.classView.value);
2001
- const propertyInfoBox = this.drawLinePropertyText(fullPath[fullPath.length - 2], fullPath[fullPath.length - 1], propertyHolderView.to.classView.value, propertyHolderView.property.value, false);
2022
+ const propertyInfoBox = this.drawLinePropertyText(
2023
+ // NOTE: by the way we compute the full path, it would guarantee
2024
+ // to always have at least 2 points
2025
+ fullPath[fullPath.length - 2], fullPath[fullPath.length - 1], propertyHolderView.to.classView.value, propertyHolderView.property.value, false);
2002
2026
  if (propertyInfoBox.contains(eventPointInModelCoordinate.x, eventPointInModelCoordinate.y)) {
2003
2027
  this.setMouseOverPropertyHolderViewLabel(propertyHolderView);
2004
2028
  break;
@@ -2025,33 +2049,38 @@ export class DiagramRenderer {
2025
2049
  return [];
2026
2050
  }
2027
2051
  layoutTaxonomy(classViewLevels, diagram, positionInitialClass, superType) {
2028
- //Offsets
2052
+ // Offsets
2029
2053
  const spaceY = 30;
2030
2054
  const spaceX = 10;
2031
2055
  classViewLevels.reverse();
2032
- const classViews = classViewLevels.flatMap((level, currentLevelIndex) => {
2056
+ const classViews = classViewLevels.flatMap((levels, currentLevelIndex) => {
2033
2057
  // Get the bounding box of the precedent level
2034
2058
  let precedentTotalWidth = 0;
2035
2059
  let precedentTotalHeight = 0;
2036
2060
  let precedentX = 0;
2037
2061
  let precedentY = 0;
2038
2062
  if (currentLevelIndex > 0) {
2039
- const precedentByX = [...classViewLevels[currentLevelIndex - 1]].sort((a, b) => a.position.x - b.position.x);
2040
- precedentX = precedentByX[0].position.x;
2041
- precedentTotalWidth =
2042
- precedentByX[precedentByX.length - 1].position.x +
2043
- precedentByX[precedentByX.length - 1].rectangle.width -
2044
- precedentByX[0].position.x;
2045
- const precedentByY = [...classViewLevels[currentLevelIndex - 1]].sort((a, b) => a.position.y - b.position.y);
2046
- precedentY = precedentByY[0].position.y;
2047
- precedentTotalHeight =
2048
- precedentByY[precedentByY.length - 1].position.y +
2049
- precedentByY[precedentByY.length - 1].rectangle.height -
2050
- precedentByY[0].position.y;
2063
+ const precedent = classViewLevels[currentLevelIndex - 1];
2064
+ if (precedent.length) {
2065
+ const precedentByX = [...precedent].sort((a, b) => a.position.x - b.position.x);
2066
+ precedentX = precedentByX[0].position.x;
2067
+ precedentTotalWidth =
2068
+ precedentByX[precedentByX.length - 1].position.x +
2069
+ precedentByX[precedentByX.length - 1].rectangle
2070
+ .width -
2071
+ precedentByX[0].position.x;
2072
+ const precedentByY = [...precedent].sort((a, b) => a.position.y - b.position.y);
2073
+ precedentY = precedentByY[0].position.y;
2074
+ precedentTotalHeight =
2075
+ precedentByY[precedentByY.length - 1].position.y +
2076
+ precedentByY[precedentByY.length - 1].rectangle
2077
+ .height -
2078
+ precedentByY[0].position.y;
2079
+ }
2051
2080
  }
2052
2081
  // Get the bounding box of current Level
2053
- const maxHeight = Math.max(...level.map((classView) => classView.rectangle.height));
2054
- const totalWidth = level
2082
+ const maxHeight = Math.max(...levels.map((classView) => classView.rectangle.height));
2083
+ const totalWidth = levels
2055
2084
  .map((classView) => classView.rectangle.width)
2056
2085
  .reduce((a, b) => a + b + spaceX);
2057
2086
  // Get the starting position
@@ -2061,19 +2090,19 @@ export class DiagramRenderer {
2061
2090
  : precedentY + precedentTotalHeight + spaceY;
2062
2091
  // Set layout of current level
2063
2092
  if (positionInitialClass || currentLevelIndex > 0) {
2064
- level[0].setPosition(new Point(startX, currentLevelY));
2065
- level.forEach((view, index) => {
2066
- if (index > 0) {
2067
- const precedent = level[index - 1];
2093
+ levels[0].setPosition(new Point(startX, currentLevelY));
2094
+ levels.forEach((view, idx) => {
2095
+ if (idx > 0) {
2096
+ const precedent = levels[idx - 1];
2068
2097
  view.setPosition(new Point(precedent.position.x + precedent.rectangle.width + spaceX, currentLevelY));
2069
2098
  }
2070
2099
  });
2071
2100
  }
2072
- return level;
2101
+ return levels;
2073
2102
  });
2074
2103
  const generalizationViews = (superType ? classViewLevels : classViewLevels.reverse())
2075
2104
  .slice(0, classViewLevels.length - 1)
2076
- .flatMap((level, i) => level.flatMap((fromClassView) => classViewLevels[i + 1].flatMap((toClassView) => {
2105
+ .flatMap((level, idx) => level.flatMap((fromClassView) => classViewLevels[idx + 1].flatMap((toClassView) => {
2077
2106
  if (fromClassView.class.value.generalizations
2078
2107
  .map((g) => g.value.rawType)
2079
2108
  .includes(toClassView.class.value)) {