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
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.eclipse.sirius.components.diagrams.Label;
import org.eclipse.sirius.components.diagrams.tests.graphql.ConnectorPaletteQueryRunner;
import org.eclipse.sirius.components.diagrams.tests.graphql.InvokeSingleClickOnTwoDiagramElementsToolMutationRunner;
import org.eclipse.sirius.components.diagrams.tests.graphql.PaletteQueryRunner;
import org.eclipse.sirius.components.diagrams.tests.navigation.DiagramNavigator;
import org.eclipse.sirius.components.view.diagram.NodeDescription;
import org.eclipse.sirius.components.view.emf.diagram.IDiagramIdProvider;
Expand Down Expand Up @@ -123,6 +124,9 @@ public class GVEdgeCreationTests extends AbstractIntegrationTests {
@Autowired
private ConnectorPaletteQueryRunner connectorPaletteQueryRunner;

@Autowired
private PaletteQueryRunner paletteQueryRunner;

private final IDescriptionNameGenerator descriptionNameGenerator = new SDVDescriptionNameGenerator();

private static Stream<Arguments> addAttributeUsageAsNestedOfEdgeSourceParameters() {
Expand Down Expand Up @@ -173,6 +177,37 @@ public void concernUsageHasCorrectlyLabelledNestedCompositionEdgeTool() {
.contains("Become nested Concern");
}

/**
* Checks that edge tools remain available before a connector target has been selected.
*/
@DisplayName("GIVEN a Usage node, WHEN retrieving its palette, THEN target-specific edge tools are available")
@GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH })
@Test
public void nodePaletteProvidesTargetSpecificEdgeTools() {
var flux = this.givenSubscriptionToDiagram(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, GeneralViewWithTopNodesTestProjectData.GraphicalIds.DIAGRAM_ID);

StepVerifier.create(flux)
.consumeNextWith(assertRefreshedDiagramThat(diagram -> {
Map<String, Object> variables = Map.of(
"editingContextId", GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
"representationId", diagram.getId(),
"diagramElementIds", List.of(GeneralViewWithTopNodesTestProjectData.GraphicalIds.PART_USAGE_ID));
var result = this.paletteQueryRunner.run(variables);
List<String> paletteEntries = JsonPath.read(result.data(), "$.data.viewer.editingContext.representation.description.palette.paletteEntries[*].label");
assertThat(paletteEntries).contains("Add target as nested Part", "Add target as nested Accept Action");

variables = Map.of(
"editingContextId", GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID,
"representationId", diagram.getId(),
"diagramElementIds", List.of(GeneralViewWithTopNodesTestProjectData.GraphicalIds.PART_DEFINITION_ID));
result = this.paletteQueryRunner.run(variables);
paletteEntries = JsonPath.read(result.data(), "$.data.viewer.editingContext.representation.description.palette.paletteEntries[*].label");
assertThat(paletteEntries).contains("Add target as owned Part", NEW_SUBCLASSIFICATION_TOOL_LABEL);
}))
.thenCancel()
.verify(Duration.ofSeconds(10));
}

@DisplayName("GIVEN a Usage source and a Usage target, WHEN retrieving the connector palette, THEN the nested tools name their target and source respectively")
@GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH })
@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@ eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
encoding/<project>=UTF-8
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*******************************************************************************
* 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.services;

import java.util.Optional;

import org.eclipse.sirius.components.collaborative.diagrams.DiagramContext;
import org.eclipse.sirius.components.collaborative.diagrams.variables.DiagramVariables;
import org.eclipse.sirius.components.core.api.IEditingContext;
import org.eclipse.sirius.components.representations.IOperationValidator;
import org.eclipse.sirius.components.representations.VariableManager;
import org.eclipse.sirius.components.view.emf.diagram.tools.DiagramElementPaletteVariableManagerProvider;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;

/**
* Provides the missing edge target variable when evaluating edge tools in an ordinary diagram element palette.
* This service should be deleted when https://github.com/eclipse-sirius/sirius-web/issues/6997 will be fixed.
*
* @author arichard
*/
@Primary
@Service
public class SysONDiagramElementPaletteVariableManagerProvider extends DiagramElementPaletteVariableManagerProvider {

/**
* Creates the palette variable provider.
*
* @param operationValidator
* validates the variables required by palette operations
*/
public SysONDiagramElementPaletteVariableManagerProvider(IOperationValidator operationValidator) {
super(operationValidator);
}

/**
* Supplies the source semantic element as an edge target placeholder until a connector target is selected.
*
* @param editingContext
* the editing context
* @param diagramContext
* the diagram context
* @param diagramElement
* the selected diagram element
* @param semanticElement
* its semantic element
* @return the palette variables
*/
@Override
public Optional<VariableManager> getVariableManager(IEditingContext editingContext, DiagramContext diagramContext, Object diagramElement, Object semanticElement) {
var variableManager = super.getVariableManager(editingContext, diagramContext, diagramElement, semanticElement);
variableManager.ifPresent(variables -> variables.put(DiagramVariables.EDGE_TARGET.name(), semanticElement));
return variableManager;
}
}
Loading