From 646995330673efa3dec3ae8308348eac9623bb91 Mon Sep 17 00:00:00 2001 From: Pierre-Charles David Date: Wed, 20 Apr 2022 15:31:00 +0200 Subject: [PATCH] [1139] Hard code a pseudo "semantic browser" in the default rules for testing Bug: https://github.com/eclipse-sirius/sirius-components/issues/1139 Signed-off-by: Pierre-Charles David --- .../PropertiesDefaultDescriptionProvider.java | 18 ++ .../SemanticBrowserDescriptionProvider.java | 194 ++++++++++++++++++ 2 files changed, 212 insertions(+) create mode 100644 backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/compatibility/properties/SemanticBrowserDescriptionProvider.java diff --git a/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/compatibility/properties/PropertiesDefaultDescriptionProvider.java b/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/compatibility/properties/PropertiesDefaultDescriptionProvider.java index 55fdaecdacd..881e2f91e90 100644 --- a/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/compatibility/properties/PropertiesDefaultDescriptionProvider.java +++ b/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/compatibility/properties/PropertiesDefaultDescriptionProvider.java @@ -30,6 +30,7 @@ import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.emf.compatibility.properties.api.IPropertiesValidationProvider; import org.eclipse.sirius.components.emf.services.messages.IEMFMessageService; +import org.eclipse.sirius.components.forms.GroupDisplayMode; import org.eclipse.sirius.components.forms.description.AbstractControlDescription; import org.eclipse.sirius.components.forms.description.ForDescription; import org.eclipse.sirius.components.forms.description.FormDescription; @@ -71,6 +72,7 @@ public FormDescription getFormDescription() { List groupDescriptions = new ArrayList<>(); GroupDescription groupDescription = this.getGroupDescription(); + groupDescriptions.add(this.getSemanticBrowserGroupDescription()); groupDescriptions.add(groupDescription); List pageDescriptions = new ArrayList<>(); @@ -204,4 +206,20 @@ private GroupDescription getGroupDescription() { // @formatter:on } + private GroupDescription getSemanticBrowserGroupDescription() { + List controlDescriptions = new ArrayList<>(); + SemanticBrowserDescriptionProvider semanticBrowserDescriptionProvider = new SemanticBrowserDescriptionProvider(this.objectService, this.propertiesValidationProvider); + controlDescriptions.add(semanticBrowserDescriptionProvider.getCurrentTreeDescription()); + controlDescriptions.add(semanticBrowserDescriptionProvider.getOutgoingTreeDescription()); + controlDescriptions.add(semanticBrowserDescriptionProvider.getIncomingTreeDescription()); + // @formatter:off + return GroupDescription.newGroupDescription("semanticBrowserGroupId") //$NON-NLS-1$ + .idProvider(variableManager -> "Semantic Browser") //$NON-NLS-1$ + .labelProvider(variableManager -> "Semantic Browser") //$NON-NLS-1$ + .displayModeProvider(variableManager -> GroupDisplayMode.TOGGLEABLE_AREAS) + .semanticElementsProvider(variableManager -> Collections.singletonList(variableManager.getVariables().get(VariableManager.SELF))) + .controlDescriptions(controlDescriptions) + .build(); + // @formatter:on + } } diff --git a/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/compatibility/properties/SemanticBrowserDescriptionProvider.java b/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/compatibility/properties/SemanticBrowserDescriptionProvider.java new file mode 100644 index 00000000000..b8246428037 --- /dev/null +++ b/backend/sirius-components-emf/src/main/java/org/eclipse/sirius/components/emf/compatibility/properties/SemanticBrowserDescriptionProvider.java @@ -0,0 +1,194 @@ +/******************************************************************************* + * Copyright (c) 2022 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.sirius.components.emf.compatibility.properties; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature.Setting; +import org.eclipse.emf.ecore.util.ECrossReferenceAdapter; +import org.eclipse.sirius.components.compatibility.forms.WidgetIdProvider; +import org.eclipse.sirius.components.core.api.IObjectService; +import org.eclipse.sirius.components.emf.compatibility.properties.api.IPropertiesValidationProvider; +import org.eclipse.sirius.components.forms.TreeNode; +import org.eclipse.sirius.components.forms.description.TreeDescription; +import org.eclipse.sirius.components.representations.VariableManager; + +/** + * Provides a tree widget description with incoming, current and outgoing trees. + * + * @author pcdavid + */ +public class SemanticBrowserDescriptionProvider { + public static final String CANDIDATE_VARIABLE = "candidate"; //$NON-NLS-1$ + + private static final String SEMANTIC_BROWSER = "semantic_browser"; //$NON-NLS-1$ + + private static final String CATEGORY_INCOMING = "Incoming"; //$NON-NLS-1$ + + private static final String CATEGORY_CURRENT = "Current"; //$NON-NLS-1$ + + private static final String CATEGORY_OUTGOING = "Outgoing"; //$NON-NLS-1$ + + private final IObjectService objectService; + + private final IPropertiesValidationProvider propertiesValidationProvider; + + public SemanticBrowserDescriptionProvider(IObjectService objectService, IPropertiesValidationProvider propertiesValidationProvider) { + this.objectService = objectService; + this.propertiesValidationProvider = propertiesValidationProvider; + } + + private String getNodeId(VariableManager variableManager) { + String result = ""; //$NON-NLS-1$ + Optional optionalCandidate = variableManager.get(CANDIDATE_VARIABLE, Object.class); + if (optionalCandidate.isPresent()) { + Object candidate = optionalCandidate.get(); + result = this.objectService.getId(candidate); + } + return result; + } + + private String getNodeLabel(VariableManager variableManager) { + String result = ""; //$NON-NLS-1$ + Optional optionalCandidate = variableManager.get(CANDIDATE_VARIABLE, Object.class); + if (optionalCandidate.isPresent()) { + Object candidate = optionalCandidate.get(); + result = this.objectService.getLabel(candidate); + } + return result; + } + + private String getNodeImageURL(VariableManager variableManager) { + String result = ""; //$NON-NLS-1$ + Optional optionalCandidate = variableManager.get(CANDIDATE_VARIABLE, Object.class); + if (optionalCandidate.isPresent()) { + Object candidate = optionalCandidate.get(); + result = this.objectService.getImagePath(candidate); + } + return result; + } + + private String getNodeKind(VariableManager variableManager) { + String result = ""; //$NON-NLS-1$ + Optional optionalCandidate = variableManager.get(CANDIDATE_VARIABLE, Object.class); + if (optionalCandidate.isPresent()) { + Object candidate = optionalCandidate.get(); + result = this.objectService.getKind(candidate); + } + return result; + } + + private List getContents(VariableManager variableManager) { + List result = List.of(); + Optional optionalCandidate = variableManager.get(CANDIDATE_VARIABLE, EObject.class); + if (optionalCandidate.isPresent()) { + EObject candidate = optionalCandidate.get(); + result = candidate.eContents(); + } + return result; + } + + private List getOutgoing(VariableManager variableManager) { + List result = List.of(); + Optional optionalSelf = variableManager.get(VariableManager.SELF, EObject.class); + Optional optionalCandidate = variableManager.get(CANDIDATE_VARIABLE, EObject.class); + if (optionalCandidate.isPresent() && optionalCandidate.equals(optionalSelf)) { + EObject candidate = optionalCandidate.get(); + result = candidate.eCrossReferences(); + } + return result; + } + + private List getIncoming(VariableManager variableManager) { + List result = List.of(); + Optional optionalSelf = variableManager.get(VariableManager.SELF, EObject.class); + Optional optionalCandidate = variableManager.get(CANDIDATE_VARIABLE, EObject.class); + if (optionalCandidate.isPresent() && optionalCandidate.equals(optionalSelf)) { + EObject candidate = optionalCandidate.get(); + ECrossReferenceAdapter xref = ECrossReferenceAdapter.getCrossReferenceAdapter(candidate); + if (xref != null) { + result = xref.getInverseReferences(candidate).stream().map(Setting::getEObject).collect(Collectors.toList()); + } + } + return result; + } + + public TreeDescription getCurrentTreeDescription() { + // @formatter:off + return TreeDescription.newTreeDescription(SEMANTIC_BROWSER + CATEGORY_CURRENT).idProvider(new WidgetIdProvider()) + .diagnosticsProvider(this.propertiesValidationProvider.getDiagnosticsProvider()) + .kindProvider(this.propertiesValidationProvider.getKindProvider()) + .messageProvider(this.propertiesValidationProvider.getMessageProvider()) + .labelProvider(variableManager -> CATEGORY_CURRENT) + .nodeIdProvider(this::getNodeId) + .nodeLabelProvider(this::getNodeLabel) + .nodeImageURLProvider(this::getNodeImageURL) + .nodeKindProvider(this::getNodeKind) + .nodeSelectableProvider(variableManager -> true) + .childrenProvider(this::getContents) + .expandedNodeIdsProvider(this::getAllNodeIds) + .build(); + // @formatter:on + } + + private List getAllNodeIds(VariableManager variableManager) { + List result = new ArrayList<>(); + for (var element : variableManager.get("nodes", List.class).orElse(List.of())) { //$NON-NLS-1$ + if (element instanceof TreeNode) { + TreeNode node = (TreeNode) element; + result.add(node.getId()); + } + } + return result; + } + + public TreeDescription getOutgoingTreeDescription() { + // @formatter:off + return TreeDescription.newTreeDescription(SEMANTIC_BROWSER + CATEGORY_OUTGOING).idProvider(new WidgetIdProvider()) + .diagnosticsProvider(this.propertiesValidationProvider.getDiagnosticsProvider()) + .kindProvider(this.propertiesValidationProvider.getKindProvider()) + .messageProvider(this.propertiesValidationProvider.getMessageProvider()) + .labelProvider(variableManager -> CATEGORY_OUTGOING) + .nodeIdProvider(this::getNodeId) + .nodeLabelProvider(this::getNodeLabel) + .nodeImageURLProvider(this::getNodeImageURL) + .nodeKindProvider(this::getNodeKind) + .nodeSelectableProvider(variableManager -> true) + .childrenProvider(this::getOutgoing) + .expandedNodeIdsProvider(this::getAllNodeIds) + .build(); + // @formatter:on + } + + public TreeDescription getIncomingTreeDescription() { + // @formatter:off + return TreeDescription.newTreeDescription(SEMANTIC_BROWSER + CATEGORY_INCOMING).idProvider(new WidgetIdProvider()) + .diagnosticsProvider(this.propertiesValidationProvider.getDiagnosticsProvider()) + .kindProvider(this.propertiesValidationProvider.getKindProvider()) + .messageProvider(this.propertiesValidationProvider.getMessageProvider()) + .labelProvider(variableManager -> CATEGORY_INCOMING) + .nodeIdProvider(this::getNodeId) + .nodeLabelProvider(this::getNodeLabel) + .nodeImageURLProvider(this::getNodeImageURL) + .nodeKindProvider(this::getNodeKind) + .nodeSelectableProvider(variableManager -> true) + .childrenProvider(this::getIncoming) + .expandedNodeIdsProvider(this::getAllNodeIds) + .build(); + // @formatter:on + } +}