From aadc04e34cd05304033edb71d94ad4124b1b216a Mon Sep 17 00:00:00 2001 From: Florian Barbin Date: Wed, 18 Mar 2026 17:34:39 +0100 Subject: [PATCH] [6295] Make it possible to hide the minimap by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - The specifier can choose to hide the minimap by default for a specific diagram description - The minimap hide/reveal action is now persisted for a specific diagram. Bug: https://github.com/eclipse-sirius/sirius-web/issues/6295 Signed-off-by: Florian Barbin Signed-off-by: Florian ROUËNÉ --- CHANGELOG.adoc | 46 +++++- .../playwright/e2e/diagrams/diagram.spec.ts | 19 ++- .../diagrams/api/IShowMinimapProvider.java | 31 ++++ .../diagrams/dto/ShowMinimapInput.java | 25 ++++ .../dto/ShowMinimapSuccessPayload.java | 30 ++++ .../handlers/ShowMinimapEventHandler.java | 98 ++++++++++++ .../main/resources/schema/diagram.graphqls | 1 + ...gramDescriptionShowMinimapDataFetcher.java | 63 ++++++++ .../tests/graphql/ShowMinimapQueryRunner.java | 57 +++++++ .../src/contexts/DiagramDescriptionContext.ts | 1 + .../src/renderer/mini-map/MiniMapContext.tsx | 32 ++-- .../representation/DiagramRepresentation.tsx | 1 + .../DiagramRepresentation.types.ts | 1 + .../diagrams/ShowMinimapControllerTests.java | 139 ++++++++++++++++++ .../ActionDiagramDescriptionProvider.java | 3 +- .../diagram/DiagramDescriptionBuilder.java | 10 ++ .../DiagramDescriptionItemProvider.java | 14 ++ .../src/main/resources/plugin.properties | 1 + .../view/diagram/DiagramDescription.java | 24 +++ .../view/diagram/DiagramPackage.java | 30 +++- .../diagram/impl/DiagramDescriptionImpl.java | 57 +++++++ .../view/diagram/impl/DiagramPackageImpl.java | 13 ++ .../src/main/resources/model/diagram.ecore | 2 + .../src/main/resources/model/diagram.genmodel | 1 + .../emf/diagram/ViewShowMinimapProvider.java | 66 +++++++++ 25 files changed, 751 insertions(+), 14 deletions(-) create mode 100644 packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/api/IShowMinimapProvider.java create mode 100644 packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/dto/ShowMinimapInput.java create mode 100644 packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/dto/ShowMinimapSuccessPayload.java create mode 100644 packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/ShowMinimapEventHandler.java create mode 100644 packages/diagrams/backend/sirius-components-diagrams-graphql/src/main/java/org/eclipse/sirius/components/diagrams/graphql/datafetchers/diagram/DiagramDescriptionShowMinimapDataFetcher.java create mode 100644 packages/diagrams/backend/sirius-components-diagrams-tests/src/main/java/org/eclipse/sirius/components/diagrams/tests/graphql/ShowMinimapQueryRunner.java create mode 100644 packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/diagrams/ShowMinimapControllerTests.java create mode 100644 packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewShowMinimapProvider.java diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index beba7934538..ee30ec94476 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -1,6 +1,49 @@ = Changelog -== 2026.3.0 (work in progress) +== 2026.5.0 + +=== Pitches + +- Measure the performance of Sirius Web based applications + + +=== Architectural decision records + + + + +=== Deprecation warning + + + + +=== Breaking changes + + + + +=== Dependency update + + + + +=== Bug fixes + + + + +=== New Features + + + + +=== Improvements + + +- https://github.com/eclipse-sirius/sirius-web/issues/6295[#6295] [diagram] Make it possible to hide the minimap by default. + + +== 2026.3.0 === Shapes @@ -156,7 +199,6 @@ Trees defined via the view DSL can alternatively provide a tooltip expression vi - https://github.com/eclipse-sirius/sirius-web/issues/6268[#6268] [sirius-web] Allow customizing the labels of the Views Explorer via delegates. - == 2026.1.0 === Shapes diff --git a/integration-tests-playwright/playwright/e2e/diagrams/diagram.spec.ts b/integration-tests-playwright/playwright/e2e/diagrams/diagram.spec.ts index 712359bb95f..718c0e2030c 100644 --- a/integration-tests-playwright/playwright/e2e/diagrams/diagram.spec.ts +++ b/integration-tests-playwright/playwright/e2e/diagrams/diagram.spec.ts @@ -52,7 +52,7 @@ test.describe('diagram', () => { }); test('when the mini map is shown or hidden, then mini map is available or not', async ({ page }) => { - // by default, the mini map is shown + //1. by default, the mini map is shown await expect(page.getByTestId('hide-mini-map')).toBeAttached(); await expect(page.getByTestId('show-mini-map')).not.toBeAttached(); await expect(page.locator('.react-flow__minimap')).toBeAttached(); @@ -62,6 +62,23 @@ test.describe('diagram', () => { await expect(page.getByTestId('show-mini-map')).toBeAttached(); await expect(page.getByTestId('hide-mini-map')).not.toBeAttached(); + //2. We Create a new diagram + await page.goto(`/projects/${projectId}/edit`); + const explorer = await new PlaywrightExplorer(page); + await explorer.expand('Flow'); + await explorer.expand('NewSystem'); + await explorer.createRepresentation('NewSystem', 'Topography unsynchronized', 'Topography2'); + await expect(page.getByTestId('rf__wrapper')).toBeAttached(); + + //3. by default, the mini map is shown, even if it has been hidden in the previous diagram. + await expect(page.getByTestId('hide-mini-map')).toBeAttached(); + await expect(page.getByTestId('show-mini-map')).not.toBeAttached(); + await expect(page.locator('.react-flow__minimap')).toBeAttached(); + + //4. We switch to the initial Topography diagram + await explorer.select('Topography'); + + //5. We show the mini map await page.getByTestId('show-mini-map').click(); await expect(page.locator('.react-flow__minimap')).toBeAttached(); }); diff --git a/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/api/IShowMinimapProvider.java b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/api/IShowMinimapProvider.java new file mode 100644 index 00000000000..5c65398078b --- /dev/null +++ b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/api/IShowMinimapProvider.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ + +package org.eclipse.sirius.components.collaborative.diagrams.api; + +import org.eclipse.sirius.components.collaborative.diagrams.DiagramContext; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.diagrams.description.DiagramDescription; + +/** + * Interface for services providing the diagram showminimap. + * + * @author fbarbin + */ +public interface IShowMinimapProvider { + + boolean canHandle(IEditingContext editingContext, DiagramContext diagramContext, DiagramDescription diagramDescription); + + boolean showMinimap(IEditingContext editingContext, DiagramContext diagramContext, DiagramDescription diagramDescription); + +} diff --git a/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/dto/ShowMinimapInput.java b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/dto/ShowMinimapInput.java new file mode 100644 index 00000000000..8c515b93183 --- /dev/null +++ b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/dto/ShowMinimapInput.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.diagrams.dto; + +import java.util.UUID; + +import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramInput; + +/** + * The input for the "Show Minimap" query. + * + * @author fbarbin + */ +public record ShowMinimapInput(UUID id, String editingContextId, String representationId) implements IDiagramInput { +} diff --git a/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/dto/ShowMinimapSuccessPayload.java b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/dto/ShowMinimapSuccessPayload.java new file mode 100644 index 00000000000..f0f814dd8f2 --- /dev/null +++ b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/dto/ShowMinimapSuccessPayload.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.diagrams.dto; + +import java.util.Objects; +import java.util.UUID; + +import org.eclipse.sirius.components.core.api.IPayload; + +/** + * The payload of the "Show Minimap" query returned on success. + * + * @author fbarbin + */ +public record ShowMinimapSuccessPayload(UUID id, boolean showMinimap) implements IPayload { + + public ShowMinimapSuccessPayload { + Objects.requireNonNull(id); + } +} diff --git a/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/ShowMinimapEventHandler.java b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/ShowMinimapEventHandler.java new file mode 100644 index 00000000000..df2e30791e3 --- /dev/null +++ b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/ShowMinimapEventHandler.java @@ -0,0 +1,98 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.collaborative.diagrams.handlers; + +import java.util.List; +import java.util.Objects; + +import org.eclipse.sirius.components.collaborative.api.ChangeDescription; +import org.eclipse.sirius.components.collaborative.api.ChangeKind; +import org.eclipse.sirius.components.collaborative.api.Monitoring; +import org.eclipse.sirius.components.collaborative.diagrams.DiagramContext; +import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramEventHandler; +import org.eclipse.sirius.components.collaborative.diagrams.api.IDiagramInput; +import org.eclipse.sirius.components.collaborative.diagrams.api.IShowMinimapProvider; +import org.eclipse.sirius.components.collaborative.diagrams.dto.ShowMinimapInput; +import org.eclipse.sirius.components.collaborative.diagrams.dto.ShowMinimapSuccessPayload; +import org.eclipse.sirius.components.collaborative.messages.ICollaborativeMessageService; +import org.eclipse.sirius.components.core.api.ErrorPayload; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IPayload; +import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService; +import org.eclipse.sirius.components.diagrams.Diagram; +import org.eclipse.sirius.components.diagrams.description.DiagramDescription; +import org.springframework.stereotype.Service; + +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import reactor.core.publisher.Sinks.Many; +import reactor.core.publisher.Sinks.One; + +/** + * Handler used to get the diagram show minimap default value. + * + * @author fbarbin + */ +@Service +public class ShowMinimapEventHandler implements IDiagramEventHandler { + + private final IRepresentationDescriptionSearchService representationDescriptionSearchService; + + private final List showMinimapProviders; + + private final ICollaborativeMessageService messageService; + + private final Counter counter; + + public ShowMinimapEventHandler(IRepresentationDescriptionSearchService representationDescriptionSearchService, List showMinimapProviders, ICollaborativeMessageService messageService, MeterRegistry meterRegistry) { + this.representationDescriptionSearchService = Objects.requireNonNull(representationDescriptionSearchService); + this.showMinimapProviders = Objects.requireNonNull(showMinimapProviders); + this.messageService = Objects.requireNonNull(messageService); + + this.counter = Counter.builder(Monitoring.EVENT_HANDLER) + .tag(Monitoring.NAME, this.getClass().getSimpleName()) + .register(meterRegistry); + } + + @Override + public boolean canHandle(IEditingContext editingContext, IDiagramInput diagramInput) { + return diagramInput instanceof ShowMinimapInput; + } + + @Override + public void handle(One payloadSink, Many changeDescriptionSink, IEditingContext editingContext, DiagramContext diagramContext, IDiagramInput diagramInput) { + this.counter.increment(); + + String message = this.messageService.invalidInput(diagramInput.getClass().getSimpleName(), ShowMinimapInput.class.getSimpleName()); + IPayload payload = new ErrorPayload(diagramInput.id(), message); + + ChangeDescription changeDescription = new ChangeDescription(ChangeKind.NOTHING, editingContext.getId(), diagramInput); + + if (diagramInput instanceof ShowMinimapInput) { + Diagram diagram = diagramContext.diagram(); + var optionalDiagramDescription = this.representationDescriptionSearchService.findById(editingContext, diagram.getDescriptionId()) + .filter(DiagramDescription.class::isInstance) + .map(DiagramDescription.class::cast); + if (optionalDiagramDescription.isPresent()) { + DiagramDescription diagramDescription = optionalDiagramDescription.get(); + boolean showMinimap = this.showMinimapProviders.stream() + .filter(provider -> provider.canHandle(editingContext, diagramContext, diagramDescription)) + .allMatch(provider -> provider.showMinimap(editingContext, diagramContext, diagramDescription)); + + payload = new ShowMinimapSuccessPayload(diagramInput.id(), showMinimap); + } + } + payloadSink.tryEmitValue(payload); + changeDescriptionSink.tryEmitNext(changeDescription); + } +} diff --git a/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/resources/schema/diagram.graphqls b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/resources/schema/diagram.graphqls index bec9ad1bb8b..f6938ceeab8 100644 --- a/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/resources/schema/diagram.graphqls +++ b/packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/resources/schema/diagram.graphqls @@ -418,6 +418,7 @@ type DiagramDescription implements RepresentationDescription { id: ID! label: String! autoLayout: Boolean! + showMinimap: Boolean! arrangeLayoutDirection: ArrangeLayoutDirection! nodeDescriptions: [NodeDescription!]! childNodeDescriptionIds: [ID!]! diff --git a/packages/diagrams/backend/sirius-components-diagrams-graphql/src/main/java/org/eclipse/sirius/components/diagrams/graphql/datafetchers/diagram/DiagramDescriptionShowMinimapDataFetcher.java b/packages/diagrams/backend/sirius-components-diagrams-graphql/src/main/java/org/eclipse/sirius/components/diagrams/graphql/datafetchers/diagram/DiagramDescriptionShowMinimapDataFetcher.java new file mode 100644 index 00000000000..b8a81f1c65b --- /dev/null +++ b/packages/diagrams/backend/sirius-components-diagrams-graphql/src/main/java/org/eclipse/sirius/components/diagrams/graphql/datafetchers/diagram/DiagramDescriptionShowMinimapDataFetcher.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.diagrams.graphql.datafetchers.diagram; + +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +import org.eclipse.sirius.components.annotations.spring.graphql.QueryDataFetcher; +import org.eclipse.sirius.components.collaborative.diagrams.dto.ShowMinimapInput; +import org.eclipse.sirius.components.collaborative.diagrams.dto.ShowMinimapSuccessPayload; +import org.eclipse.sirius.components.graphql.api.IDataFetcherWithFieldCoordinates; +import org.eclipse.sirius.components.graphql.api.IEditingContextDispatcher; +import org.eclipse.sirius.components.graphql.api.LocalContextConstants; + +import graphql.schema.DataFetchingEnvironment; +import reactor.core.publisher.Mono; + +/** + * Datafetcher to retrieve the showMinimap diagram property. + * + * @author fbarbin + */ +@QueryDataFetcher(type = "DiagramDescription", field = "showMinimap") +public class DiagramDescriptionShowMinimapDataFetcher implements IDataFetcherWithFieldCoordinates> { + + private final IEditingContextDispatcher editingContextDispatcher; + + public DiagramDescriptionShowMinimapDataFetcher(IEditingContextDispatcher editingContextDispatcher) { + this.editingContextDispatcher = Objects.requireNonNull(editingContextDispatcher); + } + + @Override + public CompletableFuture get(DataFetchingEnvironment environment) throws Exception { + Map localContext = environment.getLocalContext(); + String editingContextId = Optional.ofNullable(localContext.get(LocalContextConstants.EDITING_CONTEXT_ID)).map(Object::toString).orElse(null); + String representationId = Optional.ofNullable(localContext.get(LocalContextConstants.REPRESENTATION_ID)).map(Object::toString).orElse(null); + + if (editingContextId != null && representationId != null) { + ShowMinimapInput input = new ShowMinimapInput(UUID.randomUUID(), editingContextId, representationId); + + return this.editingContextDispatcher.dispatchQuery(input.editingContextId(), input) + .filter(ShowMinimapSuccessPayload.class::isInstance) + .map(ShowMinimapSuccessPayload.class::cast) + .map(ShowMinimapSuccessPayload::showMinimap) + .toFuture(); + } + + return Mono.just(true).toFuture(); + } +} diff --git a/packages/diagrams/backend/sirius-components-diagrams-tests/src/main/java/org/eclipse/sirius/components/diagrams/tests/graphql/ShowMinimapQueryRunner.java b/packages/diagrams/backend/sirius-components-diagrams-tests/src/main/java/org/eclipse/sirius/components/diagrams/tests/graphql/ShowMinimapQueryRunner.java new file mode 100644 index 00000000000..e9eab34ee84 --- /dev/null +++ b/packages/diagrams/backend/sirius-components-diagrams-tests/src/main/java/org/eclipse/sirius/components/diagrams/tests/graphql/ShowMinimapQueryRunner.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.components.diagrams.tests.graphql; + +import java.util.Map; +import java.util.Objects; + +import org.eclipse.sirius.components.graphql.tests.api.GraphQLResult; +import org.eclipse.sirius.components.graphql.tests.api.IGraphQLRequestor; +import org.eclipse.sirius.components.graphql.tests.api.IQueryRunner; +import org.springframework.stereotype.Service; + +/** + * Used to retrieve the show minimap of a diagram. + * + * @author fbarbin + */ +@Service +public class ShowMinimapQueryRunner implements IQueryRunner { + + private static final String TOOLBAR_QUERY = """ + query getToolbar($editingContextId: ID!, $representationId: ID!) { + viewer { + editingContext(editingContextId: $editingContextId) { + representation(representationId: $representationId) { + description { + ... on DiagramDescription { + showMinimap + } + } + } + } + } + } + """; + + private final IGraphQLRequestor graphQLRequestor; + + public ShowMinimapQueryRunner(IGraphQLRequestor graphQLRequestor) { + this.graphQLRequestor = Objects.requireNonNull(graphQLRequestor); + } + + @Override + public GraphQLResult run(Map variables) { + return this.graphQLRequestor.execute(TOOLBAR_QUERY, variables); + } +} diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/contexts/DiagramDescriptionContext.ts b/packages/diagrams/frontend/sirius-components-diagrams/src/contexts/DiagramDescriptionContext.ts index c8ac4b36cda..1793cab7728 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/contexts/DiagramDescriptionContext.ts +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/contexts/DiagramDescriptionContext.ts @@ -22,6 +22,7 @@ const defaultValue: DiagramDescriptionContextValue = { debug: false, arrangeLayoutDirection: 'RIGHT', autoLayout: false, + showMinimap: true, }, }; diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/mini-map/MiniMapContext.tsx b/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/mini-map/MiniMapContext.tsx index d3204c149cc..5f98284a371 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/mini-map/MiniMapContext.tsx +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/renderer/mini-map/MiniMapContext.tsx @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2025 Obeo. + * Copyright (c) 2025, 2026 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -10,8 +10,11 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -import React, { useState } from 'react'; -import { MiniMapContextValue, MiniMapContextProviderProps } from './MiniMapContext.types'; +import React, { useContext, useState } from 'react'; +import { DiagramContext } from '../../contexts/DiagramContext'; +import { DiagramContextValue } from '../../contexts/DiagramContext.types'; +import { useDiagramDescription } from '../../contexts/useDiagramDescription'; +import { MiniMapContextProviderProps, MiniMapContextValue } from './MiniMapContext.types'; const defaultContextValue: MiniMapContextValue = { isMiniMapVisible: false, @@ -32,21 +35,32 @@ const isLocalStorageAvailable = (): boolean => { }; export const MiniMapContextProvider = ({ children }: MiniMapContextProviderProps) => { - const localStorageKey: string = 'sirius-diagram-mini-map-visibility'; + const localStorageKey: string = 'sirius-single-diagram-mini-map-visibility'; + const { diagramId } = useContext(DiagramContext); + const { diagramDescription } = useDiagramDescription(); const getInitialMiniMapVisibility = (): boolean => { - if (!isLocalStorageAvailable()) { - return true; + let showMinimap: boolean = diagramDescription.showMinimap; + if (isLocalStorageAvailable()) { + const storedPreference = localStorage.getItem(localStorageKey); + if (storedPreference) { + const localStorageValue: boolean | undefined = JSON.parse(storedPreference)[diagramId]; + if (localStorageValue !== undefined) { + showMinimap = localStorageValue; + } + } } - const storedPreference = localStorage.getItem(localStorageKey); - return storedPreference ? JSON.parse(storedPreference) : true; + return showMinimap; }; const [miniMap, setMiniMap] = useState(getInitialMiniMapVisibility); const handleMiniMapVisibilityChange = (visible: boolean) => { if (isLocalStorageAvailable()) { - localStorage.setItem(localStorageKey, JSON.stringify(visible)); + const storedPreference = localStorage.getItem(localStorageKey); + const preferences = storedPreference ? JSON.parse(storedPreference) : {}; + preferences[diagramId] = visible; + localStorage.setItem(localStorageKey, JSON.stringify(preferences)); } setMiniMap(visible); }; 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 9a963c223ca..78f9aa45367 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.tsx +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.tsx @@ -67,6 +67,7 @@ export const getDiagramDescription = gql` debug arrangeLayoutDirection autoLayout + showMinimap } } } diff --git a/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.types.ts b/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.types.ts index bb127048190..91ec7a734d5 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.types.ts +++ b/packages/diagrams/frontend/sirius-components-diagrams/src/representation/DiagramRepresentation.types.ts @@ -64,6 +64,7 @@ export interface GQLDiagramDescription { debug: boolean; arrangeLayoutDirection: GQLArrangeLayoutDirection; autoLayout: boolean; + showMinimap: boolean; } export interface GQLDiagramToolbar { diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/diagrams/ShowMinimapControllerTests.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/diagrams/ShowMinimapControllerTests.java new file mode 100644 index 00000000000..139b73911e7 --- /dev/null +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/application/controllers/diagrams/ShowMinimapControllerTests.java @@ -0,0 +1,139 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.web.application.controllers.diagrams; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.eclipse.sirius.components.diagrams.tests.DiagramEventPayloadConsumer.assertRefreshedDiagramThat; + +import com.jayway.jsonpath.JsonPath; + +import java.time.Duration; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Consumer; + +import org.eclipse.sirius.components.collaborative.dto.CreateRepresentationInput; +import org.eclipse.sirius.components.diagrams.tests.graphql.ShowMinimapQueryRunner; +import org.eclipse.sirius.web.AbstractIntegrationTests; +import org.eclipse.sirius.web.application.studio.services.representations.api.IDomainDiagramDescriptionProvider; +import org.eclipse.sirius.web.data.PapayaIdentifiers; +import org.eclipse.sirius.web.data.StudioIdentifiers; +import org.eclipse.sirius.web.services.diagrams.ActionDiagramDescriptionProvider; +import org.eclipse.sirius.web.tests.data.GivenSiriusWebServer; +import org.eclipse.sirius.web.tests.services.api.IGivenCreatedDiagramSubscription; +import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import reactor.test.StepVerifier; + +/** + * Integration tests of the showMinimap controllers. + * + * @author fbarbin + */ +@Transactional +@SuppressWarnings("checkstyle:MultipleStringLiterals") +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = { "sirius.web.test.enabled=studio" }) +public class ShowMinimapControllerTests extends AbstractIntegrationTests { + + @Autowired + private IGivenInitialServerState givenInitialServerState; + + @Autowired + private IGivenCreatedDiagramSubscription givenCreatedDiagramSubscription; + + @Autowired + private IDomainDiagramDescriptionProvider domainDiagramDescriptionProvider; + + @Autowired + private ActionDiagramDescriptionProvider actionDiagramDescriptionProvider; + + @Autowired + private ShowMinimapQueryRunner showMinimapQueryRunner; + + @BeforeEach + public void beforeEach() { + this.givenInitialServerState.initialize(); + } + + @Test + @GivenSiriusWebServer + @DisplayName("Given a domain diagram with a showMinimap value true, when the showMinimap is requested, then the showMinimap is true") + public void givenDomainDiagramWithShowMinimapValueTrueWhenShowMinimapIsRequestedThenTheValueIsTrue() { + var input = new CreateRepresentationInput(UUID.randomUUID(), StudioIdentifiers.SAMPLE_STUDIO_EDITING_CONTEXT_ID, this.domainDiagramDescriptionProvider.getDescriptionId(), StudioIdentifiers.DOMAIN_OBJECT.toString(), "Domain"); + var flux = this.givenCreatedDiagramSubscription.createAndSubscribe(input).flux(); + + var diagramId = new AtomicReference(); + + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> diagramId.set(diagram.getId())); + + Runnable requestDiagramToolbar = () -> { + Map variables = Map.of( + "editingContextId", StudioIdentifiers.SAMPLE_STUDIO_EDITING_CONTEXT_ID, + "representationId", diagramId.get() + ); + var result = this.showMinimapQueryRunner.run(variables); + + boolean showMinimap = JsonPath.read(result.data(), "$.data.viewer.editingContext.representation.description.showMinimap"); + assertThat(showMinimap).isTrue(); + + }; + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(requestDiagramToolbar) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + + @Test + @GivenSiriusWebServer + @DisplayName("Given a domain diagram with a showMinimap value false, when the showMinimap is requested, then the showMinimap is false") + public void givenDomainDiagramWithShowMinimapValueFalseWhenShowMinimapIsRequestedThenTheValueIsFalse() { + var input = new CreateRepresentationInput( + UUID.randomUUID(), + PapayaIdentifiers.PAPAYA_EDITING_CONTEXT_ID.toString(), + this.actionDiagramDescriptionProvider.getRepresentationDescriptionId(), + PapayaIdentifiers.PROJECT_OBJECT.toString(), + "ActionDiagram" + ); + var flux = this.givenCreatedDiagramSubscription.createAndSubscribe(input).flux(); + + var diagramId = new AtomicReference(); + + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> diagramId.set(diagram.getId())); + + Runnable requestDiagramToolbar = () -> { + Map variables = Map.of( + "editingContextId", PapayaIdentifiers.PAPAYA_EDITING_CONTEXT_ID.toString(), + "representationId", diagramId.get() + ); + var result = this.showMinimapQueryRunner.run(variables); + + boolean showMinimap = JsonPath.read(result.data(), "$.data.viewer.editingContext.representation.description.showMinimap"); + assertThat(showMinimap).isFalse(); + }; + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(requestDiagramToolbar) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } +} diff --git a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/diagrams/ActionDiagramDescriptionProvider.java b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/diagrams/ActionDiagramDescriptionProvider.java index 033d37a4d78..5c3a4217b31 100644 --- a/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/diagrams/ActionDiagramDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web/src/test/java/org/eclipse/sirius/web/services/diagrams/ActionDiagramDescriptionProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2025 Obeo. + * Copyright (c) 2025, 2026 Obeo. * This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at @@ -141,6 +141,7 @@ private DiagramDescription createDiagramDescription() { .edgeDescriptions() .palette(diagramPalette) .autoLayout(false) + .showMinimap(false) .build(); return this.diagramDescription; diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/diagram/DiagramDescriptionBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/diagram/DiagramDescriptionBuilder.java index 987ba967257..c0b9c31a7bb 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/diagram/DiagramDescriptionBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/diagram/DiagramDescriptionBuilder.java @@ -149,6 +149,16 @@ public DiagramDescriptionBuilder arrangeLayoutDirection(org.eclipse.sirius.compo return this; } + /** + * Setter for ShowMinimap. + * + * @generated + */ + public DiagramDescriptionBuilder showMinimap(java.lang.Boolean value) { + this.getDiagramDescription().setShowMinimap(value); + return this; + } + /** * Setter for Description. * diff --git a/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/DiagramDescriptionItemProvider.java b/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/DiagramDescriptionItemProvider.java index 1f25793b9c0..83892e39ad1 100644 --- a/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/DiagramDescriptionItemProvider.java +++ b/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/DiagramDescriptionItemProvider.java @@ -60,6 +60,7 @@ public List getPropertyDescriptors(Object object) { this.addAutoLayoutPropertyDescriptor(object); this.addArrangeLayoutDirectionPropertyDescriptor(object); + this.addShowMinimapPropertyDescriptor(object); } return this.itemPropertyDescriptors; } @@ -89,6 +90,18 @@ protected void addArrangeLayoutDirectionPropertyDescriptor(Object object) { DiagramPackage.Literals.DIAGRAM_DESCRIPTION__ARRANGE_LAYOUT_DIRECTION, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null)); } + /** + * This adds a property descriptor for the Show Minimap feature. + * + * @generated + */ + protected void addShowMinimapPropertyDescriptor(Object object) { + this.itemPropertyDescriptors.add(this.createItemPropertyDescriptor(((ComposeableAdapterFactory) this.adapterFactory).getRootAdapterFactory(), this.getResourceLocator(), + this.getString("_UI_DiagramDescription_showMinimap_feature"), + this.getString("_UI_PropertyDescriptor_description", "_UI_DiagramDescription_showMinimap_feature", "_UI_DiagramDescription_type"), + DiagramPackage.Literals.DIAGRAM_DESCRIPTION__SHOW_MINIMAP, true, false, false, ItemPropertyDescriptor.BOOLEAN_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 @@ -168,6 +181,7 @@ public void notifyChanged(Notification notification) { switch (notification.getFeatureID(DiagramDescription.class)) { case DiagramPackage.DIAGRAM_DESCRIPTION__AUTO_LAYOUT: case DiagramPackage.DIAGRAM_DESCRIPTION__ARRANGE_LAYOUT_DIRECTION: + case DiagramPackage.DIAGRAM_DESCRIPTION__SHOW_MINIMAP: this.fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true)); return; case DiagramPackage.DIAGRAM_DESCRIPTION__TOOLBAR: 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 fbc7fe262eb..f43ddeec959 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 @@ -84,6 +84,7 @@ _UI_GroupPalette_type=Group Palette _UI_DiagramDescription_nodeDescriptions_feature=Node Descriptions _UI_DiagramDescription_edgeDescriptions_feature=Edge Descriptions _UI_DiagramDescription_arrangeLayoutDirection_feature=Arrange Layout Direction +_UI_DiagramDescription_showMinimap_feature=Show Minimap _UI_DiagramElementDescription_name_feature=Name _UI_DiagramElementDescription_domainType_feature=Domain Type _UI_DiagramElementDescription_semanticCandidatesExpression_feature=Semantic Candidates Expression diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/DiagramDescription.java b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/DiagramDescription.java index 4769cec3643..7199cc8e201 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/DiagramDescription.java +++ b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/DiagramDescription.java @@ -32,6 +32,7 @@ * Descriptions} *
  • {@link org.eclipse.sirius.components.view.diagram.DiagramDescription#getArrangeLayoutDirection Arrange Layout * Direction}
  • + *
  • {@link org.eclipse.sirius.components.view.diagram.DiagramDescription#isShowMinimap Show Minimap}
  • * * * @see org.eclipse.sirius.components.view.diagram.DiagramPackage#getDiagramDescription() @@ -160,6 +161,29 @@ public interface DiagramDescription extends RepresentationDescription { */ void setArrangeLayoutDirection(ArrangeLayoutDirection value); + /** + * Returns the value of the 'Show Minimap' attribute. The default value is "true". + * + * @return the value of the 'Show Minimap' attribute. + * @see #setShowMinimap(boolean) + * @see org.eclipse.sirius.components.view.diagram.DiagramPackage#getDiagramDescription_ShowMinimap() + * @model default="true" + * @generated + */ + boolean isShowMinimap(); + + /** + * Sets the value of the '{@link org.eclipse.sirius.components.view.diagram.DiagramDescription#isShowMinimap + * Show Minimap}' attribute. + * + * @param value + * the new value of the 'Show Minimap' attribute. + * @see #isShowMinimap() + * @generated + */ + void setShowMinimap(boolean value); + /** * Returns the value of the 'Group Palette' containment reference. 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 ce3b4b147ce..18a9caec081 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 @@ -179,6 +179,14 @@ public interface DiagramPackage extends EPackage { */ int DIAGRAM_DESCRIPTION__ARRANGE_LAYOUT_DIRECTION = ViewPackage.REPRESENTATION_DESCRIPTION_FEATURE_COUNT + 6; + /** + * The feature id for the 'Show Minimap' attribute. + * + * @generated + * @ordered + */ + int DIAGRAM_DESCRIPTION__SHOW_MINIMAP = ViewPackage.REPRESENTATION_DESCRIPTION_FEATURE_COUNT + 7; + /** * The number of structural features of the 'Description' class. @@ -186,7 +194,7 @@ public interface DiagramPackage extends EPackage { * @generated * @ordered */ - int DIAGRAM_DESCRIPTION_FEATURE_COUNT = ViewPackage.REPRESENTATION_DESCRIPTION_FEATURE_COUNT + 7; + int DIAGRAM_DESCRIPTION_FEATURE_COUNT = ViewPackage.REPRESENTATION_DESCRIPTION_FEATURE_COUNT + 8; /** * The number of operations of the 'Description' class. @@ -4366,6 +4374,18 @@ public interface DiagramPackage extends EPackage { */ EAttribute getDiagramDescription_ArrangeLayoutDirection(); + /** + * Returns the meta object for the attribute + * '{@link org.eclipse.sirius.components.view.diagram.DiagramDescription#isShowMinimap Show Minimap}'. + * + * @return the meta object for the attribute 'Show Minimap'. + * @see org.eclipse.sirius.components.view.diagram.DiagramDescription#isShowMinimap() + * @see #getDiagramDescription() + * @generated + */ + EAttribute getDiagramDescription_ShowMinimap(); + /** * Returns the meta object for the containment reference * '{@link org.eclipse.sirius.components.view.diagram.DiagramDescription#getGroupPalette Group Palette}'. @@ -6894,6 +6914,14 @@ interface Literals { */ EAttribute DIAGRAM_DESCRIPTION__ARRANGE_LAYOUT_DIRECTION = eINSTANCE.getDiagramDescription_ArrangeLayoutDirection(); + /** + * The meta object literal for the 'Show Minimap' attribute feature. + * + * + * @generated + */ + EAttribute DIAGRAM_DESCRIPTION__SHOW_MINIMAP = eINSTANCE.getDiagramDescription_ShowMinimap(); + /** * The meta object literal for the 'Group Palette' containment reference feature. diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/DiagramDescriptionImpl.java b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/DiagramDescriptionImpl.java index bb89682b972..baaea6801a3 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/DiagramDescriptionImpl.java +++ b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/DiagramDescriptionImpl.java @@ -50,6 +50,8 @@ * Descriptions} *
  • {@link org.eclipse.sirius.components.view.diagram.impl.DiagramDescriptionImpl#getArrangeLayoutDirection * Arrange Layout Direction}
  • + *
  • {@link org.eclipse.sirius.components.view.diagram.impl.DiagramDescriptionImpl#isShowMinimap Show + * Minimap}
  • * * * @generated @@ -146,6 +148,26 @@ public class DiagramDescriptionImpl extends RepresentationDescriptionImpl implem */ protected ArrangeLayoutDirection arrangeLayoutDirection = ARRANGE_LAYOUT_DIRECTION_EDEFAULT; + /** + * The default value of the '{@link #isShowMinimap() Show Minimap}' attribute. + * + * @see #isShowMinimap() + * @generated + * @ordered + */ + protected static final boolean SHOW_MINIMAP_EDEFAULT = true; + + /** + * The cached value of the '{@link #isShowMinimap() Show Minimap}' attribute. + * + * @see #isShowMinimap() + * @generated + * @ordered + */ + protected boolean showMinimap = SHOW_MINIMAP_EDEFAULT; + /** * * @@ -333,6 +355,29 @@ public void setArrangeLayoutDirection(ArrangeLayoutDirection newArrangeLayoutDir this.eNotify(new ENotificationImpl(this, Notification.SET, DiagramPackage.DIAGRAM_DESCRIPTION__ARRANGE_LAYOUT_DIRECTION, oldArrangeLayoutDirection, this.arrangeLayoutDirection)); } + /** + * + * + * @generated + */ + @Override + public boolean isShowMinimap() { + return this.showMinimap; + } + + /** + * + * + * @generated + */ + @Override + public void setShowMinimap(boolean newShowMinimap) { + boolean oldShowMinimap = this.showMinimap; + this.showMinimap = newShowMinimap; + if (this.eNotificationRequired()) + this.eNotify(new ENotificationImpl(this, Notification.SET, DiagramPackage.DIAGRAM_DESCRIPTION__SHOW_MINIMAP, oldShowMinimap, this.showMinimap)); + } + /** * * @@ -425,6 +470,8 @@ public Object eGet(int featureID, boolean resolve, boolean coreType) { return this.getEdgeDescriptions(); case DiagramPackage.DIAGRAM_DESCRIPTION__ARRANGE_LAYOUT_DIRECTION: return this.getArrangeLayoutDirection(); + case DiagramPackage.DIAGRAM_DESCRIPTION__SHOW_MINIMAP: + return this.isShowMinimap(); } return super.eGet(featureID, resolve, coreType); } @@ -461,6 +508,9 @@ public void eSet(int featureID, Object newValue) { case DiagramPackage.DIAGRAM_DESCRIPTION__ARRANGE_LAYOUT_DIRECTION: this.setArrangeLayoutDirection((ArrangeLayoutDirection) newValue); return; + case DiagramPackage.DIAGRAM_DESCRIPTION__SHOW_MINIMAP: + this.setShowMinimap((Boolean) newValue); + return; } super.eSet(featureID, newValue); } @@ -494,6 +544,9 @@ public void eUnset(int featureID) { case DiagramPackage.DIAGRAM_DESCRIPTION__ARRANGE_LAYOUT_DIRECTION: this.setArrangeLayoutDirection(ARRANGE_LAYOUT_DIRECTION_EDEFAULT); return; + case DiagramPackage.DIAGRAM_DESCRIPTION__SHOW_MINIMAP: + this.setShowMinimap(SHOW_MINIMAP_EDEFAULT); + return; } super.eUnset(featureID); } @@ -520,6 +573,8 @@ public boolean eIsSet(int featureID) { return this.edgeDescriptions != null && !this.edgeDescriptions.isEmpty(); case DiagramPackage.DIAGRAM_DESCRIPTION__ARRANGE_LAYOUT_DIRECTION: return this.arrangeLayoutDirection != ARRANGE_LAYOUT_DIRECTION_EDEFAULT; + case DiagramPackage.DIAGRAM_DESCRIPTION__SHOW_MINIMAP: + return this.showMinimap != SHOW_MINIMAP_EDEFAULT; } return super.eIsSet(featureID); } @@ -539,6 +594,8 @@ public String toString() { result.append(this.autoLayout); result.append(", arrangeLayoutDirection: "); result.append(this.arrangeLayoutDirection); + result.append(", showMinimap: "); + result.append(this.showMinimap); result.append(')'); return result.toString(); } 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 b5543309d9d..8112175adc4 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 @@ -673,6 +673,16 @@ public EAttribute getDiagramDescription_ArrangeLayoutDirection() { return (EAttribute) this.diagramDescriptionEClass.getEStructuralFeatures().get(6); } + /** + * + * + * @generated + */ + @Override + public EAttribute getDiagramDescription_ShowMinimap() { + return (EAttribute) this.diagramDescriptionEClass.getEStructuralFeatures().get(7); + } + /** * * @@ -2803,6 +2813,7 @@ public void createPackageContents() { this.createEReference(this.diagramDescriptionEClass, DIAGRAM_DESCRIPTION__NODE_DESCRIPTIONS); this.createEReference(this.diagramDescriptionEClass, DIAGRAM_DESCRIPTION__EDGE_DESCRIPTIONS); this.createEAttribute(this.diagramDescriptionEClass, DIAGRAM_DESCRIPTION__ARRANGE_LAYOUT_DIRECTION); + this.createEAttribute(this.diagramDescriptionEClass, DIAGRAM_DESCRIPTION__SHOW_MINIMAP); this.diagramElementDescriptionEClass = this.createEClass(DIAGRAM_ELEMENT_DESCRIPTION); this.createEAttribute(this.diagramElementDescriptionEClass, DIAGRAM_ELEMENT_DESCRIPTION__NAME); @@ -3145,6 +3156,8 @@ public void initializePackageContents() { this.getDiagramDescription_EdgeDescriptions().getEKeys().add(this.getDiagramElementDescription_Name()); this.initEAttribute(this.getDiagramDescription_ArrangeLayoutDirection(), this.getArrangeLayoutDirection(), "arrangeLayoutDirection", "UNDEFINED", 1, 1, DiagramDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + this.initEAttribute(this.getDiagramDescription_ShowMinimap(), this.ecorePackage.getEBoolean(), "showMinimap", "true", 0, 1, DiagramDescription.class, !IS_TRANSIENT, !IS_VOLATILE, + IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); this.initEClass(this.diagramElementDescriptionEClass, DiagramElementDescription.class, "DiagramElementDescription", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); this.initEAttribute(this.getDiagramElementDescription_Name(), theViewPackage.getIdentifier(), "name", "NewRepresentationDescription", 0, 1, DiagramElementDescription.class, !IS_TRANSIENT, 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 dd90e01323a..d6cee583a18 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 @@ -100,6 +100,8 @@ eType="#//EdgeDescription" containment="true" eKeys="#//DiagramElementDescription/name"/> + + diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewShowMinimapProvider.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewShowMinimapProvider.java new file mode 100644 index 00000000000..f18656bb670 --- /dev/null +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewShowMinimapProvider.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ + +package org.eclipse.sirius.components.view.emf.diagram; + +import java.util.Objects; + +import org.eclipse.sirius.components.collaborative.diagrams.DiagramContext; +import org.eclipse.sirius.components.collaborative.diagrams.api.IShowMinimapProvider; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.core.api.IObjectSearchService; +import org.eclipse.sirius.components.diagrams.description.DiagramDescription; +import org.eclipse.sirius.components.view.emf.ViewRepresentationDescriptionPredicate; +import org.springframework.stereotype.Service; + +/** + * Service providing the diagram show minimap for DiagramDescription based on the View DSL. + * + * @author fbarbin + */ +@Service +public class ViewShowMinimapProvider implements IShowMinimapProvider { + + private final IObjectSearchService objectSearchService; + + private final ViewDiagramDescriptionSearchService viewDiagramDescriptionSearchService; + + private final ViewRepresentationDescriptionPredicate viewRepresentationDescriptionPredicate; + + public ViewShowMinimapProvider(IObjectSearchService objectSearchService, ViewDiagramDescriptionSearchService viewDiagramDescriptionSearchService, ViewRepresentationDescriptionPredicate viewRepresentationDescriptionPredicate) { + this.objectSearchService = Objects.requireNonNull(objectSearchService); + this.viewDiagramDescriptionSearchService = Objects.requireNonNull(viewDiagramDescriptionSearchService); + this.viewRepresentationDescriptionPredicate = Objects.requireNonNull(viewRepresentationDescriptionPredicate); + } + + @Override + public boolean canHandle(IEditingContext editingContext, DiagramContext diagramContext, DiagramDescription diagramDescription) { + return this.viewRepresentationDescriptionPredicate.test(diagramDescription); + } + + @Override + public boolean showMinimap(IEditingContext editingContext, DiagramContext diagramContext, DiagramDescription diagramDescription) { + var defaultValue = true; + var targetObjectId = diagramContext.diagram().getTargetObjectId(); + var optionalTargetElement = this.objectSearchService.getObject(editingContext, targetObjectId); + + if (optionalTargetElement.isPresent()) { + var optionalDiagramDescription = this.viewDiagramDescriptionSearchService.findById(editingContext, diagramDescription.getId()); + if (optionalDiagramDescription.isPresent()) { + org.eclipse.sirius.components.view.diagram.DiagramDescription viewDiagramDescription = optionalDiagramDescription.get(); + defaultValue = viewDiagramDescription.isShowMinimap(); + } + } + return defaultValue; + } +}