diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index d6ffa3690..c061edd7a 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -29,8 +29,9 @@ - https://github.com/eclipse-syson/syson/issues/2116[#2116] [explorer] In the _Explorer_ view, the items corresponding to the internals of `Expression` elements (syntax tree) are now hidden by default. Disabling the _Hide expression internals_ filter in the _Explorer_ view allows to display them if needed. - https://github.com/eclipse-syson/syson/issues/2112[#2112] [diagrams] Add tools to create _Start_ and _Done_ `StateUsages`, available on `StateUsage` and `StateDefinition` graphical nodes. -- https://github.com/eclipse-syson/syson/issues/2231[#2231] [diagrams] Add a new tools to create a _frame_ `ConcernUsage` from `RequirementUsage` and `RequirementDefinition` graphical nodes. +- https://github.com/eclipse-syson/syson/issues/2231[#2231] [diagrams] Add a new tool to create a _frame_ `ConcernUsage` from `RequirementUsage` and `RequirementDefinition` graphical nodes. - https://github.com/eclipse-syson/syson/issues/2231[#2231] [diagrams] Add the support for the _frames_ compartment graphical node in `RequirementUsage` and `RequirementDefinition` graphical nodes. +- https://github.com/eclipse-syson/syson/issues/2235[#2235] [diagrams] Leverage the selection dialog to improve the graphical node tool creating a _frame_ `ConcernUsage` from `RequirementUsage` and `RequirementDefinition` graphical nodes. == v2026.5.0 diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVFramedConcernTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVFramedConcernTests.java index 5b4c7cf86..859ef3970 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVFramedConcernTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVFramedConcernTests.java @@ -130,7 +130,7 @@ private void createFramedConcernWithEdge(EClass parentEClass, String graphicalSo var edgeCreationToolId = diagramDescriptionIdProvider.getEdgeCreationToolId( this.descriptionNameGenerator.getNodeName(parentEClass), - "New framed Concern"); + "New Framed Concern"); AtomicReference diagram = new AtomicReference<>(); Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeRequirementCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeRequirementCreationTests.java index ca1cbef7b..e7d87552b 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeRequirementCreationTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeRequirementCreationTests.java @@ -30,6 +30,7 @@ import org.eclipse.emf.ecore.EReference; import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramEventInput; import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramRefreshedEventPayload; +import org.eclipse.sirius.components.core.api.IIdentityService; import org.eclipse.sirius.components.core.api.IObjectSearchService; import org.eclipse.sirius.components.diagrams.Diagram; import org.eclipse.sirius.components.view.emf.diagram.IDiagramIdProvider; @@ -44,6 +45,7 @@ import org.eclipse.syson.application.controllers.diagrams.testers.ToolTester; import org.eclipse.syson.application.controllers.utils.TestNameGenerator; import org.eclipse.syson.application.data.GeneralViewWithTopNodesTestProjectData; +import org.eclipse.syson.diagram.common.view.nodes.FramedConcernCompartmentItemNodeDescription; import org.eclipse.syson.services.SemanticRunnableFactory; import org.eclipse.syson.services.diagrams.DiagramComparator; import org.eclipse.syson.services.diagrams.DiagramDescriptionIdProvider; @@ -51,8 +53,11 @@ import org.eclipse.syson.services.diagrams.api.IGivenDiagramDescription; import org.eclipse.syson.services.diagrams.api.IGivenDiagramSubscription; import org.eclipse.syson.standard.diagrams.view.SDVDescriptionNameGenerator; +import org.eclipse.syson.sysml.ConcernUsage; import org.eclipse.syson.sysml.Element; +import org.eclipse.syson.sysml.FramedConcernMembership; import org.eclipse.syson.sysml.PartUsage; +import org.eclipse.syson.sysml.ReferenceSubsetting; import org.eclipse.syson.sysml.ReferenceUsage; import org.eclipse.syson.sysml.Specialization; import org.eclipse.syson.sysml.Subsetting; @@ -111,6 +116,9 @@ public class GVSubNodeRequirementCreationTests extends AbstractIntegrationTests @Autowired private DiagramComparator diagramComparator; + @Autowired + private IIdentityService identityService; + private NodeCreationTestsService creationTestsService; private final IDescriptionNameGenerator descriptionNameGenerator = new SDVDescriptionNameGenerator(); @@ -806,10 +814,10 @@ public void createRequirementUsageSiblingNodes(EClass childEClass, EReference co .verify(Duration.ofMinutes(10)); } - @DisplayName("GIVEN a Requirement Usage, WHEN creating a new Framed concern, THEN a new Framed concern is created") + @DisplayName("GIVEN a Requirement Usage, WHEN creating a New Framed Concern without referencing another concern, THEN a New Framed Concern is created") @GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) @Test - public void createRequirementUsageFramedConcern() { + public void createRequirementUsageFramedConcernWithoutSelection() { var flux = this.givenSubscriptionToDiagram(); AtomicReference diagram = new AtomicReference<>(); @@ -821,7 +829,7 @@ public void createRequirementUsageFramedConcern() { EClass parentEClass = SysmlPackage.eINSTANCE.getRequirementUsage(); String targetObjectId = GeneralViewWithTopNodesTestProjectData.SemanticIds.REQUIREMENT_USAGE_ID; - Runnable createNodeRunnable = this.creationTestsService.createNode(diagramDescriptionIdProvider, diagram, parentEClass, targetObjectId, "New framed Concern"); + Runnable createNodeRunnable = this.creationTestsService.createNodeWithSelectionDialogWithoutSelectionProvided(diagramDescriptionIdProvider, diagram, parentEClass, targetObjectId, "New Framed Concern"); Consumer diagramCheck = this.diagramCheckerService.siblingNodeGraphicalChecker(diagram, diagramDescriptionIdProvider, SysmlPackage.eINSTANCE.getConcernUsage(), 8, 2); Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker("requirement", SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern(), SysmlPackage.eINSTANCE.getConcernUsage())); @@ -834,6 +842,74 @@ public void createRequirementUsageFramedConcern() { .verify(Duration.ofSeconds(10)); } + @DisplayName("GIVEN a Requirement Usage, WHEN creating a New Framed Concern referencing another concern, THEN a New Framed Concern is created") + @GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) + @Test + public void createRequirementUsageFramedConcernWithSelection() { + var flux = this.givenSubscriptionToDiagram(); + + AtomicReference diagram = new AtomicReference<>(); + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram::set); + + var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, + SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); + var diagramDescriptionIdProvider = new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider); + + EClass parentEClass = SysmlPackage.eINSTANCE.getRequirementUsage(); + String targetObjectId = GeneralViewWithTopNodesTestProjectData.SemanticIds.REQUIREMENT_USAGE_ID; + Runnable createNodeRunnable = this.creationTestsService.createNodeWithSelectionDialogWithSingleSelection(diagramDescriptionIdProvider, diagram, parentEClass, targetObjectId, "New Framed Concern", GeneralViewWithTopNodesTestProjectData.SemanticIds.CONCERN_USAGE_ID); + Consumer diagramCheck = assertRefreshedDiagramThat(newDiagram -> { + new CheckDiagramElementCount(this.diagramComparator) + .hasNewNodeCount(1) + .hasNewEdgeCount(1) + .check(diagram.get(), newDiagram); + + String newNodeDescriptionName = this.descriptionNameGenerator.getCompartmentItemName(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern()) + FramedConcernCompartmentItemNodeDescription.COMPARTMENT_ITEM_NAME; + new CheckNodeInCompartment(diagramDescriptionIdProvider, this.diagramComparator) + .withTargetObjectId(targetObjectId) + .withCompartmentName("frames") + .hasNodeDescriptionName(newNodeDescriptionName) + .hasCompartmentCount(0) + .isHidden() + .check(diagram.get(), newDiagram); + }); + + Consumer additionalCheck = object -> { + assertThat(object).isInstanceOf(List.class) + .asInstanceOf(type(List.class)) + .satisfies(concernUsages -> { + assertThat((List) concernUsages).size().isEqualTo(1); + assertThat(concernUsages.getFirst()) + .isInstanceOf(ConcernUsage.class) + .asInstanceOf(type(ConcernUsage.class)) + .satisfies(concernUsage -> { + assertThat(concernUsage.eContainer()) + .isInstanceOf(FramedConcernMembership.class) + .asInstanceOf(type(FramedConcernMembership.class)) + .satisfies(framedConcernMembership -> { + assertThat(this.identityService.getId(framedConcernMembership.getReferencedConcern())).isEqualTo(GeneralViewWithTopNodesTestProjectData.SemanticIds.CONCERN_USAGE_ID); + assertThat(concernUsage.getOwnedRelationship().getFirst()) + .isInstanceOf(ReferenceSubsetting.class) + .asInstanceOf(type(ReferenceSubsetting.class)) + .satisfies(referenceSubsetting -> { + assertThat(referenceSubsetting.getReferencedFeature()).isEqualTo(framedConcernMembership.getReferencedConcern()); + }); + }); + }); + }); + }; + + Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker("requirement", SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern(), SysmlPackage.eINSTANCE.getConcernUsage(), additionalCheck)); + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(createNodeRunnable) + .consumeNextWith(diagramCheck) + .then(semanticCheck) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + @GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) @ParameterizedTest @MethodSource("requirementUsageChildNodeParameters") diff --git a/backend/services/syson-model-services/src/main/java/org/eclipse/syson/model/services/ModelMutationElementService.java b/backend/services/syson-model-services/src/main/java/org/eclipse/syson/model/services/ModelMutationElementService.java index 34d03616c..e740334af 100644 --- a/backend/services/syson-model-services/src/main/java/org/eclipse/syson/model/services/ModelMutationElementService.java +++ b/backend/services/syson-model-services/src/main/java/org/eclipse/syson/model/services/ModelMutationElementService.java @@ -220,13 +220,16 @@ public FramedConcernMembership createFramedConcern(Type type, ConcernUsage conce var newConcernUsage = SysmlFactory.eINSTANCE.createConcernUsage(); newFramedConcernMembership.getOwnedRelatedElement().add(newConcernUsage); - var newReferenceSubsetting = SysmlFactory.eINSTANCE.createReferenceSubsetting(); - newConcernUsage.getOwnedRelationship().add(newReferenceSubsetting); - newReferenceSubsetting.setReferencedFeature(concernUsage); - this.metamodelMutationElementService.initialize(newFramedConcernMembership); this.metamodelMutationElementService.initialize(newConcernUsage); - this.metamodelMutationElementService.initialize(newReferenceSubsetting); + + if (concernUsage != null) { + var newReferenceSubsetting = SysmlFactory.eINSTANCE.createReferenceSubsetting(); + newConcernUsage.getOwnedRelationship().add(newReferenceSubsetting); + newReferenceSubsetting.setReferencedFeature(concernUsage); + this.metamodelMutationElementService.initialize(newReferenceSubsetting); + } + return newFramedConcernMembership; } return null; diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/FramedConcernCompartmentNodeDescription.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/FramedConcernCompartmentNodeDescription.java index 955536cec..b38f95b84 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/FramedConcernCompartmentNodeDescription.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/FramedConcernCompartmentNodeDescription.java @@ -18,8 +18,10 @@ import org.eclipse.emf.ecore.EReference; import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.builder.providers.INodeToolProvider; import org.eclipse.sirius.components.view.diagram.DiagramDescription; import org.eclipse.sirius.components.view.diagram.NodeDescription; +import org.eclipse.syson.diagram.common.view.tools.FramedConcernNodeToolProvider; import org.eclipse.syson.util.IDescriptionNameGenerator; /** @@ -54,6 +56,11 @@ public void link(DiagramDescription diagramDescription, IViewDiagramElementFinde }); } + @Override + protected List getItemCreationToolProviders() { + return List.of(new FramedConcernNodeToolProvider()); + } + @Override protected List getDroppableNodes(IViewDiagramElementFinder cache) { return List.of(); diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolService.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolService.java index 1bc3c8d3e..23872290c 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolService.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewEdgeToolService.java @@ -676,7 +676,7 @@ public EdgeTool createFramedConcernEdgeTool() { .ifPresent(targetNodeDescriptions::add); return builder - .name(this.nameGenerator.getCreationToolName("New framed ", SysmlPackage.eINSTANCE.getConcernUsage())) + .name(this.nameGenerator.getCreationToolName("New Framed ", SysmlPackage.eINSTANCE.getConcernUsage())) .iconURLsExpression(METAMODEL_ICONS_PATH + SysmlPackage.eINSTANCE.getFramedConcernMembership().getName() + SVG) .body(body.build()) .targetElementDescriptions(targetNodeDescriptions.toArray(NodeDescription[]::new)) diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewToolService.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewToolService.java index 2fd70e55e..226c5af5c 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewToolService.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewToolService.java @@ -607,6 +607,36 @@ public List getExhibitStateSelectionDialogChildren(Object sele return this.getChildrenWithInstancesOf(selectionDialogTreeElement, editingContext, expandedIds, List.of(SysmlPackage.eINSTANCE.getStateUsage())); } + /** + * Provides the root elements in the tree of the selection dialog for presenting all existing ConcernUsage. + * + * @param editingContext + * the (non-{@code null}) {@link IEditingContext}. + * @return the (non-{@code null}) {@link List} of all {@link Resource} and {@link ISysONExplorerFragment} that + * contain at least one {@link org.eclipse.syson.sysml.ConcernUsage}. + */ + public List getConcernReferenceSelectionDialogElements(IEditingContext editingContext) { + return this.getAllResourcesWithInstancesOf(editingContext, List.of(SysmlPackage.eINSTANCE.getConcernUsage())); + } + + /** + * Provides the children of element in the tree of the selection dialog for presenting all existing ConcernUsage. + * + * @param selectionDialogTreeElement + * a (non-{@code null}) selection dialog tree element. + * @param editingContext + * the (non-{@code null}) {@link IEditingContext}. + * @param expandedIds + * the list of already expanded treeItems, by their Ids. + * @return the (non-{@code null}) {@link List} of all children that contain (possibly indirectly) an + * {@link org.eclipse.syson.sysml.ConcernUsage}. + */ + public List getConcernReferenceSelectionDialogChildren(Object selectionDialogTreeElement, IEditingContext editingContext, List expandedIds) { + return this.getChildrenWithInstancesOf(selectionDialogTreeElement, editingContext, expandedIds, List.of(SysmlPackage.eINSTANCE.getConcernUsage())); + } + + + /** * Provides the root elements in the tree of the selection dialog for the any creation tool. * diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/FramedConcernNodeToolProvider.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/FramedConcernNodeToolProvider.java new file mode 100644 index 000000000..6ae05a681 --- /dev/null +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/tools/FramedConcernNodeToolProvider.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.syson.diagram.common.view.tools; + +import org.eclipse.sirius.components.collaborative.diagrams.DiagramContext; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.diagrams.Node; +import org.eclipse.sirius.components.trees.renderer.TreeRenderer; +import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder; +import org.eclipse.sirius.components.view.builder.generated.diagram.DiagramBuilders; +import org.eclipse.sirius.components.view.builder.generated.view.ViewBuilders; +import org.eclipse.sirius.components.view.builder.providers.INodeToolProvider; +import org.eclipse.sirius.components.view.diagram.DialogDescription; +import org.eclipse.sirius.components.view.diagram.NodeTool; +import org.eclipse.sirius.components.view.emf.diagram.ViewDiagramDescriptionConverter; +import org.eclipse.syson.diagram.common.view.services.ViewToolService; +import org.eclipse.syson.diagram.services.aql.DiagramMutationAQLService; +import org.eclipse.syson.model.services.aql.ModelMutationAQLService; +import org.eclipse.syson.sysml.SysmlPackage; +import org.eclipse.syson.util.AQLConstants; +import org.eclipse.syson.util.ServiceMethod; +import org.eclipse.syson.util.SysMLMetamodelHelper; + +/** + * Used to create a Framed {@link org.eclipse.syson.sysml.ConcernUsage} in a {@link org.eclipse.syson.sysml.RequirementUsage} or a {@link org.eclipse.syson.sysml.RequirementDefinition}. + * + * @author gcoutable + */ +public class FramedConcernNodeToolProvider implements INodeToolProvider { + + private final DiagramBuilders diagramBuilderHelper = new DiagramBuilders(); + + private final ViewBuilders viewBuilderHelper = new ViewBuilders(); + + @Override + public NodeTool create(IViewDiagramElementFinder cache) { + var builder = this.diagramBuilderHelper.newNodeTool(); + + var updateExposedElements = this.viewBuilderHelper.newChangeContext() + .expression(ServiceMethod.of4(DiagramMutationAQLService::expose).aqlSelf(IEditingContext.EDITING_CONTEXT, DiagramContext.DIAGRAM_CONTEXT, Node.SELECTED_NODE, + ViewDiagramDescriptionConverter.CONVERTED_NODES_VARIABLE)); + + var selectedElementToExpose = this.viewBuilderHelper.newChangeContext() + .expression(AQLConstants.AQL_SELF + "." + SysmlPackage.eINSTANCE.getFramedConcernMembership_ReferencedConcern().getName()) + .children(updateExposedElements.build()); + + var body = this.viewBuilderHelper.newChangeContext() + .expression(ServiceMethod.of1(ModelMutationAQLService::createFramedConcern).aqlSelf("selectedObject")) + .children(selectedElementToExpose.build()); + + return builder + .name(this.getToolName()) + .iconURLsExpression("/icons/full/obj16/ConcernUsage.svg") + .body(body.build()) + .dialogDescription(this.getSelectionDialogDescription()) + .build(); + } + + private String getToolName() { + return "New Framed Concern"; + } + + private DialogDescription getSelectionDialogDescription() { + String concernUsageType = SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getConcernUsage()); + + var selectionDialogTree = this.diagramBuilderHelper.newSelectionDialogTreeDescription() + .isSelectableExpression(AQLConstants.AQL_SELF + ".oclIsKindOf(" + concernUsageType + ")") + .elementsExpression(ServiceMethod.of0(ViewToolService::getConcernReferenceSelectionDialogElements).aql(IEditingContext.EDITING_CONTEXT)) + .childrenExpression(ServiceMethod.of2(ViewToolService::getConcernReferenceSelectionDialogChildren).aqlSelf(IEditingContext.EDITING_CONTEXT, TreeRenderer.EXPANDED)) + .build(); + + return this.diagramBuilderHelper.newSelectionDialogDescription() + .selectionDialogTreeDescription(selectionDialogTree) + .defaultTitleExpression(this.getToolName()) + .noSelectionTitleExpression(this.getToolName()) + .withSelectionTitleExpression(this.getToolName()) + .descriptionExpression("Create a Framed Concern") + .noSelectionActionLabelExpression("Create a New Framed Concern") + .noSelectionActionDescriptionExpression("Create a New Framed Concern without referencing an existing Concern") + .withSelectionActionLabelExpression("Select an existing Concern to frame") + .withSelectionActionDescriptionExpression("Create a New Framed Concern referencing the selected Concern") + .noSelectionActionStatusMessageExpression("It will create a New Framed Concern without referencing an existing Concern") + .selectionRequiredWithoutSelectionStatusMessageExpression("Select on Concern to frame") + .selectionRequiredWithSelectionStatusMessageExpression(AQLConstants.AQL + "'It will create a new Concern referencing ' + selectedObjects->first().name") + .optional(true) + .build(); + } +} diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDescriptionNameGenerator.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDescriptionNameGenerator.java index 6a13879ea..8ad77a1df 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDescriptionNameGenerator.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDescriptionNameGenerator.java @@ -42,9 +42,6 @@ public String getCreationToolName(EReference eReference) { } else if (SysmlPackage.eINSTANCE.getRequirementUsage_RequiredConstraint().equals(eReference) || SysmlPackage.eINSTANCE.getRequirementDefinition_RequiredConstraint().equals(eReference)) { name = "New Require constraint"; - } else if (SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern().equals(eReference) - || SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern().equals(eReference)) { - name = "New framed Concern"; } return name; } diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java index d707f999c..00e3626df 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java @@ -231,8 +231,8 @@ public class SDVDiagramDescriptionProvider implements IRepresentationDescription Map.entry(SysmlPackage.eINSTANCE.getPerformActionUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), SysmlPackage.eINSTANCE.getUsage_NestedAction())), Map.entry(SysmlPackage.eINSTANCE.getPortDefinition(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getDefinition_OwnedAttribute(), SysmlPackage.eINSTANCE.getDefinition_OwnedPort(), SysmlPackage.eINSTANCE.getDefinition_OwnedReference(), SysmlPackage.eINSTANCE.getDefinition_OwnedItem())), Map.entry(SysmlPackage.eINSTANCE.getPortUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), SysmlPackage.eINSTANCE.getUsage_NestedReference(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), SysmlPackage.eINSTANCE.getUsage_NestedItem())), - Map.entry(SysmlPackage.eINSTANCE.getRequirementDefinition(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getDefinition_OwnedAttribute(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), SysmlPackage.eINSTANCE.getDefinition_OwnedRequirement(), SysmlPackage.eINSTANCE.getRequirementDefinition_AssumedConstraint(), SysmlPackage.eINSTANCE.getRequirementDefinition_RequiredConstraint(), SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern())), - Map.entry(SysmlPackage.eINSTANCE.getRequirementUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), SysmlPackage.eINSTANCE.getRequirementUsage_AssumedConstraint(), SysmlPackage.eINSTANCE.getRequirementUsage_RequiredConstraint(), SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern(), SysmlPackage.eINSTANCE.getUsage_NestedPort())), + Map.entry(SysmlPackage.eINSTANCE.getRequirementDefinition(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getDefinition_OwnedAttribute(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), SysmlPackage.eINSTANCE.getDefinition_OwnedRequirement(), SysmlPackage.eINSTANCE.getRequirementDefinition_AssumedConstraint(), SysmlPackage.eINSTANCE.getRequirementDefinition_RequiredConstraint())), + Map.entry(SysmlPackage.eINSTANCE.getRequirementUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), SysmlPackage.eINSTANCE.getRequirementUsage_AssumedConstraint(), SysmlPackage.eINSTANCE.getRequirementUsage_RequiredConstraint(), SysmlPackage.eINSTANCE.getUsage_NestedPort())), Map.entry(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), SysmlPackage.eINSTANCE.getRequirementUsage_AssumedConstraint(), SysmlPackage.eINSTANCE.getRequirementUsage_RequiredConstraint(), SysmlPackage.eINSTANCE.getUsage_NestedPort())), Map.entry(SysmlPackage.eINSTANCE.getStateDefinition(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getDefinition_OwnedAction(), SysmlPackage.eINSTANCE.getDefinition_OwnedState())), Map.entry(SysmlPackage.eINSTANCE.getStateUsage(), List.of(SysmlPackage.eINSTANCE.getElement_Documentation(), SysmlPackage.eINSTANCE.getUsage_NestedAction(), SysmlPackage.eINSTANCE.getUsage_NestedState())), @@ -639,9 +639,6 @@ private List> createCompartmentsForListIte } else if (SysmlPackage.eINSTANCE.getPortUsage().equals(eClass) && SysmlPackage.eINSTANCE.getUsage_NestedItem().equals(eReference)) { compartmentNodeDescriptionProviders.add(new CompartmentNodeDescriptionProvider(eClass, eReference, colorProvider)); compartmentNodeDescriptionProviders.add(new PortUsageNestedItemCompartmentItemNodeDescriptionProvider(colorProvider, this.getDescriptionNameGenerator())); - } else if (SysmlPackage.eINSTANCE.getRequirementDefinition().equals(eClass) && SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern().equals(eReference) - || SysmlPackage.eINSTANCE.getRequirementUsage().equals(eClass) && SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern().equals(eReference)) { - compartmentNodeDescriptionProviders.add(new InheritedCompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator())); } else { compartmentNodeDescriptionProviders.add(new CompartmentItemNodeDescriptionProvider(eClass, eReference, colorProvider, this.getDescriptionNameGenerator())); compartmentNodeDescriptionProviders.add(new CompartmentNodeDescriptionProvider(eClass, eReference, colorProvider)); diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/services/SDVNodeToolSectionSwitch.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/services/SDVNodeToolSectionSwitch.java index 4d13515ec..b44f8f24c 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/services/SDVNodeToolSectionSwitch.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/services/SDVNodeToolSectionSwitch.java @@ -37,6 +37,7 @@ import org.eclipse.syson.diagram.common.view.tools.DoneStateNodeToolProvider; import org.eclipse.syson.diagram.common.view.tools.ExhibitStateNodeToolProvider; import org.eclipse.syson.diagram.common.view.tools.ForkActionNodeToolProvider; +import org.eclipse.syson.diagram.common.view.tools.FramedConcernNodeToolProvider; import org.eclipse.syson.diagram.common.view.tools.InterfaceDefinitionEndCompartmentNodeToolProvider; import org.eclipse.syson.diagram.common.view.tools.JoinActionNodeToolProvider; import org.eclipse.syson.diagram.common.view.tools.MergeActionNodeToolProvider; @@ -698,6 +699,8 @@ public List caseRequirementUsage(RequirementUsage object) { this.toolDescriptionService.createNodeTool(this.getNodeDescription(SysmlPackage.eINSTANCE.getPartUsage()), SysmlPackage.eINSTANCE.getPartUsage())); this.toolDescriptionService.addNodeTool(sections, ToolConstants.REQUIREMENTS, this.toolDescriptionService.createNodeTool(this.getNodeDescription(SysmlPackage.eINSTANCE.getRequirementUsage()), SysmlPackage.eINSTANCE.getRequirementUsage())); + this.toolDescriptionService.addNodeTool(sections, ToolConstants.REQUIREMENTS, + new FramedConcernNodeToolProvider().create(this.cache)); this.toolDescriptionService.addNodeTool(sections, ToolConstants.STRUCTURE, this.createNewSubjectNodeTool()); this.toolDescriptionService.addNodeTool(sections, ToolConstants.STRUCTURE, this.createNewActorNodeTool()); this.toolDescriptionService.addNodeTool(sections, ToolConstants.STRUCTURE, this.createNewStakeholderNodeTool()); @@ -718,6 +721,8 @@ public List caseRequirementUsage(RequirementUsage object) { @Override public List caseRequirementDefinition(RequirementDefinition object) { var sections = this.toolDescriptionService.createDefaultNodeToolSections(); + this.toolDescriptionService.addNodeTool(sections, ToolConstants.REQUIREMENTS, + new FramedConcernNodeToolProvider().create(this.cache)); this.toolDescriptionService.addNodeTool(sections, ToolConstants.STRUCTURE, this.createNewSubjectNodeTool()); this.toolDescriptionService.addNodeTool(sections, ToolConstants.STRUCTURE, this.createNewActorNodeTool()); this.toolDescriptionService.addNodeTool(sections, ToolConstants.STRUCTURE, this.createNewStakeholderNodeTool()); diff --git a/doc/content/modules/user-manual/assets/images/release-notes-framed-concern-tool.png b/doc/content/modules/user-manual/assets/images/release-notes-framed-concern-tool.png index aaf269a36..1f6c846b7 100644 Binary files a/doc/content/modules/user-manual/assets/images/release-notes-framed-concern-tool.png and b/doc/content/modules/user-manual/assets/images/release-notes-framed-concern-tool.png differ diff --git a/doc/content/modules/user-manual/pages/release-notes/2026.7.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2026.7.0.adoc index 8baf5785c..5caee155a 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2026.7.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2026.7.0.adoc @@ -19,7 +19,7 @@ image::release-notes-frame-edge.png[Frame edge between a RequirementUsage and a + image::release-notes-start-done-states.png[Tool to create a start and done, width=60%,height=60%] -** Add a new tools to create a _frame_ `ConcernUsage` from `RequirementUsage` and `RequirementDefinition` graphical nodes. +** Add a new tool to create a _frame_ `ConcernUsage` from `RequirementUsage` and `RequirementDefinition` graphical nodes. + image::release-notes-framed-concern-tool.png[Tool to create a _frame_ concern usage, width=60%,height=60%] @@ -27,6 +27,8 @@ image::release-notes-framed-concern-tool.png[Tool to create a _frame_ concern us + image::release-notes-frames-compartment.png[frames compartment displaying concern usages of a requirement, width=60%,height=60%] +** Leverage the selection dialog to improve the graphical node tool creating a _frame_ `ConcernUsage` from `RequirementUsage` and `RequirementDefinition` graphical nodes. + * In the _Explorer_ view: ** The tree items corresponding to the internals of `Expression` elements (syntax tree) are now hidden by default.