diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 63db67bd6..798ba10e1 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -24,6 +24,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 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 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/GVAddExistingElementsTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddExistingElementsTests.java index e4d2ffb80..b8f527c95 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddExistingElementsTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVAddExistingElementsTests.java @@ -147,6 +147,7 @@ public void addExistingElementsOnDiagram() { .verify(Duration.ofSeconds(10)); } + @DisplayName("GIVEN a GV diagram, WHEN adding existing element recursively, THEN expected nodes should have been added to the diagram") @GivenSysONServer({ GeneralViewAddExistingElementsTestProjectData.SCRIPT_PATH }) @Test public void addExistingElementsRecursiveOnDiagram() { @@ -450,7 +451,7 @@ private void checkRequirementUsage(Diagram newDiagram) { assertThat(optRequirementNode).isPresent(); assertThat(optRequirementNode.get().getChildNodes()) - .as("Node RequirementUsage should contain 8 hidden compartment children").hasSize(8) + .as("Node RequirementUsage should contain 9 hidden compartment children").hasSize(9) .allMatch(node -> node.getModifiers().contains(ViewModifier.Hidden)); } diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVDropFromExplorerTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVDropFromExplorerTests.java index c34f322be..f5af899d9 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVDropFromExplorerTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVDropFromExplorerTests.java @@ -237,12 +237,12 @@ public void dropFromExplorerShortNameOnlyOnEmptyDiagram() { new CheckDiagramElementCount(this.diagramComparator) .hasNewEdgeCount(0) // 1 node for the Requirement and 8 for its compartments and one for the documentation - .hasNewNodeCount(10) + .hasNewNodeCount(11) .check(diagram.get(), newDiagram); new CheckNodeOnDiagram(diagramDescriptionIdProvider, this.diagramComparator) .hasNodeDescriptionName(this.descriptionNameGenerator.getNodeName(SysmlPackage.eINSTANCE.getRequirementUsage())) .hasTargetObjectLabel("RequirementUsage") - .hasTotalCompartmentCount(8) + .hasTotalCompartmentCount(9) .check(diagram.get(), newDiagram); }); 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 f39c2fd74..f94dbc409 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(); @@ -123,7 +131,7 @@ private static Stream concernUsageSiblingNodeParameters() { return Stream.of( Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 4), Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 11), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 8)) + Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 9)) .map(TestNameGenerator::namedArguments); } @@ -156,7 +164,7 @@ private static Stream concernDefinitionChildNodeParameters() { private static Stream concernDefinitionSiblingAndChildNodeParameters() { return Stream.of( - Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), "requirements", SysmlPackage.eINSTANCE.getDefinition_OwnedRequirement(), null, 10, 1), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), "requirements", SysmlPackage.eINSTANCE.getDefinition_OwnedRequirement(), null, 11, 1), Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), "assume constraints", SysmlPackage.eINSTANCE.getRequirementDefinition_AssumedConstraint(), "New Assume constraint", 6, 1), Arguments.of(SysmlPackage.eINSTANCE.getConstraintUsage(), "require constraints", SysmlPackage.eINSTANCE.getRequirementDefinition_RequiredConstraint(), "New Require constraint", 6, 1)) .map(TestNameGenerator::namedArguments); @@ -210,7 +218,7 @@ private static Stream requirementUsageSiblingNodeParameters() { return Stream.of( Arguments.of(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), 4), Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), 11), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 8)) + Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), 9)) .map(TestNameGenerator::namedArguments); } @@ -797,6 +805,102 @@ public void createRequirementUsageSiblingNodes(EClass childEClass, EReference co Consumer diagramCheck = this.diagramCheckerService.siblingNodeGraphicalChecker(diagram, diagramDescriptionIdProvider, childEClass, compartmentCount); Runnable semanticCheck = this.semanticCheckerService.checkEditingContext(this.semanticCheckerService.getElementInParentSemanticChecker("requirement", containmentReference, childEClass)); + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(createNodeRunnable) + .consumeNextWith(diagramCheck) + .then(semanticCheck) + .thenCancel() + .verify(Duration.ofMinutes(10)); + } + + @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 createRequirementUsageFramedConcernWithoutSelection() { + 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.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())); + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(createNodeRunnable) + .consumeNextWith(diagramCheck) + .then(semanticCheck) + .thenCancel() + .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) diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java index 82140fb1f..d9bb37e51 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVSubNodeStructureCreationTests.java @@ -221,8 +221,8 @@ private static Stream packageChildNodeParameters() { Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), ownedMember, 11, 0, 0), Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), ownedMember, 5, 0, 0), Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), ownedMember, 5, 0, 0), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), ownedMember, 8, 0, 0), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), ownedMember, 8, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), ownedMember, 9, 0, 0), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), ownedMember, 9, 0, 0), Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), ownedMember, 5, 0, 0), Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), ownedMember, 7, 0, 0), Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), ownedMember, 8, 0, 0), diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java index 290e517c2..413aded8e 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVTopNodeCreationTests.java @@ -177,8 +177,8 @@ private static Stream topNodeParameters() { Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 5, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false), Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 5, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false), Arguments.of(SysmlPackage.eINSTANCE.getReferenceUsage(), 0, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 8, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 9, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 9, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false), Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), 5, 0, 0, 0, ViewConstants.DEFAULT_DEFINITION_NODE_HEIGHT, ViewConstants.DEFAULT_DEFINITION_NODE_WIDTH, false), Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 7, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false), Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), 8, 0, 0, 0, ViewConstants.DEFAULT_USAGE_NODE_HEIGHT, ViewConstants.DEFAULT_USAGE_NODE_WIDTH, false), diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVViewUsageTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVViewUsageTests.java index 6f920fea9..f75b0ae73 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVViewUsageTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVViewUsageTests.java @@ -156,8 +156,8 @@ private static Stream childNodeParameters() { Arguments.of(SysmlPackage.eINSTANCE.getPartUsage(), 11, 0, 0, false), Arguments.of(SysmlPackage.eINSTANCE.getPortDefinition(), 5, 0, 0, false), Arguments.of(SysmlPackage.eINSTANCE.getPortUsage(), 5, 0, 0, false), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 8, 0, 0, false), - Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 8, 0, 0, false), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementDefinition(), 9, 0, 0, false), + Arguments.of(SysmlPackage.eINSTANCE.getRequirementUsage(), 9, 0, 0, false), Arguments.of(SysmlPackage.eINSTANCE.getUseCaseDefinition(), 5, 0, 0, false), Arguments.of(SysmlPackage.eINSTANCE.getUseCaseUsage(), 7, 0, 0, false), Arguments.of(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), 8, 0, 0, false), 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/FramedConcernCompartmentItemNodeDescription.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/FramedConcernCompartmentItemNodeDescription.java new file mode 100644 index 000000000..e2eacb9b8 --- /dev/null +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/FramedConcernCompartmentItemNodeDescription.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * 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.nodes; + +import org.eclipse.emf.ecore.EClass; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.sirius.components.view.builder.providers.IColorProvider; +import org.eclipse.sirius.components.view.diagram.NodeDescription; +import org.eclipse.syson.sysml.SysmlPackage; +import org.eclipse.syson.util.IDescriptionNameGenerator; +import org.eclipse.syson.util.SysMLMetamodelHelper; + +/** + * Used to create a {@link org.eclipse.syson.sysml.ConcernUsage} compartment item node description. + *

+ * {@link org.eclipse.syson.sysml.ConcernUsage} compartment items have to be contained in a {@link org.eclipse.syson.sysml.FramedConcernMembership}. + *

+ * @author gcoutable + */ +public class FramedConcernCompartmentItemNodeDescription extends CompartmentItemNodeDescriptionProvider { + + public static final String COMPARTMENT_ITEM_NAME = " frame Concern"; + + public FramedConcernCompartmentItemNodeDescription(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) { + super(eClass, eReference, colorProvider, descriptionNameGenerator); + } + + @Override + public NodeDescription create() { + NodeDescription nodeDescription = super.create(); + nodeDescription.setPreconditionExpression("true"); + return nodeDescription; + } + + @Override + protected String getDomainType() { + return SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getElement()); + } + + @Override + protected String getName() { + return super.getName() + COMPARTMENT_ITEM_NAME; + } +} 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 new file mode 100644 index 000000000..b38f95b84 --- /dev/null +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/FramedConcernCompartmentNodeDescription.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * 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.nodes; + +import java.util.List; + +import org.eclipse.emf.ecore.EClass; +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; + +/** + * Compartment node allowing to display {@link org.eclipse.syson.sysml.ConcernUsage} owned by a {@link org.eclipse.syson.sysml.FramedConcernMembership}. + * + * @author gcoutable + */ +public class FramedConcernCompartmentNodeDescription extends AbstractCompartmentNodeDescriptionProvider { + + public static final String COMPARTMENT_NAME = " frames"; + + public FramedConcernCompartmentNodeDescription(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) { + super(eClass, eReference, colorProvider, descriptionNameGenerator); + } + + @Override + protected String getCompartmentName() { + return this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + COMPARTMENT_NAME; + } + + @Override + protected String getCustomCompartmentLabel() { + return "frames"; + } + + @Override + public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) { + cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentName(this.eClass, this.eReference) + COMPARTMENT_NAME).ifPresent(nodeDescription -> { + cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + FramedConcernCompartmentItemNodeDescription.COMPARTMENT_ITEM_NAME) + .ifPresent(itemNodeDescription -> nodeDescription.getChildrenDescriptions().add(itemNodeDescription)); + nodeDescription.setPalette(this.createCompartmentPalette(cache)); + }); + } + + @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/ViewCreateService.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewCreateService.java index 415a43bcb..8bb066b2e 100644 --- a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewCreateService.java +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewCreateService.java @@ -213,6 +213,8 @@ private Membership createAppropriateMembership(EStructuralFeature feature) { ((RequirementConstraintMembership) result).setKind(RequirementConstraintKind.REQUIREMENT); } else if (feature.equals(SysmlPackage.eINSTANCE.getElement_Documentation())) { result = SysmlFactory.eINSTANCE.createOwningMembership(); + } else if (feature.equals(SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern()) || feature.equals(SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern())) { + result = SysmlFactory.eINSTANCE.createFramedConcernMembership(); } return result; } 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 fb39b78dc..a12bbf760 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 @@ -588,6 +588,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..44cd31fe6 --- /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 + ".referencedConcern") + .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/SDVDiagramDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java index c186afea7..1f635f48d 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 @@ -52,6 +52,8 @@ import org.eclipse.syson.diagram.common.view.nodes.DoneActionNodeDescriptionProvider; import org.eclipse.syson.diagram.common.view.nodes.DoneStateNodeDescriptionProvider; import org.eclipse.syson.diagram.common.view.nodes.ForkActionNodeDescriptionProvider; +import org.eclipse.syson.diagram.common.view.nodes.FramedConcernCompartmentItemNodeDescription; +import org.eclipse.syson.diagram.common.view.nodes.FramedConcernCompartmentNodeDescription; import org.eclipse.syson.diagram.common.view.nodes.ImportedPackageNodeDescriptionProvider; import org.eclipse.syson.diagram.common.view.nodes.InheritedCompartmentItemNodeDescriptionProvider; import org.eclipse.syson.diagram.common.view.nodes.InterconnectionCompartmentNodeDescriptionProvider; @@ -382,6 +384,7 @@ public RepresentationDescription create(IColorProvider colorProvider) { this.linkActionPerformActionsCompartment(cache); this.linkInterconnectionCompartment(cache); this.linkSatisfyRequirementsCompartment(cache); + this.linkFramedConcernCompartment(cache); var palette = this.createDiagramPalette(cache); diagramDescription.setPalette(palette); @@ -545,11 +548,11 @@ private List> createAllCompartmentNodeDesc // ActionUsage, PartUsage, PerformActionUsage compartmentNodeDescriptionProviders.addAll(this.createCompartmentsForNestedAction(colorProvider)); - // Compartment "interconnection" (many usages and defintions) is defined for: + // Compartment "interconnection" (many usages and definitions) is defined for: // PartUsage, PartDefinition compartmentNodeDescriptionProviders.addAll(this.createInterconnectionCompartment(colorProvider)); - // Compartment "satisfy requirements" (many usages and defintions) is defined for: + // Compartment "satisfy requirements" (many usages and definitions) is defined for: // PartUsage, PartDefinition compartmentNodeDescriptionProviders.addAll(this.createSatisfyRequirementsCompartments(colorProvider)); @@ -578,6 +581,10 @@ private List> createAllCompartmentNodeDesc compartmentNodeDescriptionProviders.add(new StateTransitionCompartmentNodeDescriptionProvider(SysmlPackage.eINSTANCE.getExhibitStateUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState(), colorProvider, this.getDescriptionNameGenerator())); + // Compartment "frames" (ConcernUsage contained by FramedConcernMembership) is defined for: + // RequirementUsage, RequirementDefinition + compartmentNodeDescriptionProviders.addAll(this.createFramedConcernCompartments(colorProvider)); + compartmentNodeDescriptionProviders.addAll(this.createCompartmentsForListItems(colorProvider)); return compartmentNodeDescriptionProviders; @@ -707,6 +714,19 @@ private List> createSatisfyRequirementsCom return compartmentNodeDescriptionProviders; } + private List> createFramedConcernCompartments(IColorProvider colorProvider) { + List> compartmentNodeDescriptionProviders = new ArrayList<>(); + compartmentNodeDescriptionProviders.add(new FramedConcernCompartmentNodeDescription(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern(), + colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new FramedConcernCompartmentItemNodeDescription(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern(), + colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new FramedConcernCompartmentNodeDescription(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern(), + colorProvider, this.getDescriptionNameGenerator())); + compartmentNodeDescriptionProviders.add(new FramedConcernCompartmentItemNodeDescription(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern(), + colorProvider, this.getDescriptionNameGenerator())); + return compartmentNodeDescriptionProviders; + } + private List> createCompartmentsForConnectionEnd(IColorProvider colorProvider) { final List> compartmentNodeDescriptionProviders = new ArrayList<>(); @@ -914,6 +934,9 @@ private List> createAllDefinitionOwnedUsag definitionOwnedUsageEdgeDescriptionProviders .add(new DefinitionOwnedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getConstraintUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedConstraint(), colorProvider, this.getDescriptionNameGenerator())); + definitionOwnedUsageEdgeDescriptionProviders.add( + new DefinitionOwnedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedConcern(), colorProvider, + this.getDescriptionNameGenerator())); definitionOwnedUsageEdgeDescriptionProviders .add(new DefinitionOwnedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getInterfaceUsage(), SysmlPackage.eINSTANCE.getDefinition_OwnedInterface(), colorProvider, this.getDescriptionNameGenerator())); @@ -946,7 +969,75 @@ private List> createAllDefinitionOwnedUsag } private List> createAllUsageCompositeEdgeDescriptionProviders(IColorProvider colorProvider) { - final var usageCompositeEdgeDescriptionProviders = new ArrayList>(); + var usageCompositeEdgeDescriptionProviders = new ArrayList>(); + + usageCompositeEdgeDescriptionProviders.addAll(this.createAllUsageRequirementCompositeEdgeDescriptionProviders(colorProvider)); + usageCompositeEdgeDescriptionProviders.addAll(this.createAllUsageStructureCompositeEdgeDescriptionProviders(colorProvider)); + usageCompositeEdgeDescriptionProviders.addAll(this.createAllUsageBehaviorCompositeEdgeDescriptionProviders(colorProvider)); + usageCompositeEdgeDescriptionProviders.addAll(this.createAllUsageAnalysisCompositeEdgeDescriptionProviders(colorProvider)); + + return usageCompositeEdgeDescriptionProviders; + } + + private List> createAllUsageRequirementCompositeEdgeDescriptionProviders(IColorProvider colorProvider) { + var usageCompositeEdgeDescriptionProviders = new ArrayList>(); + + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getConstraintUsage(), SysmlPackage.eINSTANCE.getUsage_NestedConstraint(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(), SysmlPackage.eINSTANCE.getUsage_NestedConcern(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedConstraint(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), + colorProvider, this.getDescriptionNameGenerator())); + + usageCompositeEdgeDescriptionProviders.add(new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), + colorProvider, this.getDescriptionNameGenerator())); + + usageCompositeEdgeDescriptionProviders.add(new NestedStakeholderEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedStakeholderEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedStakeholderEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedStakeholderEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedStakeholderEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), + colorProvider, this.getDescriptionNameGenerator())); + + usageCompositeEdgeDescriptionProviders.add(new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_SubjectParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter(), + colorProvider, this.getDescriptionNameGenerator())); + + return usageCompositeEdgeDescriptionProviders; + } + + private List> createAllUsageStructureCompositeEdgeDescriptionProviders(IColorProvider colorProvider) { + var usageCompositeEdgeDescriptionProviders = new ArrayList>(); + + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getAttributeUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getPortUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), + colorProvider, this.getDescriptionNameGenerator())); + + return usageCompositeEdgeDescriptionProviders; + } + + private List> createAllUsageBehaviorCompositeEdgeDescriptionProviders(IColorProvider colorProvider) { + var usageCompositeEdgeDescriptionProviders = new ArrayList>(); usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getAcceptActionUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAction(), colorProvider, this.getDescriptionNameGenerator())); @@ -954,94 +1045,40 @@ private List> createAllUsageCompositeEdgeD colorProvider, this.getDescriptionNameGenerator())); usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getAllocationUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAllocation(), colorProvider, this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders - .add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getAttributeUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAttribute(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getConstraintUsage(), SysmlPackage.eINSTANCE.getUsage_NestedConstraint(), + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getExhibitStateUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState(), colorProvider, this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getExhibitStateUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getItemUsage(), SysmlPackage.eINSTANCE.getUsage_NestedItem(), colorProvider, this.getDescriptionNameGenerator())); usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getOccurrenceUsage(), SysmlPackage.eINSTANCE.getUsage_NestedOccurrence(), colorProvider, this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPart(), colorProvider, this.getDescriptionNameGenerator())); usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getPerformActionUsage(), SysmlPackage.eINSTANCE.getUsage_NestedAction(), colorProvider, this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getPortUsage(), SysmlPackage.eINSTANCE.getUsage_NestedPort(), colorProvider, this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), - colorProvider, this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedConstraint(), - colorProvider, this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getUsage_NestedRequirement(), + usageCompositeEdgeDescriptionProviders.add(new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getStateUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState(), colorProvider, this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new UsageNestedUsageEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getStateUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState(), colorProvider, this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter(), colorProvider, this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getUseCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_ActorParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getUseCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_ActorParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter(), colorProvider, - this.getDescriptionNameGenerator())); + return usageCompositeEdgeDescriptionProviders; + } - usageCompositeEdgeDescriptionProviders.add( - new NestedStakeholderEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedStakeholderEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedStakeholderEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedStakeholderEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedStakeholderEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getConcernDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter(), colorProvider, - this.getDescriptionNameGenerator())); + private List> createAllUsageAnalysisCompositeEdgeDescriptionProviders(IColorProvider colorProvider) { + var usageCompositeEdgeDescriptionProviders = new ArrayList>(); - usageCompositeEdgeDescriptionProviders.add( - new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getUseCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getIncludeUseCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_SubjectParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getUseCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_SubjectParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_SubjectParameter(), colorProvider, - this.getDescriptionNameGenerator())); - usageCompositeEdgeDescriptionProviders.add( - new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getSatisfyRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter(), colorProvider, - this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_ActorParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getUseCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_ActorParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedActorEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getUseCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_ActorParameter(), + colorProvider, this.getDescriptionNameGenerator())); + + usageCompositeEdgeDescriptionProviders.add(new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_SubjectParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getUseCaseDefinition(), SysmlPackage.eINSTANCE.getCaseDefinition_SubjectParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getUseCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter(), + colorProvider, this.getDescriptionNameGenerator())); + usageCompositeEdgeDescriptionProviders.add(new NestedSubjectEdgeDescriptionProvider(SysmlPackage.eINSTANCE.getIncludeUseCaseUsage(), SysmlPackage.eINSTANCE.getCaseUsage_SubjectParameter(), + colorProvider, this.getDescriptionNameGenerator())); return usageCompositeEdgeDescriptionProviders; } @@ -1364,6 +1401,21 @@ private void linkSatisfyRequirementsCompartment(IViewDiagramElementFinder cache) })); } + private void linkFramedConcernCompartment(IViewDiagramElementFinder cache) { + cache.getNodeDescription(this.getDescriptionNameGenerator().getNodeName(SysmlPackage.eINSTANCE.getRequirementDefinition())) + .ifPresent(requirementDefinitionNodeDescription -> { + cache.getNodeDescription(this.descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern()) + + FramedConcernCompartmentNodeDescription.COMPARTMENT_NAME) + .ifPresent(requirementDefinitionNodeDescription.getReusedChildNodeDescriptions()::add); + }); + cache.getNodeDescription(this.getDescriptionNameGenerator().getNodeName(SysmlPackage.eINSTANCE.getRequirementUsage())) + .ifPresent(requirementUsageNodeDescription -> { + cache.getNodeDescription(this.descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_FramedConcern()) + + FramedConcernCompartmentNodeDescription.COMPARTMENT_NAME) + .ifPresent(requirementUsageNodeDescription.getReusedChildNodeDescriptions()::add); + }); + } + private void addCompartmentNodeDescriptionInNodeDescription(IViewDiagramElementFinder cache, NodeDescription compartmentNodeDescription, EClass eClass) { cache.getNodeDescription(this.getDescriptionNameGenerator().getNodeName(eClass)) .ifPresent(nodeDescription -> { diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java index d9c2dc08c..9f9125a70 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/nodes/FakeNodeDescriptionProvider.java @@ -19,6 +19,7 @@ import org.eclipse.sirius.components.view.builder.providers.IColorProvider; import org.eclipse.sirius.components.view.diagram.NodeDescription; import org.eclipse.syson.diagram.common.view.nodes.AbstractFakeNodeDescriptionProvider; +import org.eclipse.syson.diagram.common.view.nodes.FramedConcernCompartmentNodeDescription; import org.eclipse.syson.diagram.common.view.nodes.InterconnectionCompartmentNodeDescriptionProvider; import org.eclipse.syson.diagram.common.view.nodes.SatisfyRequirementCompartmentNodeDescription; import org.eclipse.syson.diagram.common.view.nodes.StatesCompartmentNodeDescriptionProvider; @@ -59,18 +60,6 @@ protected List getChildrenDescription(IViewDiagramElementFinder private void addReusableCompartments(IViewDiagramElementFinder cache, IDescriptionNameGenerator descriptionNameGenerator, List childrenNodes) { // don't forget to add custom compartments - cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter())) - .ifPresent(childrenNodes::add); - cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter())) - .ifPresent(childrenNodes::add); - cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter())) - .ifPresent(childrenNodes::add); - cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_SubjectParameter())) - .ifPresent(childrenNodes::add); - cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter())) - .ifPresent(childrenNodes::add); - cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter())) - .ifPresent(childrenNodes::add); cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getConcernUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter())) .ifPresent(childrenNodes::add); cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getConcernUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter())) @@ -152,9 +141,29 @@ private void addReusableCompartments(IViewDiagramElementFinder cache, IDescripti cache.getNodeDescription(descriptionNameGenerator.getFreeFormCompartmentName(SysmlPackage.eINSTANCE.getExhibitStateUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState())) .ifPresent(childrenNodes::add); + this.addCustomCompartmentsForRequirements(cache, descriptionNameGenerator, childrenNodes); this.addCustomCompartmentsForParts(cache, descriptionNameGenerator, childrenNodes); } + private void addCustomCompartmentsForRequirements(IViewDiagramElementFinder cache, IDescriptionNameGenerator descriptionNameGenerator, List childrenNodes) { + cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_SubjectParameter())) + .ifPresent(childrenNodes::add); + cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_SubjectParameter())) + .ifPresent(childrenNodes::add); + cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_ActorParameter())) + .ifPresent(childrenNodes::add); + cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_ActorParameter())) + .ifPresent(childrenNodes::add); + cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementUsage_StakeholderParameter())) + .ifPresent(childrenNodes::add); + cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_StakeholderParameter())) + .ifPresent(childrenNodes::add); + cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementDefinition(), SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern()) + + FramedConcernCompartmentNodeDescription.COMPARTMENT_NAME).ifPresent(childrenNodes::add); + cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getRequirementUsage(), SysmlPackage.eINSTANCE.getRequirementDefinition_FramedConcern()) + + FramedConcernCompartmentNodeDescription.COMPARTMENT_NAME).ifPresent(childrenNodes::add); + } + private void addCustomCompartmentsForParts(IViewDiagramElementFinder cache, IDescriptionNameGenerator descriptionNameGenerator, List childrenNodes) { cache.getNodeDescription(descriptionNameGenerator.getCompartmentName(SysmlPackage.eINSTANCE.getPartUsage(), SysmlPackage.eINSTANCE.getUsage_NestedState()) + StatesCompartmentNodeDescriptionProvider.STATES_NAME) .ifPresent(childrenNodes::add); 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 new file mode 100644 index 000000000..aaf269a36 Binary files /dev/null and b/doc/content/modules/user-manual/assets/images/release-notes-framed-concern-tool.png differ diff --git a/doc/content/modules/user-manual/assets/images/release-notes-frames-compartment.png b/doc/content/modules/user-manual/assets/images/release-notes-frames-compartment.png new file mode 100644 index 000000000..67211493d Binary files /dev/null and b/doc/content/modules/user-manual/assets/images/release-notes-frames-compartment.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 a4a1c1398..ef1a6ca9e 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,6 +19,16 @@ 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. ++ +image::release-notes-framed-concern-tool.png[Tool to create a _frame_ concern usage, width=60%,height=60%] + +** Add the _frames_ compartment graphical node in `RequirementUsage` and `RequirementDefinition` graphical nodes. ++ +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 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.