Skip to content

Commit 28f09d4

Browse files
committed
[test] Improve the Papaya class diagram to leverage the new capabilities of the selection dialog
Signed-off-by: Stéphane Bégaudeau <stephane.begaudeau@obeo.fr>
1 parent 3738dc0 commit 28f09d4

File tree

6 files changed

+163
-67
lines changed

6 files changed

+163
-67
lines changed

packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/classdiagram/services/ClassDiagramServices.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2024 Obeo.
2+
* Copyright (c) 2024, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -12,10 +12,30 @@
1212
*******************************************************************************/
1313
package org.eclipse.sirius.web.papaya.representations.classdiagram.services;
1414

15+
import java.util.stream.StreamSupport;
16+
17+
import org.eclipse.emf.ecore.EObject;
18+
import org.eclipse.sirius.components.papaya.Package;
19+
import org.eclipse.sirius.components.papaya.Type;
20+
1521
/**
1622
* Java services for the class diagram.
1723
*
1824
* @author sbegaudeau
1925
*/
2026
public class ClassDiagramServices {
27+
28+
public boolean hasTypeContainer(EObject self) {
29+
Iterable<EObject> content = self::eAllContents;
30+
var stream = StreamSupport.stream(content.spliterator(), false);
31+
return stream.anyMatch(child -> child instanceof Package || child instanceof Type);
32+
}
33+
34+
public EObject getFirstTypeContainer(EObject self) {
35+
Iterable<EObject> content = self::eAllContents;
36+
var stream = StreamSupport.stream(content.spliterator(), false);
37+
return stream.filter(child -> child instanceof Package || child instanceof Type)
38+
.findFirst()
39+
.orElse(null);
40+
}
2141
}

packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/classdiagram/tools/diagram/NewClassToolProvider.java

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*******************************************************************************/
1313
package org.eclipse.sirius.web.papaya.representations.classdiagram.tools.diagram;
1414

15+
import org.eclipse.sirius.components.view.CreateInstance;
1516
import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
1617
import org.eclipse.sirius.components.view.builder.generated.diagram.DiagramBuilders;
1718
import org.eclipse.sirius.components.view.builder.generated.view.ViewBuilders;
@@ -28,9 +29,41 @@
2829
public class NewClassToolProvider {
2930

3031
public NodeTool getTool(IViewDiagramElementFinder cache) {
31-
var classNodeDescription = cache.getNodeDescription(ClassNodeDescriptionProvider.NAME).orElse(null);
32+
return new DiagramBuilders().newNodeTool()
33+
.name("New class")
34+
.iconURLsExpression("/icons/papaya/full/obj16/Class.svg")
35+
.dialogDescription(new TypeContainerSelectionDialogDescriptionProvider().getDialog())
36+
.body(
37+
new ViewBuilders().newIf()
38+
.conditionExpression("aql:selectedObject <> null")
39+
.children(
40+
new ViewBuilders().newChangeContext()
41+
.expression("aql:selectedObject")
42+
.children(
43+
this.createInstance(cache)
44+
)
45+
.build()
46+
)
47+
.build(),
48+
new ViewBuilders().newIf()
49+
.conditionExpression("aql:selectedObject = null and self.hasTypeContainer()")
50+
.children(
51+
new ViewBuilders().newChangeContext()
52+
.expression("aql:self.getFirstTypeContainer()")
53+
.children(
54+
this.createInstance(cache)
55+
)
56+
.build()
57+
)
58+
.build()
59+
)
60+
.description("This Tool allows to create a new Papaya::Class concept.")
61+
.build();
62+
}
3263

33-
var createInstance = new ViewBuilders().newCreateInstance()
64+
private CreateInstance createInstance(IViewDiagramElementFinder cache) {
65+
var classNodeDescription = cache.getNodeDescription(ClassNodeDescriptionProvider.NAME).orElse(null);
66+
return new ViewBuilders().newCreateInstance()
3467
.referenceName("types")
3568
.typeName("papaya::Class")
3669
.variableName("newClass")
@@ -56,20 +89,5 @@ public NodeTool getTool(IViewDiagramElementFinder cache) {
5689
.build()
5790
)
5891
.build();
59-
60-
return new DiagramBuilders().newNodeTool()
61-
.name("New class")
62-
.iconURLsExpression("/icons/papaya/full/obj16/Class.svg")
63-
.dialogDescription(new TypeContainerSelectionDialogDescriptionProvider().getDialog())
64-
.body(
65-
new ViewBuilders().newChangeContext()
66-
.expression("aql:selectedObject")
67-
.children(
68-
createInstance
69-
)
70-
.build()
71-
)
72-
.description("This Tool allows to create a new Papaya::Class concept.")
73-
.build();
7492
}
7593
}

packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/classdiagram/tools/diagram/NewEnumToolProvider.java

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*******************************************************************************/
1313
package org.eclipse.sirius.web.papaya.representations.classdiagram.tools.diagram;
1414

15+
import org.eclipse.sirius.components.view.CreateInstance;
1516
import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
1617
import org.eclipse.sirius.components.view.builder.generated.diagram.DiagramBuilders;
1718
import org.eclipse.sirius.components.view.builder.generated.view.ViewBuilders;
@@ -27,9 +28,42 @@
2728
*/
2829
public class NewEnumToolProvider {
2930
public NodeTool getTool(IViewDiagramElementFinder cache) {
31+
return new DiagramBuilders().newNodeTool()
32+
.name("New enum")
33+
.iconURLsExpression("/icons/papaya/full/obj16/Enum.svg")
34+
.dialogDescription(new TypeContainerSelectionDialogDescriptionProvider().getDialog())
35+
.body(
36+
new ViewBuilders().newIf()
37+
.conditionExpression("aql:selectedObject <> null")
38+
.children(
39+
new ViewBuilders().newChangeContext()
40+
.expression("aql:selectedObject")
41+
.children(
42+
this.createInstance(cache)
43+
)
44+
.build()
45+
)
46+
.build(),
47+
new ViewBuilders().newIf()
48+
.conditionExpression("aql:selectedObject = null and self.hasTypeContainer()")
49+
.children(
50+
new ViewBuilders().newChangeContext()
51+
.expression("aql:self.getFirstTypeContainer()")
52+
.children(
53+
this.createInstance(cache)
54+
)
55+
.build()
56+
)
57+
.build()
58+
)
59+
.description("This Tool allows to create a new Papaya::Enum concept.")
60+
.build();
61+
}
62+
63+
private CreateInstance createInstance(IViewDiagramElementFinder cache) {
3064
var enumNodeDescription = cache.getNodeDescription(EnumNodeDescriptionProvider.NAME).orElse(null);
3165

32-
var createInstance = new ViewBuilders().newCreateInstance()
66+
return new ViewBuilders().newCreateInstance()
3367
.referenceName("types")
3468
.typeName("papaya::Enum")
3569
.variableName("newEnum")
@@ -55,20 +89,5 @@ public NodeTool getTool(IViewDiagramElementFinder cache) {
5589
.build()
5690
)
5791
.build();
58-
59-
return new DiagramBuilders().newNodeTool()
60-
.name("New enum")
61-
.iconURLsExpression("/icons/papaya/full/obj16/Enum.svg")
62-
.dialogDescription(new TypeContainerSelectionDialogDescriptionProvider().getDialog())
63-
.body(
64-
new ViewBuilders().newChangeContext()
65-
.expression("aql:selectedObject")
66-
.children(
67-
createInstance
68-
)
69-
.build()
70-
)
71-
.description("This Tool allows to create a new Papaya::Enum concept.")
72-
.build();
7392
}
7493
}

packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/classdiagram/tools/diagram/NewInterfaceToolProvider.java

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*******************************************************************************/
1313
package org.eclipse.sirius.web.papaya.representations.classdiagram.tools.diagram;
1414

15+
import org.eclipse.sirius.components.view.CreateInstance;
1516
import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
1617
import org.eclipse.sirius.components.view.builder.generated.diagram.DiagramBuilders;
1718
import org.eclipse.sirius.components.view.builder.generated.view.ViewBuilders;
@@ -28,9 +29,42 @@
2829
public class NewInterfaceToolProvider {
2930

3031
public NodeTool getTool(IViewDiagramElementFinder cache) {
32+
return new DiagramBuilders().newNodeTool()
33+
.name("New interface")
34+
.iconURLsExpression("/icons/papaya/full/obj16/Interface.svg")
35+
.dialogDescription(new TypeContainerSelectionDialogDescriptionProvider().getDialog())
36+
.body(
37+
new ViewBuilders().newIf()
38+
.conditionExpression("aql:selectedObject <> null")
39+
.children(
40+
new ViewBuilders().newChangeContext()
41+
.expression("aql:selectedObject")
42+
.children(
43+
this.createInstance(cache)
44+
)
45+
.build()
46+
)
47+
.build(),
48+
new ViewBuilders().newIf()
49+
.conditionExpression("aql:selectedObject = null and self.hasTypeContainer()")
50+
.children(
51+
new ViewBuilders().newChangeContext()
52+
.expression("aql:self.getFirstTypeContainer()")
53+
.children(
54+
this.createInstance(cache)
55+
)
56+
.build()
57+
)
58+
.build()
59+
)
60+
.description("This Tool allows to create a new Papaya::Interface concept.")
61+
.build();
62+
}
63+
64+
private CreateInstance createInstance(IViewDiagramElementFinder cache) {
3165
var interfaceNodeDescription = cache.getNodeDescription(InterfaceNodeDescriptionProvider.NAME).orElse(null);
3266

33-
var createInstance = new ViewBuilders().newCreateInstance()
67+
return new ViewBuilders().newCreateInstance()
3468
.referenceName("types")
3569
.typeName("papaya::Interface")
3670
.variableName("newInterface")
@@ -56,20 +90,5 @@ public NodeTool getTool(IViewDiagramElementFinder cache) {
5690
.build()
5791
)
5892
.build();
59-
60-
return new DiagramBuilders().newNodeTool()
61-
.name("New interface")
62-
.iconURLsExpression("/icons/papaya/full/obj16/Interface.svg")
63-
.dialogDescription(new TypeContainerSelectionDialogDescriptionProvider().getDialog())
64-
.body(
65-
new ViewBuilders().newChangeContext()
66-
.expression("aql:selectedObject")
67-
.children(
68-
createInstance
69-
)
70-
.build()
71-
)
72-
.description("This Tool allows to create a new Papaya::Interface concept.")
73-
.build();
7493
}
7594
}

packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/classdiagram/tools/diagram/NewRecordToolProvider.java

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*******************************************************************************/
1313
package org.eclipse.sirius.web.papaya.representations.classdiagram.tools.diagram;
1414

15+
import org.eclipse.sirius.components.view.CreateInstance;
1516
import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
1617
import org.eclipse.sirius.components.view.builder.generated.diagram.DiagramBuilders;
1718
import org.eclipse.sirius.components.view.builder.generated.view.ViewBuilders;
@@ -28,9 +29,42 @@
2829
public class NewRecordToolProvider {
2930

3031
public NodeTool getTool(IViewDiagramElementFinder cache) {
32+
return new DiagramBuilders().newNodeTool()
33+
.name("New record")
34+
.iconURLsExpression("/icons/papaya/full/obj16/Record.svg")
35+
.dialogDescription(new TypeContainerSelectionDialogDescriptionProvider().getDialog())
36+
.body(
37+
new ViewBuilders().newIf()
38+
.conditionExpression("aql:selectedObject <> null")
39+
.children(
40+
new ViewBuilders().newChangeContext()
41+
.expression("aql:selectedObject")
42+
.children(
43+
this.createInstance(cache)
44+
)
45+
.build()
46+
)
47+
.build(),
48+
new ViewBuilders().newIf()
49+
.conditionExpression("aql:selectedObject = null and self.hasTypeContainer()")
50+
.children(
51+
new ViewBuilders().newChangeContext()
52+
.expression("aql:self.getFirstTypeContainer()")
53+
.children(
54+
this.createInstance(cache)
55+
)
56+
.build()
57+
)
58+
.build()
59+
)
60+
.description("This Tool allows to create a new Papaya::Record concept.")
61+
.build();
62+
}
63+
64+
private CreateInstance createInstance(IViewDiagramElementFinder cache) {
3165
var recordNodeDescription = cache.getNodeDescription(RecordNodeDescriptionProvider.NAME).orElse(null);
3266

33-
var createInstance = new ViewBuilders().newCreateInstance()
67+
return new ViewBuilders().newCreateInstance()
3468
.referenceName("types")
3569
.typeName("papaya::Record")
3670
.variableName("newRecord")
@@ -56,20 +90,5 @@ public NodeTool getTool(IViewDiagramElementFinder cache) {
5690
.build()
5791
)
5892
.build();
59-
60-
return new DiagramBuilders().newNodeTool()
61-
.name("New record")
62-
.iconURLsExpression("/icons/papaya/full/obj16/Record.svg")
63-
.dialogDescription(new TypeContainerSelectionDialogDescriptionProvider().getDialog())
64-
.body(
65-
new ViewBuilders().newChangeContext()
66-
.expression("aql:selectedObject")
67-
.children(
68-
createInstance
69-
)
70-
.build()
71-
)
72-
.description("This Tool allows to create a new Papaya::Record concept.")
73-
.build();
7493
}
7594
}

packages/sirius-web/backend/sirius-web-papaya/src/main/java/org/eclipse/sirius/web/papaya/representations/classdiagram/tools/dialogs/TypeContainerSelectionDialogDescriptionProvider.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2024 Obeo.
2+
* Copyright (c) 2024, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -32,6 +32,7 @@ public SelectionDialogDescription getDialog() {
3232
return new DiagramBuilders().newSelectionDialogDescription()
3333
.selectionMessage("Select the container of the new type")
3434
.selectionDialogTreeDescription(treeDescription)
35+
.optional(true)
3536
.build();
3637
}
3738
}

0 commit comments

Comments
 (0)