Skip to content

Commit 1175bb7

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 d3f7980 commit 1175bb7

File tree

76 files changed

+2438
-140
lines changed

Some content is hidden

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

76 files changed

+2438
-140
lines changed

CHANGELOG.adoc

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ The key bindings are visible in the palette next to the tool name.
109109
A key binding needs to contain at least one of `Control`, `Alt`, or `Meta` to be executed by the frontend.
110110
- https://github.com/eclipse-sirius/sirius-web/issues/3488[#3488] [diagram] Restore auto-layout support for diagrams
111111
- https://github.com/eclipse-sirius/sirius-web/issues/5062[#5062] [sirius-web] Add new "views explorer" view
112+
- https://github.com/eclipse-sirius/sirius-web/issues/3647[#3647] [diagram] Add support for diagram style with background customization
112113

113114

114115
=== Improvements
@@ -2222,7 +2223,7 @@ As a result, the following maven modules have been deleted: `sirius-web-sample-a
22222223

22232224
* The `String` attribute `org.eclipse.sirius.components.collaborative.diagrams.dto.InvokeSingleClickOnDiagramElementToolInput#selectedObjectId` has been replaced by the attribute `variables` of type `List<ToolVariable>`
22242225
- 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.
2225-
- 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.
2226+
- 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.
22262227
- https://github.com/eclipse-sirius/sirius-web/issues/3815[#3815] [core] Make child creation descriptions locale independent
22272228
- https://github.com/eclipse-sirius/sirius-web/issues/3976[#3976] [core] Remove the configuration object used to create representation event processors.
22282229

@@ -2265,12 +2266,11 @@ The ids used to create a subscription is also changed, refer to [ADR-159] for mo
22652266
- https://github.com/eclipse-sirius/sirius-web/issues/3821[#3821] [sirius-web] Allow to filter resources in `RewriteProxiesEventHandler`.
22662267
Introduce new `IRewriteProxiesResourceFilter` interface, to register resource filter for `RewriteProxiesEventHandler`.
22672268
- https://github.com/eclipse-sirius/sirius-web/issues/3570[#3570] [diagram] Add max width expression in the View DSL for labels
2268-
- 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.
2269+
- 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.
22692270
+
22702271
image:doc/screenshots/treeItemLabelStyled.jpg[StyledString, 70%]
22712272
- https://github.com/eclipse-sirius/sirius-web/issues/3963[#3963] [core] Add support for optional GraphQLCodeRegistry post-processing/transformation.
22722273

2273-
22742274
=== Improvements
22752275

22762276
- https://github.com/eclipse-sirius/sirius-web/issues/3744[#3744] [diagram] Add support for helper lines during multi selection move
@@ -2374,8 +2374,7 @@ More existing APIs will be migrated to this new common pattern.
23742374
- https://github.com/eclipse-sirius/sirius-web/issues/3616[#3616] [diagram] Fix potential exceptions due to duplicate keys in diagram event processing
23752375
- 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
23762376
- https://github.com/eclipse-sirius/sirius-web/issues/3531[#3531] [diagram] Fix unnecessary edges label re render
2377-
- https://github.com/eclipse-sirius/sirius-web/issues/3650[#3650] [diagram] Fix potential NPE in DiagramNavigator and Node toString method
2378-
- https://github.com/eclipse-sirius/sirius-web/issues/3649[#3649] [sirius-web] Restore support for Related elements view icons
2377+
- 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
23792378
- https://github.com/eclipse-sirius/sirius-web/issues/3630[#3630] [sirius-web] Restore support for the deletion of dangling representations
23802379
- 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).
23812380
- 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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

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)