From b2fea412b05c90bbf2f273243f8b514909dc392d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Giraudet?= Date: Fri, 21 Aug 2026 09:40:58 +0200 Subject: [PATCH] [2453] Add Show/Hide section in the group palette MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: https://github.com/eclipse-syson/syson/issues/2453 Signed-off-by: Théo Giraudet --- CHANGELOG.adoc | 1 + .../GVGroupPaletteShowHideToolsTests.java | 335 ++++++++++++++++++ .../view/DiagramDefaultGroupToolsFactory.java | 97 +++++ .../view/SDVDiagramDescriptionProvider.java | 2 + .../images/manage-group-element-toolbar.png | Bin 21125 -> 13668 bytes ...-notes-show-hide-section-group-palette.png | Bin 0 -> 30939 bytes .../pages/release-notes/2026.9.0.adoc | 5 + .../partials/manage-group-elements.adoc | 4 +- 8 files changed, 443 insertions(+), 1 deletion(-) create mode 100644 backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVGroupPaletteShowHideToolsTests.java create mode 100644 backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/DiagramDefaultGroupToolsFactory.java create mode 100644 doc/content/modules/user-manual/assets/images/release-notes-show-hide-section-group-palette.png diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index b211e0e7b..4ee1197e4 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -73,6 +73,7 @@ This removes Rollup warnings about missing global names for externalized peer de - [releng] Reduce the log of the frontend tasks `format-lint` and `build-dev` by default to make tasks such as `build` or `start` less verbose. - [cleanup] Use only one border node description provider for all item border nodes. - https://github.com/eclipse-syson/syson/issues/2452[#2352] [diagram] Decouple SysON tools from Sirius Web's DefaultToolsFactory: SysON now defines its own `DiagramDefaultToolsFactory` providing show/hide tools. +- https://github.com/eclipse-syson/syson/issues/2453[#2453] [diagrams] Add the Show/Hide section and associated tools to the group palette. === New features diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVGroupPaletteShowHideToolsTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVGroupPaletteShowHideToolsTests.java new file mode 100644 index 000000000..87f4f6086 --- /dev/null +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVGroupPaletteShowHideToolsTests.java @@ -0,0 +1,335 @@ +/******************************************************************************* + * 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.syson.application.controllers.diagrams.general.view; + +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.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramEventInput; +import org.eclipse.sirius.components.collaborative.diagrams.dto.DiagramRefreshedEventPayload; +import org.eclipse.sirius.components.collaborative.diagrams.dto.HideDiagramElementInput; +import org.eclipse.sirius.components.core.api.SuccessPayload; +import org.eclipse.sirius.components.diagrams.Diagram; +import org.eclipse.sirius.components.diagrams.Node; +import org.eclipse.sirius.components.diagrams.ViewModifier; +import org.eclipse.sirius.components.diagrams.tests.graphql.HideDiagramElementMutationRunner; +import org.eclipse.sirius.components.diagrams.tests.graphql.PaletteQueryRunner; +import org.eclipse.sirius.components.diagrams.tests.navigation.DiagramNavigator; +import org.eclipse.sirius.components.view.emf.diagram.IDiagramIdProvider; +import org.eclipse.sirius.web.tests.services.api.IGivenInitialServerState; +import org.eclipse.syson.AbstractIntegrationTests; +import org.eclipse.syson.application.controllers.diagrams.testers.ToolTester; +import org.eclipse.syson.application.data.GVSimpleNestedAndTreeElementsTestProjectData; +import org.eclipse.syson.services.diagrams.DiagramDescriptionIdProvider; +import org.eclipse.syson.services.diagrams.api.IGivenDiagramDescription; +import org.eclipse.syson.services.diagrams.api.IGivenDiagramSubscription; +import org.eclipse.syson.tests.api.GivenSysONServer; +import org.eclipse.syson.util.SysONRepresentationDescriptionIdentifiers; +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.core.publisher.Flux; +import reactor.test.StepVerifier; + +/** + * Tests the tools of the "Show/Hide" section of the group palette, in the General View diagram. + * + * @author tgiraudet + */ +@Transactional +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class GVGroupPaletteShowHideToolsTests extends AbstractIntegrationTests { + + private static final String PART_A_ID = GVSimpleNestedAndTreeElementsTestProjectData.GraphicalIds.PART_A_ID; + + private static final String PARTDEF_A_ID = GVSimpleNestedAndTreeElementsTestProjectData.GraphicalIds.PARTDEF_A_ID; + + private static final String ACTION_A_ID = GVSimpleNestedAndTreeElementsTestProjectData.GraphicalIds.ACTION_A_ID; + + @Autowired + private IGivenInitialServerState givenInitialServerState; + + @Autowired + private IGivenDiagramSubscription givenDiagramSubscription; + + @Autowired + private IGivenDiagramDescription givenDiagramDescription; + + @Autowired + private IDiagramIdProvider diagramIdProvider; + + @Autowired + private ToolTester toolTester; + + @Autowired + private PaletteQueryRunner paletteQueryRunner; + + @Autowired + private HideDiagramElementMutationRunner hideDiagramElementMutationRunner; + + private Flux givenSubscriptionToDiagram() { + var diagramEventInput = new DiagramEventInput(UUID.randomUUID(), + GVSimpleNestedAndTreeElementsTestProjectData.EDITING_CONTEXT_ID, + GVSimpleNestedAndTreeElementsTestProjectData.GraphicalIds.DIAGRAM_ID); + return this.givenDiagramSubscription.subscribe(diagramEventInput); + } + + @BeforeEach + public void setUp() { + this.givenInitialServerState.initialize(); + } + + @DisplayName("GIVEN a GV diagram, WHEN the group palette is requested on a multi-selection of nodes with content, THEN it contains a 'Show/Hide' section with all the show/hide tools") + @GivenSysONServer({ GVSimpleNestedAndTreeElementsTestProjectData.SCRIPT_PATH }) + @Test + public void groupPaletteContainsShowHideSection() { + var flux = this.givenSubscriptionToDiagram(); + + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> assertThat(this.compartmentsOf(diagram, PART_A_ID)).isNotEmpty()); + + Runnable getGroupPalette = () -> { + Map variables = Map.of( + "editingContextId", GVSimpleNestedAndTreeElementsTestProjectData.EDITING_CONTEXT_ID, + "representationId", GVSimpleNestedAndTreeElementsTestProjectData.GraphicalIds.DIAGRAM_ID, + "diagramElementIds", List.of(PART_A_ID, PARTDEF_A_ID)); + var result = this.paletteQueryRunner.run(variables); + var toolLabels = JsonPath.>read(result.data(), "$.data.viewer.editingContext.representation.description.palette.paletteEntries[?(@.label == 'Show/Hide')].tools[*].label"); + assertThat(toolLabels).containsExactly("Hide", "Hide all content", "Show all content", "Reset content", "Show valued content"); + }; + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(getGroupPalette) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + + @DisplayName("GIVEN a GV diagram with several visible nodes, WHEN the group 'Hide' tool is applied on a multi-selection, THEN all the selected nodes are hidden") + @GivenSysONServer({ GVSimpleNestedAndTreeElementsTestProjectData.SCRIPT_PATH }) + @Test + public void invokeHideToolOnMultiSelection() { + var flux = this.givenSubscriptionToDiagram(); + var hideToolId = this.getGroupToolId("Hide"); + + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + assertThat(this.nodeWithId(diagram, PART_A_ID).getState()).isEqualTo(ViewModifier.Normal); + assertThat(this.nodeWithId(diagram, PARTDEF_A_ID).getState()).isEqualTo(ViewModifier.Normal); + }); + + Runnable hideTool = () -> this.invokeGroupTool(hideToolId, List.of(PART_A_ID, PARTDEF_A_ID)); + + Consumer updatedDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + assertThat(this.nodeWithId(diagram, PART_A_ID).getState()).isEqualTo(ViewModifier.Hidden); + assertThat(this.nodeWithId(diagram, PARTDEF_A_ID).getState()).isEqualTo(ViewModifier.Hidden); + assertThat(this.nodeWithId(diagram, ACTION_A_ID).getState()) + .as("The nodes that are not part of the selection should not be impacted") + .isEqualTo(ViewModifier.Normal); + }); + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(hideTool) + .consumeNextWith(updatedDiagramContentConsumer) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + + @DisplayName("GIVEN a GV diagram with several nodes with a hidden content, WHEN the group 'Show all content' tool is applied on a multi-selection, THEN the content of all the selected nodes is revealed") + @GivenSysONServer({ GVSimpleNestedAndTreeElementsTestProjectData.SCRIPT_PATH }) + @Test + public void invokeShowAllContentToolOnMultiSelection() { + var flux = this.givenSubscriptionToDiagram(); + var showAllContentToolId = this.getGroupToolId("Show all content"); + + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + assertThat(this.compartmentsOf(diagram, PART_A_ID)).isNotEmpty().allMatch(this::isHidden); + assertThat(this.compartmentsOf(diagram, PARTDEF_A_ID)).isNotEmpty().allMatch(this::isHidden); + }); + + Runnable showAllContentTool = () -> this.invokeGroupTool(showAllContentToolId, List.of(PART_A_ID, PARTDEF_A_ID)); + + Consumer updatedDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + assertThat(this.compartmentsOf(diagram, PART_A_ID)).isNotEmpty().noneMatch(this::isHidden); + assertThat(this.compartmentsOf(diagram, PARTDEF_A_ID)).isNotEmpty().noneMatch(this::isHidden); + assertThat(this.compartmentsOf(diagram, ACTION_A_ID)) + .as("The content of the nodes that are not part of the selection should not be impacted") + .isNotEmpty() + .allMatch(this::isHidden); + }); + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(showAllContentTool) + .consumeNextWith(updatedDiagramContentConsumer) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + + @DisplayName("GIVEN a GV diagram with several nodes with a visible content, WHEN the group 'Hide all content' tool is applied on a multi-selection, THEN the content of all the selected nodes is hidden") + @GivenSysONServer({ GVSimpleNestedAndTreeElementsTestProjectData.SCRIPT_PATH }) + @Test + public void invokeHideAllContentToolOnMultiSelection() { + var flux = this.givenSubscriptionToDiagram(); + var hideAllContentToolId = this.getGroupToolId("Hide all content"); + + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + var payloadTypename = this.revealCompartments(diagram, PART_A_ID, PARTDEF_A_ID); + assertThat(payloadTypename).isEqualTo(SuccessPayload.class.getSimpleName()); + }); + + Consumer diagramContentConsumerAfterReveal = assertRefreshedDiagramThat(diagram -> { + assertThat(this.compartmentsOf(diagram, PART_A_ID)).isNotEmpty().noneMatch(this::isHidden); + assertThat(this.compartmentsOf(diagram, PARTDEF_A_ID)).isNotEmpty().noneMatch(this::isHidden); + }); + + Runnable hideAllContentTool = () -> this.invokeGroupTool(hideAllContentToolId, List.of(PART_A_ID, PARTDEF_A_ID)); + + Consumer updatedDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + assertThat(this.compartmentsOf(diagram, PART_A_ID)).isNotEmpty().allMatch(this::isHidden); + assertThat(this.compartmentsOf(diagram, PARTDEF_A_ID)).isNotEmpty().allMatch(this::isHidden); + assertThat(this.nodeWithId(diagram, PART_A_ID).getState()) + .as("The selected nodes themselves should remain visible") + .isEqualTo(ViewModifier.Normal); + }); + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .consumeNextWith(diagramContentConsumerAfterReveal) + .then(hideAllContentTool) + .consumeNextWith(updatedDiagramContentConsumer) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + + @DisplayName("GIVEN a GV diagram with several nodes with a visible content, WHEN the group 'Reset content' tool is applied on a multi-selection, THEN the content of all the selected nodes recovers its default visibility") + @GivenSysONServer({ GVSimpleNestedAndTreeElementsTestProjectData.SCRIPT_PATH }) + @Test + public void invokeResetContentToolOnMultiSelection() { + var flux = this.givenSubscriptionToDiagram(); + var resetContentToolId = this.getGroupToolId("Reset content"); + + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + var payloadTypename = this.revealCompartments(diagram, PART_A_ID, PARTDEF_A_ID); + assertThat(payloadTypename).isEqualTo(SuccessPayload.class.getSimpleName()); + }); + + Consumer diagramContentConsumerAfterReveal = assertRefreshedDiagramThat(diagram -> { + assertThat(this.compartmentsOf(diagram, PART_A_ID)).isNotEmpty().noneMatch(this::isHidden); + assertThat(this.compartmentsOf(diagram, PARTDEF_A_ID)).isNotEmpty().noneMatch(this::isHidden); + }); + + Runnable resetContentTool = () -> this.invokeGroupTool(resetContentToolId, List.of(PART_A_ID, PARTDEF_A_ID)); + + Consumer updatedDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + assertThat(this.compartmentsOf(diagram, PART_A_ID)) + .as("Compartments are hidden by default, they should be hidden again once their visibility modifiers are reset") + .isNotEmpty() + .allMatch(this::isHidden); + assertThat(this.compartmentsOf(diagram, PARTDEF_A_ID)).isNotEmpty().allMatch(this::isHidden); + }); + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .consumeNextWith(diagramContentConsumerAfterReveal) + .then(resetContentTool) + .consumeNextWith(updatedDiagramContentConsumer) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + + @DisplayName("GIVEN a GV diagram with several nodes with a hidden content, WHEN the group 'Show valued content' tool is applied on a multi-selection, THEN only the content that is not empty is revealed") + @GivenSysONServer({ GVSimpleNestedAndTreeElementsTestProjectData.SCRIPT_PATH }) + @Test + public void invokeShowValuedContentToolOnMultiSelection() { + var flux = this.givenSubscriptionToDiagram(); + var showValuedContentToolId = this.getGroupToolId("Show valued content"); + + Consumer initialDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + assertThat(this.compartmentsOf(diagram, ACTION_A_ID)).isNotEmpty().allMatch(this::isHidden); + assertThat(this.compartmentsOf(diagram, PART_A_ID)).isNotEmpty().allMatch(this::isHidden); + }); + + Runnable showValuedContentTool = () -> this.invokeGroupTool(showValuedContentToolId, List.of(ACTION_A_ID, PART_A_ID)); + + Consumer updatedDiagramContentConsumer = assertRefreshedDiagramThat(diagram -> { + assertThat(this.compartmentsOf(diagram, ACTION_A_ID)) + .filteredOn(compartment -> !this.isHidden(compartment)) + .extracting(compartment -> compartment.getInsideLabel().getText()) + .as("Only the compartments of actionA containing something should be revealed") + .containsExactlyInAnyOrder("actions", "action flow"); + assertThat(this.compartmentsOf(diagram, PART_A_ID)) + .as("partA has no content, none of its compartments should be revealed") + .isNotEmpty() + .allMatch(this::isHidden); + }); + + StepVerifier.create(flux) + .consumeNextWith(initialDiagramContentConsumer) + .then(showValuedContentTool) + .consumeNextWith(updatedDiagramContentConsumer) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + + private String getGroupToolId(String toolName) { + var diagramDescription = this.givenDiagramDescription.getDiagramDescription(GVSimpleNestedAndTreeElementsTestProjectData.EDITING_CONTEXT_ID, + SysONRepresentationDescriptionIdentifiers.GENERAL_VIEW_DIAGRAM_DESCRIPTION_ID); + return new DiagramDescriptionIdProvider(diagramDescription, this.diagramIdProvider).getGroupNodeToolId(toolName); + } + + private void invokeGroupTool(String toolId, List diagramElementIds) { + this.toolTester.invokeTool(GVSimpleNestedAndTreeElementsTestProjectData.EDITING_CONTEXT_ID, GVSimpleNestedAndTreeElementsTestProjectData.GraphicalIds.DIAGRAM_ID, diagramElementIds, toolId, + List.of()); + } + + /** + * Reveals the compartments of the given nodes, and returns the type name of the payload of the mutation. + */ + private String revealCompartments(Diagram diagram, String... nodeIds) { + Set compartmentIds = Stream.of(nodeIds) + .flatMap(nodeId -> this.compartmentsOf(diagram, nodeId).stream()) + .map(Node::getId) + .collect(Collectors.toSet()); + var input = new HideDiagramElementInput(UUID.randomUUID(), GVSimpleNestedAndTreeElementsTestProjectData.EDITING_CONTEXT_ID, + GVSimpleNestedAndTreeElementsTestProjectData.GraphicalIds.DIAGRAM_ID, compartmentIds, false); + var result = this.hideDiagramElementMutationRunner.run(input); + return JsonPath.read(result.data(), "$.data.hideDiagramElement.__typename"); + } + + private Node nodeWithId(Diagram diagram, String nodeId) { + return new DiagramNavigator(diagram).nodeWithId(nodeId).getNode(); + } + + private List compartmentsOf(Diagram diagram, String nodeId) { + return this.nodeWithId(diagram, nodeId).getChildNodes(); + } + + private boolean isHidden(Node node) { + return node.getModifiers().contains(ViewModifier.Hidden); + } +} diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/DiagramDefaultGroupToolsFactory.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/DiagramDefaultGroupToolsFactory.java new file mode 100644 index 000000000..90cfca884 --- /dev/null +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/DiagramDefaultGroupToolsFactory.java @@ -0,0 +1,97 @@ +/******************************************************************************* + * 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.syson.diagram.common.view; + +import org.eclipse.sirius.components.view.ChangeContext; +import org.eclipse.sirius.components.view.ViewFactory; +import org.eclipse.sirius.components.view.diagram.DiagramFactory; +import org.eclipse.sirius.components.view.diagram.NodeTool; +import org.eclipse.sirius.components.view.diagram.NodeToolSection; + +/** + * Factory to create generic group tool descriptions which invoke the default/canonical behaviors. + * + * @author tgiraudet + */ +public class DiagramDefaultGroupToolsFactory { + + private static final String HAS_CHILDREN_EXPRESSION = "aql:selectedNodes.getChildNodes()->notEmpty() or selectedNodes.getBorderNodes()->notEmpty()"; + + private static final String HAS_HIDDEN_CHILDREN_EXPRESSION = "aql:selectedNodes.getChildNodes()->union(selectedNodes.getBorderNodes())->select(n | n.isHidden())->notEmpty()"; + + public NodeToolSection createDefaultHideRevealNodeToolSection() { + NodeToolSection nodeToolSection = DiagramFactory.eINSTANCE.createNodeToolSection(); + nodeToolSection.setName("Show/Hide"); + nodeToolSection.getNodeTools().add(this.createDefaultHideNodeTool()); + nodeToolSection.getNodeTools().add(this.createDefaultHideAllChildrenNodeTool()); + nodeToolSection.getNodeTools().add(this.createDefaultRevealAllChildrenNodeTool()); + nodeToolSection.getNodeTools().add(this.createDefaultResetAllChildrenVisibilityModifiersNodeTool()); + nodeToolSection.getNodeTools().add(this.createDefaultRevealChildrenWithValueNodeTool()); + return nodeToolSection; + } + + public NodeTool createDefaultHideNodeTool() { + NodeTool newNodeTool = DiagramFactory.eINSTANCE.createNodeTool(); + newNodeTool.setName("Hide"); + ChangeContext body = ViewFactory.eINSTANCE.createChangeContext(); + body.setExpression("aql:diagramServices.hide(selectedNodes)"); + newNodeTool.getBody().add(body); + newNodeTool.setIconURLsExpression("aql:'/icons/full/obj16/HideTool.svg'"); + return newNodeTool; + } + + public NodeTool createDefaultHideAllChildrenNodeTool() { + NodeTool newNodeTool = DiagramFactory.eINSTANCE.createNodeTool(); + newNodeTool.setName("Hide all content"); + ChangeContext body = ViewFactory.eINSTANCE.createChangeContext(); + body.setExpression("aql:diagramServices.hide(selectedNodes.getChildNodes()->union(selectedNodes.getBorderNodes()))"); + newNodeTool.getBody().add(body); + newNodeTool.setIconURLsExpression("aql:'/icons/full/obj16/HideTool.svg'"); + newNodeTool.setPreconditionExpression("aql:selectedNodes.getChildNodes()->notEmpty() or selectedNodes.getBorderNodes()->notEmpty()"); + return newNodeTool; + } + + public NodeTool createDefaultRevealAllChildrenNodeTool() { + NodeTool newNodeTool = DiagramFactory.eINSTANCE.createNodeTool(); + newNodeTool.setName("Show all content"); + ChangeContext body = ViewFactory.eINSTANCE.createChangeContext(); + body.setExpression("aql:diagramServices.reveal(selectedNodes.getChildNodes()->union(selectedNodes.getBorderNodes()))"); + newNodeTool.getBody().add(body); + newNodeTool.setIconURLsExpression("aql:'/icons/full/obj16/ShowTool.svg'"); + newNodeTool.setPreconditionExpression("aql:selectedNodes.getChildNodes()->union(selectedNodes.getBorderNodes())->select(n | n.isHidden())->notEmpty()"); + return newNodeTool; + } + + public NodeTool createDefaultResetAllChildrenVisibilityModifiersNodeTool() { + NodeTool newNodeTool = DiagramFactory.eINSTANCE.createNodeTool(); + newNodeTool.setName("Reset content"); + ChangeContext body = ViewFactory.eINSTANCE.createChangeContext(); + body.setExpression("aql:diagramServices.resetViewModifiers(selectedNodes.getChildNodes()->union(selectedNodes.getBorderNodes()))"); + newNodeTool.getBody().add(body); + newNodeTool.setIconURLsExpression("aql:'/icons/full/obj16/ShowTool.svg'"); + newNodeTool.setPreconditionExpression(HAS_CHILDREN_EXPRESSION); + return newNodeTool; + } + + public NodeTool createDefaultRevealChildrenWithValueNodeTool() { + NodeTool newNodeTool = DiagramFactory.eINSTANCE.createNodeTool(); + newNodeTool.setName("Show valued content"); + ChangeContext body = ViewFactory.eINSTANCE.createChangeContext(); + body.setExpression("aql:diagramServices.reveal(selectedNodes.getChildNodes()->union(selectedNodes.getBorderNodes())->select(n | n.getChildNodes()->notEmpty() or n.getBorderNodes()->notEmpty()))"); + newNodeTool.getBody().add(body); + newNodeTool.setIconURLsExpression("aql:'/icons/full/obj16/ShowTool.svg'"); + newNodeTool.setPreconditionExpression(HAS_HIDDEN_CHILDREN_EXPRESSION); + return newNodeTool; + } +} diff --git a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java index 3a5568baf..dc6ae87f6 100644 --- a/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java +++ b/backend/views/syson-standard-diagrams-view/src/main/java/org/eclipse/syson/standard/diagrams/view/SDVDiagramDescriptionProvider.java @@ -42,6 +42,7 @@ import org.eclipse.sirius.components.view.diagram.NodeTool; import org.eclipse.sirius.components.view.diagram.ToolSection; import org.eclipse.sirius.components.view.emf.diagram.ViewDiagramDescriptionConverter; +import org.eclipse.syson.diagram.common.view.DiagramDefaultGroupToolsFactory; import org.eclipse.syson.diagram.common.view.ViewDiagramElementFinder; import org.eclipse.syson.diagram.common.view.edges.AnnotationEdgeDescriptionProvider; import org.eclipse.syson.diagram.common.view.nodes.ActionFlowCompartmentNodeDescriptionProvider; @@ -431,6 +432,7 @@ private List createGroupToolSections() { .build(); groupToolSections.add(viewAsToolSection); groupToolSections.add(this.toolDescriptionService.relatedElementsGroupToolSection()); + groupToolSections.add(new DiagramDefaultGroupToolsFactory().createDefaultHideRevealNodeToolSection()); return groupToolSections; } diff --git a/doc/content/modules/user-manual/assets/images/manage-group-element-toolbar.png b/doc/content/modules/user-manual/assets/images/manage-group-element-toolbar.png index 1449dcacac97370118dec5d318152472641cf5c8..6fa6e2a6a8cfe0f70a686e3c2c123d70a35a1364 100644 GIT binary patch literal 13668 zcmd6ObzGEd*X{sA3`h-9O5-3UC<4;0z#!cqt%Nj6cO!@r11KQ_B1ornhm@prgCHSY zLvtR)z1{n~@AsX3&iDRt{^1A1^Q`;6*S*%dt`+k_NkJMP_Zlt;1j3hwuI8e@mW215bZ``9ZVnodJ;$jeGbQp*T43{BNl0b+-Kww`e z6pSE(DWQYJkpW;dm=xsSK6*nAQg<|%Ka_94c_Cg&!p{eq3WkH|a1ar6$N*+vC8aU@O-Ja#@*R1Q}dDieOcKT6Qn-u=2liz+~!2r@#6H|SUO8=CM&H+i|()E&H)#U zFM2%MQ))Y{zqmbSnJ>Ka<*q}9%WcP%0pQtXL}w(Uw0TZP5~wX+^kkOsuIZNlw%p-0+sP<%AZq}uG>1zhz zTOaG!w4!IU=Lf;(F0W)KY()|3*&2I4hVygrt$Xt(nm}Hg{NVa?YxdgISheYC!g?sB!@H;$KRwlN-N=8EEAQw= z(rF8)7d>q^3*>Z7P6>k4xotgG!f9ph??j?To@%_mI!eOy5E(u#IBE zWA(MUl1U^qS^ENeP38Rrrzs*X?(3S^lP3#Z_omrt!)PUguCTDMq$pRq?L9rzQjlG; zHSpu|#q}MLs2X4{rD$9$o36DUFGa(^vKlE67fEM%adxrw=bAEQ!N$r+y{A`o=O{hv zc18v@^`D{6kN8}eZS2pzJ*U<}-)Wws^co~9!qw_L`Q_&DCrSI)QZD3DoOpeDO?-a* zmG*gEQIGc|xlo#A+R<9rtwKzA2p3J&#}%__FWwQFo+Z>;9L>o_Zo~e>gRJS=MA#OS zx-yPe9aD4HwA@j`kbth8Af;>J!5;@Le|yXm$JdMumjeQdAhM?*;Ad(G`+ zpXAhs_}6C=(Hypt;HOJlCKeJcC{8n7DUuLy# zvIRxA->~Py{LhNGs<5?G&0BUNZ{sNAUXZzLTUJsi^Ocd~a;4yCUiq&yQUqljg$f#1 zGVF5bBOQd&XceA6omw)k;EDb9lt0xgHsAr0py;I2_sgQS$25x~ZI;DVlM=bE@00Cc z$(nrThi$~_R?jwbHU&jEMi!`kll^(v+qRMfH~qA3X2&+YaEOmen8qGu=`NbAvOgN1 zPV_)IlSs?98Ab`|6x38Ur&)MPnQ9U5I83w!-)bwJ3^SX+Yf5fiDP%-ta zQ`^et*Oh>mD#i~k6^rS>$KNcV{Y@zGsih(fzXJos0EhD)PDL){ zy28F5bh^Ws4--37$avHzDvyjXiZ9WRE;zEOoguxwBV^5Pta!2a-1D%hu3N{nwe>E` z*-CSXMcDF35A=P zh3oe;I8F>bCBKpH;b;6iH(Tq0x%jjw$-aAgM zA;Qqr7u)8u>0uedf>d0{9MyiIc#~UJ3D!98*_xK$>MB@p;4i5?6sD{ z=c_K0)!&1n18fsPzBdRm=-P~;WsM11FSbFWfERjdlKJX$f1gRl_by%k*{hJh7^F#& z!<=y9P*Rp<#AlVYzUa3EHzPv-F2bHh!M09Stu!|)$Lf5j$Wym;eX{z=MtYY!uT7T6 zY4`$#LS)2m3+7{DyII;~A-TLBm(Jm}lS}HI;qr{X<@#0c^ZC6x@9oxhT12cy$4#Fv zvOjN__w9}Eb{7X4pOtdfdiFhMtQe)V@GgEb2HSZ}r2N@%Luk^VAZymNTNRG8*1xXw zV!eQ=rrhvzvS_MHpz&vDXq=hH!8RMM$a!NO?+gJO?&Sr`Gri!aYJI%W?8MhcJ#@U0 zpDXOPEwk3%B&|Rt;8Fd(x6q%bHH(nuv^7z^yeTx`?>Yc(Q(gU&cVe|&KP`E$C)sOq zW~N&%_S=3K*iRQo#J>NBfsD zmJmvQs)I!qm2}gQ>Dy^1$KMc|vbccvzhPoy>~3O_Xx@5k9ZdL|2pvNiGaJ+#1zF3L z5!k(@M9`T#R@lutmA^GPobzSZ2{Y%F>-*vMu2~sP`4@>_3(?>q6n7CsPSZE0_z%xm zD1$tklXPygxL{Muj%2tdTh7sxz3!0g=po-SlyGN@BJjl9RgKf#`&KNyGd6J&U%WHc zWxY*v`o-Fm4?8!gI>FX7SK<0bw>zF$vB;d`yvJUXv=WsMl;QIg7|y~YZVYt~4s>^a zISDI!a0Hyr>3!LgWI6&Ccc~yd0j!s{w)gu}Y<;~79kPQ)7LL{3chswz!>&&$SCx*3 zmr^y`_+oj*KBpcQVvtbL-84ezA_GG1+=p;bnwf3>hG4C3!_V@_j57T|`s{8ZbwIw)Hl8YNq zo^ff>jd>>YrnbHK-E{3NN)pX)(!qGMFXC@u^x#Zw@y^ND*)q{PUX3xlHLU};TQ8Kt z=EfOl4aykPj(onPi!_Lv$bx0lrawL3T&bISd^&7hzMP+ulp{aYH@c~CRq!jO-!Spr z*bMtCEg+cGOGhUMNeF@E;4mG%rm9LrsBH-{&fd-ULn^)QrX~I%%h~X+)A!*8M|F)&x3{w<{F$7bOdrWB&)DB z`I1J-rVSU}YjV4%V(kJl*gEy$Cf~7`uxb&AXKZ2+Vv|s)3UMh7g2hTEgzY}J!xBMQ zJF>L2G%M>VYJHLvbb|=42RDS9Fk!*1;I{UaAlPGg4qjd#ydVQSH z{fa6#liy=TY;S)}kd+NJKqd5i4&2pnohYOk^8*L$_J=#LyC1k=ydUnt_>(#2hj4*Q zq{t1(nH8CVBir|8n?7+{?XOQ7C>Iv*xAo0XNYX`7Aif~_5hI8x#5`i9VG(y5$HEh^ zE?;PocsxS^cH0;1=bEHcYB*B;{?G(%Uty2#L#YejVHT&f53P@VX&yl(>Q$Y!0-Ah? z*$PEZkydh3jZ)20Z7g1RPo;46rziwOfmk7t&wjowa&6q%um&f^{*R{?JyL;-xq?7m z(L{F->uZm`X=!OmNGtLZ#u%_KE^8yK_%ZiGiJ7gKA5=#n2af}Re93(u>B@~Cm6eqh z?;q?ZX^zUvT3KQAh%3#6jo|yrNGbhXUUf{41k*LKgbPrC806_D3wk(s|Ell$o2=|? zfC5u{)Gg=KReK-8>XydrXZm55=FWYMF?t+T{yI}0r~WgBl5}&l7dk;~BKB8bNaPK@ z`gxWCqL_M(@K;p)Mc(IUp`oEO2Zw|8Hw72=G7cuceYHSs^?e<&Ih)DwOCk=D0)G&I z34IXO75sDeL1_UbH-Rwv{9{oOml}jyjt;GteYUA3xqlrSFLZ=`c2AQWEXYV?#`TI? zkbmVJdWUT0>A{vND*V8+APM_Y9!wMwL0rgDuH<*^5oC3Ad+S@P<{@L(SsJnE-?-FBDyFt7<$M+$+B9Qr34_e9@3vB6q9Ti;r?a&|duHZ%h>+-%4Z zvlxZa4vfN)0U0G3^F6c2N+}m6I)I}t;p*!85n7I6+Wkhl>h9St%{cY>JR7hHDFwe= z@+WD)ftkg9-;hmU+UBj;+t-y^kE!%xt#t^CJ>^nC$1g>l6(UZR(OWWA_h>nEcx=15 zj*~GWE-paiV8{O@*(-noK4uQ>H=f;@&SaX&(+>+xj2XC!VzRH1@V%5B(oK~0GiJRV? zq8NU>W|Q<+NrJxXe;1V;1i}YjBiPSsifh<{y7nge>@p5gY6_(u7k1@%T#U zjhk(`(D+RzH6k`7IAAvN8SDl*v$*8N?`SY)4463%!soUS68r=S#`lF11z`ih0D+{x zc+m%n@P%^U2#11hgPFzgfw%gZ#n*9tUWq|E#30vzazm5v&qsi4JP6~LFwhljxDpn; zmxvjSg5VEXx2b@D^>bB2J|#acCBGmsNWIHRJ{!_GLDc zSR;Tbi|qDFw!Wr~bHCTx<9)Vs$K-Q?^-&)wIeC7;Xn_&NDaEPh-I*76@n>zs;e0=GiaF{|97eH*_2t4B-?`^`=sY`_ zzbSh7`Ce_I;}4Be_f~4>2njq05aw)}}2_c9NkEIU_Mpio8Y zGJ|#~_DtyfWaoxY#yhuAFE@2{b?*CGRZeSW$)5Z3(TY)~Zm4xV4GpH`ujprs-&_5n zG02|Ftm8AFUs?o(uR4ZcH?UJKpoH#$cLtkR5$z%m}eWXX{$FI@mk1aA>b~dB?7(G z=ywnjre0yeX}uEjzSrI-Cag=ep1Z`B7Ut$lBZc2OIqSY0bK|wo4C&f_NG2T(d%ivK ztcPcGIEC^{zW3=5Cil!NU_HhMFC%)a2$<<_0@n7Jw^5uS=0KA&-ZV~@qOx?EaKT5s{{k~By60#D|EE<-g(lIe7a^OEBg)9 z>!68t`!is5uV{qhH`0T>q%;jY_aq60o1J8Dt@^2^KTM&WVaw;U#l3dV=20An9+#&e z2_k|7a9ghHvvkDG(vZNwK((!wSR}Mt7&QU7g)*S9I0LT=;LIM*TXQWym1$DZ`$)Cc zPHNf(Fp~3=MbRCRt|Ie328VjUaF-W(ZKtXM=)A-BFj*wY(U35C+48W*lIHKKDz%w} zXH;)}zFrMGaH#;wG|L8Wz@Ch1N#~~<-ksQwro7KRSBQ?h(zvTpQ|Xisp4sP@l)F1={L)K3Y1+tuM8FH9M{%%Uh{;1f@XD7$n^8FSAMdEbi0V!j zH~~vXKRZjFNl+Ty8Gi}Xs^()f^<}3K9>~nhqN1qpM1-Oz1s+JutK{U1i;K}%K*i4P ztNgvl8Ue=@sj6bruBfU~ieD!XY7{?FRz<(rs4WqFs-GmsQ85o(ce0=}M-7dL+`&*; z?S0Lvxlp#Hh4w}6*4d`u7Ym&4O7$cv|N0C2 z#kFtqQ*;c#y{kRo3*pxWift?7X){Hg9MSG&Z$8Myi2y~%vPq}$dS47YJUq>O{adKE zL{c`5hd_+FS9jQTikd#p5Iwa3uEpVX$Qx1bvzZ2eMYFRF>YBaJ!Qzw!Z+6zXD(;2g zT%tsgTH`xm_jzyX@h5=GI@tD7RXJ;5o;$wpm>hHvC8EAWkjI%|P}Dy{7+_365 z2yQs2o(Ku%0iaO!J-C7mB!K=;Q0*!L04*P}8yxdOPJaNR7zNaUrs|JX>8?QdU+Z1s zU3&#oU}2Atmw_lUII)%E4>-h;l;}1Akof{80R;ez$a2Vo*ZT||pg5B=N)Kscq5Ga9 z?%(V59Zj~FDioh97nZ;MG3;^l3Iz|)s?c74%faitnXf7O5vP>Vf#T1_qr##4YuQIl zwE8YfDZ#GQ2XnO9Sy}$?@5o0$O?w_~FN>753^lE$#vAr9r)tAo3hT^YIA{k$jem>gLAk-+GpAtoaH=c@^SkGzhG-JVd5p%7R`MVL*39%l^oxafmn@_M?y}QW25<-G247S&iDGvGs>jeh ziw>sM5;xtAcNgnWWKu^JcWT&uY?IVDTP)+pqnnD-^F(!(6JIOJ&8gWA@O=I^tpLth zjGRF=_)3S{)}7iE2&;!|@Xd9KPg(h7GZYLkhTixHt_TrK0e&_MIz%Nu+*F-E3!w=3 z^V*r&jM}4K)40xG@bJ+0c|cNiP4vt~+fFP!G~!-L<-LPU+-x?C^x#cxiBJbZ*qiHr z-Yak^K;#zMYK{g1wXnlHvn9VrxzqN1+{dk%21!6?3{P{Msbn`ei*WNkF(;=!*6rkx zpeN8oCwoPt(&oB)Y1tt~P-b4Mk%NP8=Vm7d5a1LXEvky)-m8U$k1?MT611ridsMRz zsBWcj!Cc>e8)my9w%Msvjf6eGh6|5&UUDuczX`G$WdACHVZCzJnVCEMG5 zK2jQp`{Y#7Da0qLJkx37Ld~6Jz2z>^sLv^4^rh1V^Mab%klO57`H!+!e*1_Dq=C=t zWPTv?tBy@zgc$@!itV@7r1Am;#&N%9oWIB^csdwAqs)Q?H^2SuVHWtXfl=@AleoGs zk80ekHzTepq0fE!{eDRllqjS;@XuQigZ$O`0A@`8+iCzF91*cIg82uhHIn)B&>?;o zjx0?FCI9nM&|!b|bY-CRCh!Nz{=eqM|1@g-ABZ;4-b=uJfO!_!sT}yhp^RNifME{L zO^efOM5W@>{gSzC^vehYC}n9^+#gHNY4pkBSnp>bLOZXG!BCwMhU%YSckJ^<5TvQ-_y&~UhFWcIRqu6MC;GkcQv%TgneNL82#j2?Bt7687jMdk!jg1Vb z>AU0#4wgF&F=e+@UbUPh-(^l392OocLrz%lDa?lNhb6Xfc8}Ez&v@kaYCefO^Lt?< zsH!)niCF}s%0NaDVICtkOv!6SK_V7RKn+-J{g^1gHmj?JhP=*CQEY^zyYPZnm6&A~ z-BKB8+xXL^3mE#%iv&M5^mzwQ%b96vt*y(+w@S5hodt9a`YMnIb4>=U*=Gt>);Xs7 zq#>Zo;G3#0Auf)VeGHIRCvEM~iHc`}POBrCsu`GgWQf>UuLU*(BWa*O#hyIMd znXNouNDIJlzJ?5h58;`=g{su5G1FuJmbx+RyZRb^YX>&``Y5ha@S(J=0RVt4As+0aTZnk4y<1DK`la(wueY^$FLV?_D{b056z6U3b<#Zi{5h zOgOKOWngQlKsk4OsG(}ctI^eOS=pF;7e;9N0lPY-MU#E#q_1R<;>@Lj5|-wYsU*Si zD^b+}x?7(6+VL=@J=^h8>kNe?8LX1N&t4=eX|mDtQ*VjX{Ek1?v*fR@M37dO2Jsdh z{U~+6i#4R}l8_m80IGM#pStg1D}k@-=N`z-$rA%rsbh`c`Q;u#&=8;m17x5`$zXyL z#X&6mYbEX|n+jS`#V_;JP(cUDqWuvl{#o+-Po4b#m6{;I|C(_ByESh}zz#%>-+l9N zso7g@Xo~H?Ml-+D@}qQUaIiC1`!cte34lk4$WIw{H!HZl$CWz`2R&}vw~m<;trt}RXeKm1C$s)jF|X{c{rUQPas@(t$(X7kJWVq zjXG--$`FgR0*GhO_4jR2gsL1C3EV z{9e+u7Ups6JiXQKebVO6&~Y*Hj~aK`uJm}vmo7AA{n|(&bmAtqm2@@AImXbDXyYhX zSx^gun8V1rqUWAS<;(BTkkOp3qJ(StR*}Fu9%i#sz@jbd)Aok?%N7+Qz@xVvuyPhuDZgaZNNmUdYJ@A zXejv=lijHKq4tPxP8C~p=mc3{cvbLe7a^|c9=*$gmESKaqSZP$uA$*B(2pbAv5J8?aX8#u3jhejAW zAvTt$Tzg-;P1bnoe(+!yykxZ&FktwE|7%8f-bkUQP1m*my595e%Cjhe4zoE z3ueWmea-H?W8&%JF!mbG!CB4giA}ln?45A6q7|8+r`YrO9#@-NOI0FG26wiu=8x-W zYI2sD;{P&Swg!VRYuSg1Y`pD>;;`Fjz%Y(+&%ZiL{}?=iwf1)S45sp`p}Myh-gFuA zkyWAdsb@3PHpX#C#9m4RUZDT_nWqlPWLLZG^{pEYyP=*}RTnj~c0+Tl zhw&S&>N$E9Xf?_g;`$_DZC(zwWF$VDpC-sR_GEV^E7s=jEp~G)9VlxT4%T%dMmJfMLo! za0CtO@I1y*OXP3Y>thq=s9J}Il=U;HKh}mcvWDga6#UTjyn)>olSKbRsy_FiG44BY z9@rp;mMM?XmH1>`B8D!9@h}Zt!s4SX)rdFyX*mt8u)0V(_>Wug9X76lZ&z7(tCMbp zrmIFSIHLi6sWJ3kO=7b-os2c*?M5EU2Pnk}C4}Z?+Iw?X+2L0h?oN~{MYRwA6qEZg zfXOWP^R19=tNOsQ~x5nrpJ@#pL8{j9!`D+2Y#zkSltmgf)V zGNkVJ?AykGi2G?Bff3Xl$hi>+%Y9J^r}}I{Jug@EZ`{trgeg4&%_`i zgdgl^%!@oXPdhiNv!uO7WA(NR*)M@E?NiK5UNGMig-1DrZ-reHeKH@p4UXoO&bd1t z+z(i3*WAfZQh)O_b|$Hz(^CR(n=an$AYQ5X>+7CLO5 zo1Gn}Tl^>YH1upfDfp0bs}#!g%1+dID(^eN5WSg3!%DgOf-82N+)`dL%7{m}2I^4^ z{?Ss9FJhI71pmP8#tTu?p_3@J&0d{yRXUrokJP>72mqZmBu8yl*=nGYR;*&IG7=`& zC;E1*Et{0_vWM4ii6*s;C8;xJNXj7$55@ReJkdl>!7*6I=<3Vv!Q@J~e|K}>*36;n z&ACJ!mNTZw>Q60lr*HKRH4@}6lSp6L>8QL(nta!fo~7YD@Su@cul3$tq|GcGgFpBw zPjTbsNrr{4NDl6$*F>^4v}6w$^*|@kskOdlq}omwSA7`eI9)fvsC{~)JSDIge2B+C zOg@z3A_mzC?BF@{@sghp`UtdmFWLz**(?pd33QS$zU!~9jBpX34!@;zu?Z1_xOhb{ z1Az&9pH@!8+S&)YpDw`Jwbxi(I+zPM_j*gH!EP~+mrm}3?+$!Z%^>DpYBMb*9L!C7l6JGgcBL~ zoVbjVT)9GQJCrjeBeFDUz4TdSgW6L2G7AQjS5T0ZRmR;D=Ew@;3-;&C; zV}<@F1-h&WSd`;p520*?ZpTdpRL~yum#V9v-(j4oXBZR?Ua;SWsyY8Kgn2j z_1NH0)};RECqzA7o}S-Z(lLPx=(I_M~4uBSO&S?4&898>B(aAmT6?yhm4NAJHgDumj}yC(J$gJIt}t z=O6^t`AlG7cy%BfhHW3qLx_U7*{!ZFs0u56FV37;-*!|UHTM20SK4FGw;m56zmB0U zVb?XOTSS;S=H%WH_`aaZp`DEdF=Oxq0JfAPh&7ns>^Gc+ulD__wkoqWu+^g5*qf2y zWH8_fuL-)L*n7aW(#^GDA#BR7nTQ$pM~Pmu%q`K6v+oT06Gf1;VNchcbZ5KG$61fU zXgkq=t*_>%J|Vf1uByA1C14+LJf)-`zb5GU<2A*qQy+6qyxfn2#wxiaX@VkF_Ue0C z{g|%yiXQ?Zf=L`q+EAF?%>RYANqr31ZBrk|%-%-^{u8g8f60R8kCjg*tW4{iYz`gWmW3={lOWw3)Kig?CA`{8Eq8fvF>)P~KL9){6&sfII#ir}4Umt|Zav3*D7c zX$1ObsMXP8*B#SqH-Yj`6d)4sa<=MXjwlKWw6Oq{-SkKm`{s)!Yi)f?{zGR+$Nt)Q znX~O@T4NsP?$$YMYa7sSYl9#RQ)8TPkk^mYSEp8cYaQ`*`I(4h%YaaA?P*#H9*XHC6?t!iv=y z;qF4Z-B+2#b(>$HA7B5zva*sS=o}jxo2T>XX&L^cdS8;-k#l-c=oj)ZsS$dO^wCvc zN0T*U+R}!>M)t~ zG!46cWkph0^vI6?)6To+)I-6xA)9Qy%4ejbq)T#@9jOZYJoFfHm09u*9D zFQt8I{h64r=~wQGbfaSXZ=XL|4wI3R_G#%9J#L?C2_wIyvkP?i*}-)CN~tQ9D*Y-e zD(I@$RDWwoRJ#7EI2yC~Gby%Sp?G06AuAi(`>HJ9>juCCLH?tPqBc`ZP+{-_ zE9}-^Xa3v+d|-^g3{97jq#vL4x$fxmA5tVMV`F1Lr>uz5+0~UFKcfq1;*OQPSTBa7 zg$N@)BJvO=h)P7g)oHX!JT##{p^K1t)^)q{J$f2Y?WXO+J*hzN%CR`P7+0&TjQ>8y zoyv+PbM^8i#OI62!IMKY51?*k2=;I($msH@6jQbOjx`t3Wdt%N>{O2}L)0Ta&&~Vf zlQ&@Fib1d%S|L^8sauj|YI_`jdk8?pB#_S+GUY73Joaf9-xq_JHeg@z4^O2F2Q@?a zRrS)EV|QpuD3}|h(zY14FhO@7bZd$_Q)k&GL6>7m~b zIqH}>)6pGm*!kH*ba-O}eR%w_w&`PI2iwQ4cORkXt~^4a?49p9Jhr@b5PHOLcZQS?b+!ECGyLX!n@3>5YYsQZ`# z(Xn9cMZ^0*XO<~}&Z{p{6t1{%nHfI6LLiGRRb_m8csoDf+IB3GB;#s2Fgj{G``XQ9n+~`+Q5fxchikm`RU5ta2vjUV``}s#=Bi|YEVVlUl{na7k`pb;kHxf_+XQw`8%}J5z)!# zw?CIwlOM|!f25?#0IKdz_31Z9Q`06+x|k>HwS#p|Pqn zreQoU8e;M@Ukj3KnWV34=eG#RML zY0}vc0g`Q)4ampB<8POkd={|hPM_;MB_=O@ z{%~(-0%dRb)z8g<0cil}Ql-t308^#GM6kRQyJ6bw`)756Bq?V4D@A(UW_btmMf3e7 z@9mqk^un*l+2pBSGRtHB;C(OwIl;H@p9xlSzu?rsJ`o5z6ba_t3+AvqF)J$!k7zJH z1F!wa_a*6{4FH=mUMn!>#j>He{6IvEFgiWBRZjTPjWh7kRfCW30wey+K=v|;S7q_> zT4&ijT%o`ANL5r(*y}ej7~KT4Y=Rt$v0uu16F+o4;m^i4i-N10bERWPY8Pq({5HY* z!@;s$fGrUBp1iLpT@IC-oS&(u25n%NA)w?v^L(MUa7))z5x^?vj=hgxQKk*z7dnbt zbluiDzrA1R`O+02lCF_<(Xvd4*xO03TQ^c_{`XF!0Jim31o*McS(yXRU~(#jmi4BRd814~kuCM1Vyr zDQ$9cQdEN?dytp)&pvjzp=btIyEO=~ZeB$XbAWF7i2?V0okTC~|i(9;{&Q`QF{2`L5q+EX zi!G*h1ui;3NKAxH3Je)fPIqXb{sNm@HXv^>_=_U>hbj zFy+8id!t0nYoi>k_S^u-^sGWh*Ay~%sYa0RoJ&~V+*Zt5vXhYoVQD{J#gQuu4%Mz( zZ7Y~Bc0RNvMN}bO&)52G2rt=<-5yyaj=2ttk*>!lp`Bmv|0y<J9sja?SKGLM?C;#{W+YW+$?Xl^A%m5oc+^mkqQV2gZc%YdpV>W*R+SqijnYB-X1|5qF86x!}+u!DGWhcb=Nve^5 z&Ci77y-=O*<87;y@^$z^%GXD>m8!WaX{^Nq;mPEAo^%ovT!cgaw!TdA9*=Ygt6>Mv zr}w)|T)u{Q@XsNOBS(#1IVZD`X3A*4B(Rp$Tv5Spl}LMK5Lz2vb+Zgh= zDU5XKF?-v&grrYZLY!?y!DzC#oY>RmX@M=%XMddo6?>x{!NlJnv}?oLUKnqYscB?_f9|DQvp zrpGNCF_{5NyzQTMUi7ZZ2b-R}L}-NKgEqVrlU6Ul4c=MA5vL=M{WGKm(?Mxr=}tY& zuc}2PPW+Z_;y1nsO>LEY?Lth}V)mT;PP&OlhisR!Z0KvH+24(seU$o|Yb`68 zOiC0u9Py0-OK)@1PGO{IZ&$cgy-a`d8z@s6C9XtpA2Lw=_1a%);rC;#HJbeg%A!I4 z%%*^2938Z|N@=fc+Q{v=_kPY(6e1t zHhPT?)+sLcBO|M=pUo7?>kjXBn{Wsf8agf*sVtL{dJxZ~5XkGbP)Cw>h#{Z*Qh}zV z53c&0r*(8YjA)SWW|(8YxhmDlSe7yAL&<+A9+7J`Vc4IGNt z_qf{F=Z(@ncVKmQfq-PJwvFf7LbqePe%VLwkYDd{^VP*f=DJ7rM+bct8r_PjByg=J zX3D>VJ0S?|u+@wiLv7FL7pH3??oHrFIbtKd)?~*@w|~joMy4KVE6Sg@vOK*WDpfxF zn(`8zY_(Si9Q%zZ^s)uu9WCdwd1|X4zWU}qkoNu~W8=!ZVyPG5^QDE}@cxwygD&p@ z6k0R2#bmdz=(zz9|D8_B(PXP;r(#@AXmHLEKTL=$k zpv%yzIO;bR)Td|YK)R9c_R-QS3tR1d4()fwjNWanw947VdW9M74QyN(kQh0QYEWaI zo~EqSCRuZ@eGwe2Zzc?7_x+vK7x`+5+2Lx>iTi@toi|a8_vyshw@(#}h`6-79(&%x zP9PfaMdaoZ<>hh>P|>dFYd}LJ6vX1lO;hGP*Oka6jz2zSgy%#g$zX;qQyrG^KgT~_ zN$bbh1ntFvYTNkw60)tzbqGQIZa&$nCLq z8$3%@a_y|~(AP^*9X{RUVKG7P3n$Rk2k0Qn;=~5En~dmf-@Ju?iOT26HApF*J*jV7 z7TWRP>EC{~>Nttgchpvs7se%X0#!T*X!=%6v0|;gU5H}``*a1V*jZ;bT?LW=1w9tQs&}VSKW7%QKOC2-=DfT?bJ8Iju-Q;zvWReK=%e zTe}uQR%D)6VxQX_xTEmEGEHUC@nG2&>Yxwhp+R7=&$^537~)wjyzPsPs6$kJ6OXJ) zRYWjqf4eCBTYV%+!v08(O+CERf{`OeTP^C%cKK!60WsP-rK;9kV&AqjCSlVje&>(^ z#6j2g2MQb32bqU>>qn|xaVDYGoTz?k6OZ^9hYwZ%ZhL}cai8N#_S>H@Hqu`4L6p|a zQ#Y7NBM=ByDnzLIUrQdpVD3$0_EjqzOJ9F^Jw5YG)lhhe6YUOx$9pHa=9IMYAdWm+ zs7rUZEMaOZI^t5W8UEFA>^)c?`C|Q5v8&ibm+!*2I{H%_4`BAsgy5IPfHMOZMF*uK zntYK@Ta08e=$Q#OW9#h5lHadSg}y8T<{2KGP$$<@CyAE-}7B>Pe(X>@HHp%(3o(>>~{d(ejhwr3m zYR#AL$gS#moCB6uWovDscxgJ>E-m@c?VoD+88s;RXREsW(19n%_o9I^+eo&aAQaUk zH@2=t1hjikzb)Eq`e;)ru{9pHx=-{=YxU}|66+kZ&sxL6w^)Nt+cK7d&kpYz#i3qU zDi@mf7IpDhSsqIFJCQtf0lq_6=n1+l zjve~d$ZGKTVsU9^X^i%EIg2&ZR@r0Ji}y>NN(~mSLnnAWeq<~_G4Z2iWx(TjZ{H~y zpE}CtEXOlonoL(^w4r?OGnsHx(y-6=rtFx8KSq;eRPv+mu%%%f)^Cd4yBl90kCuJi zIzr04jd@GX)wV}DrJ1Y2YJ0^hP#X91+O?@r ztBvvCjjvXlx5~HHXBtZTER|x5STdCsxEq#E)#@Rk{?6()_mjvC%xcOh0pl0Sl;+A` z#SePZ$am+5tH%J)o^j+?r)zy#%}T!G7k&AwfW~8{G^87Ou*)8vC@CdC&G~G56BoQD z9+suH0vjMx zyNkpd`>N}>(fBVvq`gv{yniVCYZ7^Gq}GaXA`=O%%!=~{;5B3-3)fDz7ByGyruY+C z`8eoWO@izpq?q+m2hjMY4&gmtLKvFzQKM|Ir&FHkkl{`$z!rzH0ViFj4#Qla{7Vd? z0o1(ahxyPFhwwXqm>%_mu=$OsrZ$7@O00cvxTq|e(>VKxqvMNebIAI^=4~s>S`5|r z;0{=)&(bH2i&!?KintW6X5v~7Q#u4cpptV6c|hz(4I%h3&7CQH&PL;v9m*Y;I$8J? zw@UhDYI$au?1=1nAg8F&8RJ@>y_4Qljy*aFlY`ADaclnFS!pInerx2si^c|RA_+}0 zGnrvHGcV3{!sq3eQs64Gj=)iH;vsrg1A?PQHwJ3Ll^u-AqQ$NrK1v`w+K*LAguz!n z>yaN?F?^Sh55TCIFyja+ttRJp_e7>gUgsA{V8Qn_9a)B2oVgFCz77~2KLg+-h#DEX zK<1&{ZOUlt4GqKZZT2`yTDRJ(3}LYyK7&4s47T81xn=d$?w>uQn&4SCfa;;h`2X(o3|u)n$VHq8O~PriD+%s-%E{^ z^be?DOC)w0VN`0FdpT#3lLv3qyg~07K+?QZ5+#W**6B6kg8vSFt92!Sp5<*~KFj;v zcg?hN#3*#!;pg6=<`bG)J3B6OfwXrRKndM}Y3+_+9GB06y!7`toRZK=nJG2pZw}ji z-JGPu{Omiqfv*7Ra5MvyM;s2Z5!d4VeK_)2+;@_`e-G47qrf{P)v9^Z^3{hA$9`ml zt3>QjsVO)C`PQ~J-IA)@(Q#kM2Pbpm5~5ID>F!-q=2Hf@>+sN_TsFu;&sU-@aC@Kg z542|-8G*+wg`CYLXtTxh6CD&cAR2nOhVOPt!MawZB|ux9PlOCB z={1@HSCvwA-M}2=+en_0*4qs_?8#%)W9FvoH8&97FJy%--6XX9Qf^vez_?y0uHJ#k z2l=lHi@^s?8XRbNMpi$}8@~#?2$0Ei=3;u^mn^ij*G$%*HdPTQhtjM+fdFE2JG--| zWIH#L-ej}1Vo&xvh#f~o#YxIFOI^m(DM!z*E$XffR+=;fT2;%XoH73|zW(m;1CwUH z7x4c=9 z=nJO%h0n03Z7@c&$blzH)P{|=xC&$J6(A*CH3F8Znq6kB5W)~zSqG}e^rtLN%3%iB zeiDR*`KvakR9P*nCYMQh>Ort4&L^fMIxQf+nf!>* zlz*3IKhaYeJ);vGIcZsh<#effb6R?Yw>Lk}2 zLaHfxs_2zPG?{+*OW(I*6-gQ_`bG@4+1^;)yrfSidR3N|cyGMrnM;xRkpOw^6Q4$Z z0uTI_m3P(40)2EbCWL~ILQAVoO_P*VR%}IKa*n&ay#(odqNI)Q#kdd#BLo+aHo`E& zM8%Kq6)imeGH?Q+d~d{l75R2Ll=#i3?#%;Z0*@MFD|K04I%V^I01I;ePA#Do`wMK5 zd+RE=dgS#tl(?2Xdki_@V@_9EiALD57nKTu5C*SOe_*KaaJl%BPl`#(la*1& z_WaX=($2mBNCv;4UKyEX!;+58V z9sqs87KH}m^H~JKZNx*g3GtBEVr(^G3$+m^9q#6c$rojBHGx98v=F%G5tU>YXnb7} zg(L?II(MmXT|<}&!J$ZA6NP5b(F39++N5gM#>0=}C1Ua+$84no2&xk>e1AKLK1~85 z|MW|yqm)HEl#e|lRUB!Ph$d9lVTL|vXHjjPd4k8F&Xf#>VLL^ueqQ57Jb{qBy-Y&ep5XJk7*Yc z1~+M|u2OI>8nbGd0?!As}oDe z(65|~`Y14d4e|5N?0Z`v2E$FmXd?!o0-3tIp?BO}w8@Wv14e}K_+uqV?G~(}>=}tw zq&g>pGO<9sAPn);uoba8+3l)rkzj`6?YT4`Shk@bNC}&rLS|J-o}#Iio?*qDrTzo=%Yd}M%|cgA8|g2H57u6 zMWa1Gv>$AT1xF`+LlCk`W;DLXKX}L84=Bp@@Ug~_y$D(7roxBHbOCDU=&vt`_6=;F z>dj(17Amc2g(u0@$<^}EQLjGxr$!^KH>Ay22q&sX3nD$&MtoIu$78~Gf+Mt zG8may7E27VQQ{^c;1VVuOcT*freeAP1D}`j#yZ?J;MJA1VbNeeaxJ!scY5md8MU?} zl;W#%4c0?nZoU(`rFudLoJ4`&c-mg-0%8>WAY-r8tB4aaPd-4nsxUS^OBc}pvl8uA zEYZP&b?b3oIM>6kFNe3+^3_I6S&g*_7M4KVy<6z&BsA>WvaB{Dz<(1tzVex{c|5PL zwae%X{6?Q$?3NHn5WNgoZKZ5;4gZ=+f0O$4c#kG-RwO&vCdCSf;%F0tG21lCp?_ns zebHt&hO^OoXqsN>qPa7X#DsNiO}$Wr4XtLRTFz^%B1OKpcap0i;gu?t^@|n(GbJap z|IUdg=`4(WmHQD(1oCrkT!@n)gu_qG)_C#`m@@8`m16xvUE)}Kh~9|j5ZmDH*OTek ze9!Jhlx1R>o%6C-vjL1ydYs<$%GO9(ue8iss|-|`{i06bsYUN`Aj;r$q_3nS2H6C` zvYIVFk&kFH2KB^6{Pv&zAX0<{`SK)bJhg=iIK}p%@nM^d=cCcISV=2z$LwF9Bq4e) z&ZjSq4z+kw#k2ivz;twgXez>n@pRYr(%V9G-Yvh{Vr?7@D#q{lBAqtsg+h1z1^1t| zznTo&+0zdOxN~w=lSsW3LX+MFtf#`Q;r+Awy7_t0GY>vl@ z5ON%)bf#MX%CKyU+0OdhK_`zyxI8OHGWL>GV~@*gwO`zIUbwsOw^4Mc8XUhw3`Y30 znzTCY)HH#xQb^3EPAXKbiQR`=W}n~6eeAVq3X>WpOw8ssR6FMn6z(m&#)U~TdFJWdRvUxN5^EKJh zLL5(0@h3JDfIEc<`~(^BGKP>Nv=!Cb?~9qa0ROPLP<&MBsF3izR_q4nJ2bzXw7#@> zo+k;RrZll17QGH2TqI0@H#5WoXdWdwL>VJLDFgu#wu129ReVfCg^hSKl;A*7ndceW zcpUkjBhMltn8kOAe3!@N>N^93cCa_X1(Q;PV-aVa6!`rtKfFV4b2jd^Z6ub|b(&O0 zKNH%3UTr*9DKzo}MuAmYJ(ip5rhNE6^cQB$fyz>TGf+MrE>;RIA*-D!Hi1MS|P z_!C}2w+W@Fhj#~5`UtjYFhR8+2w7CVKu@^~#<67m?jIuErP zcP==ZlZw5g@c754%d#3_`+f^Pt^w_>Ch6f4TFwxLW9am_xUm+wY19AS+0N9$V(6Z3 z&|SZO;p~D^uB|IGu4L!2Gjc%M%J;Y6^n>W!r;x^`T`ic&W3b z;_f(>h67V)JI#J$LVKIaFn>IAO{5%ka=u?q?$A}hx2KKTA}BsqX=TP3`Fv_zaOB8X zx*CCf3w&S8)v3JHQRFaE6E3O2#QNgZU*Uy=WB+2o7nBcVZB6^S7jl{s zevwV>6qEq#RI;pC2HuCJ@*XlbkGd^W5z};62^SFKxz^;jf~@rqa=IY~GEjLL1LqEn zwKVX1Ej?%1`c7DZ*jt8qrn|I4^9z+hcY9yL+Yt9g|D-x+J4rpi!kl@gsyKS$j>nR> zHfap}@PkZ?d!h~}9vXP%zacYY6c^N#m{Ay4-hUuKxAjpfh(uB*n&td^FbucIcNH(# z!_YB=CWl|;Ysy%wgFcH({8jT=T_e~ANPTsLqma>Rd!!*j5^f7gZS;*1qNC=Ge>6W| zE0)};?O7>f)YSO+xpltjj$TG4qq>SF`zaZ%ACs{I94?3GPx&G7E4jV+4*Z%N#%u^{ z^p*Dm1(9-+<0`4sK9^@3!^gpI8RrF&$TeH|(*GclJ;n{h7hX39GW>|m*0TD4Ws!0! z=}vP*tqTDXg5XRc$SPGaN?=vou3GJ|d1C#(fP1G<#+6?k)gN|*27hZk)Xq*L!7EOm zIR~2P+B_kktWE=+)N)BI6PmFHBLb*M5PdNSb0Jh{AKuaPV<+9tjLvbbE#%&AxH1CB zSN*JFY{=G6ssH{lrJ*+;-T-B0D`st(&W;gd|24t=cWUAw0Qq zM8N*5zolh||6XK$aXWC-dW1bs)AF^h&AmQ=88L(IvTrb* z#anY}OauEycr_I4mDpiNV+g4;a*IP0a)?aaDEC*)x3O0C&u?M^Q?mvAIr27LQd6bC^lgtFypat%nZcjIjOCcCi-EX-XDhrup{1)DyXwo+ASP0LO=Ei9gfH zLLd99JF|Aj!mrETLD`6Hdf6KTYj>(G_|}&t)T`n z29cl4e5$AH-~R;6iX{AXc53YE_l*I~UuYZt<|jK0oHl{Xyj@+q&O1Q(&F5JF8wdDk z+VlG-*%B<~e0xqlAFusxU_}%8O&2Cg4)`V^thRaoE_8AN>Fm<6%?#b^aEQ*o{D;3Ki)czdm#PVgEW5`UY_b#lp#fzGrDcH} z`VnB82Gfpe@NgSJ7T)qG`7x~c1cGVz4QErILrK9d0scP`y&Zz^II$3dsj_G+wEC!f zw*NB~{C_rpXXp{1Uth;E8Ksn>A;pD;m7Oy62_2gy>RCP<)28 z`0bKV8AhVk4G2+VX44^rYuFc2c-^|cudNrDq(wX>*BtG|OXJDb%7f2{dndW2+sOUe zP}Tz#9-f_r9}d^>Wh%1A*Pq7AFxy2#M}r@{7#G_VA=1nHK^4$voQ9LK*RPL7#zrOv zVg!{B%rev&)!dq38{*$_1v>zCzqGLA>pkAF5@*ytU+i- zv^65*%P^#MiUK>lwm`c3$ln4*Z!unjQojc;Gk5K$wNkI7X&H@lQQzhv@$3FsunbE3 zRLvrhL1dAN99L37UY=HaC(j*7HvZR>g1wujn8grd@MRNMpP4Hyk3C<4{`LP!dSeGH+7dRN`#$cJey*^M;eAl|wViO?8F5U6T zMv47&UQ&nuy^!4^$`R6ap3d`Ry%P|`jt@xU*g0Y$HXzgRBdBJwL$hVFu|Y|%^6onp zg7Yu#)^noK0WE&N9rg(U=Krr64MdS?(zO@OAJ?Irr`Bhv=#r>sBLFKca~U>KODHsW zM3qe2jZvSUp*Iuj<@IBwBd@4Z^F1{=7 zk*{oi$DIU8sc+?<_8s(V-;c5s!pkh90(`NCwqr>Lr~9!*;hXU8V?Cu44FtYGdfJ^a z65urgyOB=(Mr*E!x1Kfq9xVxu%N01&WQc|`e~+(K3qNZfyvpWMUI#KjqbM!rXhQY* zSvLfE&nyxwd07*G^WFT(Ti~y9cQl`={bzZQ0Ot1Q4jdQx9Y!^QviWNH!Hsb6d*@Rc zvwex9OjI(*i`pcjjfsc?SEvIRvKNV$)gCP?)=!UH!($9d&AeQ`I3#$Z8GoLfLO@xt zz^AruVS;0SZ<>oOS8k+fbYtTw@rjx^eZ9S=2Elu2Um;0x`PrgE8@Sx=#QEFgT%v6i zrKvFdx{QS9uf~52#{7@L2vk9{7So9&?`zjzw}t01B4&W0oAB{JI~gZw8|^K8b(Sgr zExMZ{<5E=I`6nY?RL1@Tby$B#A26`VzTwfW5!kHi$wXY$xuca4C?z?ttT5Dt`jObC zcHKL5qNx34t5e+X3f?_JxW%X>_VOWEf2dMWyt*)8^&}lgvx*G%-8GPtFW)5f!00M@ z+Ffv-YYH%4C3dyzaU?vR7eTY-t0}OW>L<(Gd&GU_OXVM;H+x={Hpk5I$@CYSaoevi zU$^h;?G)d-E*A6bV+l@7Vp;l>i*_~_jaEf9A|=$HCI&_%!udNX$u8pN6e0}P%HfM@6^elsT ztiLgZoCqxC1XzuBQj1hfnl~{UddVmtV!q2B$;ZC@k?c~-{qiVCd}J{KL*vxa`X@f5 z`-4&alt0CKNa6{lfX}be-QZ=9bAQ{^_9-!5d_X%n04eYW3D(I`4V*~pZypi@QEEpS zsilNc%&!{cOYb2!FRuPh)lIj}txV6~CK@kEuc3H}$+XPv?i17Gz+xT7-ux&GkA$Za ziPAW*ub&9qSI3EiH%DO8&HE6M`)FaMR((15pjrY1A-M=URnoEV4ue<$hB>wVatV5^ zv4FjtreaNh&8dw6S%>~I4w)05w6ZTIv<gq>^F1}OMru~kJkhEk4ohS6X zErDj_1xvm=G-o%{(<&)kc=3NRqTQ&YZxf1=PB5jJuF~+=^Nt*Bw_hcHeY*aq>;9rH zQ<@7dg!0_OvENw@vs~@O=($-x2!DIEC7(VvOBki|v z#CtNlpfIFduEd4?yF;;(sHB*<)Ve1B?6ip`F z>U#p=xa7QmGQb`AFhcLAf)f;oST<$vlg8_fLRi+XABvn|>*C{vYCT%pY_Q^6Y$z3| z!GBYp-^FBY$^`A?OwrILKbf7k8*KYm5%NEQzkg&S|1{D~B;d9uZ+FSCy{qY{7Jsy? zD5R^lb#`}o7H#ZS>^_kBVDdgP)TDp)4&a`U9>x<+>etSH1p-lCuCtjX6rSSt2>#1o zh-kC#DqA(p7o;u1ukDHyY)Brh3)jAIM0W{{!%ZG*#$&AXv;m9XuqYP2M{2nL@+|!+ zu&A?$d&LYuf(2%rFPYG|O1=bK3Zx!^L1g2*b({Ap5o~V~FG}qcqm79_K<)3G;%)97 zOhnsNRLU&atmz)gH+*rtpw1Z_*jn~5cH zh@ssi3Qw+KE}5bqk9<6WSIuw~U&h5vs#mT5S`-Vs+bqZpH=Y?1>(H>s-$# z3piP+W&<_aJKOO&0nOjL)aBX5=s$xB#lX98uCGW^Qr6V*dv#5rU{P4;^IAI34SKf5 zwtn8k&68du*h)S>jM{~ocN6<>;T8~ccv=sSAb#a}3FAfu4_D9%hO&a6CDMDTMDj5N z#ham1^al)5S!;N>i|L8!58%7$#2d83i08asc87RZg(KDwUtdbdx@S0bi#RiY>rTkg z)u8$YqAU;MnS06D25xFE-p8(GxRM|vc1_uIddoRLyVbMD?b#1 z_&q)wre$mErq?&EJkX#w_lJb9D`esreqs^#3+ttJ68R3ZyC66LM{80tc%I=w+S{W( zbkVV!z;WRNV~XTdz$eRPx`4XS*VPKKrhHgF2~dvzj3=y#aNZM?#O@)iFX6^qJ^hY)V#O1_btR?tQA+>Zf=es zhU_E5OA8#9XUbUfXwJTC$OGtobx0O2=0Bzco)m*BIl`7tH1|%#pigK+SJr-ThM*PO zON*U@5?l{MQYuJ=CWTTekrrV2VxuDqAHHa3lu7^RV{w0-FDYn>P-MJos`=)16`WeZ z4nGia1uB^PoG&Je;w)cx_d!ad$MD-fE7h`68*QMR!y9s?5y>TJ=R@iO&o5`YZS7{R z=ZpVubWOXC6Y_XX@*8Uodyi}6?Z)??M!*`{M(d!{E^PfbG0=^{OjjCJ3SCKeVRF(t zv%B>_HGs8jKCjZ@+|CL|c8S`}@zn5|^J$~Gt+Qo0=PcPE=XlG?#THM#>z?codw;+# zeGPU2xAFXwEgU1$<8*Z=sjP^Sd|k04QIUGoA|A=;IxMfNe%SKyM$ISf{pCSx?Bvie zbpRuC^X-wHdnSi~t&cppVMXaf9BYJk)FON0_PUivUoZ-IisF@ye}Xm2-5L8fBdjke{V zko(CA72Y#Y37tyBnT^;BV!4Pze_oYUaeyPo<`+Km^JMz?h5855X{O)l0XAR@&DI#YcsaQV5O zZLtADXLe$y?6>so8cAxO)D!C7hjmSnJN_`U_K7EgV@#OCR_(w@+0Y!(8Z-zm zoK|>BZUDMpR|^xvg!!}gW?Z$m_fK!K%$z`;s3uYhMU^9IkSXeV%F#TFuE4q8^ zlMr zHoFOw-&+sOsl74b8~mtJ5=)7Ihz9_}02*`HThGWvYcPS? z<|c)Ze-^PVkKdeCFjMPw_~HcC%p%9Z9W(nWgscpol`f!aOyfDwm3j!=O^c+bl1m^y zOa?()2EXs2W$;w`#8MH&DL#ghrxW=PnL&JE(|iN)+?x1wb3?(*q_2=qlSxTxB+;RL zb&_vYZWnfi{XAk+b#CC1r4Ct}^<^0Nq`LgC`-08jIgk=yGRuGXuWNOTHRO9L@m zYd36(HZ#cN6+TLLQy`>%@A8P3&2B zjV}=@)TROnDGBQyDb4+{Skc4FFqRtD1_no|CzB4XggC?Cq#y*t#Bty5tlY$2hn>WsO| z*IT>#=!%Q^5^tdwC0Y5u9PG1jwNQBUO=npkUr!LaytCLS|9aH(;V<`=x1-{#H{=r?jjil0FM61- zUm-}wm6nz|&i3O;O|GkRLt`aht~2JOc|34iN*T#BoAdwj3|*E+o8$13G>aW=pG=`U z^wOJ4CI~107Lzh!7t%rd`k+52v@rPLOn)MOuL1iwm!q~P5Or@=ve}N6i5QBk~ zuui^TzkV&U>q>L{o^1Clv36tf_}u<4y$^w?DTu7`KuR8&K7T@Tfv{pUfsVU$%G9o$ z&%a(q{ARB@XIXIshxEYp)|0f?>%v$jQ|b*5tk2dmMi47;3-hX@b0GR1F<^6G%}VG- zvs}6IJkkWZ7pM>nU5@|gAIe!^FJ>T)X$8dH#>zOTap-Ed&5I~oJO*yIhTB6e!$FFc z-YZHb9;U!&3b>~im(0UQiM(n7>Nnf+arBfDgV(V>*0ia`sz@{Fnz_JX+w$_Pu-}(G zUQ3b?&C_;(e*3!xL>-~p4P^A1ML1B5_5c{2Cf#;wlhf-Wm!~|}9$3{H46Oy__r1o9 zMD75~hm@5)y^2z`9W_Qs)|s7d?ZqZ8m{;9DJZ}_XQ65i$j>>qc>GpHX7s6S$x(JI7 zbvXUUKUl?;c{K%RUOAj7zJ+zhH$lFjs z%zG>ZkKXU_yuLDyVy9k_svNGT5A5e~j{|W?BRrTdN=G};-$$KMukI;_?jvil%rrzq zPEa;`N-ZwPjS`A=c=|l)plJ+r)CDL(b#MRhXcx-GZXEU@tuCeY6FiB@N=>3sb&)u5YKf-UAw>b zh@EZr<(zee4yNF%`G4cBPS-t%P26dHHAHub7dEB9l8+Oi68ZoUbt$! zc8}QK1n0c{%!7+_Z;-{eJ?+P&8O%pFvBzWSAjw8s_35IIWvmT-l!?96q&%iWZC+|` zLSg+ljA-jSz|iD^+;;gIk!3Uovv0<0a8~Bt`k&1Z(I0!oLosXny&0Pqz`+~bnTj4A z&mq0UodvVDwMF0EafQGK=Vm5m4bN*vn#l^myAOK7Z_JM8hlxW9zRpfWnWr|litQ5g z&}ALqOVDrWc=y3p>?sI`t{J&)H!bM5`-?(#it`$T)XM{q^FpXTKzVkltfD1?W1`VH z&{sjqLMX=8@x7juCJu+2C(a0xt_%K7ZnXs=>4O$wmvOzPrMDxH5s7!q4xlSPgY!% z+#!+I7afRUfi6RiZ7dD59_3T5FqAQ0xcdu{)bkv7swTzK z+;6T8O$jZf*bGD+tqE`TSxLd9SiOs28WSJia05NK(Mp(7vF~>Lka%;8rw!o&4bvh+ z2oR-6sun8G)RVNi+M^^s807VxDML%{uuLe?o^V$~A@J@Eaj+kAw-a%wH`iW1l(Mtq zkUsj^d8h8Vz0zlmY8xA_F5C$H8LoBrWM~D!G5M-|2OPnS_B6&>zGo(cpTDW+vev5_;cndt&!g zWedTjEo-l5n4v)vId7{co0t(H6ONg@8Cny8L#P*t!m26tzN3=mo*)SmOJqkyEcZPS zx;FO82w)S-Onyk(S!o<s8BLV-bBDGd&_?_eR2dZ1tO{ouGi0k;gDaZuaf^1#E2^q`f&tsv9n*!0 zffsA+ht_oT(B4(t4{xPFYH*3&+1sQc*+U^8vtwH=ET~XMm4LCyr;waEuh>EQgid3d z|8aaj8AdX?SfhOToz!|M@q^Qy*1Jk=lHOHNf?2FOUDVZs99<2UjNO?Fm$$=mG6Is+;tWu!tm|M{YZokl5cuK^dDalDM*6;*34he@t?n)3`6663Z&B$ z(KCM?P7lOhgmg(0+EUMz2v}GZ80bMDPUa*vV zyO<=D@U-~)fz94J+-$#>5<73ZxFscoWFW2@qSQNI75Pzl5>GrfW7#%XRtTT}A-*#k zC>PvuqM@PUQa@mhW2+q7NkRkrF*H@=8vg%j;@ZQZOy4k8jwQA+Lo7*UOolacIcJ=0 zCKc6M8i&kC(J&4T(v0Jd6{0rB#!?O|o1a3B)6`@biox2o7;>1=G-@c)GL1vO?~~nY z|NXA(`L6eUzw3LR`+lGMexg^fSI*ir9M7E`tT;`rpp^B5mPvixsrY2S=gQK&0Os1j zmT{-=+4~*P^Ce)18Yt>^##` zpi+1x&%SOBMUgg!eSP1d-_JI|!R?eKN+HNU$jM*{xCiJzcn6MpR2cgl3XEE2 zH^lmQEG2d{mJg2+2*LE@`t&Q}nr>$%b3@W5N9CAK^|k<}w=L5Q&=?Bslc40}@5~$O zZ*qxtX~Hx1L|BDuH~@QUZ@GRmR({GKnz?JiuT?H9%c0?$s_xvzVy>6o{c?Pnboof` z@^Aq3w9kD|eERuK(M{Leih!Vy7J zA{tB0&K>Bnp!2VW&l5Y*?+NIWRFle_s_|DjyrTH+kAB{pClG&}=R&5B^}YX9m;)o< z9$9w${pe204*zi6&f&>rAt|!1KvhqXa=lDT!Gni4G<{eb#W>15@SEck(}PYL2BlBF z&Kk_Mu!zgA?tWp3U&`B+`4@q>G3M(FRZR|_+xt;-d+|?%zX~J2A_P6U`7^TW?LlR~ zqYS*tnO>+wm5RlfdsN*EuR&VtnHf%<&A99lK2M%~mE<{TZc#gEtG9McZqKd6AMUWW z@;0>Ke=K{Z(n?&DqOg2jBI*R7vLzM(y7=>bX7m~JU@54BQ6yUcvLEyMpgT7)oJ&ii#PK?V@wHJnTaHfk0 zyk1Q~W`rn-VLF~pQ7XJI?_&Nn>)k{%A^0;yXH{t1JZm(EClcu<6E(iN+vuY3O8S{1 zFBx?WA&0E8-^~+c(zJi+Z>3jkjD0Qj)Rx4Z%9q*gAjMo74a1L_pC= zifNlm>pQWoJ-Gi|(4!73Pd~UqW(sO11`FIy8ZfxM3K6^r%XzfItIkAYWgbKQS@eW? z*T_&PjNnq@kTh(RykaDT#B&+BhZR-u6d3$r+E+e^d-R__R6Oi& z1EP+Ys^fYv5qZ1Do_Y<8W_jSKS)to;ja;3o#TQ=R*RD0~V>%(eAIy?%d}dqi6eeq? z6xp;!(EeLSjCA5JF!c53y6 zu+3qEzhmlHy0~i!b>1fF)Y&-gJ5M!L3KurX_@#|cj0MYQwwu#-IV=@#D% zz5Jg8DQ)EBK*@OhaD%Sle^UD;p7i8xHvO(71D;=val&TS{!{Ewfa@Km(RHBDk&%yb z2Icr~FI_GC>SGd0CK1vPN+qLCO zUt_CeZPgFplnO!O%A9jE%L)YZ?-zi1FC-!Y39{MJ=x*&HkR)tJ7J#$VK#I#0B1zZ& z8zB!9_0z3>x?kUhNCeYx?+P&91Y+0*l!3i0sPug4f$4`=nRGU#x9T^bQKy;$u zni1P&w>?Bn?}&A~)=V?W&3k-T87?80-wMK9iL+!~R4koQM z4aJ;q&HvDn%eP+AWydNH*3u)}j9-#R1DZs8%VJCa!ZK)0fNpk+QG?7pajn>S4(Hm6 zdOX{;w2xVkGkPOwFE+)dj%Gx*RxT3ouxP2|;9BriQ+J_?6kuTie0%ak~VH>#+CyF~~ z1@ndPvE8J}-5ANtd_{^?j3-jkl{BIw=RB`{Tve6Ba^D*0ZfUM@o+ogTJL-= F?f;bYWTF57 diff --git a/doc/content/modules/user-manual/assets/images/release-notes-show-hide-section-group-palette.png b/doc/content/modules/user-manual/assets/images/release-notes-show-hide-section-group-palette.png new file mode 100644 index 0000000000000000000000000000000000000000..80831ef1e55a8f85acd55427d3227dffb774b376 GIT binary patch literal 30939 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≀V>APPO$| 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 literal 0 HcmV?d00001 diff --git a/doc/content/modules/user-manual/pages/release-notes/2026.9.0.adoc b/doc/content/modules/user-manual/pages/release-notes/2026.9.0.adoc index fc685fb45..17e07ad45 100644 --- a/doc/content/modules/user-manual/pages/release-notes/2026.9.0.adoc +++ b/doc/content/modules/user-manual/pages/release-notes/2026.9.0.adoc @@ -149,6 +149,11 @@ image::release-notes-hierarchical-requirements-table-view.png[Hierarchical requi + image::release-notes-hierarchical-requirements-table-view-create-nested-requirement.png[New sub-requirement in row action menu, width=90%,height=90%] +** When selecting multiple graphical nodes, the group palette now displays the _Show/Hide_ section just like the single selection palette. +The associated tools are the same ones: _Hide_; _Hide all content_; _Show all content_; _Reset content_; _Show valued content_. ++ +image::release-notes-show-hide-section-group-palette.png[New Show/Hide section in group palette, width=90%,height=90%] + == Technical details * For technical details on this {product} release, including breaking changes, please refer to the https://github.com/eclipse-syson/syson/blob/main/CHANGELOG.adoc[changelog]. diff --git a/doc/content/modules/user-manual/partials/manage-group-elements.adoc b/doc/content/modules/user-manual/partials/manage-group-elements.adoc index 3288ceddd..1fc19b413 100644 --- a/doc/content/modules/user-manual/partials/manage-group-elements.adoc +++ b/doc/content/modules/user-manual/partials/manage-group-elements.adoc @@ -11,10 +11,12 @@ image::manage-group-element-toolbar.png[Group element toolbar] User can still used basic tools such as : * Hide elements, +* Hide all their content, +* Show their valued content, * Fade elements, * Pin elements. -A new tool section appears in this toolbar. +A layout tool section appears in this toolbar. Many tools acting on selected elements layout can be found in this tool section : * Align left,