From bb084c2a7eb0b0a58bfcac087a3901817ad6060f Mon Sep 17 00:00:00 2001 From: Guillaume Coutable Date: Tue, 7 Nov 2023 17:55:27 +0100 Subject: [PATCH] [2535] Make possible to hide the header separator in the view DSL Bug: https://github.com/eclipse-sirius/sirius-web/issues/2535 Signed-off-by: Guillaume Coutable --- CHANGELOG.adoc | 5 +- .../compartmentWithHeaderWithoutSeparator.png | Bin 0 -> 33252 bytes .../src/converter/convertDiagram.ts | 6 +- .../src/renderer/DiagramRenderer.types.ts | 1 + .../renderer/layout/ListNodeLayoutHandler.ts | 2 +- .../layout/RectangleNodeLayoutHandler.ts | 22 +- .../src/renderer/layout/layoutNode.ts | 29 ++- .../CDClassNodeDescriptionProvider.java | 2 + .../CDInterfaceNodeDescriptionProvider.java | 1 + .../CDPackageNodeDescriptionProvider.java | 1 + .../ClassNodeDescriptionProvider.java | 3 + .../ComponentNodeDescriptionProvider.java | 1 + .../EnumNodeDescriptionProvider.java | 1 + .../InterfaceNodeDescriptionProvider.java | 1 + .../PackageNodeDescriptionProvider.java | 1 + ...erationalActorNodeDescriptionProvider.java | 1 + ...rationalEntityNodeDescriptionProvider.java | 1 + ...ionalPerimeterNodeDescriptionProvider.java | 1 + ...ectangularNodeStyleDescriptionBuilder.java | 10 + ...gularNodeStyleDescriptionItemProvider.java | 15 ++ .../src/main/resources/plugin.properties | 15 +- .../view/diagram/DiagramPackage.java | 31 ++- .../RectangularNodeStyleDescription.java | 26 +++ .../view/diagram/impl/DiagramPackageImpl.java | 13 ++ .../RectangularNodeStyleDescriptionImpl.java | 58 ++++++ .../src/main/resources/model/diagram.ecore | 2 + .../src/main/resources/model/diagram.genmodel | 1 + .../NodeStylePropertiesConfigurer.java | 193 ++++++------------ .../ViewDiagramDescriptionConverter.java | 10 +- 29 files changed, 299 insertions(+), 154 deletions(-) create mode 100644 doc/screenshots/compartmentWithHeaderWithoutSeparator.png diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 2fbcda4ad5..91fd74c44c 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -42,8 +42,11 @@ Update the graphql API accordingly. - https://github.com/eclipse-sirius/sirius-web/issues/2516[#2516] [diagram] Add to the diagram core API the possibility to display the header separator when the inside label is a header. It requires to add a `displayHeaderSeparatorProvider` to the _InsideLabelDescription_. For the compatibility layer, the separator will always be displayed if the label is inside a node displaying its children has a list. -In a near future it will be possible to customize that value using the View DSL, but for now, the `displayHeaderSeparatorProvider` has the same value as `isHeaderProvider`. Add the attribute `displayHeaderSeparator` to the graphql API. +- https://github.com/eclipse-sirius/sirius-web/issues/2512[#2512] [view] Add the possibility for the header separator to be displayed or hidden in the View DSL. ++ +.Compartment with header without separator +image:doc/screenshots/compartmentWithHeaderWithoutSeparator.png[Compartment with header without separator,30%] === Dependency update diff --git a/doc/screenshots/compartmentWithHeaderWithoutSeparator.png b/doc/screenshots/compartmentWithHeaderWithoutSeparator.png new file mode 100644 index 0000000000000000000000000000000000000000..5274854bde0113c7a729b9fddb52c0598a71e02f GIT binary patch literal 33252 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 %s^M`{nNX7vD;s_g;rYVI$+_f^0CnX-C@=U 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 literal 0 HcmV?d00001 diff --git a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/convertDiagram.ts b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/convertDiagram.ts index 6d46f84850..f1c8a68c64 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/convertDiagram.ts +++ b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/convertDiagram.ts @@ -76,6 +76,7 @@ const toRectangularNode = ( id: insideLabel.id, text: insideLabel.text, isHeader: insideLabel.isHeader, + displayHeaderSeparator: insideLabel.displayHeaderSeparator, style: { display: 'flex', flexDirection: 'row', @@ -91,7 +92,7 @@ const toRectangularNode = ( const alignement = AlignmentMap[insideLabel.insideLabelLocation]; if (alignement.isPrimaryVerticalAlignment) { if (alignement.primaryAlignment === 'TOP') { - if (insideLabel.displayHeaderSeparator) { + if (data.label.displayHeaderSeparator) { data.label.style.borderBottom = `${style.borderSize}px ${style.borderStyle} ${style.borderColor}`; } data.style = { ...data.style, display: 'flex', flexDirection: 'column', justifyContent: 'flex-start' }; @@ -222,6 +223,7 @@ const toListNode = ( text: insideLabel.text, iconURL: labelStyle.iconURL, isHeader: insideLabel.isHeader, + displayHeaderSeparator: insideLabel.displayHeaderSeparator, style: { display: 'flex', flexDirection: 'row', @@ -236,7 +238,7 @@ const toListNode = ( const alignement = AlignmentMap[insideLabel.insideLabelLocation]; if (alignement.isPrimaryVerticalAlignment) { if (alignement.primaryAlignment === 'TOP') { - if (insideLabel.displayHeaderSeparator) { + if (data.label.displayHeaderSeparator) { data.label.style.borderBottom = `${style.borderSize}px ${style.borderStyle} ${style.borderColor}`; } data.style = { ...data.style, display: 'flex', flexDirection: 'column', justifyContent: 'flex-start' }; diff --git a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/DiagramRenderer.types.ts b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/DiagramRenderer.types.ts index e2545d5305..66cea07eb8 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/DiagramRenderer.types.ts +++ b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/DiagramRenderer.types.ts @@ -83,4 +83,5 @@ export interface Label { iconURL: string[]; style: React.CSSProperties; isHeader?: boolean; + displayHeaderSeparator?: boolean; } diff --git a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/ListNodeLayoutHandler.ts b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/ListNodeLayoutHandler.ts index 50e215fa7d..30e41cda59 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/ListNodeLayoutHandler.ts +++ b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/ListNodeLayoutHandler.ts @@ -92,7 +92,7 @@ export class ListNodeLayoutHandler implements INodeLayoutHandler { const nodeIndex = findNodeIndex(visibleNodes, node.id); const labelElement = document.getElementById(`${node.id}-label-${nodeIndex}`); - const withHeader = node.data.label?.isHeader; + const withHeader: boolean = node.data.label?.isHeader ?? false; const borderNodes = directChildren.filter((node) => node.data.isBorderNode); const directNodesChildren = directChildren.filter((child) => !child.data.isBorderNode); diff --git a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/RectangleNodeLayoutHandler.ts b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/RectangleNodeLayoutHandler.ts index 7eec571c85..b3fdcfcbb1 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/RectangleNodeLayoutHandler.ts +++ b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/RectangleNodeLayoutHandler.ts @@ -79,7 +79,8 @@ export class RectangleNodeLayoutHandler implements INodeLayoutHandler node.data.isBorderNode); const directNodesChildren = directChildren.filter((child) => !child.data.isBorderNode); @@ -95,7 +96,14 @@ export class RectangleNodeLayoutHandler implements INodeLayoutHandler, visibleNodes: Node[], borderWidth: number, @@ -166,11 +174,5 @@ export class RectangleNodeLayoutHandler implements INodeLayoutHandler previousNode.id === node.id); - if (previousNode && previousNode.width && previousNode.height) { - node.width = previousNode.width; - node.height = previousNode.height; - } } } diff --git a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/layoutNode.ts b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/layoutNode.ts index 91d02a3997..0e06522fb2 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/layoutNode.ts +++ b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/renderer/layout/layoutNode.ts @@ -10,7 +10,7 @@ * Contributors: * Obeo - initial API and implementation *******************************************************************************/ -import { Box, Node, Rect, boxToRect, rectToBox } from 'reactflow'; +import { Box, Node, Rect, XYPosition, boxToRect, rectToBox } from 'reactflow'; import { Diagram, NodeData } from '../DiagramRenderer.types'; import { getBorderNodeExtent, @@ -67,15 +67,15 @@ export const getNodeOrMinHeight = (nodeHeight: number | undefined): number => { return Math.max(nodeHeight ?? -Infinity, defaultHeight); }; -// WARN: should be moved in RectangularNodeLayoutHandler.ts export const getChildNodePosition = ( allVisibleNodes: Node[], child: Node, labelElement: HTMLElement | null, withHeader: boolean, + displayHeaderSeparator: boolean, borderWidth: number, previousSibling?: Node -) => { +): XYPosition => { const maxWestBorderNodeWidth = getChildren(child, allVisibleNodes) .filter(isWestBorderNode) .map((borderNode) => getNodeFootprint(allVisibleNodes, borderNode).width || 0) @@ -87,11 +87,11 @@ export const getChildNodePosition = ( .reduce((a, b) => Math.max(a, b), 0); if (!previousSibling) { - const headerFootprint = withHeader ? labelElement?.getBoundingClientRect().height ?? 0 : 0; + const headerFootprint = labelElement ? getHeaderFootprint(labelElement, withHeader, displayHeaderSeparator) : 0; return { x: rectangularNodePadding + borderWidth + maxWestBorderNodeWidth, - y: borderWidth + headerFootprint + rectangularNodePadding + maxNorthBorderNodeHeight, + y: borderWidth + headerFootprint + maxNorthBorderNodeHeight, }; } else { const previousSiblingsMaxEastBorderNodeWidth = getChildren(previousSibling, allVisibleNodes) @@ -111,6 +111,23 @@ export const getChildNodePosition = ( } }; +const getHeaderFootprint = ( + labelElement: HTMLElement, + withHeader: boolean, + displayHeaderSeparator: boolean +): number => { + let headerFootprint = 0; + + if (withHeader) { + headerFootprint = labelElement.getBoundingClientRect().height; + if (displayHeaderSeparator) { + headerFootprint += rectangularNodePadding; + } + } + + return headerFootprint; +}; + /** * Returns the node footprint. * It requires node border nodes to be positioned. @@ -168,7 +185,7 @@ export const setBorderNodesPosition = ( borderNodes: Node[], nodeToLayout: Node, previousDiagram: Diagram | null -) => { +): void => { const borderNodesEast = borderNodes.filter(isEastBorderNode); borderNodesEast.forEach((child, index) => { const previousBorderNode = (previousDiagram?.nodes ?? []).find((previousNode) => previousNode.id === child.id); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDClassNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDClassNodeDescriptionProvider.java index bc8dc5c156..b21fd5e2b3 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDClassNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDClassNodeDescriptionProvider.java @@ -63,6 +63,7 @@ public NodeDescription create() { .borderColor(this.colorProvider.getColor("border_blue")) .labelColor(this.colorProvider.getColor("label_white")) .withHeader(false) + .displayHeaderSeparator(false) .build()) .synchronizationPolicy(SynchronizationPolicy.UNSYNCHRONIZED) .conditionalStyles(this.diagramBuilderHelper.newConditionalNodeStyle() @@ -72,6 +73,7 @@ public NodeDescription create() { .borderColor(this.colorProvider.getColor("border_green")) .labelColor(this.colorProvider.getColor("label_white")) .withHeader(false) + .displayHeaderSeparator(false) .build()) .build()) .build(); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDInterfaceNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDInterfaceNodeDescriptionProvider.java index 3e0eeb90da..96442e36f3 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDInterfaceNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDInterfaceNodeDescriptionProvider.java @@ -47,6 +47,7 @@ public NodeDescription create() { nodeStyle.setBorderColor(this.colorProvider.getColor("border_blue_2")); nodeStyle.setLabelColor(this.colorProvider.getColor("label_white")); nodeStyle.setWithHeader(true); + nodeStyle.setDisplayHeaderSeparator(true); var builder = new PapayaViewBuilder(); var domainType = builder.domainType(builder.entity("Interface")); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDPackageNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDPackageNodeDescriptionProvider.java index 888515ca77..8b88d5e053 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDPackageNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/classdiagram/CDPackageNodeDescriptionProvider.java @@ -46,6 +46,7 @@ public NodeDescription create() { nodeStyle.setBorderColor(this.colorProvider.getColor("border_blue_3")); nodeStyle.setLabelColor(this.colorProvider.getColor("label_black")); nodeStyle.setWithHeader(true); + nodeStyle.setDisplayHeaderSeparator(false); var builder = new PapayaViewBuilder(); var domainType = builder.domainType(builder.entity("Package")); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/ClassNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/ClassNodeDescriptionProvider.java index 2795f534dd..5b866e2378 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/ClassNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/ClassNodeDescriptionProvider.java @@ -48,6 +48,7 @@ public NodeDescription create() { nodeStyle.setBorderColor(this.colorProvider.getColor("border_blue")); nodeStyle.setLabelColor(this.colorProvider.getColor("label_white")); nodeStyle.setWithHeader(true); + nodeStyle.setDisplayHeaderSeparator(true); var nodeDescription = new PapayaViewBuilder().createNodeDescription("Class"); nodeDescription.setSemanticCandidatesExpression("aql:self.types"); @@ -138,6 +139,7 @@ private NodeDescription attributesNodeDescription() { abstractNodeStyle.setBorderColor(this.colorProvider.getColor("border_green")); abstractNodeStyle.setLabelColor(this.colorProvider.getColor("label_white")); abstractNodeStyle.setWithHeader(false); + abstractNodeStyle.setDisplayHeaderSeparator(false); var abstractConditionalNodeStyle = DiagramFactory.eINSTANCE.createConditionalNodeStyle(); abstractConditionalNodeStyle.setCondition("aql:self.abstract"); @@ -187,6 +189,7 @@ private NodeDescription operationsNodeDescription() { abstractNodeStyle.setBorderColor(this.colorProvider.getColor("border_green")); abstractNodeStyle.setLabelColor(this.colorProvider.getColor("label_white")); abstractNodeStyle.setWithHeader(false); + abstractNodeStyle.setDisplayHeaderSeparator(false); var abstractConditionalNodeStyle = DiagramFactory.eINSTANCE.createConditionalNodeStyle(); abstractConditionalNodeStyle.setCondition("aql:self.abstract"); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/ComponentNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/ComponentNodeDescriptionProvider.java index 9279db0d98..0c55edc46b 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/ComponentNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/ComponentNodeDescriptionProvider.java @@ -44,6 +44,7 @@ public NodeDescription create() { nodeStyle.setBorderColor(this.colorProvider.getColor("border_blue_4")); nodeStyle.setLabelColor(this.colorProvider.getColor("label_black")); nodeStyle.setWithHeader(true); + nodeStyle.setDisplayHeaderSeparator(false); var nodeDescription = new PapayaViewBuilder().createNodeDescription("Component"); nodeDescription.setSemanticCandidatesExpression("aql:self.components"); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/EnumNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/EnumNodeDescriptionProvider.java index 4cd0c60efc..10edb1886d 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/EnumNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/EnumNodeDescriptionProvider.java @@ -41,6 +41,7 @@ public NodeDescription create() { nodeStyle.setBorderColor(this.colorProvider.getColor("border_green_2")); nodeStyle.setLabelColor(this.colorProvider.getColor("label_white")); nodeStyle.setWithHeader(true); + nodeStyle.setDisplayHeaderSeparator(true); var nodeDescription = new PapayaViewBuilder().createNodeDescription("Enum"); nodeDescription.setChildrenLayoutStrategy(DiagramFactory.eINSTANCE.createListLayoutStrategyDescription()); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/InterfaceNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/InterfaceNodeDescriptionProvider.java index 8bffa0374d..82caa955f0 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/InterfaceNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/InterfaceNodeDescriptionProvider.java @@ -42,6 +42,7 @@ public NodeDescription create() { nodeStyle.setBorderColor(this.colorProvider.getColor("border_blue_2")); nodeStyle.setLabelColor(this.colorProvider.getColor("label_white")); nodeStyle.setWithHeader(true); + nodeStyle.setDisplayHeaderSeparator(true); var nodeDescription = new PapayaViewBuilder().createNodeDescription("Interface"); nodeDescription.setSemanticCandidatesExpression("aql:self.types"); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/PackageNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/PackageNodeDescriptionProvider.java index 9e8011abc4..2c7d6204f0 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/PackageNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/logicalarchitecture/PackageNodeDescriptionProvider.java @@ -46,6 +46,7 @@ public NodeDescription create() { nodeStyle.setBorderColor(this.colorProvider.getColor("border_blue_3")); nodeStyle.setLabelColor(this.colorProvider.getColor("label_black")); nodeStyle.setWithHeader(true); + nodeStyle.setDisplayHeaderSeparator(false); var nodeDescription = new PapayaViewBuilder().createNodeDescription("Package"); nodeDescription.setSemanticCandidatesExpression("aql:self.eContents()"); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalActorNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalActorNodeDescriptionProvider.java index 1dc4675062..fb181f0fc9 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalActorNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalActorNodeDescriptionProvider.java @@ -43,6 +43,7 @@ public NodeDescription create() { operationalActorNodeStyle.setBorderColor(this.colorProvider.getColor("border_gray")); operationalActorNodeStyle.setLabelColor(this.colorProvider.getColor("label_black")); operationalActorNodeStyle.setWithHeader(true); + operationalActorNodeStyle.setDisplayHeaderSeparator(false); var operationalActorEmptyNodeStyle = DiagramFactory.eINSTANCE.createImageNodeStyleDescription(); operationalActorEmptyNodeStyle.setShape("4d9a22c0-dc36-31c9-bb6a-c18c66b51d93"); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalEntityNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalEntityNodeDescriptionProvider.java index 69ad31fa7a..b60170fe64 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalEntityNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalEntityNodeDescriptionProvider.java @@ -43,6 +43,7 @@ public NodeDescription create() { nodeStyle.setBorderColor(this.colorProvider.getColor("border_gray")); nodeStyle.setLabelColor(this.colorProvider.getColor("label_black")); nodeStyle.setWithHeader(true); + nodeStyle.setDisplayHeaderSeparator(false); var builder = new PapayaViewBuilder(); diff --git a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalPerimeterNodeDescriptionProvider.java b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalPerimeterNodeDescriptionProvider.java index eaa25397ac..d90c03ca20 100644 --- a/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalPerimeterNodeDescriptionProvider.java +++ b/packages/sirius-web/backend/sirius-web-sample-application/src/main/java/org/eclipse/sirius/web/sample/papaya/view/operationalanalysis/OperationalPerimeterNodeDescriptionProvider.java @@ -44,6 +44,7 @@ public NodeDescription create() { nodeStyle.setBorderColor(this.colorProvider.getColor("border_gray_2")); nodeStyle.setLabelColor(this.colorProvider.getColor("label_black")); nodeStyle.setWithHeader(true); + nodeStyle.setDisplayHeaderSeparator(false); var nodeDescription = new PapayaViewBuilder().createNodeDescription("OperationalPerimeter"); nodeDescription.setSemanticCandidatesExpression("aql:self.operationalPerimeters"); diff --git a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/RectangularNodeStyleDescriptionBuilder.java b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/RectangularNodeStyleDescriptionBuilder.java index 88e412a8a0..756cf5b1e8 100644 --- a/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/RectangularNodeStyleDescriptionBuilder.java +++ b/packages/view/backend/sirius-components-view-builder/src/main/java/org/eclipse/sirius/components/view/builder/generated/RectangularNodeStyleDescriptionBuilder.java @@ -188,5 +188,15 @@ public RectangularNodeStyleDescriptionBuilder withHeader(java.lang.Boolean value return this; } + /** + * Setter for DisplayHeaderSeparator. + * + * @generated + */ + public RectangularNodeStyleDescriptionBuilder displayHeaderSeparator(java.lang.Boolean value) { + this.getRectangularNodeStyleDescription().setDisplayHeaderSeparator(value); + return this; + } + } diff --git a/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/RectangularNodeStyleDescriptionItemProvider.java b/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/RectangularNodeStyleDescriptionItemProvider.java index 25309bcf02..0738c7bf0d 100644 --- a/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/RectangularNodeStyleDescriptionItemProvider.java +++ b/packages/view/backend/sirius-components-view-diagram-edit/src/main/java/org/eclipse/sirius/components/view/diagram/provider/RectangularNodeStyleDescriptionItemProvider.java @@ -67,6 +67,7 @@ public List getPropertyDescriptors(Object object) { this.addShowIconPropertyDescriptor(object); this.addLabelIconPropertyDescriptor(object); this.addWithHeaderPropertyDescriptor(object); + this.addDisplayHeaderSeparatorPropertyDescriptor(object); } return this.itemPropertyDescriptors; } @@ -244,6 +245,19 @@ protected void addWithHeaderPropertyDescriptor(Object object) { DiagramPackage.Literals.RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER, true, false, false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null)); } + /** + * This adds a property descriptor for the Display Header Separator feature. + * + * @generated + */ + protected void addDisplayHeaderSeparatorPropertyDescriptor(Object object) { + this.itemPropertyDescriptors.add(this.createItemPropertyDescriptor(((ComposeableAdapterFactory) this.adapterFactory).getRootAdapterFactory(), this.getResourceLocator(), + this.getString("_UI_RectangularNodeStyleDescription_displayHeaderSeparator_feature"), + this.getString("_UI_PropertyDescriptor_description", "_UI_RectangularNodeStyleDescription_displayHeaderSeparator_feature", "_UI_RectangularNodeStyleDescription_type"), + DiagramPackage.Literals.RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR, true, false, false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null)); + } + /** * This returns RectangularNodeStyleDescription.gif. * @@ -302,6 +316,7 @@ public void notifyChanged(Notification notification) { case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__SHOW_ICON: case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__LABEL_ICON: case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER: + case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR: this.fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true)); return; } 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 d500273983..b91efc6e26 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 @@ -1,23 +1,24 @@ -################################################################################ # Copyright (c) 2021, 2023 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 -################################################################################# + pluginName = Diagram Edit Support providerName = www.example.org + _UI_CreateChild_text = {0} _UI_CreateChild_text2 = {1} {0} _UI_CreateChild_text3 = {1} _UI_CreateChild_tooltip = Create New {0} Under {1} Feature _UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}. _UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent. + _UI_PropertyDescriptor_description = The {0} of the {1} _UI_DiagramDescription_type = Diagram Description _UI_DiagramElementDescription_type = Diagram Element Description @@ -56,7 +57,9 @@ _UI_NodeToolSection_type = Node Tool Section _UI_EdgeToolSection_type = Edge Tool Section _UI_DropNodeTool_type = Drop Node Tool _UI_Unknown_type = Object -_UI_Unknown_datatype = Value + +_UI_Unknown_datatype= Value + _UI_DiagramDescription_autoLayout_feature = Auto Layout _UI_DiagramDescription_palette_feature = Palette _UI_DiagramDescription_nodeDescriptions_feature = Node Descriptions @@ -99,6 +102,7 @@ _UI_NodeStyleDescription_showIcon_feature = Show Icon _UI_NodeStyleDescription_labelIcon_feature = Label Icon _UI_ConditionalNodeStyle_style_feature = Style _UI_RectangularNodeStyleDescription_withHeader_feature = With Header +_UI_RectangularNodeStyleDescription_displayHeaderSeparator_feature = Display Header Separator _UI_ImageNodeStyleDescription_shape_feature = Shape _UI_EdgeStyle_lineStyle_feature = Line Style _UI_EdgeStyle_sourceArrowStyle_feature = Source Arrow Style @@ -144,6 +148,7 @@ _UI_NodeToolSection_edgeTools_feature = Edge Tools _UI_EdgeToolSection_nodeTools_feature = Node Tools _UI_DropNodeTool_acceptedNodeTypes_feature = Accepted Node Types _UI_Unknown_feature = Unspecified + _UI_ArrowStyle_None_literal = None _UI_ArrowStyle_OutputArrow_literal = OutputArrow _UI_ArrowStyle_InputArrow_literal = InputArrow 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 e21d65b469..77705925ca 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 @@ -1093,6 +1093,15 @@ public interface DiagramPackage extends EPackage { */ int RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER = NODE_STYLE_DESCRIPTION_FEATURE_COUNT + 0; + /** + * The feature id for the 'Display Header Separator' attribute. + * + * @generated + * @ordered + */ + int RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR = NODE_STYLE_DESCRIPTION_FEATURE_COUNT + 1; + /** * The number of structural features of the 'Rectangular Node Style Description' class. @@ -1100,7 +1109,7 @@ public interface DiagramPackage extends EPackage { * @generated * @ordered */ - int RECTANGULAR_NODE_STYLE_DESCRIPTION_FEATURE_COUNT = NODE_STYLE_DESCRIPTION_FEATURE_COUNT + 1; + int RECTANGULAR_NODE_STYLE_DESCRIPTION_FEATURE_COUNT = NODE_STYLE_DESCRIPTION_FEATURE_COUNT + 2; /** * The number of operations of the 'Rectangular Node Style Description' class. + * + * @return the meta object for the attribute 'Display Header Separator'. + * @see org.eclipse.sirius.components.view.diagram.RectangularNodeStyleDescription#isDisplayHeaderSeparator() + * @see #getRectangularNodeStyleDescription() + * @generated + */ + EAttribute getRectangularNodeStyleDescription_DisplayHeaderSeparator(); + /** * Returns the meta object for class '{@link org.eclipse.sirius.components.view.diagram.ImageNodeStyleDescription * Image Node Style Description}'. @@ -4808,6 +4829,14 @@ interface Literals { */ EAttribute RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER = eINSTANCE.getRectangularNodeStyleDescription_WithHeader(); + /** + * The meta object literal for the 'Display Header Separator' attribute feature. + * + * @generated + */ + EAttribute RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR = eINSTANCE.getRectangularNodeStyleDescription_DisplayHeaderSeparator(); + /** * The meta object literal for the * '{@link org.eclipse.sirius.components.view.diagram.impl.ImageNodeStyleDescriptionImpl Image Node Style diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/RectangularNodeStyleDescription.java b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/RectangularNodeStyleDescription.java index 329c60a64f..de1931f393 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/RectangularNodeStyleDescription.java +++ b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/RectangularNodeStyleDescription.java @@ -22,6 +22,8 @@ *
    *
  • {@link org.eclipse.sirius.components.view.diagram.RectangularNodeStyleDescription#isWithHeader With * Header}
  • + *
  • {@link org.eclipse.sirius.components.view.diagram.RectangularNodeStyleDescription#isDisplayHeaderSeparator + * Display Header Separator}
  • *
* * @see org.eclipse.sirius.components.view.diagram.DiagramPackage#getRectangularNodeStyleDescription() @@ -52,4 +54,28 @@ public interface RectangularNodeStyleDescription extends NodeStyleDescription { */ void setWithHeader(boolean value); + /** + * Returns the value of the 'Display Header Separator' attribute. + * + * @return the value of the 'Display Header Separator' attribute. + * @see #setDisplayHeaderSeparator(boolean) + * @see org.eclipse.sirius.components.view.diagram.DiagramPackage#getRectangularNodeStyleDescription_DisplayHeaderSeparator() + * @model + * @generated + */ + boolean isDisplayHeaderSeparator(); + + /** + * Sets the value of the + * '{@link org.eclipse.sirius.components.view.diagram.RectangularNodeStyleDescription#isDisplayHeaderSeparator + * Display Header Separator}' attribute. + * + * @param value + * the new value of the 'Display Header Separator' attribute. + * @see #isDisplayHeaderSeparator() + * @generated + */ + void setDisplayHeaderSeparator(boolean value); + } // RectangularNodeStyleDescription 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 a5e3abe475..23baa37da9 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 @@ -960,6 +960,16 @@ public EAttribute getRectangularNodeStyleDescription_WithHeader() { return (EAttribute) this.rectangularNodeStyleDescriptionEClass.getEStructuralFeatures().get(0); } + /** + * + * + * @generated + */ + @Override + public EAttribute getRectangularNodeStyleDescription_DisplayHeaderSeparator() { + return (EAttribute) this.rectangularNodeStyleDescriptionEClass.getEStructuralFeatures().get(1); + } + /** * * @@ -1784,6 +1794,7 @@ public void createPackageContents() { this.rectangularNodeStyleDescriptionEClass = this.createEClass(RECTANGULAR_NODE_STYLE_DESCRIPTION); this.createEAttribute(this.rectangularNodeStyleDescriptionEClass, RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER); + this.createEAttribute(this.rectangularNodeStyleDescriptionEClass, RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR); this.imageNodeStyleDescriptionEClass = this.createEClass(IMAGE_NODE_STYLE_DESCRIPTION); this.createEAttribute(this.imageNodeStyleDescriptionEClass, IMAGE_NODE_STYLE_DESCRIPTION__SHAPE); @@ -2056,6 +2067,8 @@ public void initializePackageContents() { this.initEClass(this.rectangularNodeStyleDescriptionEClass, RectangularNodeStyleDescription.class, "RectangularNodeStyleDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); this.initEAttribute(this.getRectangularNodeStyleDescription_WithHeader(), this.ecorePackage.getEBoolean(), "withHeader", null, 0, 1, RectangularNodeStyleDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); + this.initEAttribute(this.getRectangularNodeStyleDescription_DisplayHeaderSeparator(), this.ecorePackage.getEBoolean(), "displayHeaderSeparator", null, 0, 1, + RectangularNodeStyleDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); this.initEClass(this.imageNodeStyleDescriptionEClass, ImageNodeStyleDescription.class, "ImageNodeStyleDescription", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); this.initEAttribute(this.getImageNodeStyleDescription_Shape(), this.ecorePackage.getEString(), "shape", null, 0, 1, ImageNodeStyleDescription.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/RectangularNodeStyleDescriptionImpl.java b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/RectangularNodeStyleDescriptionImpl.java index 95d68278e6..0725eb8838 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/RectangularNodeStyleDescriptionImpl.java +++ b/packages/view/backend/sirius-components-view-diagram/src/main/java/org/eclipse/sirius/components/view/diagram/impl/RectangularNodeStyleDescriptionImpl.java @@ -61,6 +61,8 @@ * Icon
} *
  • {@link org.eclipse.sirius.components.view.diagram.impl.RectangularNodeStyleDescriptionImpl#isWithHeader With * Header}
  • + *
  • {@link org.eclipse.sirius.components.view.diagram.impl.RectangularNodeStyleDescriptionImpl#isDisplayHeaderSeparator + * Display Header Separator}
  • * * * @generated @@ -346,6 +348,26 @@ public class RectangularNodeStyleDescriptionImpl extends StyleImpl implements Re */ protected boolean withHeader = WITH_HEADER_EDEFAULT; + /** + * The default value of the '{@link #isDisplayHeaderSeparator() Display Header Separator}' attribute. + * + * @see #isDisplayHeaderSeparator() + * @generated + * @ordered + */ + protected static final boolean DISPLAY_HEADER_SEPARATOR_EDEFAULT = false; + + /** + * The cached value of the '{@link #isDisplayHeaderSeparator() Display Header Separator}' attribute. + * + * @see #isDisplayHeaderSeparator() + * @generated + * @ordered + */ + protected boolean displayHeaderSeparator = DISPLAY_HEADER_SEPARATOR_EDEFAULT; + /** * * @@ -746,6 +768,30 @@ public void setWithHeader(boolean newWithHeader) { this.eNotify(new ENotificationImpl(this, Notification.SET, DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER, oldWithHeader, this.withHeader)); } + /** + * + * + * @generated + */ + @Override + public boolean isDisplayHeaderSeparator() { + return this.displayHeaderSeparator; + } + + /** + * + * + * @generated + */ + @Override + public void setDisplayHeaderSeparator(boolean newDisplayHeaderSeparator) { + boolean oldDisplayHeaderSeparator = this.displayHeaderSeparator; + this.displayHeaderSeparator = newDisplayHeaderSeparator; + if (this.eNotificationRequired()) + this.eNotify( + new ENotificationImpl(this, Notification.SET, DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR, oldDisplayHeaderSeparator, this.displayHeaderSeparator)); + } + /** * * @@ -788,6 +834,8 @@ public Object eGet(int featureID, boolean resolve, boolean coreType) { return this.getLabelIcon(); case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER: return this.isWithHeader(); + case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR: + return this.isDisplayHeaderSeparator(); } return super.eGet(featureID, resolve, coreType); } @@ -845,6 +893,9 @@ public void eSet(int featureID, Object newValue) { case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER: this.setWithHeader((Boolean) newValue); return; + case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR: + this.setDisplayHeaderSeparator((Boolean) newValue); + return; } super.eSet(featureID, newValue); } @@ -902,6 +953,9 @@ public void eUnset(int featureID) { case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER: this.setWithHeader(WITH_HEADER_EDEFAULT); return; + case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR: + this.setDisplayHeaderSeparator(DISPLAY_HEADER_SEPARATOR_EDEFAULT); + return; } super.eUnset(featureID); } @@ -944,6 +998,8 @@ public boolean eIsSet(int featureID) { return LABEL_ICON_EDEFAULT == null ? this.labelIcon != null : !LABEL_ICON_EDEFAULT.equals(this.labelIcon); case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER: return this.withHeader != WITH_HEADER_EDEFAULT; + case DiagramPackage.RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR: + return this.displayHeaderSeparator != DISPLAY_HEADER_SEPARATOR_EDEFAULT; } return super.eIsSet(featureID); } @@ -1065,6 +1121,8 @@ public String toString() { result.append(this.labelIcon); result.append(", withHeader: "); result.append(this.withHeader); + result.append(", displayHeaderSeparator: "); + result.append(this.displayHeaderSeparator); result.append(')'); return result.toString(); } 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 491115d9f9..a1a854fff5 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 @@ -139,6 +139,8 @@ + diff --git a/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.genmodel b/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.genmodel index fa256c9787..5f8afb0a92 100644 --- a/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.genmodel +++ b/packages/view/backend/sirius-components-view-diagram/src/main/resources/model/diagram.genmodel @@ -111,6 +111,7 @@ + diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/NodeStylePropertiesConfigurer.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/NodeStylePropertiesConfigurer.java index 432ef6e702..4bbb147c64 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/NodeStylePropertiesConfigurer.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/NodeStylePropertiesConfigurer.java @@ -74,14 +74,19 @@ public class NodeStylePropertiesConfigurer implements IPropertiesDescriptionRegi private static final String EMPTY = ""; private static final String CUSTOM = "/custom/%s"; + private final List parametricSVGImageRegistries; + private final ICustomImageMetadataSearchService customImageSearchService; + private final IPropertiesConfigurerService propertiesConfigurerService; + private final IPropertiesWidgetCreationService propertiesWidgetCreationService; + private final IObjectService objectService; - public NodeStylePropertiesConfigurer(ICustomImageMetadataSearchService customImageSearchService, - List parametricSVGImageRegistries, PropertiesConfigurerService propertiesConfigurerService, IPropertiesWidgetCreationService propertiesWidgetCreationService, IObjectService objectService) { + public NodeStylePropertiesConfigurer(ICustomImageMetadataSearchService customImageSearchService, List parametricSVGImageRegistries, + PropertiesConfigurerService propertiesConfigurerService, IPropertiesWidgetCreationService propertiesWidgetCreationService, IObjectService objectService) { this.customImageSearchService = Objects.requireNonNull(customImageSearchService); this.parametricSVGImageRegistries = parametricSVGImageRegistries; this.propertiesConfigurerService = Objects.requireNonNull(propertiesConfigurerService); @@ -106,9 +111,7 @@ private PageDescription getImageNodeStyleProperties() { GroupDescription groupDescription = this.propertiesWidgetCreationService.createSimpleGroupDescription(controls); - Predicate canCreatePagePredicate = variableManager -> variableManager.get(VariableManager.SELF, Object.class) - .filter(ImageNodeStyleDescription.class::isInstance) - .isPresent(); + Predicate canCreatePagePredicate = variableManager -> variableManager.get(VariableManager.SELF, Object.class).filter(ImageNodeStyleDescription.class::isInstance).isPresent(); return this.propertiesWidgetCreationService.createSimplePageDescription(id, groupDescription, canCreatePagePredicate); } @@ -120,8 +123,7 @@ private PageDescription getIconLabelNodeStyleProperties() { GroupDescription groupDescription = this.propertiesWidgetCreationService.createSimpleGroupDescription(controls); - Predicate canCreatePagePredicate = variableManager -> variableManager.get(VariableManager.SELF, Object.class) - .filter(IconLabelNodeStyleDescription.class::isInstance) + Predicate canCreatePagePredicate = variableManager -> variableManager.get(VariableManager.SELF, Object.class).filter(IconLabelNodeStyleDescription.class::isInstance) .isPresent(); return this.propertiesWidgetCreationService.createSimplePageDescription(id, groupDescription, canCreatePagePredicate); @@ -136,6 +138,10 @@ private PageDescription getRectangularNodeStyleProperties() { style -> ((RectangularNodeStyleDescription) style).isWithHeader(), (style, newWithHeaderValue) -> ((RectangularNodeStyleDescription) style).setWithHeader(newWithHeaderValue), DiagramPackage.Literals.RECTANGULAR_NODE_STYLE_DESCRIPTION__WITH_HEADER, Optional.empty())); + controls.add(this.propertiesWidgetCreationService.createCheckbox("nodestyle.displayHeaderSeparator", "Display header separator", + style -> ((RectangularNodeStyleDescription) style).isDisplayHeaderSeparator(), + (style, newDisplayHeaderSeparator) -> ((RectangularNodeStyleDescription) style).setDisplayHeaderSeparator(newDisplayHeaderSeparator), + DiagramPackage.Literals.RECTANGULAR_NODE_STYLE_DESCRIPTION__DISPLAY_HEADER_SEPARATOR, Optional.empty())); controls.addAll(this.getGeneralControlDescription(NodeType.NODE_RECTANGLE)); @@ -163,17 +169,16 @@ private List getGeneralControlDescription(String nod DiagramPackage.Literals.NODE_STYLE_DESCRIPTION__HEIGHT_COMPUTATION_EXPRESSION); controls.add(heightExpression); - var showIcon = this.propertiesWidgetCreationService.createCheckbox("nodestyle.showIcon", "Show Icon", - style -> ((NodeStyleDescription) style).isShowIcon(), - (style, newValue) -> ((NodeStyleDescription) style).setShowIcon(newValue), - DiagramPackage.Literals.NODE_STYLE_DESCRIPTION__SHOW_ICON, + var showIcon = this.propertiesWidgetCreationService.createCheckbox("nodestyle.showIcon", "Show Icon", style -> ((NodeStyleDescription) style).isShowIcon(), + (style, newValue) -> ((NodeStyleDescription) style).setShowIcon(newValue), DiagramPackage.Literals.NODE_STYLE_DESCRIPTION__SHOW_ICON, Optional.of(variableManager -> "Show an icon near the label, use the default one if no custom icon is set.")); controls.add(showIcon); controls.add(this.createIconSelectionField()); Function> colorOptionsProvider = variableManager -> this.getColorsFromColorPalettesStream(variableManager).toList(); - var labelColor = this.propertiesWidgetCreationService.createReferenceWidget("nodestyle.labelColor", "Label Color", DiagramPackage.Literals.NODE_STYLE_DESCRIPTION__LABEL_COLOR, colorOptionsProvider); + var labelColor = this.propertiesWidgetCreationService.createReferenceWidget("nodestyle.labelColor", "Label Color", DiagramPackage.Literals.NODE_STYLE_DESCRIPTION__LABEL_COLOR, + colorOptionsProvider); controls.add(labelColor); if (!Objects.equals(nodeType, NodeType.NODE_IMAGE)) { @@ -183,84 +188,65 @@ private List getGeneralControlDescription(String nod var borderColor = this.propertiesWidgetCreationService.createReferenceWidget("nodestyle.borderColor", "Border Color", DiagramPackage.Literals.BORDER_STYLE__BORDER_COLOR, colorOptionsProvider); controls.add(borderColor); - var borderRadius = this.propertiesWidgetCreationService.createTextField("nodestyle.borderRadius", "Border Radius", - style -> String.valueOf(((NodeStyleDescription) style).getBorderRadius()), + var borderRadius = this.propertiesWidgetCreationService.createTextField("nodestyle.borderRadius", "Border Radius", style -> String.valueOf(((NodeStyleDescription) style).getBorderRadius()), (style, newBorderRadius) -> { try { ((NodeStyleDescription) style).setBorderRadius(Integer.parseInt(newBorderRadius)); } catch (NumberFormatException nfe) { // Ignore. } - }, - DiagramPackage.Literals.BORDER_STYLE__BORDER_RADIUS); + }, DiagramPackage.Literals.BORDER_STYLE__BORDER_RADIUS); controls.add(borderRadius); - var borderSize = this.propertiesWidgetCreationService.createTextField("nodestyle.borderSize", "Border Size", - style -> String.valueOf(((NodeStyleDescription) style).getBorderSize()), + var borderSize = this.propertiesWidgetCreationService.createTextField("nodestyle.borderSize", "Border Size", style -> String.valueOf(((NodeStyleDescription) style).getBorderSize()), (style, newBorderSize) -> { try { ((NodeStyleDescription) style).setBorderSize(Integer.parseInt(newBorderSize)); } catch (NumberFormatException nfe) { // Ignore. } - }, - DiagramPackage.Literals.BORDER_STYLE__BORDER_SIZE); + }, DiagramPackage.Literals.BORDER_STYLE__BORDER_SIZE); controls.add(borderSize); var borderStyle = this.createBorderLineStyleSelectionField(); controls.add(borderStyle); - var fontSize = this.propertiesWidgetCreationService.createTextField("nodestyle.fontSize", "Font Size", - style -> String.valueOf(((LabelStyle) style).getFontSize()), - (style, newColor) -> { - try { - ((LabelStyle) style).setFontSize(Integer.parseInt(newColor)); - } catch (NumberFormatException nfe) { - // Ignore. - } - }, - ViewPackage.Literals.LABEL_STYLE__FONT_SIZE); + var fontSize = this.propertiesWidgetCreationService.createTextField("nodestyle.fontSize", "Font Size", style -> String.valueOf(((LabelStyle) style).getFontSize()), (style, newColor) -> { + try { + ((LabelStyle) style).setFontSize(Integer.parseInt(newColor)); + } catch (NumberFormatException nfe) { + // Ignore. + } + }, ViewPackage.Literals.LABEL_STYLE__FONT_SIZE); controls.add(fontSize); - var italic = this.propertiesWidgetCreationService.createCheckbox("nodestyle.italic", "Italic", - style -> ((LabelStyle) style).isItalic(), - (style, newItalic) -> ((LabelStyle) style).setItalic(newItalic), - ViewPackage.Literals.LABEL_STYLE__ITALIC, Optional.empty()); + var italic = this.propertiesWidgetCreationService.createCheckbox("nodestyle.italic", "Italic", style -> ((LabelStyle) style).isItalic(), + (style, newItalic) -> ((LabelStyle) style).setItalic(newItalic), ViewPackage.Literals.LABEL_STYLE__ITALIC, Optional.empty()); controls.add(italic); - var bold = this.propertiesWidgetCreationService.createCheckbox("nodestyle.bold", "Bold", - style -> ((LabelStyle) style).isBold(), - (style, newBold) -> ((LabelStyle) style).setBold(newBold), + var bold = this.propertiesWidgetCreationService.createCheckbox("nodestyle.bold", "Bold", style -> ((LabelStyle) style).isBold(), (style, newBold) -> ((LabelStyle) style).setBold(newBold), ViewPackage.Literals.LABEL_STYLE__BOLD, Optional.empty()); controls.add(bold); - var underline = this.propertiesWidgetCreationService.createCheckbox("nodestyle.underline", "Underline", - style -> ((LabelStyle) style).isUnderline(), - (style, newUnderline) -> ((LabelStyle) style).setUnderline(newUnderline), - ViewPackage.Literals.LABEL_STYLE__UNDERLINE, Optional.empty()); + var underline = this.propertiesWidgetCreationService.createCheckbox("nodestyle.underline", "Underline", style -> ((LabelStyle) style).isUnderline(), + (style, newUnderline) -> ((LabelStyle) style).setUnderline(newUnderline), ViewPackage.Literals.LABEL_STYLE__UNDERLINE, Optional.empty()); controls.add(underline); - var strikeThrough = this.propertiesWidgetCreationService.createCheckbox("nodestyle.strikeThrough", "Strike Through", - style -> ((LabelStyle) style).isStrikeThrough(), - (style, newStrikeThrough) -> ((LabelStyle) style).setStrikeThrough(newStrikeThrough), - ViewPackage.Literals.LABEL_STYLE__STRIKE_THROUGH, Optional.empty()); + var strikeThrough = this.propertiesWidgetCreationService.createCheckbox("nodestyle.strikeThrough", "Strike Through", style -> ((LabelStyle) style).isStrikeThrough(), + (style, newStrikeThrough) -> ((LabelStyle) style).setStrikeThrough(newStrikeThrough), ViewPackage.Literals.LABEL_STYLE__STRIKE_THROUGH, Optional.empty()); controls.add(strikeThrough); return controls; } private SelectDescription createBorderLineStyleSelectionField() { - return SelectDescription.newSelectDescription("nodestyle.borderstyle") - .idProvider(variableManager -> "nodestyle.borderstyle") - .targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider()) - .labelProvider(variableManager -> "Border Line Style") - .valueProvider(variableManager -> variableManager.get(VariableManager.SELF, BorderStyle.class).map(BorderStyle::getBorderLineStyle).map(LineStyle::toString) - .orElse(EMPTY)) + return SelectDescription.newSelectDescription("nodestyle.borderstyle").idProvider(variableManager -> "nodestyle.borderstyle") + .targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider()).labelProvider(variableManager -> "Border Line Style") + .valueProvider(variableManager -> variableManager.get(VariableManager.SELF, BorderStyle.class).map(BorderStyle::getBorderLineStyle).map(LineStyle::toString).orElse(EMPTY)) .optionsProvider(variableManager -> LineStyle.VALUES.stream().toList()) .optionIdProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, LineStyle.class).map(LineStyle::getLiteral).orElse(EMPTY)) .optionLabelProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, LineStyle.class).map(LineStyle::getName).orElse(EMPTY)) - .optionIconURLProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, Object.class).map(this.objectService::getImagePath) - .orElse(List.of())) + .optionIconURLProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, Object.class).map(this.objectService::getImagePath).orElse(List.of())) .newValueHandler((variableManager, newValue) -> { var optionalBorderStyle = variableManager.get(VariableManager.SELF, BorderStyle.class); if (optionalBorderStyle.isPresent()) { @@ -272,114 +258,67 @@ private SelectDescription createBorderLineStyleSelectionField() { return new Success(); } return new Failure(""); - }) - .diagnosticsProvider(this.propertiesConfigurerService.getDiagnosticsProvider(DiagramPackage.Literals.BORDER_STYLE__BORDER_LINE_STYLE)) - .kindProvider(this.propertiesConfigurerService.getKindProvider()) - .messageProvider(this.propertiesConfigurerService.getMessageProvider()) - .build(); + }).diagnosticsProvider(this.propertiesConfigurerService.getDiagnosticsProvider(DiagramPackage.Literals.BORDER_STYLE__BORDER_LINE_STYLE)) + .kindProvider(this.propertiesConfigurerService.getKindProvider()).messageProvider(this.propertiesConfigurerService.getMessageProvider()).build(); } - private Stream getColorsFromColorPalettesStream(VariableManager variableManager) { - return variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class) - .filter(EditingContext.class::isInstance) - .map(EditingContext.class::cast) - .map(EditingContext::getDomain) - .map(EditingDomain::getResourceSet) - .map(ResourceSet::getResources) - .stream() - .flatMap(EList::stream) - .map(Resource::getContents) - .flatMap(EList::stream) - .filter(View.class::isInstance) - .map(View.class::cast) - .map(View::getColorPalettes) - .flatMap(EList::stream) - .map(ColorPalette::getColors) - .flatMap(EList::stream); + return variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class).filter(EditingContext.class::isInstance).map(EditingContext.class::cast).map(EditingContext::getDomain) + .map(EditingDomain::getResourceSet).map(ResourceSet::getResources).stream().flatMap(EList::stream).map(Resource::getContents).flatMap(EList::stream).filter(View.class::isInstance) + .map(View.class::cast).map(View::getColorPalettes).flatMap(EList::stream).map(ColorPalette::getColors).flatMap(EList::stream); } private SelectDescription createIconSelectionField() { - return SelectDescription.newSelectDescription("nodestyle.iconLabelSelector") - .idProvider(variableManager -> "nodestyle.iconLabelSelector") - .targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider()) - .labelProvider(variableManager -> "Custom Icon") + return SelectDescription.newSelectDescription("nodestyle.iconLabelSelector").idProvider(variableManager -> "nodestyle.iconLabelSelector") + .targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider()).labelProvider(variableManager -> "Custom Icon") .styleProvider(vm -> SelectStyle.newSelectStyle().showIcon(true).build()) .valueProvider(variableManager -> variableManager.get(VariableManager.SELF, NodeStyleDescription.class).map(NodeStyleDescription::getLabelIcon).orElse(EMPTY)) - .optionsProvider(variableManager -> variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class) - .map(IEditingContext::getId) - .map(this.customImageSearchService::getAvailableImages) - .orElse(List.of()) - ) + .optionsProvider(variableManager -> variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class).map(IEditingContext::getId) + .map(this.customImageSearchService::getAvailableImages).orElse(List.of())) .optionIdProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, CustomImageMetadata.class) - .map(customImageMetadataEntity -> String.format(CUSTOM, customImageMetadataEntity.getId().toString())) - .orElse(EMPTY)) - .optionLabelProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, CustomImageMetadata.class) - .map(CustomImageMetadata::getLabel) - .orElse(EMPTY)) + .map(customImageMetadataEntity -> String.format(CUSTOM, customImageMetadataEntity.getId().toString())).orElse(EMPTY)) + .optionLabelProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, CustomImageMetadata.class).map(CustomImageMetadata::getLabel).orElse(EMPTY)) .optionIconURLProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, CustomImageMetadata.class) - .map(customImageMetadataEntity -> List.of(String.format(CUSTOM, customImageMetadataEntity.getId().toString()))) - .orElse(List.of())) + .map(customImageMetadataEntity -> List.of(String.format(CUSTOM, customImageMetadataEntity.getId().toString()))).orElse(List.of())) .newValueHandler(this.getIconLabelValueHandler()) .diagnosticsProvider(this.propertiesConfigurerService.getDiagnosticsProvider(DiagramPackage.Literals.NODE_STYLE_DESCRIPTION__LABEL_ICON)) - .kindProvider(this.propertiesConfigurerService.getKindProvider()) - .messageProvider(this.propertiesConfigurerService.getMessageProvider()) - .helpTextProvider(variableManager -> "Set a custom icon for the label, use in association with Show Icon property") - .build(); + .kindProvider(this.propertiesConfigurerService.getKindProvider()).messageProvider(this.propertiesConfigurerService.getMessageProvider()) + .helpTextProvider(variableManager -> "Set a custom icon for the label, use in association with Show Icon property").build(); } private SelectDescription createShapeSelectionField() { - return SelectDescription.newSelectDescription("nodestyle.shapeSelector") - .idProvider(variableManager -> "nodestyle.shapeSelector") - .targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider()) - .labelProvider(variableManager -> "Shape") + return SelectDescription.newSelectDescription("nodestyle.shapeSelector").idProvider(variableManager -> "nodestyle.shapeSelector") + .targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider()).labelProvider(variableManager -> "Shape") .valueProvider(variableManager -> variableManager.get(VariableManager.SELF, ImageNodeStyleDescription.class).map(ImageNodeStyleDescription::getShape).orElse(EMPTY)) .optionsProvider(variableManager -> { Optional optionalEditingContextId = variableManager.get(IEditingContext.EDITING_CONTEXT, IEditingContext.class).map(IEditingContext::getId); - Stream parametricSVGs = this.parametricSVGImageRegistries.stream() - .flatMap(service -> service.getImages().stream()) + Stream parametricSVGs = this.parametricSVGImageRegistries.stream().flatMap(service -> service.getImages().stream()) .map(image -> new CustomImageMetadata(image.getId(), optionalEditingContextId, image.getLabel(), "image/svg+xml")); List customImages = optionalEditingContextId.map(this.customImageSearchService::getAvailableImages).orElse(List.of()); - return Stream.concat(parametricSVGs, customImages.stream()) - .sorted(Comparator.comparing(CustomImageMetadata::getLabel)) - .toList(); + return Stream.concat(parametricSVGs, customImages.stream()).sorted(Comparator.comparing(CustomImageMetadata::getLabel)).toList(); }) - .optionIdProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, CustomImageMetadata.class) - .map(CustomImageMetadata::getId) - .map(UUID::toString) - .orElse(EMPTY)) - .optionLabelProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, CustomImageMetadata.class) - .map(CustomImageMetadata::getLabel) - .orElse(EMPTY)) - .optionIconURLProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, Object.class).map(this.objectService::getImagePath) - .orElse(List.of())) + .optionIdProvider( + variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, CustomImageMetadata.class).map(CustomImageMetadata::getId).map(UUID::toString).orElse(EMPTY)) + .optionLabelProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, CustomImageMetadata.class).map(CustomImageMetadata::getLabel).orElse(EMPTY)) + .optionIconURLProvider(variableManager -> variableManager.get(SelectComponent.CANDIDATE_VARIABLE, Object.class).map(this.objectService::getImagePath).orElse(List.of())) .newValueHandler(this.getNewShapeValueHandler()) .diagnosticsProvider(this.propertiesConfigurerService.getDiagnosticsProvider(DiagramPackage.Literals.IMAGE_NODE_STYLE_DESCRIPTION__SHAPE)) - .kindProvider(this.propertiesConfigurerService.getKindProvider()) - .messageProvider(this.propertiesConfigurerService.getMessageProvider()) - .build(); + .kindProvider(this.propertiesConfigurerService.getKindProvider()).messageProvider(this.propertiesConfigurerService.getMessageProvider()).build(); } private ImageDescription createShapePreviewField() { - return ImageDescription.newImageDescription("nodestyle.shapePreview") - .targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider()) - .idProvider(variableManager -> "nodestyle.shapePreview") - .labelProvider(variableManager -> "Shape Preview") - .urlProvider(variableManager -> { + return ImageDescription.newImageDescription("nodestyle.shapePreview").targetObjectIdProvider(this.propertiesConfigurerService.getSemanticTargetIdProvider()) + .idProvider(variableManager -> "nodestyle.shapePreview").labelProvider(variableManager -> "Shape Preview").urlProvider(variableManager -> { var optionalShape = variableManager.get(VariableManager.SELF, ImageNodeStyleDescription.class).map(ImageNodeStyleDescription::getShape); if (optionalShape.isPresent()) { return String.format(CUSTOM, optionalShape.get()); } return ""; - }) - .maxWidthProvider(variableManager -> "300px") - .diagnosticsProvider(variableManager -> List.of()) - .kindProvider(this.propertiesConfigurerService.getKindProvider()) - .messageProvider(this.propertiesConfigurerService.getMessageProvider()) - .build(); + }).maxWidthProvider(variableManager -> "300px").diagnosticsProvider(variableManager -> List.of()).kindProvider(this.propertiesConfigurerService.getKindProvider()) + .messageProvider(this.propertiesConfigurerService.getMessageProvider()).build(); } private BiFunction getIconLabelValueHandler() { diff --git a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewDiagramDescriptionConverter.java b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewDiagramDescriptionConverter.java index 86d675dfc6..c6f6e830c9 100644 --- a/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewDiagramDescriptionConverter.java +++ b/packages/view/backend/sirius-components-view-emf/src/main/java/org/eclipse/sirius/components/view/emf/diagram/ViewDiagramDescriptionConverter.java @@ -328,12 +328,20 @@ private InsideLabelDescription getInsideLabelDescription(org.eclipse.sirius.comp return false; }; + Function displayHeaderSeparatorProvider = variableManager -> { + var effectiveStyle = this.findEffectiveStyle(viewNodeDescription, interpreter, variableManager); + if (effectiveStyle instanceof RectangularNodeStyleDescription rectangularNodeStyleDescription) { + return rectangularNodeStyleDescription.isDisplayHeaderSeparator(); + } + return false; + }; + return InsideLabelDescription.newInsideLabelDescription(EcoreUtil.getURI(viewNodeDescription).toString() + InsideLabelDescription.INSIDE_LABEL_SUFFIX) .idProvider(labelIdProvider) .textProvider(variableManager -> this.evaluateString(interpreter, variableManager, viewNodeDescription.getLabelExpression())) .styleDescriptionProvider(styleDescriptionProvider) .isHeaderProvider(isHeaderProvider) - .displayHeaderSeparatorProvider(isHeaderProvider) + .displayHeaderSeparatorProvider(displayHeaderSeparatorProvider) .insideLabelLocation(InsideLabelLocation.TOP_CENTER) .build(); }