Skip to content

Commit d9d135b

Browse files
committed
[3647] Add support for diagram style with background customization
Bug: #3647 Signed-off-by: Florian ROUËNÉ <florian.rouene@obeosoft.com>
1 parent 84d7bb0 commit d9d135b

File tree

87 files changed

+2493
-179
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+2493
-179
lines changed

CHANGELOG.adoc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ A key binding needs to contain at least one of `Control`, `Alt`, or `Meta` to be
117117
- https://github.com/eclipse-sirius/sirius-web/issues/5982[#5982] [tree] Add the ability to trigger context menu entries using key bindings.
118118
As for diagram tools, it is now possible to add `KeyBinding` instances to context menu entries in trees.
119119
Note that for the moment, only entries that aren't overridden in the frontend can be triggered with key bindings, although it is possible to define key bindings for any entry.
120+
- https://github.com/eclipse-sirius/sirius-web/issues/3647[#3647] [diagram] Add support for diagram style with background customization
120121

121122

122123
=== Improvements
@@ -2230,7 +2231,7 @@ As a result, the following maven modules have been deleted: `sirius-web-sample-a
22302231

22312232
* The `String` attribute `org.eclipse.sirius.components.collaborative.diagrams.dto.InvokeSingleClickOnDiagramElementToolInput#selectedObjectId` has been replaced by the attribute `variables` of type `List<ToolVariable>`
22322233
- https://github.com/eclipse-sirius/sirius-web/issues/3437[#3437] [core] Migrate frontend to MUI 5, if you contributed React componenent that use MUI, you should upgrade them to use MUI 5.
2233-
- https://github.com/eclipse-sirius/sirius-web/issues/2204[#2204] [core] Added `getStyledLabel` in `IDefaultLabelService` and `IObjectService`, you must implement this method if you have custom implementation of these interface.
2234+
- https://github.com/eclipse-sirius/sirius-web/issues/2204[#2204] [core] Add `getStyledLabel` in `IDefaultLabelService` and `IObjectService`, you must implement this method if you have custom implementation of these interface.
22342235
- https://github.com/eclipse-sirius/sirius-web/issues/3815[#3815] [core] Make child creation descriptions locale independent
22352236
- https://github.com/eclipse-sirius/sirius-web/issues/3976[#3976] [core] Remove the configuration object used to create representation event processors.
22362237

@@ -2273,12 +2274,11 @@ The ids used to create a subscription is also changed, refer to [ADR-159] for mo
22732274
- https://github.com/eclipse-sirius/sirius-web/issues/3821[#3821] [sirius-web] Allow to filter resources in `RewriteProxiesEventHandler`.
22742275
Introduce new `IRewriteProxiesResourceFilter` interface, to register resource filter for `RewriteProxiesEventHandler`.
22752276
- https://github.com/eclipse-sirius/sirius-web/issues/3570[#3570] [diagram] Add max width expression in the View DSL for labels
2276-
- https://github.com/eclipse-sirius/sirius-web/issues/2204[#2204] [core] Added `getStyledLabel` in `IDefaultLabelService` and `IObjectService` that can be used to display styled string in the explorer for example.
2277+
- https://github.com/eclipse-sirius/sirius-web/issues/2204[#2204] [core] Add `getStyledLabel` in `IDefaultLabelService` and `IObjectService` that can be used to display styled string in the explorer for example.
22772278
+
22782279
image:doc/screenshots/treeItemLabelStyled.jpg[StyledString, 70%]
22792280
- https://github.com/eclipse-sirius/sirius-web/issues/3963[#3963] [core] Add support for optional GraphQLCodeRegistry post-processing/transformation.
22802281

2281-
22822282
=== Improvements
22832283

22842284
- https://github.com/eclipse-sirius/sirius-web/issues/3744[#3744] [diagram] Add support for helper lines during multi selection move
@@ -2382,8 +2382,7 @@ More existing APIs will be migrated to this new common pattern.
23822382
- https://github.com/eclipse-sirius/sirius-web/issues/3616[#3616] [diagram] Fix potential exceptions due to duplicate keys in diagram event processing
23832383
- https://github.com/eclipse-sirius/sirius-web/issues/3624[#3624] [diagram] Fix an issue where the header separator does not fill the entire width of the node
23842384
- https://github.com/eclipse-sirius/sirius-web/issues/3531[#3531] [diagram] Fix unnecessary edges label re render
2385-
- https://github.com/eclipse-sirius/sirius-web/issues/3650[#3650] [diagram] Fix potential NPE in DiagramNavigator and Node toString method
2386-
- https://github.com/eclipse-sirius/sirius-web/issues/3649[#3649] [sirius-web] Restore support for Related elements view icons
2385+
- https://github.com/eclipse-sirius/sirius-web/issues/3650[#3650] [diagram] Fix potential NPE in DiagramNavigator and Node toString method- https://github.com/eclipse-sirius/sirius-web/issues/3649[#3649] [sirius-web] Restore support for Related elements view icons
23872386
- https://github.com/eclipse-sirius/sirius-web/issues/3630[#3630] [sirius-web] Restore support for the deletion of dangling representations
23882387
- https://github.com/eclipse-sirius/sirius-web/issues/3666[#3666] [core] Enable EMF's intrinsicIDToEObjectMap for JSON resources to support languages which use modeled identifiers (e.g. SysMLv2).
23892388
- https://github.com/eclipse-sirius/sirius-web/issues/3664[#3664] [core] The Default.svg image is no longer displayed with the new architecture.

integration-tests-playwright/playwright/e2e/diagrams/diagram.spec.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,59 @@ test.describe('diagram', () => {
6666
await expect(page.locator('.react-flow__minimap')).toBeAttached();
6767
});
6868
});
69+
70+
test.describe('diagram', () => {
71+
let projectId;
72+
test.beforeEach(async ({ page, request }) => {
73+
const project = await new PlaywrightProject(request).createProject('diagram-list', 'papaya-empty');
74+
projectId = project.projectId;
75+
76+
await page.goto(`/projects/${projectId}/edit`);
77+
const playwrightExplorer = new PlaywrightExplorer(page);
78+
await playwrightExplorer.uploadDocument('diagramPapayaClassNode.xml');
79+
await playwrightExplorer.expand('diagramPapayaClassNode.xml');
80+
await playwrightExplorer.expand('Project');
81+
await playwrightExplorer.expand('Component');
82+
83+
await playwrightExplorer.createRepresentation('Component', 'Class Diagram', 'diagram');
84+
});
85+
86+
test.afterEach(async ({ request }) => {
87+
await new PlaywrightProject(request).deleteProject(projectId);
88+
});
89+
90+
test('when a diagram has a conditional style, then the style is changed after triggering the condition', async ({
91+
page,
92+
}) => {
93+
await expect(page.getByTestId('rf__wrapper')).toBeAttached();
94+
const playwrightExplorer = new PlaywrightExplorer(page);
95+
await playwrightExplorer.expand('Package');
96+
await page.waitForFunction(
97+
() => {
98+
const div = document.querySelector('[data-testid="rf__background"]');
99+
if (!div) {
100+
return false;
101+
}
102+
103+
const background = window.getComputedStyle(div).getPropertyValue('background');
104+
return background.includes('Drag and drop elements to get started');
105+
},
106+
{ timeout: 2000 }
107+
);
108+
109+
await (await playwrightExplorer.getTreeItemLabel('NewClass')).dragTo(page.getByTestId('rf__wrapper'));
110+
111+
await page.waitForFunction(
112+
() => {
113+
const div = document.querySelector('[data-testid="rf__background"]');
114+
if (!div) {
115+
return false;
116+
}
117+
118+
const background = window.getComputedStyle(div).getPropertyValue('background');
119+
return background.startsWith('rgb(255, 255, 255) none repeat scroll 0% 0% ');
120+
},
121+
{ timeout: 2000 }
122+
);
123+
});
124+
});

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/resources/schema/diagram.graphqls

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,14 @@ type Diagram implements Representation {
3434
targetObjectId: ID!
3535
nodes: [Node!]!
3636
edges: [Edge!]!
37+
style: DiagramStyle!
3738
layoutData: DiagramLayoutData!
3839
}
3940

41+
type DiagramStyle {
42+
background: String!
43+
}
44+
4045
type DiagramLayoutData {
4146
nodeLayoutData: [NodeLayoutData!]!
4247
edgeLayoutData: [EdgeLayoutData!]!

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/DiagramEventProcessorTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.eclipse.sirius.components.core.api.IPayload;
3232
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
3333
import org.eclipse.sirius.components.diagrams.Diagram;
34+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
3435
import org.eclipse.sirius.components.diagrams.InsideLabel;
3536
import org.eclipse.sirius.components.diagrams.Node;
3637
import org.junit.jupiter.api.Test;
@@ -55,6 +56,7 @@ public class DiagramEventProcessorTests {
5556
.targetObjectId("targetObjectId")
5657
.nodes(List.of(INITIAL_TEST_NODE))
5758
.edges(List.of())
59+
.style(DiagramStyle.newDiagramStyle().build())
5860
.build();
5961

6062
private final IDiagramCreationService diagramCreationService = new MockDiagramCreationService(INITIAL_TEST_DIAGRAM);

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/CreateDiagramEventHandlerTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2019, 2025 Obeo.
2+
* Copyright (c) 2019, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -33,6 +33,7 @@
3333
import org.eclipse.sirius.components.core.api.IPayload;
3434
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
3535
import org.eclipse.sirius.components.diagrams.Diagram;
36+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
3637
import org.eclipse.sirius.components.diagrams.description.DiagramDescription;
3738
import org.eclipse.sirius.components.representations.Failure;
3839
import org.eclipse.sirius.components.representations.IRepresentationDescription;
@@ -64,6 +65,7 @@ public Optional<IRepresentationDescription> findById(IEditingContext editingCont
6465
.targetObjectIdProvider(variableManager -> "targetObjectId")
6566
.dropHandler(variableManager -> new Failure(""))
6667
.iconURLsProvider(variableManager -> List.of())
68+
.styleProvider(variableManager -> DiagramStyle.newDiagramStyle().build())
6769
.build();
6870

6971
return Optional.of(diagramDescription);

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/GetConnectorToolsEventHandlerTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2022, 2025 Obeo.
2+
* Copyright (c) 2022, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -35,6 +35,7 @@
3535
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
3636
import org.eclipse.sirius.components.diagrams.CollapsingState;
3737
import org.eclipse.sirius.components.diagrams.Diagram;
38+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
3839
import org.eclipse.sirius.components.diagrams.HeaderSeparatorDisplayMode;
3940
import org.eclipse.sirius.components.diagrams.InsideLabel;
4041
import org.eclipse.sirius.components.diagrams.InsideLabelLocation;
@@ -143,6 +144,7 @@ public void testGetConnectorTools() {
143144
.edgeDescriptions(new ArrayList<>())
144145
.dropHandler(variableManager -> new Failure(""))
145146
.iconURLsProvider(variableManager -> List.of())
147+
.styleProvider(variableManager -> DiagramStyle.newDiagramStyle().build())
146148
.build();
147149

148150
Node sourceNode = this.getNode(SOURCE_NODE_ID, SOURCE_NODE_TARGET_ID);
@@ -208,6 +210,7 @@ private Diagram getDiagram(String id, List<Node> nodes) {
208210
.targetObjectId("diagramTargetObjectId")
209211
.nodes(nodes)
210212
.edges(List.of())
213+
.style(DiagramStyle.newDiagramStyle().build())
211214
.build();
212215
}
213216
}

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/GetNodeDescriptionsEventHandlerTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2024, 2025 Obeo.
2+
* Copyright (c) 2024, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -29,6 +29,7 @@
2929
import org.eclipse.sirius.components.core.api.IPayload;
3030
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
3131
import org.eclipse.sirius.components.diagrams.Diagram;
32+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
3233
import org.eclipse.sirius.components.diagrams.description.NodeDescription;
3334
import org.eclipse.sirius.components.diagrams.layoutdata.DiagramLayoutData;
3435
import org.eclipse.sirius.components.representations.IRepresentationDescription;
@@ -81,6 +82,7 @@ public Optional<IRepresentationDescription> findById(IEditingContext editingCont
8182
}
8283
return desc;
8384
}
85+
8486
@Override
8587
public Map<String, IRepresentationDescription> findAll(IEditingContext editingContext) {
8688
var descriptions = new HashMap<String, IRepresentationDescription>();
@@ -106,6 +108,7 @@ public Map<String, IRepresentationDescription> findAll(IEditingContext editingCo
106108
.layoutData(new DiagramLayoutData(Map.of(), Map.of(), Map.of()))
107109
.nodes(List.of())
108110
.targetObjectId("")
111+
.style(DiagramStyle.newDiagramStyle().build())
109112
.build();
110113

111114
handler.handle(payloadSink, changeDescriptionSink, editingContext, new DiagramContext(diagram), input);

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/TestDiagramBuilder.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2019, 2025 Obeo.
2+
* Copyright (c) 2019, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -19,6 +19,7 @@
1919
import org.eclipse.sirius.components.diagrams.ArrowStyle;
2020
import org.eclipse.sirius.components.diagrams.CollapsingState;
2121
import org.eclipse.sirius.components.diagrams.Diagram;
22+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
2223
import org.eclipse.sirius.components.diagrams.Edge;
2324
import org.eclipse.sirius.components.diagrams.EdgeStyle;
2425
import org.eclipse.sirius.components.diagrams.EdgeType;
@@ -54,6 +55,7 @@ public Diagram getDiagram(String id) {
5455
.targetObjectId("diagramTargetObjectId")
5556
.nodes(List.of())
5657
.edges(List.of())
58+
.style(DiagramStyle.newDiagramStyle().build())
5759
.build();
5860
}
5961

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/TestDiagramDescriptionBuilder.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2019, 2025 Obeo.
2+
* Copyright (c) 2019, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -18,6 +18,7 @@
1818
import java.util.function.Function;
1919

2020
import org.eclipse.sirius.components.diagrams.ArrowStyle;
21+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
2122
import org.eclipse.sirius.components.diagrams.EdgeStyle;
2223
import org.eclipse.sirius.components.diagrams.EdgeType;
2324
import org.eclipse.sirius.components.diagrams.FreeFormLayoutStrategy;
@@ -56,6 +57,7 @@ public DiagramDescription getDiagramDescription(String diagramDescriptionId, Lis
5657
.edgeDescriptions(edgeDescriptions)
5758
.dropHandler(variableManager -> new Failure(""))
5859
.iconURLsProvider(variableManager -> List.of())
60+
.styleProvider(variableManager -> DiagramStyle.newDiagramStyle().build())
5961
.build();
6062
}
6163

@@ -64,14 +66,14 @@ public EdgeDescription getEdgeDescription(String edgeDescriptionId, NodeDescript
6466
Function<VariableManager, List<Element>> targetProvider = variableManager -> List.of();
6567

6668
Function<VariableManager, EdgeStyle> edgeStyleProvider = variableManager ->
67-
EdgeStyle.newEdgeStyle()
68-
.size(2)
69-
.lineStyle(LineStyle.Dash_Dot)
70-
.sourceArrow(ArrowStyle.InputArrowWithDiamond)
71-
.targetArrow(ArrowStyle.None)
72-
.color("rgb(1, 2, 3)")
73-
.edgeType(EdgeType.Manhattan)
74-
.build();
69+
EdgeStyle.newEdgeStyle()
70+
.size(2)
71+
.lineStyle(LineStyle.Dash_Dot)
72+
.sourceArrow(ArrowStyle.InputArrowWithDiamond)
73+
.targetArrow(ArrowStyle.None)
74+
.color("rgb(1, 2, 3)")
75+
.edgeType(EdgeType.Manhattan)
76+
.build();
7577

7678
Function<VariableManager, String> idProvider = variableManager -> variableManager.get(VariableManager.SELF, String.class).orElse(null);
7779

packages/diagrams/backend/sirius-components-diagrams/src/main/java/org/eclipse/sirius/components/diagrams/Diagram.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2019, 2024 Obeo.
2+
* Copyright (c) 2019, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -28,6 +28,7 @@
2828
*/
2929
@Immutable
3030
public final class Diagram implements IRepresentation {
31+
3132
public static final String KIND = IRepresentation.KIND_PREFIX + "?type=Diagram";
3233

3334
private String id;
@@ -44,6 +45,8 @@ public final class Diagram implements IRepresentation {
4445

4546
private DiagramLayoutData layoutData;
4647

48+
private DiagramStyle style;
49+
4750
private Diagram() {
4851
// Prevent instantiation
4952
}
@@ -80,6 +83,10 @@ public DiagramLayoutData getLayoutData() {
8083
return this.layoutData;
8184
}
8285

86+
public DiagramStyle getStyle() {
87+
return this.style;
88+
}
89+
8390
public static Builder newDiagram(String id) {
8491
return new Builder(id);
8592
}
@@ -101,9 +108,10 @@ public String toString() {
101108
*/
102109
@SuppressWarnings("checkstyle:HiddenField")
103110
public static final class Builder {
104-
private String id;
105111

106-
private String kind = KIND;
112+
private final String id;
113+
114+
private final String kind = KIND;
107115

108116
private String targetObjectId;
109117

@@ -113,6 +121,8 @@ public static final class Builder {
113121

114122
private List<Edge> edges;
115123

124+
private DiagramStyle style;
125+
116126
private DiagramLayoutData layoutData = new DiagramLayoutData(Map.of(), Map.of(), Map.of());
117127

118128
private Builder(String id) {
@@ -125,6 +135,7 @@ private Builder(Diagram diagram) {
125135
this.descriptionId = diagram.getDescriptionId();
126136
this.nodes = diagram.getNodes();
127137
this.edges = diagram.getEdges();
138+
this.style = diagram.getStyle();
128139
this.layoutData = diagram.getLayoutData();
129140
}
130141

@@ -148,6 +159,11 @@ public Builder edges(List<Edge> edges) {
148159
return this;
149160
}
150161

162+
public Builder style(DiagramStyle style) {
163+
this.style = Objects.requireNonNull(style);
164+
return this;
165+
}
166+
151167
public Builder layoutData(DiagramLayoutData layoutData) {
152168
this.layoutData = Objects.requireNonNull(layoutData);
153169
return this;
@@ -161,6 +177,7 @@ public Diagram build() {
161177
diagram.descriptionId = Objects.requireNonNull(this.descriptionId);
162178
diagram.nodes = Objects.requireNonNull(this.nodes);
163179
diagram.edges = Objects.requireNonNull(this.edges);
180+
diagram.style = Objects.requireNonNull(this.style);
164181
diagram.layoutData = Objects.requireNonNull(this.layoutData);
165182
return diagram;
166183
}

0 commit comments

Comments
 (0)