Skip to content

Commit 11772c3

Browse files
committed
[1314] Update ViewUsage#exposedElement when manipulating GeneralView
Bug: #1314 Signed-off-by: Axel RICHARD <axel.richard@obeo.fr>
1 parent 94d276f commit 11772c3

File tree

15 files changed

+221
-103
lines changed

15 files changed

+221
-103
lines changed

CHANGELOG.adoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ At the moment SysON only supports KerML and SysML, and does not support the defi
6868
- https://github.com/eclipse-syson/syson/issues/1251[#1251] [explorer] Create `ViewUsage` semantic element in addition to _Diagram_ on _New representation_ menu in _Explorer_ view.
6969
All existing SysON _DiagramDescriptions_ (i.g. _General View_, _Interconnection View_...) have been updated to reflect the fact that they now be associated to `ViewUsages`.
7070
- https://github.com/eclipse-syson/syson/issues/1310[#1310] [metamodel] Remove derived flag for `ViewUsage#exposedElement` feature.
71+
- https://github.com/eclipse-syson/syson/issues/1314[#1314] [general-view] Update `ViewUsage#exposedElement` when manipulating _General View_ diagram.
7172

7273
=== New features
7374

backend/application/syson-application-configuration/src/main/java/org/eclipse/syson/application/services/CoreFeaturesSwitch.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.eclipse.syson.sysml.SysmlPackage;
4747
import org.eclipse.syson.sysml.TextualRepresentation;
4848
import org.eclipse.syson.sysml.Type;
49+
import org.eclipse.syson.sysml.ViewUsage;
4950
import org.eclipse.syson.sysml.util.SysmlSwitch;
5051

5152
/**
@@ -295,4 +296,12 @@ public List<EStructuralFeature> caseType(Type object) {
295296
features.add(SysmlPackage.eINSTANCE.getType_IsAbstract());
296297
return features;
297298
}
299+
300+
@Override
301+
public List<EStructuralFeature> caseViewUsage(ViewUsage object) {
302+
var features = new ArrayList<EStructuralFeature>();
303+
features.addAll(this.caseFeature(object));
304+
features.add(SysmlPackage.eINSTANCE.getViewUsage_ExposedElement());
305+
return features;
306+
}
298307
}

backend/application/syson-application-configuration/src/main/java/org/eclipse/syson/application/services/DetailsViewService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import org.eclipse.syson.sysml.SysmlPackage;
7171
import org.eclipse.syson.sysml.TransitionUsage;
7272
import org.eclipse.syson.sysml.Type;
73+
import org.eclipse.syson.sysml.ViewUsage;
7374
import org.eclipse.syson.sysml.util.ElementUtil;
7475

7576
/**
@@ -201,6 +202,8 @@ public boolean isReadOnly(Element element, EStructuralFeature eStructuralFeature
201202
isReadOnly = isReadOnly || ((Type) element).getOwnedFeature().stream().anyMatch(TransitionUsage.class::isInstance);
202203
} else if (element instanceof FeatureMembership && SysmlPackage.eINSTANCE.getFeaturing_Feature().equals(eStructuralFeature)) {
203204
isReadOnly = true;
205+
} else if (element instanceof ViewUsage && SysmlPackage.eINSTANCE.getViewUsage_ExposedElement().equals(eStructuralFeature)) {
206+
isReadOnly = true;
204207
}
205208
}
206209
return isReadOnly;

backend/services/syson-services/src/main/java/org/eclipse/syson/services/ToolService.java

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.Optional;
2020
import java.util.Set;
2121

22+
import org.eclipse.emf.ecore.EObject;
2223
import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramContext;
2324
import org.eclipse.sirius.components.core.api.IEditingContext;
2425
import org.eclipse.sirius.components.core.api.IFeedbackMessageService;
@@ -40,6 +41,7 @@
4041
import org.eclipse.sirius.components.view.diagram.DiagramDescription;
4142
import org.eclipse.syson.services.api.ISysMLMoveElementService;
4243
import org.eclipse.syson.sysml.Element;
44+
import org.eclipse.syson.sysml.ViewUsage;
4345
import org.eclipse.syson.sysml.helper.EMFUtils;
4446

4547
/**
@@ -126,6 +128,56 @@ public Object getParentNode(Element element, IDiagramElement diagramElement, IDi
126128
return parentNode;
127129
}
128130

131+
/**
132+
* Add the given "newExposedElement" to the exposedElements reference of the {@link ViewUsage} that is the target of
133+
* the given {@link IDiagramContext}.
134+
*
135+
* @param element
136+
* the current context of the service.
137+
* @param newExposedElement
138+
* the new Element to be exposed.
139+
* @param editingContext
140+
* the given {@link IEditingContext} in which this service has been called.
141+
* @param diagramContext
142+
* the given {@link IDiagramContext}.
143+
* @return the current context of the service.
144+
*/
145+
public EObject updateExposedElements(EObject eObject, Element newExposedElement, IEditingContext editingContext, IDiagramContext diagramContext) {
146+
var optDiagramTargetObject = this.objectSearchService.getObject(editingContext, diagramContext.getDiagram().getTargetObjectId());
147+
if (optDiagramTargetObject.isPresent()) {
148+
var diagramTargetObject = optDiagramTargetObject.get();
149+
if (diagramTargetObject instanceof ViewUsage viewUsage) {
150+
viewUsage.getExposedElement().add(newExposedElement);
151+
}
152+
}
153+
return eObject;
154+
}
155+
156+
/**
157+
* Add the given "newExposedElement" to the exposedElements reference of the {@link ViewUsage} that is the target of
158+
* the given {@link Node}.
159+
*
160+
* @param element
161+
* the current context of the service.
162+
* @param newExposedElement
163+
* the new Element to be exposed.
164+
* @param editingContext
165+
* the given {@link IEditingContext} in which this service has been called.
166+
* @param viewUsageNode
167+
* the given {@link Node}.
168+
* @return the current context of the service.
169+
*/
170+
public EObject updateExposedElements(EObject eObject, Element newExposedElement, IEditingContext editingContext, Node viewUsageNode) {
171+
var optDiagramTargetObject = this.objectSearchService.getObject(editingContext, viewUsageNode.getTargetObjectId());
172+
if (optDiagramTargetObject.isPresent()) {
173+
var diagramTargetObject = optDiagramTargetObject.get();
174+
if (diagramTargetObject instanceof ViewUsage viewUsage) {
175+
viewUsage.getExposedElement().add(newExposedElement);
176+
}
177+
}
178+
return eObject;
179+
}
180+
129181
protected Node getParentNode(IDiagramElement diagramElement, Node nodeContainer) {
130182
List<Node> nodes = nodeContainer.getChildNodes();
131183
if (nodes.contains(diagramElement)) {
@@ -157,6 +209,7 @@ protected boolean isPresent(Element element, List<Node> nodes) {
157209
return nodes.stream().anyMatch(node -> node.getTargetObjectId().equals(this.identityService.getId(element)));
158210
}
159211

212+
160213
protected ViewCreationRequest createView(Element element, IEditingContext editingContext, IDiagramContext diagramContext, Object selectedNode,
161214
Map<org.eclipse.sirius.components.view.diagram.NodeDescription, NodeDescription> convertedNodes) {
162215
return this.createView(element, editingContext, diagramContext, selectedNode, convertedNodes, NodeContainmentKind.CHILD_NODE);
@@ -167,20 +220,22 @@ protected ViewCreationRequest createView(Element element, IEditingContext editin
167220
var parentElementId = this.getParentElementId(selectedNode, diagramContext);
168221
var optDescriptionId = this.getChildNodeDescriptionIdForRendering(element, editingContext, diagramContext, selectedNode, convertedNodes);
169222
if (optDescriptionId.isPresent()) {
170-
return this.createView(element, parentElementId, optDescriptionId.get(), diagramContext, nodeKind);
223+
return this.createView(element, parentElementId, optDescriptionId.get(), editingContext, diagramContext, nodeKind);
171224
} else {
172225
return null;
173226
}
174227
}
175228

176-
protected ViewCreationRequest createView(Element element, String parentElementId, String descriptionId, IDiagramContext diagramContext, NodeContainmentKind nodeKind) {
229+
protected ViewCreationRequest createView(Element element, String parentElementId, String descriptionId, IEditingContext editingContext, IDiagramContext diagramContext,
230+
NodeContainmentKind nodeKind) {
177231
var request = ViewCreationRequest.newViewCreationRequest()
178232
.containmentKind(nodeKind)
179233
.descriptionId(descriptionId)
180234
.parentElementId(parentElementId)
181235
.targetObjectId(this.identityService.getId(element))
182236
.build();
183237
diagramContext.getViewCreationRequests().add(request);
238+
this.updateExposedElements(element, element, editingContext, diagramContext);
184239
return request;
185240
}
186241

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import java.util.Objects;
1818

1919
import org.eclipse.emf.ecore.EClass;
20+
import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramContext;
21+
import org.eclipse.sirius.components.core.api.IEditingContext;
2022
import org.eclipse.sirius.components.view.builder.IViewDiagramElementFinder;
2123
import org.eclipse.sirius.components.view.builder.generated.diagram.NodeToolSectionBuilder;
2224
import org.eclipse.sirius.components.view.builder.providers.IColorProvider;
@@ -36,6 +38,7 @@
3638
import org.eclipse.syson.diagram.common.view.services.description.ToolDescriptionService;
3739
import org.eclipse.syson.diagram.common.view.tools.ToolSectionDescription;
3840
import org.eclipse.syson.sysml.SysmlPackage;
41+
import org.eclipse.syson.util.AQLUtils;
3942
import org.eclipse.syson.util.IDescriptionNameGenerator;
4043
import org.eclipse.syson.util.SysMLMetamodelHelper;
4144
import org.eclipse.syson.util.ViewConstants;
@@ -139,8 +142,11 @@ private NodePalette createNodePalette(IViewDiagramElementFinder cache) {
139142
private NodeTool createNodeToolFromPackage(NodeDescription nodeDescription, EClass eClass) {
140143
var builder = this.diagramBuilderHelper.newNodeTool();
141144

145+
var updateExposedElements = this.viewBuilderHelper.newChangeContext()
146+
.expression(AQLUtils.getSelfServiceCallExpression("updateExposedElements", List.of("newInstance", IEditingContext.EDITING_CONTEXT, IDiagramContext.DIAGRAM_CONTEXT)));
147+
142148
var changeContextNewInstance = this.viewBuilderHelper.newChangeContext()
143-
.expression("aql:newInstance.elementInitializer()");
149+
.expression(AQLUtils.getServiceCallExpression("newInstance", "elementInitializer"));
144150

145151
var createView = this.diagramBuilderHelper.newCreateView()
146152
.containmentKind(NodeContainmentKind.CHILD_NODE)
@@ -153,7 +159,7 @@ private NodeTool createNodeToolFromPackage(NodeDescription nodeDescription, ECla
153159
.typeName(SysMLMetamodelHelper.buildQualifiedName(eClass))
154160
.referenceName(SysmlPackage.eINSTANCE.getRelationship_OwnedRelatedElement().getName())
155161
.variableName("newInstance")
156-
.children(createView.build(), changeContextNewInstance.build());
162+
.children(createView.build(), changeContextNewInstance.build(), updateExposedElements.build());
157163

158164
var changeContexMembership = this.viewBuilderHelper.newChangeContext()
159165
.expression("aql:newOwningMembership")

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,11 @@ private NodeTool createNodeTool(NodeDescription nodeDescription, EClass eClass)
265265
return new NamespaceImportNodeToolProvider(nodeDescription, this.descriptionNameGenerator).create(null);
266266
}
267267

268+
var updateExposedElements = this.viewBuilderHelper.newChangeContext()
269+
.expression(AQLUtils.getSelfServiceCallExpression("updateExposedElements", List.of("newInstance", IEditingContext.EDITING_CONTEXT, IDiagramContext.DIAGRAM_CONTEXT)));
270+
268271
var changeContextNewInstance = this.viewBuilderHelper.newChangeContext()
269-
.expression("aql:newInstance.elementInitializer()");
272+
.expression(AQLUtils.getServiceCallExpression("newInstance", "elementInitializer"));
270273

271274
var parentViewExpression = "aql:selectedNode";
272275
if (SysmlPackage.eINSTANCE.getComment().equals(eClass)) {
@@ -286,7 +289,7 @@ private NodeTool createNodeTool(NodeDescription nodeDescription, EClass eClass)
286289
.typeName(SysMLMetamodelHelper.buildQualifiedName(eClass))
287290
.referenceName(SysmlPackage.eINSTANCE.getRelationship_OwnedRelatedElement().getName())
288291
.variableName("newInstance")
289-
.children(createView.build(), changeContextNewInstance.build());
292+
.children(createView.build(), changeContextNewInstance.build(), updateExposedElements.build());
290293

291294
var changeContexMembership = this.viewBuilderHelper.newChangeContext()
292295
.expression("aql:newOwningMembership")

backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/ViewToolService.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ public Element addExistingElements(Element parentElement, IEditingContext editin
217217
if (candidate.getSynchronizationPolicy().equals(SynchronizationPolicy.SYNCHRONIZED)) {
218218
hasRenderedSynchronizedElement = true;
219219
} else {
220-
creationRequests.add(this.createView(childElement, compartmentNodeId, candidate.getId(), diagramContext, NodeContainmentKind.CHILD_NODE));
220+
creationRequests.add(this.createView(childElement, compartmentNodeId, candidate.getId(), editingContext, diagramContext, NodeContainmentKind.CHILD_NODE));
221221
}
222222
}
223223
}
@@ -303,7 +303,7 @@ public Element addExistingElements(Element parentElement, IEditingContext editin
303303
if (candidate.getSynchronizationPolicy().equals(SynchronizationPolicy.SYNCHRONIZED)) {
304304
hasRenderedSynchronizedElement = true;
305305
} else {
306-
creationRequests.add(this.createView(childElement, compartmentNode.getId(), candidate.getId(), diagramContext, NodeContainmentKind.CHILD_NODE));
306+
creationRequests.add(this.createView(childElement, compartmentNode.getId(), candidate.getId(), editingContext, diagramContext, NodeContainmentKind.CHILD_NODE));
307307
}
308308
}
309309
}
@@ -392,6 +392,7 @@ public Element dropElementFromExplorer(Element element, IEditingContext editingC
392392
}
393393
if (optElementToDrop.isPresent()) {
394394
this.dropElementFromExplorerInTarget(optElementToDrop.get(), targetElement, editingContext, diagramContext, selectedNode, convertedNodes);
395+
this.updateExposedElements(targetElement, optElementToDrop.get(), editingContext, diagramContext);
395396
}
396397
}
397398
}
@@ -466,7 +467,7 @@ private void dropElementFromExplorerInTarget(Element sourceElement, Element targ
466467
* the dropped {@link Node}.
467468
* @param targetElement
468469
* the new semantic container.
469-
* @param targetElement
470+
* @param targetNode
470471
* the new graphical container.
471472
* @param editingContext
472473
* the {@link IEditingContext} of the tool. It corresponds to a variable accessible from the variable
@@ -482,14 +483,21 @@ private void dropElementFromExplorerInTarget(Element sourceElement, Element targ
482483
public Element dropElementFromDiagram(Element droppedElement, Node droppedNode, Element targetElement, Node targetNode, IEditingContext editingContext, IDiagramContext diagramContext,
483484
Map<org.eclipse.sirius.components.view.diagram.NodeDescription, NodeDescription> convertedNodes) {
484485
final Element result;
486+
final Element realTargetElement;
487+
// If the target element is a ViewUsage, then we must drop the dropped element in its owner.
488+
if (targetElement instanceof ViewUsage viewUsage) {
489+
realTargetElement = viewUsage.getOwner();
490+
} else {
491+
realTargetElement = targetElement;
492+
}
485493
// Check if the element we attempt to drop is in the ancestors of the target element. If it is the case we want
486494
// to prevent the drop.
487-
if (EMFUtils.isAncestor(droppedElement, targetElement)) {
488-
this.logAncestorError(droppedElement, targetElement);
495+
if (EMFUtils.isAncestor(droppedElement, realTargetElement)) {
496+
this.logAncestorError(droppedElement, realTargetElement);
489497
// Null prevents the drop and makes Sirius Web reset the position of the dragged element.
490498
result = null;
491499
} else {
492-
this.moveElement(droppedElement, droppedNode, targetElement, targetNode, editingContext, diagramContext, convertedNodes);
500+
this.moveElement(droppedElement, droppedNode, realTargetElement, targetNode, editingContext, diagramContext, convertedNodes);
493501
result = droppedElement;
494502
}
495503
return result;

0 commit comments

Comments
 (0)