Skip to content

Commit bf89b78

Browse files
froueneAxelRICHARD
authored andcommitted
[1581] Remove rename and delete tools from inherited port palette
Bug: #1581 Signed-off-by: Florian ROUËNÉ <florian.rouene@obeosoft.com>
1 parent 05d3587 commit bf89b78

8 files changed

Lines changed: 102 additions & 29 deletions

File tree

CHANGELOG.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
- https://github.com/eclipse-syson/syson/issues/1604[#1604] [export] Fix an issue where the `Imports` located in the root `Namespace` were not exported in the textual format.
1616
- https://github.com/eclipse-syson/syson/issues/1602[#1602] [diagrams] Fix an issue where the drag and drop of a `RequirementUsage` (or any other `Element`) with a declared short name but no declared name from the _Explorer_ view to a diagram was not possible.
17+
- https://github.com/eclipse-syson/syson/issues/1581[#1581] [diagrams] Remove rename and delete tools from inherited port palette.
1718

1819
=== Improvements
1920

backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVInheritedPortTests.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.eclipse.sirius.components.collaborative.diagrams.dto.InvokeSingleClickOnTwoDiagramElementsToolSuccessPayload;
3232
import org.eclipse.sirius.components.diagrams.tests.graphql.ConnectorToolsQueryRunner;
3333
import org.eclipse.sirius.components.diagrams.tests.graphql.InvokeSingleClickOnTwoDiagramElementsToolMutationRunner;
34+
import org.eclipse.sirius.components.diagrams.tests.graphql.PaletteQueryRunner;
3435
import org.eclipse.sirius.components.diagrams.tests.navigation.DiagramNavigator;
3536
import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState;
3637
import org.eclipse.syson.AbstractIntegrationTests;
@@ -78,6 +79,9 @@ public class GVInheritedPortTests extends AbstractIntegrationTests {
7879
@Autowired
7980
private ShowDiagramsInheritedMembersMutationRunner showDiagramsInheritedMembersMutationRunner;
8081

82+
@Autowired
83+
private PaletteQueryRunner paletteQueryRunner;
84+
8185
private Flux<DiagramRefreshedEventPayload> givenSubscriptionToDiagram() {
8286
var diagramEventInput = new DiagramEventInput(UUID.randomUUID(),
8387
GeneralViewInheritedPortTestProjectData.EDITING_CONTEXT_ID,
@@ -369,4 +373,42 @@ public void checkInheritedPortAsSourceAndTargetRedefinition(String parameterized
369373
.thenCancel()
370374
.verify(Duration.ofSeconds(10));
371375
}
376+
377+
@DisplayName("GIVEN a diagram with some inherited port, WHEN palette is retrieved, THEN delete and rename tools should not be available")
378+
@Sql(scripts = { GeneralViewInheritedPortTestProjectData.SCRIPT_PATH }, executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD,
379+
config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
380+
@Sql(scripts = { "/scripts/cleanup.sql" }, executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
381+
@Test
382+
public void checkInheritedPortPalette() {
383+
var flux = this.givenSubscriptionToDiagram();
384+
var diagramId = new AtomicReference<String>();
385+
var inheritedPortId = new AtomicReference<String>();
386+
387+
Consumer<Object> initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> {
388+
diagramId.set(diagram.getId());
389+
var v1Node = new DiagramNavigator(diagram).nodeWithLabel("\u00ABpart\u00BB\nv1 : Vehicle").getNode();
390+
assertThat(v1Node.getBorderNodes()).hasSize(1);
391+
assertThat(v1Node.getBorderNodes()).allMatch(node -> node.getOutsideLabels().get(0).text().equals("^fuelInPort : FuelPort"));
392+
inheritedPortId.set(v1Node.getBorderNodes().get(0).getId());
393+
});
394+
395+
Runnable triggerEdgeTool = () -> {
396+
Map<String, Object> variables = Map.of(
397+
"editingContextId", GeneralViewInheritedPortTestProjectData.EDITING_CONTEXT_ID,
398+
"representationId", diagramId.get(),
399+
"diagramElementId", inheritedPortId.get()
400+
);
401+
var result = this.paletteQueryRunner.run(variables);
402+
List<String> quickAccessToolIds = JsonPath.read(result, "$.data.viewer.editingContext.representation.description.palette.quickAccessTools[*].id");
403+
assertThat(quickAccessToolIds).doesNotContain("semantic-delete", "edit");
404+
List<String> editToolSectionIds = JsonPath.read(result, "$.data.viewer.editingContext.representation.description.palette.paletteEntries[?(@.id=='edit-section')].tools[*].id");
405+
assertThat(editToolSectionIds).doesNotContain("semantic-delete", "edit");
406+
};
407+
408+
StepVerifier.create(flux)
409+
.consumeNextWith(initialDiagramContentConsumer)
410+
.then(triggerEdgeTool)
411+
.thenCancel()
412+
.verify(Duration.ofSeconds(10));
413+
}
372414
}

backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/AbstractPortUsageBorderNodeDescriptionProvider.java

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ public AbstractPortUsageBorderNodeDescriptionProvider(IColorProvider colorProvid
6969

7070
protected abstract OutsideLabelDescription createOutsideLabelDescription();
7171

72+
protected abstract NodePalette createNodePalette(IViewDiagramElementFinder cache, NodeDescription nodeDescription);
73+
7274
protected abstract String getName();
7375

7476
@Override
@@ -93,7 +95,7 @@ public void link(DiagramDescription diagramDescription, IViewDiagramElementFinde
9395
cache.getNodeDescription(this.getName()).ifPresent(portUsageBorderNodeDescription -> portUsageBorderNodeDescription.setPalette(this.createNodePalette(cache, portUsageBorderNodeDescription)));
9496
}
9597

96-
private NodeStyleDescription createPortUnsetNodeStyle() {
98+
protected NodeStyleDescription createPortUnsetNodeStyle() {
9799
return this.diagramBuilderHelper.newRectangularNodeStyleDescription()
98100
.borderColor(this.colorProvider.getColor(ViewConstants.DEFAULT_BORDER_COLOR))
99101
.borderRadius(0)
@@ -114,7 +116,7 @@ protected OutsideLabelStyle createOutsideLabelStyle() {
114116
.build();
115117
}
116118

117-
private List<ConditionalNodeStyle> createPortUsageConditionalNodeStyles() {
119+
protected List<ConditionalNodeStyle> createPortUsageConditionalNodeStyles() {
118120
var borderColor = this.colorProvider.getColor(ViewConstants.DEFAULT_BORDER_COLOR);
119121
return List.of(
120122
this.diagramBuilderHelper.newConditionalNodeStyle()
@@ -132,33 +134,7 @@ private List<ConditionalNodeStyle> createPortUsageConditionalNodeStyles() {
132134
);
133135
}
134136

135-
private NodePalette createNodePalette(IViewDiagramElementFinder cache, NodeDescription nodeDescription) {
136-
var changeContext = this.viewBuilderHelper.newChangeContext()
137-
.expression(AQLUtils.getSelfServiceCallExpression("deleteFromModel"));
138-
139-
var deleteTool = this.diagramBuilderHelper.newDeleteTool()
140-
.name("Delete from Model")
141-
.body(changeContext.build());
142-
143-
var callEditService = this.viewBuilderHelper.newChangeContext()
144-
.expression(AQLUtils.getSelfServiceCallExpression("directEdit", "newLabel"));
145-
146-
var editTool = this.diagramBuilderHelper.newLabelEditTool()
147-
.name("Edit")
148-
.initialDirectEditLabelExpression(AQLUtils.getSelfServiceCallExpression("getDefaultInitialDirectEditLabel"))
149-
.body(callEditService.build());
150-
151-
152-
return this.diagramBuilderHelper.newNodePalette()
153-
.deleteTool(deleteTool.build())
154-
.labelEditTool(editTool.build())
155-
.toolSections(this.defaultToolsFactory.createDefaultHideRevealNodeToolSection())
156-
.edgeTools(this.getEdgeTools(cache, nodeDescription).toArray(EdgeTool[]::new))
157-
.build();
158-
}
159-
160137
protected String getToolIconURLsExpression(String elementName) {
161138
return "/icons/full/obj16/" + elementName + ".svg";
162139
}
163-
164140
}

backend/views/syson-diagram-tests/src/main/java/org/eclipse/syson/diagram/tests/predicates/DiagramPredicates.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public class DiagramPredicates {
4040

4141
private final Predicate<NodeDescription> isInheritedCompartmentItemNode;
4242

43+
private final Predicate<NodeDescription> isInheritedBorderNode;
44+
4345
private final Predicate<NodeDescription> isNamespaceImportNode;
4446

4547
private final Predicate<NodeDescription> isStartOrDoneNode;
@@ -51,6 +53,8 @@ public DiagramPredicates(String diagramPrefix, IDescriptionNameGenerator descrip
5153
this.isCompartmentNode = n -> n.getName().contains(compartmentNameFragment);
5254
String inheritedCompartmentItemNameFragment = this.getInheritedCompartmentItemNameFragment(descriptionNameGenerator);
5355
this.isInheritedCompartmentItemNode = n -> n.getName().contains(inheritedCompartmentItemNameFragment);
56+
String inheritedBorderNodeNameFragment = this.getInheritedBorderNodeNameFragment(descriptionNameGenerator);
57+
this.isInheritedBorderNode = n -> n.getName().contains(inheritedBorderNodeNameFragment);
5458
this.isNamespaceImportNode = n -> n.getName().equals(diagramPrefix + " Node NamespaceImport");
5559
this.isStartOrDoneNode = n -> n.getName().equals(descriptionNameGenerator.getNodeName(StartActionNodeDescriptionProvider.START_ACTION_NAME))
5660
|| n.getName().equals(descriptionNameGenerator.getNodeName(DoneActionNodeDescriptionProvider.DONE_ACTION_NAME));
@@ -72,6 +76,10 @@ public Predicate<NodeDescription> isInheritedCompartmentItemNode() {
7276
return this.isInheritedCompartmentItemNode;
7377
}
7478

79+
public Predicate<NodeDescription> isInheritedBorderNode() {
80+
return this.isInheritedBorderNode;
81+
}
82+
7583
public Predicate<NodeDescription> getIsNamespaceImportNode() {
7684
return this.isNamespaceImportNode;
7785
}
@@ -110,4 +118,13 @@ private String getInheritedCompartmentItemNameFragment(IDescriptionNameGenerator
110118
.strip()
111119
.concat(" ");
112120
}
121+
122+
private String getInheritedBorderNodeNameFragment(IDescriptionNameGenerator nameGenerator) {
123+
EClass element = SysmlPackage.eINSTANCE.getElement();
124+
String fullName = nameGenerator.getInheritedBorderNodeName(element);
125+
126+
return fullName.replace(element.getName(), "")
127+
.strip()
128+
.concat(" ");
129+
}
113130
}

backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/InheritedPortUsageBorderNodeDescriptionProvider.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
2222
import org.eclipse.sirius.components.view.diagram.EdgeTool;
2323
import org.eclipse.sirius.components.view.diagram.NodeDescription;
24+
import org.eclipse.sirius.components.view.diagram.NodePalette;
2425
import org.eclipse.sirius.components.view.diagram.OutsideLabelDescription;
2526
import org.eclipse.sirius.components.view.diagram.OutsideLabelPosition;
2627
import org.eclipse.sirius.web.application.editingcontext.EditingContext;
@@ -66,6 +67,14 @@ protected String getName() {
6667
return this.nameGenerator.getInheritedBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage());
6768
}
6869

70+
@Override
71+
protected NodePalette createNodePalette(IViewDiagramElementFinder cache, NodeDescription nodeDescription) {
72+
return this.diagramBuilderHelper.newNodePalette()
73+
.toolSections(this.defaultToolsFactory.createDefaultHideRevealNodeToolSection())
74+
.edgeTools(this.getEdgeTools(cache, nodeDescription).toArray(EdgeTool[]::new))
75+
.build();
76+
}
77+
6978
@Override
7079
protected List<EdgeTool> getEdgeTools(IViewDiagramElementFinder cache, NodeDescription nodeDescription) {
7180
List<EdgeTool> edgeTools = new ArrayList<>();

backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/PortUsageBorderNodeDescriptionProvider.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
2222
import org.eclipse.sirius.components.view.diagram.EdgeTool;
2323
import org.eclipse.sirius.components.view.diagram.NodeDescription;
24+
import org.eclipse.sirius.components.view.diagram.NodePalette;
2425
import org.eclipse.sirius.components.view.diagram.OutsideLabelDescription;
2526
import org.eclipse.sirius.components.view.diagram.OutsideLabelPosition;
2627
import org.eclipse.sirius.web.application.editingcontext.EditingContext;
@@ -60,6 +61,31 @@ protected String getName() {
6061
return this.nameGenerator.getBorderNodeName(SysmlPackage.eINSTANCE.getPortUsage());
6162
}
6263

64+
@Override
65+
protected NodePalette createNodePalette(IViewDiagramElementFinder cache, NodeDescription nodeDescription) {
66+
var changeContext = this.viewBuilderHelper.newChangeContext()
67+
.expression(AQLUtils.getSelfServiceCallExpression("deleteFromModel"));
68+
69+
var deleteTool = this.diagramBuilderHelper.newDeleteTool()
70+
.name("Delete from Model")
71+
.body(changeContext.build());
72+
73+
var callEditService = this.viewBuilderHelper.newChangeContext()
74+
.expression(AQLUtils.getSelfServiceCallExpression("directEdit", "newLabel"));
75+
76+
var editTool = this.diagramBuilderHelper.newLabelEditTool()
77+
.name("Edit")
78+
.initialDirectEditLabelExpression(AQLUtils.getSelfServiceCallExpression("getDefaultInitialDirectEditLabel"))
79+
.body(callEditService.build());
80+
81+
return this.diagramBuilderHelper.newNodePalette()
82+
.deleteTool(deleteTool.build())
83+
.labelEditTool(editTool.build())
84+
.toolSections(this.defaultToolsFactory.createDefaultHideRevealNodeToolSection())
85+
.edgeTools(this.getEdgeTools(cache, nodeDescription).toArray(EdgeTool[]::new))
86+
.build();
87+
}
88+
6389
@Override
6490
protected List<EdgeTool> getEdgeTools(IViewDiagramElementFinder cache, NodeDescription nodeDescription) {
6591
List<EdgeTool> edgeTools = new ArrayList<>();
@@ -163,5 +189,4 @@ private EdgeTool createFlowUsageEdgeToInheritedPortUsageTool(List<NodeDescriptio
163189
.targetElementDescriptions(targetElementDescriptions.toArray(NodeDescription[]::new))
164190
.build();
165191
}
166-
167192
}

backend/views/syson-standard-diagrams-view/src/test/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ public void eachNodeHasDirectEditTool() {
113113
.and(this.diagramPredicates.isEmptyDiagramNode().negate())
114114
.and(this.diagramPredicates.isCompartmentNode().negate())
115115
.and(this.diagramPredicates.isInheritedCompartmentItemNode().negate())
116+
.and(this.diagramPredicates.isInheritedBorderNode().negate())
116117
.and(this.diagramPredicates.getIsNamespaceImportNode().negate())
117118
)
118119
.filter(nodeDescription -> nodeDescription.getInsideLabel() != null && nodeDescription.getInsideLabel().getLabelExpression() != null
@@ -129,6 +130,7 @@ public void eachNodeHasDeleteTool() {
129130
.and(this.diagramPredicates.isEmptyDiagramNode().negate())
130131
.and(this.diagramPredicates.isCompartmentNode().negate())
131132
.and(this.diagramPredicates.isInheritedCompartmentItemNode().negate())
133+
.and(this.diagramPredicates.isInheritedBorderNode().negate())
132134
.and(this.diagramPredicates.isStartOrDoneNode().negate()))
133135
.toList();
134136
new NodeDescriptionHasDeleteToolChecker().checkAll(nodeDescriptionCandidates);

doc/content/modules/user-manual/pages/release-notes/2025.12.0.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
== New features
88

99
- In diagrams, inherited _PortUsages_ are now displayed as graphical border nodes.
10+
These graphical border nodes cannot be edited or deleted.
1011

1112
image::gv-inherited-port.png[Inherited port, width=65%,height=65%]
1213

0 commit comments

Comments
 (0)