diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 56827d7e98..4ed5796b08 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -58,6 +58,7 @@ As a result the development of applications consuming Sirius Components packages - https://github.com/eclipse-sirius/sirius-web/issues/2117[#2117] [form] Add a modal to select new values for multi-valued references - https://github.com/eclipse-sirius/sirius-web/issues/2118[#2118] [form] Add a modal to create new objects on a widget reference - https://github.com/eclipse-sirius/sirius-web/issues/2253[#2253] [diagram] Add the possibility of organizing palette tools into sections +- https://github.com/eclipse-sirius/sirius-web/issues/2254[#2254] [diagram] Add the possibility to specify precondition on diagram tools === Improvements diff --git a/integration-tests/cypress/e2e/project/edit/studio.cy.js b/integration-tests/cypress/e2e/project/edit/studio.cy.js index ac20440a54..efb80c5f88 100644 --- a/integration-tests/cypress/e2e/project/edit/studio.cy.js +++ b/integration-tests/cypress/e2e/project/edit/studio.cy.js @@ -111,4 +111,51 @@ describe('/projects/:projectId/edit - Studio', () => { cy.get('[data-value="Source Edge End Reconnection Tool"]').should('not.exist'); cy.get('[data-value="Target Edge End Reconnection Tool"]').should('not.exist'); }); + + it('Check the precondition on tools', () => { + cy.getByTestId('ViewNewModel').dblclick(); + cy.getByTestId('View').dblclick(); + cy.get('[data-testid$=" Diagram Description"]').dblclick(); + cy.getByTestId('DiagramPalette-more').click(); + cy.getByTestId('new-object').click(); + cy.getByTestId('childCreationDescription').children('[role="button"]').invoke('text').should('have.length.gt', 1); + cy.getByTestId('childCreationDescription').click(); + cy.getByTestId('childCreationDescription').get('[data-value="Node Tool"]').should('exist').click(); + cy.getByTestId('create-object').click(); + cy.getByTestId('Precondition Expression').should('exist'); + cy.getByTestId('Precondition Expression').type('aql:self.eAllContents()->size()>0'); + cy.getByTestId('Name').clear(); + cy.getByTestId('Name').type('TestTool'); + + cy.get('[title="Back to the homepage"]').click(); + // Check the diagram representation + + cy.getByTestId('create').click(); + cy.getByTestId('name').type('Instance'); + cy.getByTestId('create-project').click(); + cy.getByTestId('empty').click(); + cy.getByTestId('Others...-more').click(); + cy.getByTestId('new-object').click(); + cy.getByTestId('domain').children('[role="button"]').invoke('text').should('have.length.gt', 1); + cy.getByTestId('domain').click(); + cy.getByTestId('domain').get('[data-value^="domain://"]').should('exist').click(); + cy.getByTestId('create-object').click(); + + cy.getByTestId('Root-more').click(); + cy.getByTestId('treeitem-contextmenu').findByTestId('new-representation').click(); + cy.getByTestId('representationDescription').children('[role="button"]').invoke('text').should('have.length.gt', 1); + cy.getByTestId('representationDescription').click(); + cy.get('[data-testid$=" Diagram Description"]').should('exist').click(); + cy.getByTestId('create-representation').click(); + + cy.getByTestId('Diagram').click(); + cy.getByTestId('New Entity1 - Tool').should('exist'); + cy.getByTestId('New Entity2 - Tool').should('exist'); + cy.getByTestId('TestTool - Tool').should('not.exist'); + cy.getByTestId('New Entity1 - Tool').click(); + cy.getByTestId('Diagram').click(); + cy.getByTestId('New Entity1 - Tool').should('exist'); + cy.getByTestId('New Entity2 - Tool').should('exist'); + cy.getByTestId('TestTool - Tool').should('exist'); + }); }); diff --git a/packages/compatibility/backend/sirius-components-compatibility/src/main/java/org/eclipse/sirius/components/compatibility/services/diagrams/CompatibilityPaletteProvider.java b/packages/compatibility/backend/sirius-components-compatibility/src/main/java/org/eclipse/sirius/components/compatibility/services/diagrams/CompatibilityPaletteProvider.java index 335628da2d..7108438f15 100644 --- a/packages/compatibility/backend/sirius-components-compatibility/src/main/java/org/eclipse/sirius/components/compatibility/services/diagrams/CompatibilityPaletteProvider.java +++ b/packages/compatibility/backend/sirius-components-compatibility/src/main/java/org/eclipse/sirius/components/compatibility/services/diagrams/CompatibilityPaletteProvider.java @@ -33,6 +33,7 @@ import org.eclipse.sirius.components.compatibility.api.IIdentifierProvider; import org.eclipse.sirius.components.compatibility.services.api.IODesignRegistry; import org.eclipse.sirius.components.core.api.Environment; +import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.diagrams.Edge; import org.eclipse.sirius.components.diagrams.Node; import org.eclipse.sirius.components.diagrams.description.DiagramDescription; @@ -84,7 +85,7 @@ public boolean canHandle(DiagramDescription diagramDescription) { } @Override - public Palette handle(Object targetElement, Object diagramElement, Object diagramElementDescription, DiagramDescription diagramDescription) { + public Palette handle(Object targetElement, Object diagramElement, Object diagramElementDescription, DiagramDescription diagramDescription, IEditingContext editingContext) { var optionalVsmElementId = this.identifierProvider.findVsmElementId(diagramDescription.getId()); var optionalSiriusDiagramDescription = this.odesignRegistry.getODesigns().stream() diff --git a/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/api/IPaletteProvider.java b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/api/IPaletteProvider.java index 0cd21c23ea..c9540be021 100644 --- a/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/api/IPaletteProvider.java +++ b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/api/IPaletteProvider.java @@ -13,6 +13,7 @@ package org.eclipse.sirius.components.collaborative.diagrams.api; import org.eclipse.sirius.components.collaborative.diagrams.dto.Palette; +import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.diagrams.description.DiagramDescription; @@ -25,5 +26,5 @@ public interface IPaletteProvider { boolean canHandle(DiagramDescription diagramDescription); - Palette handle(Object targetElement, Object diagramElement, Object diagramElementDescription, DiagramDescription diagramDescription); + Palette handle(Object targetElement, Object diagramElement, Object diagramElementDescription, DiagramDescription diagramDescription, IEditingContext editingContext); } diff --git a/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/GetPaletteEventHandler.java b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/GetPaletteEventHandler.java index 50218c0c66..4c84ad2d51 100644 --- a/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/GetPaletteEventHandler.java +++ b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/GetPaletteEventHandler.java @@ -110,7 +110,7 @@ public void handle(One payloadSink, Many changeDesc if (optionalToolSectionsProvider.isPresent() && optionalTargetElement.isPresent() && optionalDiagramElementDescription.isPresent()) { IPaletteProvider toolSectionsProvider = optionalToolSectionsProvider.get(); palette = toolSectionsProvider.handle(optionalTargetElement.get(), optionalDiagramElement.orElse(null), optionalDiagramElementDescription.get(), - diagramDescription); + diagramDescription, editingContext); } } } diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.tsx b/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.tsx index 2fc58732ce..e29bd7105c 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.tsx +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.tsx @@ -1096,12 +1096,14 @@ export const DiagramRepresentation = ({ diagramServer.actionDispatcher.dispatch(sourceElementAction); } } - const setDefaultToolEvent: SetDefaultToolEvent = { - type: 'SET_DEFAULT_TOOL', - defaultTool: tool, - toolSection: toolSection, - }; - dispatch(setDefaultToolEvent); + if (toolSection) { + const setDefaultToolEvent: SetDefaultToolEvent = { + type: 'SET_DEFAULT_TOOL', + defaultTool: tool, + toolSection: toolSection, + }; + dispatch(setDefaultToolEvent); + } }; const invokeConnectorToolFromContextualPalette = (palette: GQLPalette) => { resetTools(); diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/DeleteToolBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/DeleteToolBuilder.java index b888159aa7..0e4419e558 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/DeleteToolBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/DeleteToolBuilder.java @@ -51,6 +51,16 @@ public DeleteToolBuilder name(java.lang.String value) { this.getDeleteTool().setName(value); return this; } + /** + * Setter for PreconditionExpression. + * + * @generated + */ + public DeleteToolBuilder preconditionExpression(java.lang.String value) { + this.getDeleteTool().setPreconditionExpression(value); + return this; + } + /** * Setter for Body. * diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/DropToolBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/DropToolBuilder.java index 0cc1a16fcc..f692e0e3e2 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/DropToolBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/DropToolBuilder.java @@ -51,6 +51,16 @@ public DropToolBuilder name(java.lang.String value) { this.getDropTool().setName(value); return this; } + /** + * Setter for PreconditionExpression. + * + * @generated + */ + public DropToolBuilder preconditionExpression(java.lang.String value) { + this.getDropTool().setPreconditionExpression(value); + return this; + } + /** * Setter for Body. * diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/EdgeReconnectionToolBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/EdgeReconnectionToolBuilder.java index 78e9e1895b..ff21c55526 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/EdgeReconnectionToolBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/EdgeReconnectionToolBuilder.java @@ -35,6 +35,16 @@ public EdgeReconnectionToolBuilder name(java.lang.String value) { this.getEdgeReconnectionTool().setName(value); return this; } + /** + * Setter for PreconditionExpression. + * + * @generated + */ + public EdgeReconnectionToolBuilder preconditionExpression(java.lang.String value) { + this.getEdgeReconnectionTool().setPreconditionExpression(value); + return this; + } + /** * Setter for Body. * diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/EdgeToolBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/EdgeToolBuilder.java index 5e50927eb7..535ca528cc 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/EdgeToolBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/EdgeToolBuilder.java @@ -51,6 +51,16 @@ public EdgeToolBuilder name(java.lang.String value) { this.getEdgeTool().setName(value); return this; } + /** + * Setter for PreconditionExpression. + * + * @generated + */ + public EdgeToolBuilder preconditionExpression(java.lang.String value) { + this.getEdgeTool().setPreconditionExpression(value); + return this; + } + /** * Setter for Body. * diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/LabelEditToolBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/LabelEditToolBuilder.java index 9f4303e30c..56ae9d6a0a 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/LabelEditToolBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/LabelEditToolBuilder.java @@ -51,6 +51,16 @@ public LabelEditToolBuilder name(java.lang.String value) { this.getLabelEditTool().setName(value); return this; } + /** + * Setter for PreconditionExpression. + * + * @generated + */ + public LabelEditToolBuilder preconditionExpression(java.lang.String value) { + this.getLabelEditTool().setPreconditionExpression(value); + return this; + } + /** * Setter for Body. * diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/NodeToolBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/NodeToolBuilder.java index df56104b54..050c3602d1 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/NodeToolBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/NodeToolBuilder.java @@ -51,6 +51,16 @@ public NodeToolBuilder name(java.lang.String value) { this.getNodeTool().setName(value); return this; } + /** + * Setter for PreconditionExpression. + * + * @generated + */ + public NodeToolBuilder preconditionExpression(java.lang.String value) { + this.getNodeTool().setPreconditionExpression(value); + return this; + } + /** * Setter for Body. * diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/SourceEdgeEndReconnectionToolBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/SourceEdgeEndReconnectionToolBuilder.java index 21afc6d1ec..389e27c603 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/SourceEdgeEndReconnectionToolBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/SourceEdgeEndReconnectionToolBuilder.java @@ -51,6 +51,16 @@ public SourceEdgeEndReconnectionToolBuilder name(java.lang.String value) { this.getSourceEdgeEndReconnectionTool().setName(value); return this; } + /** + * Setter for PreconditionExpression. + * + * @generated + */ + public SourceEdgeEndReconnectionToolBuilder preconditionExpression(java.lang.String value) { + this.getSourceEdgeEndReconnectionTool().setPreconditionExpression(value); + return this; + } + /** * Setter for Body. * diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/TargetEdgeEndReconnectionToolBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/TargetEdgeEndReconnectionToolBuilder.java index 726c261e15..8fbbfc3f9e 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/TargetEdgeEndReconnectionToolBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/TargetEdgeEndReconnectionToolBuilder.java @@ -51,6 +51,16 @@ public TargetEdgeEndReconnectionToolBuilder name(java.lang.String value) { this.getTargetEdgeEndReconnectionTool().setName(value); return this; } + /** + * Setter for PreconditionExpression. + * + * @generated + */ + public TargetEdgeEndReconnectionToolBuilder preconditionExpression(java.lang.String value) { + this.getTargetEdgeEndReconnectionTool().setPreconditionExpression(value); + return this; + } + /** * Setter for Body. * diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/ToolBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/ToolBuilder.java index 92d53ce742..d4e7b3d64c 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/ToolBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/ToolBuilder.java @@ -35,6 +35,16 @@ public ToolBuilder name(java.lang.String value) { this.getTool().setName(value); return this; } + /** + * Setter for PreconditionExpression. + * + * @generated + */ + public ToolBuilder preconditionExpression(java.lang.String value) { + this.getTool().setPreconditionExpression(value); + return this; + } + /** * Setter for Body. * diff --git a/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/ToolItemProvider.java b/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/ToolItemProvider.java index bb011c399f..30f2ab97ac 100644 --- a/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/ToolItemProvider.java +++ b/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/ToolItemProvider.java @@ -61,6 +61,7 @@ public List getPropertyDescriptors(Object object) { super.getPropertyDescriptors(object); this.addNamePropertyDescriptor(object); + this.addPreconditionExpressionPropertyDescriptor(object); } return this.itemPropertyDescriptors; } @@ -76,6 +77,18 @@ protected void addNamePropertyDescriptor(Object object) { false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null)); } + /** + * This adds a property descriptor for the Precondition Expression feature. + * + * @generated + */ + protected void addPreconditionExpressionPropertyDescriptor(Object object) { + this.itemPropertyDescriptors.add(this.createItemPropertyDescriptor(((ComposeableAdapterFactory) this.adapterFactory).getRootAdapterFactory(), this.getResourceLocator(), + this.getString("_UI_Tool_preconditionExpression_feature"), this.getString("_UI_PropertyDescriptor_description", "_UI_Tool_preconditionExpression_feature", "_UI_Tool_type"), + DiagramPackage.Literals.TOOL__PRECONDITION_EXPRESSION, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null)); + } + /** * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or @@ -140,6 +153,7 @@ public void notifyChanged(Notification notification) { switch (notification.getFeatureID(Tool.class)) { case DiagramPackage.TOOL__NAME: + case DiagramPackage.TOOL__PRECONDITION_EXPRESSION: this.fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true)); return; case DiagramPackage.TOOL__BODY: diff --git a/packages/view/backend/sirius-components-view-diagram-edit/src/main/resources/plugin.properties b/packages/view/backend/sirius-components-view-diagram-edit/src/main/resources/plugin.properties index cf8c74c66b..ba351f4850 100644 --- a/packages/view/backend/sirius-components-view-diagram-edit/src/main/resources/plugin.properties +++ b/packages/view/backend/sirius-components-view-diagram-edit/src/main/resources/plugin.properties @@ -119,6 +119,7 @@ _UI_EdgePalette_nodeTools_feature = Node Tools _UI_EdgePalette_edgeReconnectionTools_feature = Edge Reconnection Tools _UI_EdgePalette_toolSections_feature = Tool Sections _UI_Tool_name_feature = Name +_UI_Tool_preconditionExpression_feature = Precondition Expression _UI_Tool_body_feature = Body _UI_EdgeTool_targetElementDescriptions_feature = Target Element Descriptions _UI_LabelEditTool_initialDirectEditLabelExpression_feature = Initial Direct Edit Label Expression diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/DiagramPackage.java b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/DiagramPackage.java index ff83847dc1..72919629ec 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/DiagramPackage.java +++ b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/DiagramPackage.java @@ -1866,6 +1866,15 @@ public interface DiagramPackage extends EPackage { */ int TOOL__NAME = 0; + /** + * The feature id for the 'Precondition Expression' attribute. + * + * @generated + * @ordered + */ + int TOOL__PRECONDITION_EXPRESSION = 1; + /** * The feature id for the 'Body' containment reference list. @@ -1873,7 +1882,7 @@ public interface DiagramPackage extends EPackage { * @generated * @ordered */ - int TOOL__BODY = 1; + int TOOL__BODY = 2; /** * The number of structural features of the 'Tool' class. @@ -1881,7 +1890,7 @@ public interface DiagramPackage extends EPackage { * @generated * @ordered */ - int TOOL_FEATURE_COUNT = 2; + int TOOL_FEATURE_COUNT = 3; /** * The number of operations of the 'Tool' class. @@ -1909,6 +1918,15 @@ public interface DiagramPackage extends EPackage { */ int DELETE_TOOL__NAME = TOOL__NAME; + /** + * The feature id for the 'Precondition Expression' attribute. + * + * @generated + * @ordered + */ + int DELETE_TOOL__PRECONDITION_EXPRESSION = TOOL__PRECONDITION_EXPRESSION; + /** * The feature id for the 'Body' containment reference list. @@ -1953,6 +1971,15 @@ public interface DiagramPackage extends EPackage { */ int DROP_TOOL__NAME = TOOL__NAME; + /** + * The feature id for the 'Precondition Expression' attribute. + * + * @generated + * @ordered + */ + int DROP_TOOL__PRECONDITION_EXPRESSION = TOOL__PRECONDITION_EXPRESSION; + /** * The feature id for the 'Body' containment reference list. @@ -1997,6 +2024,15 @@ public interface DiagramPackage extends EPackage { */ int EDGE_TOOL__NAME = TOOL__NAME; + /** + * The feature id for the 'Precondition Expression' attribute. + * + * @generated + * @ordered + */ + int EDGE_TOOL__PRECONDITION_EXPRESSION = TOOL__PRECONDITION_EXPRESSION; + /** * The feature id for the 'Body' containment reference list. @@ -2050,6 +2086,15 @@ public interface DiagramPackage extends EPackage { */ int EDGE_RECONNECTION_TOOL__NAME = TOOL__NAME; + /** + * The feature id for the 'Precondition Expression' attribute. + * + * @generated + * @ordered + */ + int EDGE_RECONNECTION_TOOL__PRECONDITION_EXPRESSION = TOOL__PRECONDITION_EXPRESSION; + /** * The feature id for the 'Body' containment reference list. @@ -2095,6 +2140,15 @@ public interface DiagramPackage extends EPackage { */ int LABEL_EDIT_TOOL__NAME = TOOL__NAME; + /** + * The feature id for the 'Precondition Expression' attribute. + * + * @generated + * @ordered + */ + int LABEL_EDIT_TOOL__PRECONDITION_EXPRESSION = TOOL__PRECONDITION_EXPRESSION; + /** * The feature id for the 'Body' containment reference list. @@ -2148,6 +2202,15 @@ public interface DiagramPackage extends EPackage { */ int NODE_TOOL__NAME = TOOL__NAME; + /** + * The feature id for the 'Precondition Expression' attribute. + * + * @generated + * @ordered + */ + int NODE_TOOL__PRECONDITION_EXPRESSION = TOOL__PRECONDITION_EXPRESSION; + /** * The feature id for the 'Body' containment reference list. @@ -2202,6 +2265,15 @@ public interface DiagramPackage extends EPackage { */ int SOURCE_EDGE_END_RECONNECTION_TOOL__NAME = EDGE_RECONNECTION_TOOL__NAME; + /** + * The feature id for the 'Precondition Expression' attribute. + * + * @generated + * @ordered + */ + int SOURCE_EDGE_END_RECONNECTION_TOOL__PRECONDITION_EXPRESSION = EDGE_RECONNECTION_TOOL__PRECONDITION_EXPRESSION; + /** * The feature id for the 'Body' containment reference list. @@ -2248,6 +2320,15 @@ public interface DiagramPackage extends EPackage { */ int TARGET_EDGE_END_RECONNECTION_TOOL__NAME = EDGE_RECONNECTION_TOOL__NAME; + /** + * The feature id for the 'Precondition Expression' attribute. + * + * @generated + * @ordered + */ + int TARGET_EDGE_END_RECONNECTION_TOOL__PRECONDITION_EXPRESSION = EDGE_RECONNECTION_TOOL__PRECONDITION_EXPRESSION; + /** * The feature id for the 'Body' containment reference list. @@ -3628,6 +3709,18 @@ public interface DiagramPackage extends EPackage { */ EAttribute getTool_Name(); + /** + * Returns the meta object for the attribute + * '{@link org.eclipse.sirius.components.view.diagram.Tool#getPreconditionExpression Precondition + * Expression}'. + * + * @return the meta object for the attribute 'Precondition Expression'. + * @see org.eclipse.sirius.components.view.diagram.Tool#getPreconditionExpression() + * @see #getTool() + * @generated + */ + EAttribute getTool_PreconditionExpression(); + /** * Returns the meta object for the containment reference list * '{@link org.eclipse.sirius.components.view.diagram.Tool#getBody Body}'. + * + * @generated + */ + EAttribute TOOL__PRECONDITION_EXPRESSION = eINSTANCE.getTool_PreconditionExpression(); + /** * The meta object literal for the 'Body' containment reference list feature. diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/Tool.java b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/Tool.java index a5cacef38e..5a0dbb0523 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/Tool.java +++ b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/Tool.java @@ -24,6 +24,8 @@ *

*
    *
  • {@link org.eclipse.sirius.components.view.diagram.Tool#getName Name}
  • + *
  • {@link org.eclipse.sirius.components.view.diagram.Tool#getPreconditionExpression Precondition + * Expression}
  • *
  • {@link org.eclipse.sirius.components.view.diagram.Tool#getBody Body}
  • *
* @@ -55,6 +57,29 @@ public interface Tool extends EObject { */ void setName(String value); + /** + * Returns the value of the 'Precondition Expression' attribute. + * + * @return the value of the 'Precondition Expression' attribute. + * @see #setPreconditionExpression(String) + * @see org.eclipse.sirius.components.view.diagram.DiagramPackage#getTool_PreconditionExpression() + * @model dataType="org.eclipse.sirius.components.view.InterpretedExpression" + * @generated + */ + String getPreconditionExpression(); + + /** + * Sets the value of the '{@link org.eclipse.sirius.components.view.diagram.Tool#getPreconditionExpression + * Precondition Expression}' attribute. + * + * @param value + * the new value of the 'Precondition Expression' attribute. + * @see #getPreconditionExpression() + * @generated + */ + void setPreconditionExpression(String value); + /** * Returns the value of the 'Body' containment reference list. The list contents are of type * {@link org.eclipse.sirius.components.view.Operation}. diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/DiagramPackageImpl.java b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/DiagramPackageImpl.java index 130a2af9fa..c550101983 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/DiagramPackageImpl.java +++ b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/DiagramPackageImpl.java @@ -1242,6 +1242,16 @@ public EAttribute getTool_Name() { return (EAttribute) this.toolEClass.getEStructuralFeatures().get(0); } + /** + * + * + * @generated + */ + @Override + public EAttribute getTool_PreconditionExpression() { + return (EAttribute) this.toolEClass.getEStructuralFeatures().get(1); + } + /** * * @@ -1249,7 +1259,7 @@ public EAttribute getTool_Name() { */ @Override public EReference getTool_Body() { - return (EReference) this.toolEClass.getEStructuralFeatures().get(1); + return (EReference) this.toolEClass.getEStructuralFeatures().get(2); } /** @@ -1743,6 +1753,7 @@ public void createPackageContents() { this.toolEClass = this.createEClass(TOOL); this.createEAttribute(this.toolEClass, TOOL__NAME); + this.createEAttribute(this.toolEClass, TOOL__PRECONDITION_EXPRESSION); this.createEReference(this.toolEClass, TOOL__BODY); this.deleteToolEClass = this.createEClass(DELETE_TOOL); @@ -2027,6 +2038,8 @@ public void initializePackageContents() { this.initEClass(this.toolEClass, Tool.class, "Tool", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); this.initEAttribute(this.getTool_Name(), theViewPackage.getIdentifier(), "name", "Tool", 1, 1, Tool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + this.initEAttribute(this.getTool_PreconditionExpression(), theViewPackage.getInterpretedExpression(), "preconditionExpression", null, 0, 1, Tool.class, !IS_TRANSIENT, !IS_VOLATILE, + IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); this.initEReference(this.getTool_Body(), theViewPackage.getOperation(), null, "body", null, 0, -1, Tool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/ToolImpl.java b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/ToolImpl.java index b01cef3397..08273ddc31 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/ToolImpl.java +++ b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/ToolImpl.java @@ -34,6 +34,8 @@ *

*
    *
  • {@link org.eclipse.sirius.components.view.diagram.impl.ToolImpl#getName Name}
  • + *
  • {@link org.eclipse.sirius.components.view.diagram.impl.ToolImpl#getPreconditionExpression Precondition + * Expression}
  • *
  • {@link org.eclipse.sirius.components.view.diagram.impl.ToolImpl#getBody Body}
  • *
* @@ -60,6 +62,26 @@ public abstract class ToolImpl extends MinimalEObjectImpl.Container implements T */ protected String name = NAME_EDEFAULT; + /** + * The default value of the '{@link #getPreconditionExpression() Precondition Expression}' attribute. + * + * @see #getPreconditionExpression() + * @generated + * @ordered + */ + protected static final String PRECONDITION_EXPRESSION_EDEFAULT = null; + + /** + * The cached value of the '{@link #getPreconditionExpression() Precondition Expression}' attribute. + * + * @see #getPreconditionExpression() + * @generated + * @ordered + */ + protected String preconditionExpression = PRECONDITION_EXPRESSION_EDEFAULT; + /** * The cached value of the '{@link #getBody() Body}' containment reference list. * @@ -112,6 +134,29 @@ public void setName(String newName) { this.eNotify(new ENotificationImpl(this, Notification.SET, DiagramPackage.TOOL__NAME, oldName, this.name)); } + /** + * + * + * @generated + */ + @Override + public String getPreconditionExpression() { + return this.preconditionExpression; + } + + /** + * + * + * @generated + */ + @Override + public void setPreconditionExpression(String newPreconditionExpression) { + String oldPreconditionExpression = this.preconditionExpression; + this.preconditionExpression = newPreconditionExpression; + if (this.eNotificationRequired()) + this.eNotify(new ENotificationImpl(this, Notification.SET, DiagramPackage.TOOL__PRECONDITION_EXPRESSION, oldPreconditionExpression, this.preconditionExpression)); + } + /** * * @@ -149,6 +194,8 @@ public Object eGet(int featureID, boolean resolve, boolean coreType) { switch (featureID) { case DiagramPackage.TOOL__NAME: return this.getName(); + case DiagramPackage.TOOL__PRECONDITION_EXPRESSION: + return this.getPreconditionExpression(); case DiagramPackage.TOOL__BODY: return this.getBody(); } @@ -167,6 +214,9 @@ public void eSet(int featureID, Object newValue) { case DiagramPackage.TOOL__NAME: this.setName((String) newValue); return; + case DiagramPackage.TOOL__PRECONDITION_EXPRESSION: + this.setPreconditionExpression((String) newValue); + return; case DiagramPackage.TOOL__BODY: this.getBody().clear(); this.getBody().addAll((Collection) newValue); @@ -186,6 +236,9 @@ public void eUnset(int featureID) { case DiagramPackage.TOOL__NAME: this.setName(NAME_EDEFAULT); return; + case DiagramPackage.TOOL__PRECONDITION_EXPRESSION: + this.setPreconditionExpression(PRECONDITION_EXPRESSION_EDEFAULT); + return; case DiagramPackage.TOOL__BODY: this.getBody().clear(); return; @@ -203,6 +256,8 @@ public boolean eIsSet(int featureID) { switch (featureID) { case DiagramPackage.TOOL__NAME: return NAME_EDEFAULT == null ? this.name != null : !NAME_EDEFAULT.equals(this.name); + case DiagramPackage.TOOL__PRECONDITION_EXPRESSION: + return PRECONDITION_EXPRESSION_EDEFAULT == null ? this.preconditionExpression != null : !PRECONDITION_EXPRESSION_EDEFAULT.equals(this.preconditionExpression); case DiagramPackage.TOOL__BODY: return this.body != null && !this.body.isEmpty(); } @@ -222,6 +277,8 @@ public String toString() { StringBuilder result = new StringBuilder(super.toString()); result.append(" (name: "); result.append(this.name); + result.append(", preconditionExpression: "); + result.append(this.preconditionExpression); result.append(')'); return result.toString(); } diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.ecore b/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.ecore index 84f72ce4b4..8d5235f508 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.ecore +++ b/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.ecore @@ -196,6 +196,8 @@ + diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.genmodel b/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.genmodel index 166d9d1b55..572ac29f0f 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.genmodel +++ b/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.genmodel @@ -146,6 +146,7 @@ + diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewReconnectionToolsExecutorParameters.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewPaletteToolsConfiguration.java similarity index 85% rename from packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewReconnectionToolsExecutorParameters.java rename to packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewPaletteToolsConfiguration.java index 6246d08242..eb17a09986 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewReconnectionToolsExecutorParameters.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/configuration/ViewPaletteToolsConfiguration.java @@ -18,15 +18,15 @@ import org.eclipse.sirius.components.core.api.IURLParser; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionPredicate; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionSearchService; -import org.springframework.stereotype.Service; +import org.springframework.context.annotation.Configuration; /** * Bundles the common dependencies that view tool services need into a single object for convenience. * * @author frouene */ -@Service -public class ViewReconnectionToolsExecutorParameters { +@Configuration +public class ViewPaletteToolsConfiguration { private final IURLParser urlParser; @@ -36,7 +36,7 @@ public class ViewReconnectionToolsExecutorParameters { private final IObjectService objectService; - public ViewReconnectionToolsExecutorParameters(IURLParser urlParser, IViewRepresentationDescriptionPredicate viewRepresentationDescriptionPredicate, IViewRepresentationDescriptionSearchService viewRepresentationDescriptionSearchService, IObjectService objectService) { + public ViewPaletteToolsConfiguration(IURLParser urlParser, IViewRepresentationDescriptionPredicate viewRepresentationDescriptionPredicate, IViewRepresentationDescriptionSearchService viewRepresentationDescriptionSearchService, IObjectService objectService) { this.urlParser = Objects.requireNonNull(urlParser); this.viewRepresentationDescriptionPredicate = Objects.requireNonNull(viewRepresentationDescriptionPredicate); this.viewRepresentationDescriptionSearchService = Objects.requireNonNull(viewRepresentationDescriptionSearchService); diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewPaletteProvider.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewPaletteProvider.java index 5082a83b69..80ff85da0b 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewPaletteProvider.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewPaletteProvider.java @@ -20,6 +20,7 @@ import java.util.function.Function; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.sirius.components.collaborative.diagrams.api.DiagramImageConstants; import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramDescriptionService; @@ -30,6 +31,7 @@ import org.eclipse.sirius.components.collaborative.diagrams.dto.SingleClickOnTwoDiagramElementsCandidate; import org.eclipse.sirius.components.collaborative.diagrams.dto.SingleClickOnTwoDiagramElementsTool; import org.eclipse.sirius.components.collaborative.diagrams.dto.ToolSection; +import org.eclipse.sirius.components.core.api.IEditingContext; import org.eclipse.sirius.components.core.api.IObjectService; import org.eclipse.sirius.components.core.api.IURLParser; import org.eclipse.sirius.components.diagrams.Diagram; @@ -41,13 +43,27 @@ import org.eclipse.sirius.components.diagrams.description.IDiagramElementDescription; import org.eclipse.sirius.components.diagrams.description.NodeDescription; import org.eclipse.sirius.components.diagrams.description.SynchronizationPolicy; +import org.eclipse.sirius.components.emf.services.EditingContext; +import org.eclipse.sirius.components.interpreter.AQLInterpreter; +import org.eclipse.sirius.components.interpreter.Result; +import org.eclipse.sirius.components.interpreter.Status; +import org.eclipse.sirius.components.representations.VariableManager; +import org.eclipse.sirius.components.view.View; import org.eclipse.sirius.components.view.diagram.DiagramToolSection; import org.eclipse.sirius.components.view.diagram.EdgeTool; import org.eclipse.sirius.components.view.diagram.EdgeToolSection; import org.eclipse.sirius.components.view.diagram.NodeTool; import org.eclipse.sirius.components.view.diagram.NodeToolSection; +import org.eclipse.sirius.components.view.diagram.Tool; +import org.eclipse.sirius.components.view.emf.IJavaServiceProvider; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionPredicate; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionSearchService; +import org.eclipse.sirius.components.view.emf.configuration.ViewPaletteToolsConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; /** @@ -69,6 +85,8 @@ @Service public class ViewPaletteProvider implements IPaletteProvider { + private final Logger logger = LoggerFactory.getLogger(ViewPaletteProvider.class); + private final IURLParser urlParser; private final IViewRepresentationDescriptionPredicate viewRepresentationDescriptionPredicate; @@ -81,15 +99,21 @@ public class ViewPaletteProvider implements IPaletteProvider { private final IObjectService objectService; + private final List javaServiceProviders; + + private final ApplicationContext applicationContext; + private final Function idProvider = (eObject) -> UUID.nameUUIDFromBytes(EcoreUtil.getURI(eObject).toString().getBytes()); - public ViewPaletteProvider(IURLParser urlParser, IViewRepresentationDescriptionPredicate viewRepresentationDescriptionPredicate, IViewRepresentationDescriptionSearchService viewRepresentationDescriptionSearchService, IDiagramDescriptionService diagramDescriptionService, IDiagramIdProvider diagramIdProvider, IObjectService objectService) { - this.urlParser = Objects.requireNonNull(urlParser); - this.viewRepresentationDescriptionPredicate = Objects.requireNonNull(viewRepresentationDescriptionPredicate); - this.viewRepresentationDescriptionSearchService = Objects.requireNonNull(viewRepresentationDescriptionSearchService); + public ViewPaletteProvider(ViewPaletteToolsConfiguration parameters, IDiagramDescriptionService diagramDescriptionService, IDiagramIdProvider diagramIdProvider, List javaServiceProviders, ApplicationContext applicationContext) { + this.urlParser = Objects.requireNonNull(parameters.getUrlParser()); + this.viewRepresentationDescriptionPredicate = Objects.requireNonNull(parameters.getViewRepresentationDescriptionPredicate()); + this.viewRepresentationDescriptionSearchService = Objects.requireNonNull(parameters.getViewRepresentationDescriptionSearchService()); this.diagramDescriptionService = Objects.requireNonNull(diagramDescriptionService); this.diagramIdProvider = Objects.requireNonNull(diagramIdProvider); - this.objectService = Objects.requireNonNull(objectService); + this.objectService = Objects.requireNonNull(parameters.getObjectService()); + this.javaServiceProviders = Objects.requireNonNull(javaServiceProviders); + this.applicationContext = Objects.requireNonNull(applicationContext); } @Override @@ -98,43 +122,50 @@ public boolean canHandle(DiagramDescription diagramDescription) { } @Override - public Palette handle(Object targetElement, Object diagramElement, Object diagramElementDescription, DiagramDescription diagramDescription) { + public Palette handle(Object targetElement, Object diagramElement, Object diagramElementDescription, DiagramDescription diagramDescription, IEditingContext editingContext) { Palette palette = null; - - if (diagramElement instanceof Diagram) { - palette = this.getDiagramPalette(diagramDescription); - } else if (diagramElement instanceof Node && diagramElementDescription instanceof NodeDescription nodeDescription) { - palette = this.getNodePalette(diagramDescription, nodeDescription, this.createExtraToolSections(diagramElementDescription, diagramElement)); - } else if (diagramElement instanceof Edge && diagramElementDescription instanceof EdgeDescription edgeDescription) { - palette = this.getEdgePalette(edgeDescription, this.createExtraToolSections(diagramElementDescription, diagramElement)); + VariableManager variableManager = new VariableManager(); + variableManager.put(VariableManager.SELF, targetElement); + var optionalDiagramDescription = this.viewRepresentationDescriptionSearchService.findById(diagramDescription.getId()) + .filter(org.eclipse.sirius.components.view.diagram.DiagramDescription.class::isInstance) + .map(org.eclipse.sirius.components.view.diagram.DiagramDescription.class::cast); + if (optionalDiagramDescription.isPresent()) { + org.eclipse.sirius.components.view.diagram.DiagramDescription viewDiagramDescription = optionalDiagramDescription.get(); + var interpreter = this.createInterpreter((View) viewDiagramDescription.eContainer(), editingContext); + if (diagramElement instanceof Diagram) { + palette = this.getDiagramPalette(diagramDescription, viewDiagramDescription, variableManager, interpreter); + } else if (diagramElement instanceof Node && diagramElementDescription instanceof NodeDescription nodeDescription) { + variableManager.put(Node.SELECTED_NODE, diagramElement); + palette = this.getNodePalette(diagramDescription, nodeDescription, this.createExtraToolSections(diagramElementDescription, diagramElement), variableManager, interpreter); + } else if (diagramElement instanceof Edge && diagramElementDescription instanceof EdgeDescription edgeDescription) { + variableManager.put(Edge.SELECTED_EDGE, diagramElement); + palette = this.getEdgePalette(edgeDescription, this.createExtraToolSections(diagramElementDescription, diagramElement), variableManager, interpreter); + } } - return palette; } - protected Palette getDiagramPalette(DiagramDescription diagramDescription) { + protected Palette getDiagramPalette(DiagramDescription diagramDescription, org.eclipse.sirius.components.view.diagram.DiagramDescription viewDiagramDescription, VariableManager variableManager, AQLInterpreter interpreter) { Palette diagramPalette = null; var toolFinder = new ToolFinder(); Optional sourceElementId = this.getSourceElementId(diagramDescription.getId()); if (sourceElementId.isPresent()) { String diagramPaletteId = "siriusComponents://diagramPalette?diagramId=" + sourceElementId.get(); - var optionalDiagramDescription = this.viewRepresentationDescriptionSearchService.findById(diagramDescription.getId()) - .filter(org.eclipse.sirius.components.view.diagram.DiagramDescription.class::isInstance) - .map(org.eclipse.sirius.components.view.diagram.DiagramDescription.class::cast); - - if (optionalDiagramDescription.isPresent()) { - org.eclipse.sirius.components.view.diagram.DiagramDescription viewDiagramDescription = optionalDiagramDescription.get(); - diagramPalette = Palette.newPalette(diagramPaletteId) - .tools(toolFinder.findNodeTools(viewDiagramDescription).stream().map(this::createDiagramRootNodeTool).toList()) - .toolSections(toolFinder.findToolSections(viewDiagramDescription).stream().map(this::createToolSection).toList()) - .build(); - } + diagramPalette = Palette.newPalette(diagramPaletteId) + .tools(toolFinder.findNodeTools(viewDiagramDescription).stream() + .filter(tool -> this.checkPrecondition(tool, variableManager, interpreter)) + .map(this::createDiagramRootNodeTool) + .toList()) + .toolSections(toolFinder.findToolSections(viewDiagramDescription).stream() + .map(toolSection -> this.createToolSection(toolSection, variableManager, interpreter)) + .toList()) + .build(); } return diagramPalette; } - private ToolSection createToolSection(DiagramToolSection toolSection) { + private ToolSection createToolSection(DiagramToolSection toolSection, VariableManager variableManager, AQLInterpreter interpreter) { String toolSelectionId = this.idProvider.apply(toolSection).toString(); return ToolSection.newToolSection(toolSelectionId) @@ -167,7 +198,7 @@ private ITool createNodeTool(NodeTool viewNodeTool, boolean appliesToDiagramRoot .build(); } - protected Palette getNodePalette(DiagramDescription diagramDescription, NodeDescription nodeDescription, List extraToolSections) { + protected Palette getNodePalette(DiagramDescription diagramDescription, NodeDescription nodeDescription, List extraToolSections, VariableManager variableManager, AQLInterpreter interpreter) { Optional sourceElementId = this.getSourceElementId(nodeDescription.getId()); Palette nodePalette = null; var toolFinder = new ToolFinder(); @@ -178,14 +209,16 @@ protected Palette getNodePalette(DiagramDescription diagramDescription, NodeDesc org.eclipse.sirius.components.view.diagram.NodeDescription viewNodeDescription = optionalNodeDescription.get(); var tools = new ArrayList(); tools.addAll(toolFinder.findNodeTools(viewNodeDescription).stream() + .filter(tool -> this.checkPrecondition(tool, variableManager, interpreter)) .map(this::createNodeTool) .toList()); tools.addAll(toolFinder.findEdgeTools(viewNodeDescription).stream() + .filter(tool -> this.checkPrecondition(tool, variableManager, interpreter)) .map(viewEdgeTools -> this.createEdgeTool(viewEdgeTools, diagramDescription, nodeDescription)) .toList()); var toolSections = new ArrayList(); toolSections.addAll(toolFinder.findToolSections(viewNodeDescription).stream() - .map(nodeToolSection -> this.createToolSection(nodeToolSection, diagramDescription, nodeDescription)) + .map(nodeToolSection -> this.createToolSection(nodeToolSection, diagramDescription, nodeDescription, variableManager, interpreter)) .toList()); toolSections.addAll(extraToolSections); nodePalette = Palette.newPalette(nodePaletteId) @@ -197,12 +230,18 @@ protected Palette getNodePalette(DiagramDescription diagramDescription, NodeDesc return nodePalette; } - private ToolSection createToolSection(NodeToolSection toolSection, DiagramDescription diagramDescription, NodeDescription nodeDescription) { + private ToolSection createToolSection(NodeToolSection toolSection, DiagramDescription diagramDescription, NodeDescription nodeDescription, VariableManager variableManager, AQLInterpreter interpreter) { String toolSelectionId = this.idProvider.apply(toolSection).toString(); var tools = new ArrayList(); - tools.addAll(toolSection.getNodeTools().stream().map(this::createNodeTool).toList()); - tools.addAll(toolSection.getEdgeTools().stream().map(viewEdgeTools -> this.createEdgeTool(viewEdgeTools, diagramDescription, nodeDescription)).toList()); + tools.addAll(toolSection.getNodeTools().stream() + .filter(tool -> this.checkPrecondition(tool, variableManager, interpreter)) + .map(this::createNodeTool) + .toList()); + tools.addAll(toolSection.getEdgeTools().stream() + .filter(tool -> this.checkPrecondition(tool, variableManager, interpreter)) + .map(viewEdgeTools -> this.createEdgeTool(viewEdgeTools, diagramDescription, nodeDescription)) + .toList()); return ToolSection.newToolSection(toolSelectionId) .label(toolSection.getName()) @@ -227,7 +266,7 @@ private ITool createEdgeTool(EdgeTool viewEdgeTool, DiagramDescription diagramDe .build(); } - protected Palette getEdgePalette(EdgeDescription edgeDescription, List extraToolSections) { + protected Palette getEdgePalette(EdgeDescription edgeDescription, List extraToolSections, VariableManager variableManager, AQLInterpreter interpreter) { Palette edgePalette = null; var toolFinder = new ToolFinder(); Optional optionalSourceElementId = this.getSourceElementId(edgeDescription.getId()); @@ -239,7 +278,9 @@ protected Palette getEdgePalette(EdgeDescription edgeDescription, List(); - toolSections.addAll(toolFinder.findToolSections(viewEdgeDescription).stream().map(this::createToolSection).toList()); + toolSections.addAll(toolFinder.findToolSections(viewEdgeDescription).stream() + .map(edgeToolSection -> this.createToolSection(edgeToolSection, variableManager, interpreter)) + .toList()); toolSections.addAll(extraToolSections); edgePalette = Palette.newPalette(edgePaletteId) .tools(toolFinder.findNodeTools(viewEdgeDescription).stream().map(this::createNodeTool).toList()) @@ -251,13 +292,16 @@ protected Palette getEdgePalette(EdgeDescription edgeDescription, List this.checkPrecondition(tool, variableManager, interpreter)) + .map(this::createNodeTool) + .toList()) .build(); } @@ -418,4 +462,44 @@ private boolean hasDeleteTool(Object diagramElementDescription) { } return result; } + + private AQLInterpreter createInterpreter(View view, IEditingContext editingContext) { + List visibleEPackages = this.getAccessibleEPackages(editingContext); + AutowireCapableBeanFactory beanFactory = this.applicationContext.getAutowireCapableBeanFactory(); + List serviceInstances = this.javaServiceProviders.stream() + .flatMap(provider -> provider.getServiceClasses(view).stream()) + .map(serviceClass -> { + try { + return beanFactory.createBean(serviceClass); + } catch (BeansException beansException) { + this.logger.warn("Error while trying to instantiate Java service class " + serviceClass.getName(), beansException); + return null; + } + }) + .filter(Objects::nonNull) + .map(Object.class::cast) + .toList(); + return new AQLInterpreter(List.of(), serviceInstances, visibleEPackages); + } + + private List getAccessibleEPackages(IEditingContext editingContext) { + if (editingContext instanceof EditingContext) { + EPackage.Registry packageRegistry = ((EditingContext) editingContext).getDomain().getResourceSet().getPackageRegistry(); + return packageRegistry.values().stream() + .filter(EPackage.class::isInstance) + .map(EPackage.class::cast) + .toList(); + } else { + return List.of(); + } + } + + private boolean checkPrecondition(Tool tool, VariableManager variableManager, AQLInterpreter interpreter) { + String precondition = tool.getPreconditionExpression(); + if (precondition != null && !precondition.isBlank()) { + Result result = interpreter.evaluateExpression(variableManager.getVariables(), precondition); + return result.getStatus().compareTo(Status.WARNING) <= 0 && result.asBoolean().orElse(Boolean.FALSE); + } + return true; + } } diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewReconnectionToolsExecutor.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewReconnectionToolsExecutor.java index d7ec8a745a..cf48498626 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewReconnectionToolsExecutor.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewReconnectionToolsExecutor.java @@ -38,7 +38,7 @@ import org.eclipse.sirius.components.view.emf.IJavaServiceProvider; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionPredicate; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionSearchService; -import org.eclipse.sirius.components.view.emf.configuration.ViewReconnectionToolsExecutorParameters; +import org.eclipse.sirius.components.view.emf.configuration.ViewPaletteToolsConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; @@ -70,8 +70,8 @@ public class ViewReconnectionToolsExecutor implements IReconnectionToolsExecutor private final Logger logger = LoggerFactory.getLogger(ViewReconnectionToolsExecutor.class); - public ViewReconnectionToolsExecutor(ViewReconnectionToolsExecutorParameters parameters, IEditService editService, List javaServiceProviders, - ApplicationContext applicationContext, IFeedbackMessageService feedbackMessageService) { + public ViewReconnectionToolsExecutor(ViewPaletteToolsConfiguration parameters, IEditService editService, List javaServiceProviders, + ApplicationContext applicationContext, IFeedbackMessageService feedbackMessageService) { this.objectService = Objects.requireNonNull(parameters.getObjectService()); this.editService = Objects.requireNonNull(editService); this.viewRepresentationDescriptionSearchService = Objects.requireNonNull(parameters.getViewRepresentationDescriptionSearchService()); diff --git a/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/diagram/ViewPaletteProviderTests.java b/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/diagram/ViewPaletteProviderTests.java index 756362729a..dc754dbe3e 100644 --- a/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/diagram/ViewPaletteProviderTests.java +++ b/packages/view/backend/sirius-components-view-emf/src/test/java/org/eclipse/sirius/components/view/emf/diagram/ViewPaletteProviderTests.java @@ -18,6 +18,7 @@ import java.util.Map; import java.util.Optional; +import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramDescriptionService; import org.eclipse.sirius.components.collaborative.diagrams.dto.SingleClickOnDiagramElementTool; import org.eclipse.sirius.components.collaborative.diagrams.dto.SingleClickOnTwoDiagramElementsTool; @@ -29,8 +30,10 @@ import org.eclipse.sirius.components.diagrams.description.LabelDescription; import org.eclipse.sirius.components.diagrams.description.LabelStyleDescription; import org.eclipse.sirius.components.diagrams.description.NodeDescription; +import org.eclipse.sirius.components.interpreter.AQLInterpreter; import org.eclipse.sirius.components.representations.Failure; import org.eclipse.sirius.components.representations.Success; +import org.eclipse.sirius.components.representations.VariableManager; import org.eclipse.sirius.components.view.RepresentationDescription; import org.eclipse.sirius.components.view.diagram.DiagramFactory; import org.eclipse.sirius.components.view.diagram.DiagramPalette; @@ -43,7 +46,9 @@ import org.eclipse.sirius.components.view.diagram.NodeTool; import org.eclipse.sirius.components.view.diagram.NodeToolSection; import org.eclipse.sirius.components.view.emf.IViewRepresentationDescriptionSearchService; +import org.eclipse.sirius.components.view.emf.configuration.ViewPaletteToolsConfiguration; import org.junit.jupiter.api.Test; +import org.springframework.context.support.StaticApplicationContext; /** * Unit tests of the ViewPaletteProvider. @@ -101,7 +106,9 @@ public void getDiagramPaletteTest() { DiagramDescription diagramDescription = this.createDiagramDescription(); - var result = viewPaletteProvider.getDiagramPalette(diagramDescription); + VariableManager variableManager = new VariableManager(); + AQLInterpreter interpreter = new AQLInterpreter(List.of(), List.of(EcorePackage.eINSTANCE)); + var result = viewPaletteProvider.getDiagramPalette(diagramDescription, getDiagramDescription(), variableManager, interpreter); assertThat(result).isNotNull(); assertThat(result.id()).isEqualTo("siriusComponents://diagramPalette?diagramId=sourceElementId"); @@ -118,7 +125,9 @@ public void getDiagramPaletteTest() { public void getNodePaletteTest() { ViewPaletteProvider viewPaletteProvider = this.createViewPaletteProvider(); - var result = viewPaletteProvider.getNodePalette(this.createDiagramDescription(), this.createNodeDescription(), List.of()); + VariableManager variableManager = new VariableManager(); + AQLInterpreter interpreter = new AQLInterpreter(List.of(), List.of(EcorePackage.eINSTANCE)); + var result = viewPaletteProvider.getNodePalette(this.createDiagramDescription(), this.createNodeDescription(), List.of(), variableManager, interpreter); assertThat(result).isNotNull(); assertThat(result.id()).isEqualTo("siriusComponents://nodePalette?nodeId=sourceElementId"); @@ -148,7 +157,10 @@ public void getEdgePaletteTest() { .targetObjectKindProvider(vm -> "") .targetObjectLabelProvider(vm -> "") .build(); - var result = viewPaletteProvider.getEdgePalette(edgeDescription, List.of()); + + VariableManager variableManager = new VariableManager(); + AQLInterpreter interpreter = new AQLInterpreter(List.of(), List.of(EcorePackage.eINSTANCE)); + var result = viewPaletteProvider.getEdgePalette(edgeDescription, List.of(), variableManager, interpreter); assertThat(result).isNotNull(); assertThat(result.id()).isEqualTo("siriusComponents://edgePalette?edgeId=sourceElementId"); @@ -183,10 +195,10 @@ public Optional findViewEdgeDescriptionById(String edgeDescript return Optional.of(edgeDescription); } }; - - return new ViewPaletteProvider(urlParser, iRepresentationDescription -> true, - viewRepresentationDescriptionSearchService, new IDiagramDescriptionService.NoOp(), - new IDiagramIdProvider.NoOp(), new IObjectService.NoOp()); + ViewPaletteToolsConfiguration viewPaletteToolsConfiguration = new ViewPaletteToolsConfiguration(urlParser, iRepresentationDescription -> true, + viewRepresentationDescriptionSearchService, new IObjectService.NoOp()); + return new ViewPaletteProvider(viewPaletteToolsConfiguration, new IDiagramDescriptionService.NoOp(), + new IDiagramIdProvider.NoOp(), List.of(), new StaticApplicationContext()); } private DiagramDescription createDiagramDescription() {