diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index 98e5876265..408f3670eb 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/2535[#2535] [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 0000000000..5274854bde Binary files /dev/null and b/doc/screenshots/compartmentWithHeaderWithoutSeparator.png differ diff --git a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/ListNodeConverterHandler.ts b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/ListNodeConverterHandler.ts index 9ff516edea..2dab1b3e94 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/ListNodeConverterHandler.ts +++ b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/ListNodeConverterHandler.ts @@ -68,6 +68,7 @@ const toListNode = ( text: insideLabel.text, iconURL: labelStyle.iconURL, isHeader: insideLabel.isHeader, + displayHeaderSeparator: insideLabel.displayHeaderSeparator, style: { display: 'flex', flexDirection: 'row', @@ -82,7 +83,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/converter/RectangleNodeConverterHandler.ts b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/RectangleNodeConverterHandler.ts index 734247e0ee..c4b0c0de28 100644 --- a/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/RectangleNodeConverterHandler.ts +++ b/packages/diagrams/frontend/sirius-components-diagrams-reactflow/src/converter/RectangleNodeConverterHandler.ts @@ -68,6 +68,7 @@ const toRectangularNode = ( id: insideLabel.id, text: insideLabel.text, isHeader: insideLabel.isHeader, + displayHeaderSeparator: insideLabel.displayHeaderSeparator, style: { display: 'flex', flexDirection: 'row', @@ -83,7 +84,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' }; 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 05255f0a9e..5bb9afd8d1 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(); }