From c8b39f62728ad4a43278e05c2984bcc376e0180a Mon Sep 17 00:00:00 2001 From: Axel RICHARD Date: Tue, 28 Nov 2023 10:51:02 +0100 Subject: [PATCH] Improve General View Signed-off-by: Axel RICHARD --- .../services/CoreFeaturesSwitch.java | 9 +++ .../eclipse/syson/sysml/impl/ElementImpl.java | 9 ++- .../GeneralViewDirectEditListener.java | 27 +++++---- .../AbstractNodeDescriptionProvider.java | 2 +- .../services/GeneralViewLabelService.java | 56 ++++++++++++++++++- 5 files changed, 88 insertions(+), 15 deletions(-) diff --git a/backend/application/syson-application-configuration/src/main/java/org/eclipse/syson/application/services/CoreFeaturesSwitch.java b/backend/application/syson-application-configuration/src/main/java/org/eclipse/syson/application/services/CoreFeaturesSwitch.java index ae6f945..857d6b4 100644 --- a/backend/application/syson-application-configuration/src/main/java/org/eclipse/syson/application/services/CoreFeaturesSwitch.java +++ b/backend/application/syson-application-configuration/src/main/java/org/eclipse/syson/application/services/CoreFeaturesSwitch.java @@ -18,6 +18,7 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.syson.sysml.Element; +import org.eclipse.syson.sysml.FeatureTyping; import org.eclipse.syson.sysml.Redefinition; import org.eclipse.syson.sysml.Specialization; import org.eclipse.syson.sysml.Subclassification; @@ -46,6 +47,14 @@ public List caseElement(Element object) { return features; } + @Override + public List caseFeatureTyping(FeatureTyping object) { + var features = new ArrayList(); + features.addAll(this.caseSpecialization(object)); + features.add(SysmlPackage.eINSTANCE.getFeatureTyping_Type()); + return features; + } + @Override public List caseRedefinition(Redefinition object) { var features = new ArrayList(); diff --git a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ElementImpl.java b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ElementImpl.java index fbdd8b1..200bec1 100644 --- a/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ElementImpl.java +++ b/backend/metamodel/syson-sysml-metamodel/src/main/java/org/eclipse/syson/sysml/impl/ElementImpl.java @@ -33,6 +33,7 @@ import org.eclipse.syson.sysml.Annotation; import org.eclipse.syson.sysml.Documentation; import org.eclipse.syson.sysml.Element; +import org.eclipse.syson.sysml.Membership; import org.eclipse.syson.sysml.Namespace; import org.eclipse.syson.sysml.OwningMembership; import org.eclipse.syson.sysml.Relationship; @@ -521,7 +522,13 @@ else if (eNotificationRequired()) public String getQualifiedName() { StringBuilder qualifiedName = new StringBuilder(); EObject container = this.eContainer(); - if (container instanceof Element element) { + if (container instanceof Membership membership) { + EObject membershipContainer = membership.eContainer(); + if (membershipContainer instanceof Element element) { + qualifiedName.append(element.getQualifiedName()); + qualifiedName.append("::"); + } + } else if (container instanceof Element element) { qualifiedName.append(element.getQualifiedName()); qualifiedName.append("::"); } diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/GeneralViewDirectEditListener.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/GeneralViewDirectEditListener.java index 48aea7f..d742b96 100644 --- a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/GeneralViewDirectEditListener.java +++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/directedit/GeneralViewDirectEditListener.java @@ -60,23 +60,26 @@ public void exitTypingExpression(TypingExpressionContext ctx) { if (definition == null) { var containerPackage = this.generalViewUtilService.getContainerPackage(this.element); var newMembership = SysmlFactory.eINSTANCE.createOwningMembership(); - containerPackage.getOwnedMembership().add(newMembership); - EClassifier eClassifier = SysmlPackage.eINSTANCE.getEClassifier(this.element.eClass().getInstanceTypeName().replace("Usage", "Definition")); + containerPackage.getOwnedRelationship().add(newMembership); + EClassifier eClassifier = SysmlPackage.eINSTANCE.getEClassifier(this.element.eClass().getName().replace("Usage", "Definition")); if (eClassifier instanceof EClass eClass) { definition = (Definition) SysmlFactory.eINSTANCE.create(eClass); definition.setDeclaredName(typeAsString); + newMembership.getOwnedRelatedElement().add(definition); } } - var featureTyping = this.element.getOwnedRelationship().stream() - .filter(FeatureTyping.class::isInstance) - .map(FeatureTyping.class::cast) - .findFirst(); - if (featureTyping.isPresent()) { - featureTyping.get().setType(definition); - } else { - var newFeatureTyping = SysmlFactory.eINSTANCE.createFeatureTyping(); - this.element.getOwnedRelationship().add(newFeatureTyping); - featureTyping.get().setType(definition); + if (definition != null) { + var featureTyping = this.element.getOwnedRelationship().stream() + .filter(FeatureTyping.class::isInstance) + .map(FeatureTyping.class::cast) + .findFirst(); + if (featureTyping.isPresent()) { + featureTyping.get().setType(definition); + } else { + var newFeatureTyping = SysmlFactory.eINSTANCE.createFeatureTyping(); + this.element.getOwnedRelationship().add(newFeatureTyping); + featureTyping.get().setType(definition); + } } } } diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/AbstractNodeDescriptionProvider.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/AbstractNodeDescriptionProvider.java index 05816d3..ad82fc3 100644 --- a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/AbstractNodeDescriptionProvider.java +++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/nodes/AbstractNodeDescriptionProvider.java @@ -71,7 +71,7 @@ protected NodeDescription createDefinitionAttributesCompartmentItem(String name) .defaultHeightExpression(GeneralViewDiagramDescriptionProvider.DEFAULT_COMPARTMENT_NODE_ITEM_HEIGHT) .defaultWidthExpression(GeneralViewDiagramDescriptionProvider.DEFAULT_NODE_WIDTH) .domainType(SysMLMetamodelHelper.buildQualifiedName(SysmlPackage.eINSTANCE.getAttributeUsage())) - .labelExpression(GeneralViewDiagramDescriptionProvider.DEFAULT_LABEL_EXPRESSION) + .labelExpression("aql:self.getCompartmentItemLabel()") .name(name + " AttributesCompartmentItem") .semanticCandidatesExpression(AQLConstants.AQL_SELF + "." + SysmlPackage.eINSTANCE.getDefinition_OwnedAttribute().getName()) .style(this.createDefinitionCompartmentItemNodeStyle()) diff --git a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewLabelService.java b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewLabelService.java index 7b91bde..7b931b4 100644 --- a/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewLabelService.java +++ b/backend/views/syson-diagram-general-view/src/main/java/org/eclipse/syson/diagram/general/view/services/GeneralViewLabelService.java @@ -24,6 +24,8 @@ import org.eclipse.syson.diagram.general.view.directedit.grammars.generated.DirectEditParser; import org.eclipse.syson.sysml.Dependency; import org.eclipse.syson.sysml.Element; +import org.eclipse.syson.sysml.FeatureTyping; +import org.eclipse.syson.sysml.Usage; /** * Label-related Java services used by the {@link GeneralViewDiagramDescriptionProvider}. @@ -43,6 +45,56 @@ public String getContainerLabel(Element element) { return new ContainerLabelSwitch().doSwitch(element); } + /** + * Return the compartment item label for the given {@link Usage}. + * + * @param usage + * the given {@link Usage}. + * @return the compartment item label for the given {@link Usage}. + */ + public String getCompartmentItemLabel(Usage usage) { + StringBuilder builder = new StringBuilder(); + builder.append(usage.getDeclaredName()); + builder.append(this.getTypingLabel(usage)); + builder.append(this.getValueLabel(usage)); + return builder.toString(); + } + + /** + * Return the label of the value part of the given {@link Usage}. + * + * @param usage + * the given {@link Usage}. + * @return the label of the value part of the given {@link Usage} if there is one, an empty string otherwise. + */ + private String getValueLabel(Usage usage) { + return ""; + } + + /** + * Return the label of the typing part of the given {@link Usage}. + * + * @param usage + * the given {@link Usage}. + * @return the label of the typing part of the given {@link Usage} if there is one, an empty string otherwise. + */ + private String getTypingLabel(Usage usage) { + StringBuilder builder = new StringBuilder(); + builder.append(""); + var featureTyping = usage.getOwnedRelationship().stream() + .filter(FeatureTyping.class::isInstance) + .map(FeatureTyping.class::cast) + .findFirst(); + if (featureTyping.isPresent()) { + var type = featureTyping.get().getType(); + if (type != null) { + builder.append(" : "); + builder.append(type.getDeclaredName()); + } + } + return builder.toString(); + } + /** * Return the edge label for the given {@link Dependency}. * @@ -68,7 +120,6 @@ public Element directEdit(Element element, String newLabel) { CommonTokenStream tokens = new CommonTokenStream(lexer); DirectEditParser parser = new DirectEditParser(tokens); ParseTree tree = parser.expression(); - ParseTreeWalker walker = new ParseTreeWalker(); DirectEditListener listener = new GeneralViewDirectEditListener(element); walker.walk(listener, tree); @@ -83,6 +134,9 @@ public Element directEdit(Element element, String newLabel) { * @return the value to display. */ public String getInitialDirectEditLabel(Element element) { + if (element instanceof Usage usage) { + return this.getCompartmentItemLabel(usage); + } return element.getDeclaredName(); } }