Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ One creates a `ConcernUsage` and another one creates `FramedConcernMembership`.
This is currently supported on `Features` (e.g. `Attribute`), `Constraints` and `Transitions` (guard conditions) view new context menu actions (_Create expression_ and _Edit expression_) on the corresponding elements in the _Explorer_.
- https://github.com/eclipse-syson/syson/issues/2247[#2247] [diagrams] Add the support for creating _timeslices/snapshots_ from the different kind of `OccurrenceDefiniton` graphical nodes.
It leverages the selection dialog to either create an _occurrence timeslice/snapshot_, or the _usage timeslice/snapshot_ matching the `OccurrenceDefinition` on which the tool is applied.
- https://github.com/eclipse-syson/syson/issues/2250[#2250] [diagrams] Leverage the selection dialog to improve the graphical node tools creating a _require_ `ConstraintUsage`, or an _assume_ `ConstraintUsage`, from `RequirementUsage` and `RequirementDefinition` graphical nodes.

== v2026.5.0

Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
import org.eclipse.syson.sysml.PartDefinition;
import org.eclipse.syson.sysml.PartUsage;
import org.eclipse.syson.sysml.PortUsage;
import org.eclipse.syson.sysml.RequirementConstraintMembership;
import org.eclipse.syson.sysml.SysmlFactory;
import org.eclipse.syson.sysml.SysmlPackage;
import org.eclipse.syson.sysml.TextualRepresentation;
Expand Down Expand Up @@ -140,11 +141,12 @@ public Element expose(Element element, IEditingContext editingContext, DiagramCo
viewUsage.getOwnedRelationship().add(membershipExpose);
new ElementInitializerSwitch().doSwitch(membershipExpose);
// if it is the General View, we want to hide tree elements if a compartment containing the same
// element is displayed or it is displayed as border node
// element is displayed or it is displayed as border node, or if there is another exposed relation
if (selectedNode != null && ViewDefinitionKind.isGeneralView(this.utilService.getViewDefinitionKind(element, List.of(), editingContext))) {
this.hideNodeIfVisibleCompartmentCouldHostTheFutureNode(element, editingContext, diagramContext, selectedNode, convertedNodes);
this.hideNodeIfBorderNodeCouldHostTheFutureNode(element, editingContext, diagramContext, selectedNode, convertedNodes);
this.hideNodeIfNestedIsDefault(element, editingContext, diagramContext, selectedNode, convertedNodes);
this.hideNodeIfHasReferenceSubset(element, editingContext, diagramContext, selectedNode, convertedNodes);
}
}
}
Expand Down Expand Up @@ -276,7 +278,7 @@ public boolean removeFromExposedElements(Element element, Node selectedNode, IEd
* Returns the elements contained by {@code parentElement} that should be rendered.
* <p>
* This method is typically used by
* {@link #addToExposedElements(Element, IEditingContext, DiagramContext, Node, Map, boolean)} to navigate the model
* {@link #addToExposedElements(Element, boolean, IEditingContext, DiagramContext, Node, Map)} to navigate the model
* and find the elements to display.
* </p>
*
Expand Down Expand Up @@ -486,6 +488,24 @@ private void hideNodeIfNestedIsDefault(Element element, IEditingContext editingC
}
}

private void hideNodeIfHasReferenceSubset(Element element, IEditingContext editingContext, DiagramContext diagramContext, Node selectedNode, Map<org.eclipse.sirius.components.view.diagram.NodeDescription, NodeDescription> convertedNodes) {
var owningMembership = element.getOwningMembership();
if (owningMembership.eClass().equals(SysmlPackage.eINSTANCE.getRequirementConstraintMembership())) {
var requirementConstraintMembership = (RequirementConstraintMembership) owningMembership;
if (requirementConstraintMembership.getReferencedConstraint() != requirementConstraintMembership.getOwnedConstraint() && requirementConstraintMembership.getOwnedConstraint() == element) {
var parentId = this.diagramQueryElementService.getGraphicalParentId(diagramContext, selectedNode);
var descriptionId = this.diagramQueryElementService.getNodeDescriptionId(element, diagramContext.diagram(), editingContext);
if (parentId != null && descriptionId.isPresent()) {
var nodeId = new NodeIdProvider().getNodeId(parentId,
descriptionId.get(),
NodeContainmentKind.CHILD_NODE,
this.siriusWebCoreServices.identityService().getId(element));
diagramContext.diagramEvents().add(new HideDiagramElementEvent(Set.of(nodeId), true));
}
}
}
}

private boolean isItemNotContainedByAction(Element element) {
boolean isItemNotContainedByAction = false;
if (Objects.equals(SysmlPackage.eINSTANCE.getItemUsage(), element.eClass())) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,16 @@
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.sirius.components.emf.utils.SiriusEMFCopier;
import org.eclipse.syson.sysml.ConcernUsage;
import org.eclipse.syson.sysml.ConstraintUsage;
import org.eclipse.syson.sysml.Definition;
import org.eclipse.syson.sysml.Element;
import org.eclipse.syson.sysml.FeatureTyping;
import org.eclipse.syson.sysml.FramedConcernMembership;
import org.eclipse.syson.sysml.Namespace;
import org.eclipse.syson.sysml.PartUsage;
import org.eclipse.syson.sysml.Relationship;
import org.eclipse.syson.sysml.RequirementConstraintKind;
import org.eclipse.syson.sysml.RequirementConstraintMembership;
import org.eclipse.syson.sysml.RequirementDefinition;
import org.eclipse.syson.sysml.RequirementUsage;
import org.eclipse.syson.sysml.SatisfyRequirementUsage;
Expand Down Expand Up @@ -235,6 +238,42 @@ public FramedConcernMembership createFramedConcern(Type type, ConcernUsage conce
return null;
}

/**
* In a {@link RequirementUsage} or a {@link RequirementDefinition}, creates a {@link RequirementConstraintMembership} containing a {@link ConstraintUsage}.
* The {@link RequirementConstraintKind} is used to indicate whether the constraint is {@code required} or {@code assumed}.
* If a {@link ConstraintUsage} is given, the {@link RequirementConstraintMembership} owned constraint will be subsetted by the given {@link ConstraintUsage}.
*
* @param type
* the type that will hold the {@link RequirementConstraintMembership}, {@code type} must be a {@link RequirementDefinition} or a requirementUsage
* @param constraintUsage
* the {@link ConstraintUsage} subsetted by reference, can be {@code null}
* @param constraintKind
* whether the constraint is {@code required} or {@code assumed}
* @return the created {@link RequirementConstraintMembership} when {@code type} is a {@link RequirementDefinition}, or a {@link RequirementUsage}, {@code null} otherwise
*/
public RequirementConstraintMembership createConstraint(Type type, ConstraintUsage constraintUsage, RequirementConstraintKind constraintKind) {
if (type instanceof RequirementDefinition || type instanceof RequirementUsage) {
var newRequirementConstraintMembership = SysmlFactory.eINSTANCE.createRequirementConstraintMembership();
type.getOwnedRelationship().add(newRequirementConstraintMembership);
newRequirementConstraintMembership.setKind(constraintKind);

var newConstraintUsage = SysmlFactory.eINSTANCE.createConstraintUsage();
newRequirementConstraintMembership.getOwnedRelatedElement().add(newConstraintUsage);

this.metamodelMutationElementService.initialize(newRequirementConstraintMembership);
this.metamodelMutationElementService.initialize(newConstraintUsage);

if (constraintUsage != null) {
var newReferenceSubsetting = SysmlFactory.eINSTANCE.createReferenceSubsetting();
newConstraintUsage.getOwnedRelationship().add(newReferenceSubsetting);
newReferenceSubsetting.setReferencedFeature(constraintUsage);
this.metamodelMutationElementService.initialize(newReferenceSubsetting);
}
return newRequirementConstraintMembership;
}
return null;
}

/**
* Creates a {@link SatisfyRequirementUsage SatisfyRequirement} on {@code parentElement}.
* <p>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@
import org.eclipse.emf.ecore.EObject;
import org.eclipse.syson.model.services.ModelMutationElementService;
import org.eclipse.syson.sysml.ConcernUsage;
import org.eclipse.syson.sysml.ConstraintUsage;
import org.eclipse.syson.sysml.Documentation;
import org.eclipse.syson.sysml.Element;
import org.eclipse.syson.sysml.Membership;
import org.eclipse.syson.sysml.PartUsage;
import org.eclipse.syson.sysml.RequirementConstraintKind;
import org.eclipse.syson.sysml.RequirementUsage;
import org.eclipse.syson.sysml.Type;
import org.eclipse.syson.sysml.ViewUsage;
Expand Down Expand Up @@ -113,4 +115,11 @@ public Element setAsView(ViewUsage viewUsage, String newViewDefinition) {
public Element createFramedConcern(Type type, ConcernUsage concernUsage) {
return this.modelMutationElementService.createFramedConcern(type, concernUsage);
}

/**
* {@link ModelMutationElementService#createConstraint(Type, ConstraintUsage, RequirementConstraintKind)}.
*/
public Element createConstraint(Type type, ConstraintUsage constraintUsage, RequirementConstraintKind constraintKind) {
return this.modelMutationElementService.createConstraint(type, constraintUsage, constraintKind);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*******************************************************************************
* 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.syson.sysml.SysmlPackage;
import org.eclipse.syson.util.IDescriptionNameGenerator;
import org.eclipse.syson.util.SysMLMetamodelHelper;

/**
* Used to create a {@link org.eclipse.syson.sysml.ConstraintUsage} compartment item node description.
* <p>
* {@link org.eclipse.syson.sysml.ConstraintUsage} compartment items have to be contained in a {@link org.eclipse.syson.sysml.RequirementConstraintMembership} with {@link org.eclipse.syson.sysml.RequirementConstraintKind#ASSUMPTION}.
* </p>
* @author gcoutable
*/
public class AssumeConstraintCompartmentItemNodeDescription extends CompartmentItemNodeDescriptionProvider {
public static final String COMPARTMENT_ITEM_NAME = " assume constraint";

public AssumeConstraintCompartmentItemNodeDescription(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
super(eClass, eReference, colorProvider, descriptionNameGenerator);
}

@Override
protected String getDomainType() {
return SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getElement());
}

@Override
protected String getName() {
return super.getName() + COMPARTMENT_ITEM_NAME;
}
}
Original file line number Diff line number Diff line change
@@ -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.AssumeConstraintNodeToolProvider;
import org.eclipse.syson.util.IDescriptionNameGenerator;

/**
* Compartment node allowing to display {@link org.eclipse.syson.sysml.ConstraintUsage} owned by a {@link org.eclipse.syson.sysml.RequirementConstraintMembership} with {@link org.eclipse.syson.sysml.RequirementConstraintKind#ASSUMPTION}.
*
* @author gcoutable
*/
public class AssumeConstraintCompartmentNodeDescription extends AbstractCompartmentNodeDescriptionProvider {

public static final String COMPARTMENT_NAME = " assume";

public AssumeConstraintCompartmentNodeDescription(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 "assume constraints";
}

@Override
public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) {
cache.getNodeDescription(this.getCompartmentName()).ifPresent(nodeDescription -> {
cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + AssumeConstraintCompartmentItemNodeDescription.COMPARTMENT_ITEM_NAME)
.ifPresent(itemNodeDescription -> nodeDescription.getChildrenDescriptions().add(itemNodeDescription));
nodeDescription.setPalette(this.createCompartmentPalette(cache));
});
}

@Override
protected List<INodeToolProvider> getItemCreationToolProviders() {
return List.of(new AssumeConstraintNodeToolProvider());
}

@Override
protected List<NodeDescription> getDroppableNodes(IViewDiagramElementFinder cache) {
return List.of();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*******************************************************************************
* 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.syson.sysml.SysmlPackage;
import org.eclipse.syson.util.IDescriptionNameGenerator;
import org.eclipse.syson.util.SysMLMetamodelHelper;

/**
* Used to create a {@link org.eclipse.syson.sysml.ConstraintUsage} compartment item node description.
* <p>
* {@link org.eclipse.syson.sysml.ConstraintUsage} compartment items have to be contained in a {@link org.eclipse.syson.sysml.RequirementConstraintMembership} with {@link org.eclipse.syson.sysml.RequirementConstraintKind#REQUIREMENT}.
* </p>
* @author gcoutable
*/
public class RequireConstraintCompartmentItemNodeDescription extends CompartmentItemNodeDescriptionProvider {
public static final String COMPARTMENT_ITEM_NAME = " require constraint";

public RequireConstraintCompartmentItemNodeDescription(EClass eClass, EReference eReference, IColorProvider colorProvider, IDescriptionNameGenerator descriptionNameGenerator) {
super(eClass, eReference, colorProvider, descriptionNameGenerator);
}

@Override
protected String getDomainType() {
return SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getElement());
}

@Override
protected String getName() {
return super.getName() + COMPARTMENT_ITEM_NAME;
}
}
Original file line number Diff line number Diff line change
@@ -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.RequireConstraintNodeToolProvider;
import org.eclipse.syson.util.IDescriptionNameGenerator;

/**
* Compartment node allowing to display {@link org.eclipse.syson.sysml.ConstraintUsage} owned by a {@link org.eclipse.syson.sysml.RequirementConstraintMembership} with {@link org.eclipse.syson.sysml.RequirementConstraintKind#REQUIREMENT}.
*
* @author gcoutable
*/
public class RequireConstraintCompartmentNodeDescription extends AbstractCompartmentNodeDescriptionProvider {

public static final String COMPARTMENT_NAME = " require";
Comment thread
pcdavid marked this conversation as resolved.

public RequireConstraintCompartmentNodeDescription(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 "require constraints";
}

@Override
public void link(DiagramDescription diagramDescription, IViewDiagramElementFinder cache) {
cache.getNodeDescription(this.getCompartmentName()).ifPresent(nodeDescription -> {
cache.getNodeDescription(this.getDescriptionNameGenerator().getCompartmentItemName(this.eClass, this.eReference) + RequireConstraintCompartmentItemNodeDescription.COMPARTMENT_ITEM_NAME)
.ifPresent(itemNodeDescription -> nodeDescription.getChildrenDescriptions().add(itemNodeDescription));
nodeDescription.setPalette(this.createCompartmentPalette(cache));
});
}

@Override
protected List<INodeToolProvider> getItemCreationToolProviders() {
return List.of(new RequireConstraintNodeToolProvider());
}

@Override
protected List<NodeDescription> getDroppableNodes(IViewDiagramElementFinder cache) {
return List.of();
}
}
Loading
Loading