From d6cf1b8e4cf332922c273d6b9f197522b2f2701e Mon Sep 17 00:00:00 2001 From: mypsycho Date: Tue, 11 Jun 2024 14:49:07 +0200 Subject: [PATCH] Add API for properties and actions. --- .../emf/sirius/api/AbstractDiagramPart.xtend | 9 ++ .../emf/sirius/api/AbstractEdition.xtend | 89 +++++++++---------- .../emf/sirius/api/SiriusDependencies.xtend | 53 +++++++++-- .../modit/emf/sirius/api/SiriusDesigns.xtend | 8 +- .../modit/emf/sirius/api/SiriusVpGroup.xtend | 8 ++ .../emf/sirius/tool/SiriusGroupTemplate.xtend | 27 +++--- plugins/modit/META-INF/MANIFEST.MF | 3 +- .../design/sirius/EcoretoolsDesign.xtend | 2 +- 8 files changed, 128 insertions(+), 71 deletions(-) diff --git a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/AbstractDiagramPart.xtend b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/AbstractDiagramPart.xtend index 0a00f218..71ac4202 100644 --- a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/AbstractDiagramPart.xtend +++ b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/AbstractDiagramPart.xtend @@ -84,6 +84,7 @@ import org.eclipse.sirius.viewpoint.description.tool.InitialNodeCreationOperatio import org.eclipse.sirius.viewpoint.description.tool.ModelOperation import static extension org.mypsycho.modit.emf.sirius.api.SiriusDesigns.* +import org.eclipse.sirius.viewpoint.description.DecorationDescriptionsSet /** * Adaptation of Sirius model into Java and EClass reflections API @@ -447,6 +448,14 @@ abstract class AbstractDiagramPart extends AbstractTypedEditi customization.vsmElementCustomizations } + /** Gets decorations of a layer. */ + def getDecorationDescriptions(Layer it) { + if (decorationDescriptionsSet === null) { + decorationDescriptionsSet = DecorationDescriptionsSet.create + } + decorationDescriptionsSet.decorationDescriptions + } + /** * Add customization on assembly. *

diff --git a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/AbstractEdition.xtend b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/AbstractEdition.xtend index a5790c87..5ffe8e6c 100644 --- a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/AbstractEdition.xtend +++ b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/AbstractEdition.xtend @@ -111,6 +111,8 @@ import org.eclipse.sirius.viewpoint.description.validation.ValidationFix import static extension org.mypsycho.modit.emf.sirius.api.SiriusDesigns.* import org.eclipse.sirius.properties.PageDescription +import org.eclipse.sirius.properties.GroupOverrideDescription +import org.eclipse.sirius.properties.PageOverrideDescription /** * Adaptation of Sirius model into Java and EClass reflections API @@ -138,7 +140,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * * @param expression to evaluate */ - protected def toOperation(String expression) { + def toOperation(String expression) { ChangeContext.create[ browseExpression = expression ] } @@ -147,7 +149,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * * @param expression to evaluate */ - protected def toContext(String expression, ModelOperation... subOperations) { + def toContext(String expression, ModelOperation... subOperations) { expression.toOperation.andThen [ subModelOperations += subOperations ] @@ -166,7 +168,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { expression.toContext(subOperations) } - protected def toTool(ModelOperation operation) { + def toTool(ModelOperation operation) { InitialOperation.create[ firstModelOperations = operation ] @@ -179,7 +181,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * @param expression of value * @return a new SetValue */ - protected def setter(String featureExpr, String value) { + def setter(String featureExpr, String value) { SetValue.create[ featureName = featureExpr valueExpression = value @@ -193,7 +195,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * @param expression of value * @return a new SetValue */ - protected def SetValue setter(EStructuralFeature feature, String expression) { + def SetValue setter(EStructuralFeature feature, String expression) { feature.name.setter(expression) } @@ -203,7 +205,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * @param feature to set * @return a new SetValue */ - protected def SetValue setter(EStructuralFeature feature) { + def SetValue setter(EStructuralFeature feature) { feature.setter(SiriusDesigns.PROP_VALUE) } @@ -214,7 +216,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * @param expr expression of value * @return a new SetValue */ - protected def SetValue setter(EStructuralFeature feature, + def SetValue setter(EStructuralFeature feature, Functions.Function1 expr) { SetValue.create[ featureName = feature.name @@ -224,18 +226,18 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { /** Creates a 'CreateIntance' operation. */ - protected def creator(EReference ref, Class instanceType) { + def creator(EReference ref, Class instanceType) { ref.name.creator(instanceType) } /** Creates a 'CreateIntance' operation. */ - protected def creator(String refName, Class instanceType) { + def creator(String refName, Class instanceType) { refName.creator(instanceType.asDomainClass) } /** Deprecated: use typed signature. */ // for reverse template only - protected def creator(String refName, String instanceType) { + def creator(String refName, String instanceType) { CreateInstance.create [ referenceName = refName typeName = instanceType @@ -248,7 +250,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * @param expression of value * @return a new RemoveElement */ - protected def remover(String expression) { + def remover(String expression) { expression.toOperation.chain(RemoveElement.create) } @@ -259,7 +261,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * @param expression of element * @return a new Unset */ - protected def unsetter(String feature, String expression) { + def unsetter(String feature, String expression) { Unset.create [ featureName = feature elementExpression = expression @@ -273,7 +275,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * @param expression of element * @return a new Unset */ - protected def unsetter(EStructuralFeature feature, String expression) { + def unsetter(EStructuralFeature feature, String expression) { expression.unsetter(feature.name) } @@ -284,7 +286,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * @param expression of element * @return a new Unset */ - protected def letDo(String expression, String varName, ModelOperation... operations) { + def letDo(String expression, String varName, ModelOperation... operations) { Let.create [ variableName = varName valueExpression = expression @@ -299,7 +301,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { } /** Creates a 'switch' operation. */ - protected def switchDo(Pair... subCases) { + def switchDo(Pair... subCases) { Switch.create[ cases += subCases.map[ descr | Case.create [ @@ -313,7 +315,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { } /** Sets a default case to a 'Switch' operation. */ - protected def setByDefault(Switch it, ModelOperation operation) { + def setByDefault(Switch it, ModelOperation operation) { andThen[ // must be performed after original empty default ^default = Default.create[ @@ -323,18 +325,18 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { } /** Creates a 'If' operation. */ - protected def ifThenDo(String expression, ModelOperation... operations) { - expression.thenDo(operations) - } - - /** Creates a 'If' operation. Use ifThenDo */ - @Deprecated - protected def thenDo(String expression, ModelOperation... operations) { + def ifThenDo(String expression, ModelOperation... operations) { If.create [ conditionExpression = expression subModelOperations += operations ] } + + /** Creates a 'If' operation. Use 'ifThenDo' ! */ + @Deprecated + def thenDo(String expression, ModelOperation... operations) { + expression.ifThenDo(operations) + } /** * Creates a 'For' operation. @@ -342,7 +344,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * @param it 'iterator' -> 'collection' * @param operations to perform */ - protected def forDo(Pair it, ModelOperation... operations) { + def forDo(Pair it, ModelOperation... operations) { value.forDo(key, operations) } @@ -353,7 +355,7 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { * @param iter iterator name * @param operations to perform */ - protected def forDo(String valuesExpression, String iter, ModelOperation... operations) { + def forDo(String valuesExpression, String iter, ModelOperation... operations) { For.create [ expression = valuesExpression iteratorName = iter @@ -389,10 +391,12 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { ] } + /** Creates an external java action. */ def javaDo(Class actionId, String name, Pair... params) { actionId.name.javaDo(name, params) } + /** Creates an external java action. */ def javaDo(String actionId, String name, Pair... params) { ExternalJavaAction.create(name) [ id = actionId @@ -400,37 +404,26 @@ abstract class AbstractEdition extends AbstractIdentifiableElement { ] } - /** - * Sets the operation for provided widget. - *

- * Widget may be used in wizard operation of all views. - *

- *

- * This class unifies the initialOperation declaration of sub-class tool. - *

- * @param it tool to set - * @param value operation to perform - */ + /** Adds an action to a group. */ def action(GroupDescription owner, String label, String icon, ModelOperation operation) { label.createToolAction(icon, operation) => [ owner.actions += it ] } - /** - * Sets the operation for provided widget. - *

- * Widget may be used in wizard operation of all views. - *

- *

- * This class unifies the initialOperation declaration of sub-class tool. - *

- * @param it tool to set - * @param value operation to perform - */ + /** Adds an action to a page. */ def action(PageDescription owner, String label, String icon, ModelOperation operation) { label.createToolAction(icon, operation) => [ owner.actions += it ] } - + /** Adds an action to a group. */ + def action(GroupOverrideDescription owner, String label, String icon, ModelOperation operation) { + label.createToolAction(icon, operation) => [ owner.actions += it ] + } + + /** Adds an action to a page. */ + def action(PageOverrideDescription owner, String label, String icon, ModelOperation operation) { + label.createToolAction(icon, operation) => [ owner.actions += it ] + } + /** * Sets the operation for provided widget. *

diff --git a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusDependencies.xtend b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusDependencies.xtend index 9199cf23..ea8ea678 100644 --- a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusDependencies.xtend +++ b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusDependencies.xtend @@ -13,7 +13,9 @@ *******************************************************************************/ package org.mypsycho.modit.emf.sirius.api +import java.util.Collections import java.util.HashMap +import java.util.Iterator import java.util.Map import org.eclipse.emf.common.util.URI import org.eclipse.emf.ecore.EObject @@ -21,6 +23,7 @@ import org.eclipse.emf.ecore.resource.ResourceSet import org.eclipse.sirius.diagram.description.AbstractNodeMapping import org.eclipse.sirius.diagram.description.DiagramDescription import org.eclipse.sirius.diagram.description.EdgeMapping +import org.eclipse.sirius.properties.PageDescription import org.eclipse.sirius.properties.ViewExtensionDescription import org.eclipse.sirius.viewpoint.description.Group import org.eclipse.sirius.viewpoint.description.IdentifiedElement @@ -28,8 +31,9 @@ import org.eclipse.sirius.viewpoint.description.RepresentationDescription import org.eclipse.sirius.viewpoint.description.UserColor import org.eclipse.sirius.viewpoint.description.tool.AbstractToolDescription import org.eclipse.sirius.viewpoint.description.tool.ExternalJavaAction -import java.util.Collections -import java.util.Iterator +import org.eclipse.sirius.properties.GroupDescription +import org.eclipse.sirius.properties.PageOverrideDescription +import org.eclipse.sirius.properties.GroupOverrideDescription /** * Convenient methods and constants to handle dependencies between Sirius designs. @@ -85,6 +89,10 @@ class SiriusDependencies { RepresentationDescription: aliasBase + toClassname.apply(it) ViewExtensionDescription: aliasBase + toClassname.apply(it) + PageDescription: '''page:«aliasBase»«name»''' + GroupDescription: '''group:«aliasBase»«name»''' + PageOverrideDescription: '''page+:«aliasBase»«name»''' + GroupOverrideDescription: '''group+:«aliasBase»«name»''' } } @@ -105,9 +113,10 @@ class SiriusDependencies { } static def getDependencyExtras( - String designId, ResourceSet rs, String resourcePath + String designId, ResourceSet rs, + String resourcePath ) { - designId.getDependencyExtras(rs, resourcePath, [ SiriusDesigns.toClassname(it) ]) + designId.getDependencyExtras(rs, resourcePath) [ SiriusDesigns.toClassname(it) ] } static def getDependencyExtras( @@ -136,7 +145,6 @@ class SiriusDependencies { DiagramDescription it, String aliasBase, (EObject)=>String toClassname ) { val result = new HashMap - result += #{ it as EObject -> getExtraAlias(aliasBase, toClassname) } val representationAlias = aliasBase + toClassname.apply(it) + "#" @@ -145,6 +153,30 @@ class SiriusDependencies { result } + private static def dispatch Map mapDependencyExtras( + ViewExtensionDescription it, String aliasBase, (EObject)=>String toClassname + ) { + val result = new HashMap + result += #{ it as EObject -> getExtraAlias(aliasBase, toClassname) } + + val uniqueExt = (eContainer as Group) + .extensions + .filter(ViewExtensionDescription) + .size == 1 + val extAlias = aliasBase + (uniqueExt ? "" : name) + + val uniqueCat = categories.size > 1 + categories.forEach[ + val categoryAlias = uniqueExt && uniqueCat + ? aliasBase + : '''«extAlias»«uniqueCat ? '_' + name : ""»#''' + result += pages.toDependencyExtras(categoryAlias, toClassname) + result += groups.toDependencyExtras(categoryAlias, toClassname) + ] + + result + } + private static def dispatch Map mapDependencyExtras( Group it, String aliasBase, (EObject)=>String toClassname ) { @@ -155,15 +187,22 @@ class SiriusDependencies { .flatMap[ ownedRepresentations + ownedRepresentationExtensions ] .forEach [ result += mapDependencyExtras(aliasBase, toClassname) ] - ownedViewpoints + extensions .filter(ViewExtensionDescription) .forEach [ result += mapDependencyExtras(aliasBase, toClassname) ] - result += paletteColors.iterator().toDependencyExtras(aliasBase, toClassname) + result += paletteColors.toDependencyExtras(aliasBase, toClassname) result } + static def toDependencyExtras( + Iterable values, String aliasBase, + (EObject)=>String toClassname + ) { + values.iterator.toDependencyExtras(aliasBase, toClassname) + } + static def toDependencyExtras( Iterator values, String aliasBase, (EObject)=>String toClassname diff --git a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusDesigns.xtend b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusDesigns.xtend index 0d73cda0..f7ebd6e8 100644 --- a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusDesigns.xtend +++ b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusDesigns.xtend @@ -16,11 +16,11 @@ package org.mypsycho.modit.emf.sirius.api import java.util.regex.Pattern import org.eclipse.emf.common.util.EList import org.eclipse.emf.common.util.Enumerator +import org.eclipse.emf.ecore.EClass import org.eclipse.emf.ecore.EClassifier import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.EReference import org.eclipse.emf.ecore.EStructuralFeature -import org.eclipse.emf.ecore.EcorePackage import org.eclipse.emf.ecore.util.EcoreEList import org.eclipse.emf.edit.provider.IItemLabelProvider import org.eclipse.sirius.diagram.ui.provider.DiagramUIPlugin @@ -30,7 +30,6 @@ import org.eclipse.sirius.viewpoint.description.IdentifiedElement import org.eclipse.sirius.viewpoint.description.RepresentationDescription import org.eclipse.sirius.viewpoint.description.RepresentationExtensionDescription import org.mypsycho.modit.emf.sirius.SiriusConstantInterpreter -import org.eclipse.emf.ecore.EClass /** * Convenient methods and constants for Sirius design creation. @@ -58,7 +57,10 @@ class SiriusDesigns { /** Expression for return semantic container */ public static val NEVER = AQL + "false" - public static val ANY_TYPE = encode(EcorePackage.eINSTANCE.EObject) + public static val ANY_TYPE = "EObject" + // Constant used in: + // org.eclipse.sirius.ecore.extender.business.internal.accessor.ecore.EcoreIntrinsicExtender + // #eInstanceOf /** * Creates a constant of the value. diff --git a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusVpGroup.xtend b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusVpGroup.xtend index 761a9a55..e8647e3b 100644 --- a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusVpGroup.xtend +++ b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/api/SiriusVpGroup.xtend @@ -29,6 +29,7 @@ import org.eclipse.sirius.viewpoint.description.RepresentationExtensionDescripti import org.eclipse.sirius.viewpoint.description.UserFixedColor import org.eclipse.sirius.viewpoint.description.Viewpoint import org.mypsycho.modit.emf.sirius.SiriusModelProvider +import org.eclipse.sirius.viewpoint.description.Group /** * Class regrouping a common adaptation of Sirius into Java and EClass reflection for group. @@ -169,6 +170,13 @@ abstract class SiriusVpGroup extends SiriusModelProvider { ] } + protected def properties(Group owner, Class descr) { + val part = descr.constructors.head.newInstance(this) as AbstractPropertySet + part.createContent => [ + owner.extensions += it + ] + } + // // Identification // diff --git a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/tool/SiriusGroupTemplate.xtend b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/tool/SiriusGroupTemplate.xtend index 2b52755a..b11e62f1 100644 --- a/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/tool/SiriusGroupTemplate.xtend +++ b/plugins/modit.sirius/src/org/mypsycho/modit/emf/sirius/tool/SiriusGroupTemplate.xtend @@ -18,9 +18,12 @@ import org.eclipse.emf.ecore.EObject import org.eclipse.emf.ecore.EStructuralFeature import org.eclipse.emf.ecore.resource.Resource import org.eclipse.sirius.business.api.helper.ViewpointUtil +import org.eclipse.sirius.properties.ViewExtensionDescription import org.eclipse.sirius.viewpoint.description.DescriptionPackage import org.eclipse.sirius.viewpoint.description.Group import org.eclipse.sirius.viewpoint.description.JavaExtension +import org.eclipse.sirius.viewpoint.description.RepresentationDescription +import org.eclipse.sirius.viewpoint.description.RepresentationExtensionDescription import org.eclipse.sirius.viewpoint.description.UserFixedColor import org.eclipse.xtend.lib.annotations.Accessors import org.mypsycho.modit.emf.EReversIt @@ -43,8 +46,8 @@ class SiriusGroupTemplate extends EReversIt { delegates += new DiagramTemplate(this) delegates += new TableTemplate(this) delegates += new TreeTemplate(this) - delegates += new PropertiesTemplate(this) delegates += new DiagramExtensionTemplate(this) + delegates += new PropertiesTemplate(this) } override protected prepareContext() { @@ -135,23 +138,25 @@ ENDFOR } } + static val SUB_CLASSES_CASES = #{ + VP.viewpoint_OwnedRepresentations -> RepresentationDescription -> "owned", + VP.viewpoint_OwnedRepresentationExtensions -> RepresentationExtensionDescription -> "owned", + VP.group_Extensions -> ViewExtensionDescription -> "properties" + } override templatePropertyValue(EStructuralFeature feat, Object value, (Object)=>String encoding) { feat == VP.viewpoint_OwnedJavaExtensions ? '''use(«(value as JavaExtension).qualifiedClassName»)''' - : feat == VP.viewpoint_OwnedRepresentations || feat == VP.viewpoint_OwnedRepresentationExtensions - ? feat.templateOwned(value, encoding) + : feat.findSubClassCase(value) !== null + ? '''«feat.findSubClassCase(value)»(«context.splits.get(value).templateSplitClass»)''' : super.templatePropertyValue(feat, value, encoding) } - def templateOwned(EStructuralFeature feat, Object value, (Object)=>String encoding) { - val split = context.splits.get(value) - split !== null - ? '''owned(«split.templateSplitClass»)''' - : super.templatePropertyValue(feat, value, encoding) // unlikely + def findSubClassCase(EStructuralFeature feat, Object target) { + SUB_CLASSES_CASES.entrySet.findFirst[ + key.key == feat && key.value.isInstance(target) + ]?.value } + - override templateRef(EObject it, Class using) { - super.templateRef(it, using) - } } diff --git a/plugins/modit/META-INF/MANIFEST.MF b/plugins/modit/META-INF/MANIFEST.MF index 63687791..ddbd1bda 100644 --- a/plugins/modit/META-INF/MANIFEST.MF +++ b/plugins/modit/META-INF/MANIFEST.MF @@ -13,7 +13,8 @@ Require-Bundle: org.eclipse.xtend.lib;visibility:=reexport, org.eclipse.xtend.lib.macro;visibility:=reexport, org.eclipse.emf.ecore;visibility:=reexport, - org.eclipse.emf.ecore.xmi;visibility:=reexport + org.eclipse.emf.ecore.xmi;visibility:=reexport, + org.eclipse.emf.codegen.ecore.ui;bundle-version="2.26.0" Export-Package: org.mypsycho.modit, org.mypsycho.modit.emf, diff --git a/tests/modit-sirius-tests/src/org/eclipse/emf/ecoretools/design/sirius/EcoretoolsDesign.xtend b/tests/modit-sirius-tests/src/org/eclipse/emf/ecoretools/design/sirius/EcoretoolsDesign.xtend index dfb98ab2..60ad5087 100644 --- a/tests/modit-sirius-tests/src/org/eclipse/emf/ecoretools/design/sirius/EcoretoolsDesign.xtend +++ b/tests/modit-sirius-tests/src/org/eclipse/emf/ecoretools/design/sirius/EcoretoolsDesign.xtend @@ -92,7 +92,7 @@ class EcoretoolsDesign extends SiriusVpGroup { entries += "Abstract EClass".color(228, 228, 228) entries += "Inherited".color(125, 125, 125) ] - extensions += new DefaultViewExtension(this).createContent + properties(DefaultViewExtension) }