diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 63db67bd6..1487f0575 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -14,6 +14,8 @@ === Bug fixes +- https://github.com/eclipse-syson/syson/issues/2237[#2237] [diagrams] Fix the item label inside `frames`, `require constraints`, and `assume constraints` compartments. + === Improvements - https://github.com/eclipse-syson/syson/issues/2198[#2198] [diagrams] Improve diagram-to-diagram drag and drop to support dropping multiple graphical nodes at once, leveraging Sirius Web's `droppedNodes` and `droppedElements` variables. @@ -24,6 +26,8 @@ - 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. == 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..a075b4d54 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 @@ -123,7 +123,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 +156,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 +210,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 +797,34 @@ 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, THEN a new framed concern is created") + @GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) + @Test + public void createRequirementUsageFramedConcern() { + 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.createNode(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) 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-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramQueryLabelService.java b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramQueryLabelService.java index 423fc03af..950f281bb 100644 --- a/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramQueryLabelService.java +++ b/backend/services/syson-diagram-services/src/main/java/org/eclipse/syson/diagram/services/DiagramQueryLabelService.java @@ -96,11 +96,16 @@ public class DiagramQueryLabelService implements IDiagramLabelService { @Override public String getIdentificationLabel(Element element) { StringBuilder label = new StringBuilder(); + var shortNameLabel = this.getShortNameLabel(element); + String declaredName = element.getDeclaredName(); + if (element instanceof ActionUsage && element.eContainer() instanceof StateSubactionMembership ssm) { - label.append(ssm.getKind()).append(LabelConstants.SPACE); + label.append(ssm.getKind()); + if (!shortNameLabel.isBlank() || declaredName != null) { + label.append(LabelConstants.SPACE); + } } - label.append(this.getShortNameLabel(element)); - String declaredName = element.getDeclaredName(); + label.append(shortNameLabel); if (declaredName != null) { label.append(declaredName); } @@ -119,6 +124,7 @@ public String getReferenceSubsettingLabel(Element element) { if (!referenceSubsetting.isIsImplied()) { var referencedFeature = referenceSubsetting.getReferencedFeature(); if (referencedFeature != null) { + label.append(LabelConstants.SPACE); label.append(LabelConstants.REFERENCES); label.append(LabelConstants.SPACE); label.append(this.getDeclaredNameLabel(referencedFeature)); @@ -549,11 +555,11 @@ public String getDependencyLabel(Dependency dependency) { } /** - * Returns the label for the given {@code dependency}. + * Returns the label for the given {@link SatisfyRequirementUsage}. * - * @param dependency - * the dependency to get the edge label from - * @return the edge label + * @param satisfyRequirementUsage + * The given {@link SatisfyRequirementUsage} + * @return the label for the given {@link SatisfyRequirementUsage} */ public String getSatisfyLabel(SatisfyRequirementUsage satisfyRequirementUsage) { StringBuilder label = new StringBuilder(); @@ -577,8 +583,19 @@ private String getCompartmentItemLabel(ConstraintUsage constraintUsage, boolean } else if (!constraintUsage.getOwnedMember().isEmpty() && constraintUsage.getOwnedMember().get(0) instanceof Expression expression) { label.append(this.getSysmlTextualRepresentation(expression, directEditInput)); } else { - // The constraint doesn't have an expression, we use its name as default label. - label.append(this.getIdentificationLabel(constraintUsage)); + var identificationLabel = this.getIdentificationLabel(constraintUsage); + if (identificationLabel.isBlank()) { + // The constraint doesn't have an expression and does not have a name, we use the referenced feature name if the referenced feature exists + var ownedReferenceSubsetting = constraintUsage.getOwnedReferenceSubsetting(); + if (ownedReferenceSubsetting != null) { + label.append(this.getIdentificationLabel(ownedReferenceSubsetting.getReferencedFeature())); + } + } else { + // The constraint doesn't have an expression and has a name, we use its name and the referenced feature name + label.append(this.getIdentificationLabel(constraintUsage)); + label.append(this.getReferenceSubsettingLabel(constraintUsage)); + } + } return label.toString(); } @@ -648,7 +665,7 @@ public String getInitialDirectEditListItemLabel(Documentation documentation) { * Get the value to display when a direct edit has been called on the given {@link Comment}. * * @param comment - * the given {@link comment}. + * the given {@link Comment}. * @return the value to display. */ public String getInitialDirectEditListItemLabel(Comment comment) { diff --git a/backend/services/syson-diagram-services/src/test/java/org/eclipse/syson/diagram/services/DiagramQueryLabelServiceTest.java b/backend/services/syson-diagram-services/src/test/java/org/eclipse/syson/diagram/services/DiagramQueryLabelServiceTest.java index 19cf66027..7e6b2c691 100644 --- a/backend/services/syson-diagram-services/src/test/java/org/eclipse/syson/diagram/services/DiagramQueryLabelServiceTest.java +++ b/backend/services/syson-diagram-services/src/test/java/org/eclipse/syson/diagram/services/DiagramQueryLabelServiceTest.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2025 Obeo. + * Copyright (c) 2025, 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 @@ -179,6 +179,7 @@ void testItemCompartmentLabelWithName() { } @DisplayName("Check Attribute Usage item label with name and short name") + @Test void testItemCompartmentLabelWithNameAndShortName() { AttributeUsage attributeUsage = SysmlFactory.eINSTANCE.createAttributeUsage(); attributeUsage.setDeclaredName(ATTRIBUTE_USAGE_NAME); @@ -270,9 +271,9 @@ void testItemCompartmentLabelWithPrefixAndMultiplicity() { this.labelService.getCompartmentItemLabel(attributeUsage)); } - @DisplayName("GIVEN a ConstraintUsage with no expression, WHEN its label is computed, THEN the label contains the name of the constraint") + @DisplayName("GIVEN a ConstraintUsage without expression, with declared name, without requiring another constraint, WHEN its label is computed, THEN the label contains the name of the constraint") @Test - public void testGetCompartmentItemLabelOfConstraintWithNoExpression() { + public void testGetCompartmentItemLabelOfConstraintWithoutExpressionWithDeclaredNameWithoutRequiringAnotherConstraint() { ConstraintUsage constraintUsage = SysmlFactory.eINSTANCE.createConstraintUsage(); constraintUsage.setDeclaredName(CONSTRAINT_USAGE_NAME); // Constraints have a special label when they are inside a RequirementConstraintMembership @@ -281,6 +282,41 @@ public void testGetCompartmentItemLabelOfConstraintWithNoExpression() { assertThat(this.labelService.getCompartmentItemLabel(constraintUsage)).isEqualTo(CONSTRAINT_USAGE_NAME); } + @DisplayName("GIVEN a ConstraintUsage without expression, with declared name, requiring another constraint, WHEN its label is computed, THEN the label contains the constraint name with subsetted refence name") + @Test + public void testGetCompartmentItemLabelOfConstraintWithoutExpressionWithDeclaredNameRequiringAnotherConstraint() { + ConstraintUsage constraintUsage = SysmlFactory.eINSTANCE.createConstraintUsage(); + constraintUsage.setDeclaredName(CONSTRAINT_USAGE_NAME); + + ConstraintUsage referenceConstraintUsage = SysmlFactory.eINSTANCE.createConstraintUsage(); + referenceConstraintUsage.setDeclaredName("referencedConstraint"); + var referenceSubsetting = SysmlFactory.eINSTANCE.createReferenceSubsetting(); + referenceSubsetting.setReferencedFeature(referenceConstraintUsage); + constraintUsage.getOwnedRelationship().add(referenceSubsetting); + + // Constraints have a special label when they are inside a RequirementConstraintMembership + RequirementConstraintMembership requirementConstraintMembership = SysmlFactory.eINSTANCE.createRequirementConstraintMembership(); + requirementConstraintMembership.getOwnedRelatedElement().add(constraintUsage); + assertThat(this.labelService.getCompartmentItemLabel(constraintUsage)).isEqualTo(CONSTRAINT_USAGE_NAME + LabelConstants.SPACE + LabelConstants.REFERENCES + LabelConstants.SPACE + "referencedConstraint"); + } + + @DisplayName("GIVEN a ConstraintUsage without expression, without declared name, requiring another constraint, WHEN its label is computed, THEN the label contains only subsetted refence name") + @Test + public void testGetCompartmentItemLabelOfConstraintWithoutExpressionWithoutDeclaredNameRequiringAnotherConstraint() { + ConstraintUsage constraintUsage = SysmlFactory.eINSTANCE.createConstraintUsage(); + + ConstraintUsage referenceConstraintUsage = SysmlFactory.eINSTANCE.createConstraintUsage(); + referenceConstraintUsage.setDeclaredName("referencedConstraint"); + var referenceSubsetting = SysmlFactory.eINSTANCE.createReferenceSubsetting(); + referenceSubsetting.setReferencedFeature(referenceConstraintUsage); + constraintUsage.getOwnedRelationship().add(referenceSubsetting); + + // Constraints have a special label when they are inside a RequirementConstraintMembership + RequirementConstraintMembership requirementConstraintMembership = SysmlFactory.eINSTANCE.createRequirementConstraintMembership(); + requirementConstraintMembership.getOwnedRelatedElement().add(constraintUsage); + assertThat(this.labelService.getCompartmentItemLabel(constraintUsage)).isEqualTo("referencedConstraint"); + } + @DisplayName("GIVEN a ConstraintUsage with a boolean expression, WHEN its label is computed, THEN the label represents the expression") @Test public void testGetCompartmentItemLabelOfConstraintWithBooleanExpression() { 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..955536cec --- /dev/null +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/nodes/FramedConcernCompartmentNodeDescription.java @@ -0,0 +1,61 @@ +/******************************************************************************* + * 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.diagram.DiagramDescription; +import org.eclipse.sirius.components.view.diagram.NodeDescription; +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 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-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 7ba3058e0..98ab0ccde 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2024, 2025 Obeo. + * Copyright (c) 2024, 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 @@ -42,6 +42,9 @@ 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 c186afea7..36b3925d9 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; @@ -229,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())), - 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.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.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())), @@ -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; @@ -636,6 +643,9 @@ 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)); @@ -707,6 +717,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 +937,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 +972,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 +1048,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 +1404,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/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..f053b1c08 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,14 @@ 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%] + * In the _Explorer_ view: ** The tree items corresponding to the internals of `Expression` elements (syntax tree) are now hidden by default. @@ -41,6 +49,8 @@ a|image::explorer-expression-internals-visible.png[Internals visible] ** Improve diagram-to-diagram drag and drop to support dropping multiple graphical nodes at once. +** Fix the item label inside `frames`, `require constraints`, and `assume constraints` compartments. + == Technical details * For technical details on this {product} release, including breaking changes, please refer to the https://github.com/eclipse-syson/syson/blob/main/CHANGELOG.adoc[changelog].