Skip to content

Commit 7441367

Browse files
pcdavidsbegaudeau
authored andcommitted
[2809] Add support for custom tree definitions in model browsers
Bug: #2809 Signed-off-by: Pierre-Charles David <[email protected]>
1 parent 2869357 commit 7441367

File tree

20 files changed

+500
-53
lines changed

20 files changed

+500
-53
lines changed

CHANGELOG.adoc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,11 +165,12 @@ Some part of each namespace may not be supported yet.
165165
Do not hesitate to read the ADR-214 for further understanding.
166166
- https://github.com/eclipse-sirius/sirius-web/issues/5673[#5673] [sirius-web] The EditingContext expose a new method `Map<String, IViewConversionData> getViewConversionData()`
167167
This can be used to retrieve a `ViewDiagramConversionData` that contains the mapping between view `IDiagramElementDescription` and programmatic `IDiagramElementDescription`.
168+
- https://github.com/eclipse-sirius/sirius-web/issues/2809[#2809] [browser] Add support for overriding the tree description to use for a specific model browser.
169+
In particular, this can be used to customize the tree used for the model browser of a particular reference widget by discriminating on the `descriptionId` parameter of the `modelBrowser://` id.
168170

169171

170172
=== Improvements
171173

172-
- https://github.com/eclipse-sirius/sirius-web/issues/5608[#5608] [diagram] Hide empty sections on the palette
173174
- https://github.com/eclipse-sirius/sirius-web/issues/5608[#5608] [diagram] Hide empty sections on the palette
174175
- https://github.com/eclipse-sirius/sirius-web/issues/5416[#5416] [palette] Move the component `PaletteToolList` from `sirius-components-diagrams` to `sirius-components-palette`
175176
- https://github.com/eclipse-sirius/sirius-web/issues/5662[#5662] [diagram] Add a bottom padding for child nodes
@@ -197,6 +198,7 @@ As a result, some of those menu items are not contributed anymore on invalid use
197198

198199

199200

201+
200202
== 2025.10.0
201203

202204
=== Shapes
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Obeo.
3+
* This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Obeo - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.sirius.components.collaborative.browser;
14+
15+
import java.util.List;
16+
import java.util.Objects;
17+
18+
import org.eclipse.sirius.components.collaborative.browser.api.IDefaultModelBrowserTreeDescriptionIdProvider;
19+
import org.eclipse.sirius.components.collaborative.browser.api.IModelBrowserTreeDescriptionIdProvider;
20+
import org.eclipse.sirius.components.collaborative.browser.api.IModelBrowserTreeDescriptionIdProviderDelegate;
21+
import org.eclipse.sirius.components.core.api.IEditingContext;
22+
import org.springframework.stereotype.Service;
23+
24+
/**
25+
* Used to find the tree description id to use for the model browser of a specific reference widget.
26+
*
27+
* @author pcdavid
28+
* @see IModelBrowserTreeDescriptionIdProviderDelegate
29+
*/
30+
@Service
31+
public class ComposedModelBrowserTreeDescriptionIdProvider implements IModelBrowserTreeDescriptionIdProvider {
32+
33+
private final IDefaultModelBrowserTreeDescriptionIdProvider defaultTreeDescriptionIdProvider;
34+
35+
private final List<IModelBrowserTreeDescriptionIdProviderDelegate> treeDescriptionIdProviderDelegates;
36+
37+
public ComposedModelBrowserTreeDescriptionIdProvider(IDefaultModelBrowserTreeDescriptionIdProvider defaultTreeDescriptionIdProvider,
38+
List<IModelBrowserTreeDescriptionIdProviderDelegate> treeDescriptionIdProviderDelegates) {
39+
this.defaultTreeDescriptionIdProvider = Objects.requireNonNull(defaultTreeDescriptionIdProvider);
40+
this.treeDescriptionIdProviderDelegates = Objects.requireNonNull(treeDescriptionIdProviderDelegates);
41+
}
42+
43+
@Override
44+
public String getModelBrowserTreeDescriptionId(IEditingContext editingContext, String modelBrowserId) {
45+
return this.treeDescriptionIdProviderDelegates.stream()
46+
.filter(delegate -> delegate.canHandle(editingContext, modelBrowserId))
47+
.findFirst()
48+
.map(delegate -> delegate.getModelBrowserTreeDescriptionId(editingContext, modelBrowserId))
49+
.orElseGet(() -> this.defaultTreeDescriptionIdProvider.getModelBrowserTreeDescriptionId(editingContext, modelBrowserId));
50+
}
51+
}

packages/browser/backend/sirius-components-collaborative-browser/src/main/java/org/eclipse/sirius/components/collaborative/browser/ModelBrowserEventProcessorFactory.java

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.eclipse.sirius.components.collaborative.api.IRepresentationEventProcessorFactory;
2222
import org.eclipse.sirius.components.collaborative.api.IRepresentationRefreshPolicyRegistry;
2323
import org.eclipse.sirius.components.collaborative.api.ISubscriptionManagerFactory;
24+
import org.eclipse.sirius.components.collaborative.browser.api.IModelBrowserTreeDescriptionIdProvider;
2425
import org.eclipse.sirius.components.collaborative.trees.TreeEventProcessor;
2526
import org.eclipse.sirius.components.collaborative.trees.api.ITreeEventHandler;
2627
import org.eclipse.sirius.components.collaborative.trees.api.ITreeService;
@@ -40,6 +41,9 @@
4041
*/
4142
@Service
4243
public class ModelBrowserEventProcessorFactory implements IRepresentationEventProcessorFactory {
44+
public static final String PREFIX = "modelBrowser://";
45+
46+
private static final String EXPANDED_IDS = "expandedIds";
4347

4448
private final IRepresentationDescriptionSearchService representationDescriptionSearchService;
4549

@@ -53,39 +57,33 @@ public class ModelBrowserEventProcessorFactory implements IRepresentationEventPr
5357

5458
private final IURLParser urlParser;
5559

60+
private final IModelBrowserTreeDescriptionIdProvider modelBrowserTreeDescriptionIdProvider;
61+
5662
public ModelBrowserEventProcessorFactory(IRepresentationDescriptionSearchService representationDescriptionSearchService, List<ITreeEventHandler> treeEventHandlers, ITreeService treeService,
57-
IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry, ISubscriptionManagerFactory subscriptionManagerFactory, IURLParser urlParser) {
63+
IRepresentationRefreshPolicyRegistry representationRefreshPolicyRegistry, ISubscriptionManagerFactory subscriptionManagerFactory, IURLParser urlParser,
64+
IModelBrowserTreeDescriptionIdProvider modelBrowserTreeDescriptionIdProvider) {
5865
this.representationDescriptionSearchService = Objects.requireNonNull(representationDescriptionSearchService);
5966
this.treeService = Objects.requireNonNull(treeService);
6067
this.treeEventHandlers = Objects.requireNonNull(treeEventHandlers);
6168
this.subscriptionManagerFactory = Objects.requireNonNull(subscriptionManagerFactory);
6269
this.representationRefreshPolicyRegistry = Objects.requireNonNull(representationRefreshPolicyRegistry);
6370
this.urlParser = Objects.requireNonNull(urlParser);
71+
this.modelBrowserTreeDescriptionIdProvider = Objects.requireNonNull(modelBrowserTreeDescriptionIdProvider);
6472
}
6573

6674
@Override
6775
public boolean canHandle(IEditingContext editingContext, String representationId) {
68-
return representationId.startsWith("modelBrowser://");
76+
return representationId.startsWith(PREFIX);
6977
}
7078

7179
@Override
7280
public Optional<IRepresentationEventProcessor> createRepresentationEventProcessor(IEditingContext editingContext, String representationId) {
73-
String descriptionId;
74-
if (representationId.startsWith(ModelBrowserDescriptionProvider.MODEL_BROWSER_CONTAINER_PREFIX)) {
75-
descriptionId = ModelBrowserDescriptionProvider.CONTAINER_DESCRIPTION_ID;
76-
} else {
77-
descriptionId = ModelBrowserDescriptionProvider.REFERENCE_DESCRIPTION_ID;
78-
}
79-
80-
Optional<TreeDescription> optionalTreeDescription = this.representationDescriptionSearchService
81-
.findById(editingContext, descriptionId)
82-
.filter(TreeDescription.class::isInstance)
83-
.map(TreeDescription.class::cast);
81+
Optional<TreeDescription> optionalTreeDescription = this.findModelBrowserTreeDescription(editingContext, representationId);
8482
if (optionalTreeDescription.isPresent()) {
8583
var treeDescription = optionalTreeDescription.get();
8684

8785
Map<String, List<String>> parameters = this.urlParser.getParameterValues(representationId);
88-
String expandedIdsParam = parameters.get("expandedIds").get(0);
86+
String expandedIdsParam = parameters.get(EXPANDED_IDS).get(0);
8987

9088
var expanded = this.urlParser.getParameterEntries(expandedIdsParam);
9189

@@ -104,4 +102,10 @@ public Optional<IRepresentationEventProcessor> createRepresentationEventProcesso
104102
return Optional.empty();
105103
}
106104

105+
private Optional<TreeDescription> findModelBrowserTreeDescription(IEditingContext editingContext, String representationId) {
106+
return Optional.ofNullable(this.modelBrowserTreeDescriptionIdProvider.getModelBrowserTreeDescriptionId(editingContext, representationId))
107+
.flatMap(treeDescriptionId -> this.representationDescriptionSearchService.findById(editingContext, treeDescriptionId))
108+
.filter(TreeDescription.class::isInstance)
109+
.map(TreeDescription.class::cast);
110+
}
107111
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Obeo.
3+
* This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Obeo - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.sirius.components.collaborative.browser.api;
14+
15+
import org.eclipse.sirius.components.core.api.IEditingContext;
16+
17+
/**
18+
* Provides the default choice of which tree description should be used a the model browser.
19+
*
20+
* @author pcdavid
21+
*/
22+
public interface IDefaultModelBrowserTreeDescriptionIdProvider {
23+
String getModelBrowserTreeDescriptionId(IEditingContext editingContext, String modelBrowserId);
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Obeo.
3+
* This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Obeo - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.sirius.components.collaborative.browser.api;
14+
15+
import org.eclipse.sirius.components.core.api.IEditingContext;
16+
17+
/**
18+
* Used to decide which tree description should be used for a given model browser.
19+
*
20+
* @author pcdavid
21+
*/
22+
public interface IModelBrowserTreeDescriptionIdProvider {
23+
String getModelBrowserTreeDescriptionId(IEditingContext editingContext, String modelBrowserId);
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Obeo.
3+
* This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Obeo - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.sirius.components.collaborative.browser.api;
14+
15+
import org.eclipse.sirius.components.core.api.IEditingContext;
16+
17+
/**
18+
* Used to customize which tree description to use for a specific model browser.
19+
*
20+
* @author pcdavid
21+
*/
22+
public interface IModelBrowserTreeDescriptionIdProviderDelegate {
23+
boolean canHandle(IEditingContext editingContext, String modelBrowserId);
24+
25+
String getModelBrowserTreeDescriptionId(IEditingContext editingContext, String modelBrowserId);
26+
}

packages/forms/backend/sirius-components-widget-reference-tests/src/main/java/org/eclipse/sirius/components/widget/reference/tests/assertions/ReferenceWidgetAssert.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ public ReferenceWidgetAssert hasNoValue() {
4747
return this;
4848
}
4949

50+
public ReferenceWidgetAssert hasHelpText(String helpText) {
51+
assertThat(this.actual.getHelpTextProvider()).isNotNull();
52+
assertThat(this.actual.getHelpTextProvider().get()).isEqualTo(helpText);
53+
return this;
54+
}
55+
5056
public ReferenceWidgetAssert isBold() {
5157
assertThat(this.actual.getStyle().isBold())
5258
.withFailMessage("Expecting the reference widget to be bold but was not bold instead")

packages/sirius-web/backend/sirius-web-application/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@
5858
<artifactId>sirius-components-collaborative-forms</artifactId>
5959
<version>2025.10.3</version>
6060
</dependency>
61+
<dependency>
62+
<groupId>org.eclipse.sirius</groupId>
63+
<artifactId>sirius-components-collaborative-browser</artifactId>
64+
<version>2025.10.3</version>
65+
</dependency>
6166
<dependency>
6267
<groupId>org.eclipse.sirius</groupId>
6368
<artifactId>sirius-components-collaborative-portals</artifactId>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*******************************************************************************
2+
* Copyright (c) 2025 Obeo.
3+
* This program and the accompanying materials
4+
* are made available under the terms of the Eclipse Public License v2.0
5+
* which accompanies this distribution, and is available at
6+
* https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* Obeo - initial API and implementation
12+
*******************************************************************************/
13+
package org.eclipse.sirius.web.application.browser;
14+
15+
import org.eclipse.sirius.components.collaborative.browser.api.IDefaultModelBrowserTreeDescriptionIdProvider;
16+
import org.eclipse.sirius.components.core.api.IEditingContext;
17+
import org.springframework.stereotype.Service;
18+
19+
/**
20+
* Provides the default choice of which tree description should be used for the model browser of a given reference widget.
21+
* The default choice only depends on whether the requested browser is on containment or reference mode.
22+
*
23+
* @author pcdavid
24+
* @see DefaultModelBrowsersTreeDescriptionProvider
25+
*/
26+
@Service
27+
public class DefaultModelBrowserTreeDescriptionIdProvider implements IDefaultModelBrowserTreeDescriptionIdProvider {
28+
@Override
29+
public String getModelBrowserTreeDescriptionId(IEditingContext editingContext, String modelBrowserId) {
30+
if (modelBrowserId.startsWith(DefaultModelBrowsersTreeDescriptionProvider.MODEL_BROWSER_CONTAINER_PREFIX)) {
31+
return DefaultModelBrowsersTreeDescriptionProvider.CONTAINER_DESCRIPTION_ID;
32+
} else {
33+
return DefaultModelBrowsersTreeDescriptionProvider.REFERENCE_DESCRIPTION_ID;
34+
}
35+
}
36+
37+
}
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
* Contributors:
1111
* Obeo - initial API and implementation
1212
*******************************************************************************/
13-
package org.eclipse.sirius.components.collaborative.browser;
13+
package org.eclipse.sirius.web.application.browser;
1414

1515
import java.util.List;
1616
import java.util.Optional;
@@ -26,23 +26,23 @@
2626
* @author pcdavid
2727
*/
2828
@Service
29-
public class ModelBrowserMetadataProvider implements IRepresentationMetadataProvider {
29+
public class DefaultModelBrowsersMetadataProvider implements IRepresentationMetadataProvider {
3030

3131
@Override
3232
public Optional<RepresentationMetadata> getMetadata(String representationId) {
3333
RepresentationMetadata representationMetadata = null;
34-
if (representationId.startsWith(ModelBrowserDescriptionProvider.MODEL_BROWSER_CONTAINER_PREFIX)) {
34+
if (representationId.startsWith(DefaultModelBrowsersTreeDescriptionProvider.MODEL_BROWSER_CONTAINER_PREFIX)) {
3535
representationMetadata = RepresentationMetadata.newRepresentationMetadata(representationId)
3636
.kind(Tree.KIND)
37-
.label(ModelBrowserDescriptionProvider.REPRESENTATION_NAME)
38-
.descriptionId(ModelBrowserDescriptionProvider.CONTAINER_DESCRIPTION_ID)
37+
.label(DefaultModelBrowsersTreeDescriptionProvider.REPRESENTATION_NAME)
38+
.descriptionId(DefaultModelBrowsersTreeDescriptionProvider.CONTAINER_DESCRIPTION_ID)
3939
.iconURLs(List.of())
4040
.build();
41-
} else if (representationId.startsWith(ModelBrowserDescriptionProvider.MODEL_BROWSER_REFERENCE_PREFIX)) {
41+
} else if (representationId.startsWith(DefaultModelBrowsersTreeDescriptionProvider.MODEL_BROWSER_REFERENCE_PREFIX)) {
4242
representationMetadata = RepresentationMetadata.newRepresentationMetadata(representationId)
4343
.kind(Tree.KIND)
44-
.label(ModelBrowserDescriptionProvider.REPRESENTATION_NAME)
45-
.descriptionId(ModelBrowserDescriptionProvider.REFERENCE_DESCRIPTION_ID)
44+
.label(DefaultModelBrowsersTreeDescriptionProvider.REPRESENTATION_NAME)
45+
.descriptionId(DefaultModelBrowsersTreeDescriptionProvider.REFERENCE_DESCRIPTION_ID)
4646
.iconURLs(List.of())
4747
.build();
4848
}

0 commit comments

Comments
 (0)