Skip to content

Commit 8a3a2a8

Browse files
authored
NAD: Use single foreignObject for all text nodes (#691)
Signed-off-by: Giovanni Ferrari <giovanni.ferrari@soft.it>
1 parent 9d06de7 commit 8a3a2a8

63 files changed

Lines changed: 845 additions & 1772 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

network-area-diagram/src/main/java/com/powsybl/nad/svg/SvgWriter.java

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -630,12 +630,20 @@ private void drawHighlightedNode(XMLStreamWriter writer, VoltageLevelNode vlNode
630630
}
631631

632632
private void drawTextNodes(Graph graph, XMLStreamWriter writer) throws XMLStreamException {
633-
writer.writeStartElement(GROUP_ELEMENT_NAME);
634-
writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.TEXT_NODES_CLASS);
635-
for (Pair<VoltageLevelNode, TextNode> nodePair : graph.getVoltageLevelTextPairs()) {
636-
writeTextNode(writer, nodePair.getSecond(), nodePair.getFirst(), labelProvider);
633+
List<Pair<VoltageLevelNode, TextNode>> textNodes = graph.getVoltageLevelTextPairs().stream()
634+
.filter(nodePair -> nodePair.getSecond() != null)
635+
.toList();
636+
637+
if (!textNodes.isEmpty()) {
638+
writeForeignObject(writer);
639+
writer.writeStartElement("", DIV_ELEMENT_NAME, XHTML_NAMESPACE_URI);
640+
writer.writeDefaultNamespace(XHTML_NAMESPACE_URI);
641+
for (Pair<VoltageLevelNode, TextNode> nodePair : textNodes) {
642+
writeDetailedTextNode(writer, nodePair.getSecond(), nodePair.getFirst());
643+
}
644+
writer.writeEndElement();
645+
writer.writeEndElement();
637646
}
638-
writer.writeEndElement();
639647
}
640648

641649
private String getTranslateString(Node node) {
@@ -650,24 +658,22 @@ private String getTranslateString(double x, double y) {
650658
return "translate(" + getFormattedValue(x) + "," + getFormattedValue(y) + ")";
651659
}
652660

653-
private void writeTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLevelNode vlNode, LabelProvider labelProvider) throws XMLStreamException {
654-
if (textNode == null) {
655-
return;
656-
}
657-
661+
private void writeForeignObject(XMLStreamWriter writer) throws XMLStreamException {
658662
writer.writeStartElement(FOREIGN_OBJECT_ELEMENT_NAME);
659-
writeId(writer, textNode);
660-
writer.writeAttribute(Y_ATTRIBUTE, getFormattedValue(textNode.getY()));
661-
writer.writeAttribute(X_ATTRIBUTE, getFormattedValue(textNode.getX()));
662-
663-
// width and height cannot be set to auto, and object is of width and height 0 if not specified
663+
// width and height can be set neither to auto nor 0, due to firefox not displaying it in those cases
664664
// using a fixed size of 1x1 and CSS {overflow: visible} to display it
665665
writer.writeAttribute(HEIGHT_ATTRIBUTE, "1");
666666
writer.writeAttribute(WIDTH_ATTRIBUTE, "1");
667+
writeStyleClasses(writer, StyleProvider.TEXT_NODES_CLASS);
668+
}
667669

670+
private void writeDetailedTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLevelNode vlNode) throws XMLStreamException {
668671
writer.writeStartElement("", DIV_ELEMENT_NAME, XHTML_NAMESPACE_URI);
669-
writer.writeDefaultNamespace(XHTML_NAMESPACE_URI);
670672
writer.writeAttribute(CLASS_ATTRIBUTE, StyleProvider.LABEL_BOX_CLASS);
673+
long top = Math.round(textNode.getY());
674+
long left = Math.round(textNode.getX());
675+
writeStyleAttribute(writer, String.format("position: absolute; top: %spx; left: %spx", top, left));
676+
writeId(writer, textNode);
671677

672678
List<String> vlDescription = labelProvider.getVoltageLevelDescription(vlNode);
673679
writeLines(vlDescription, writer);
@@ -678,7 +684,6 @@ private void writeTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLev
678684
writeLines(vlDetails, writer);
679685

680686
writer.writeEndElement();
681-
writer.writeEndElement();
682687
}
683688

684689
private void writeLines(List<String> lines, XMLStreamWriter writer) throws XMLStreamException {

network-area-diagram/src/main/resources/customStyle.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ path.nad-arrow-out:not(.nad-state-out .nad-arrow-out) {visibility: hidden}
1010
path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden}
1111
.nad-text-background {flood-color: #90a4aeaa}
1212
.nad-text-nodes {font: 25px serif; fill: black; dominant-baseline: central}
13-
.nad-text-nodes foreignObject {overflow: visible; color: black}
13+
foreignObject.nad-text-nodes {overflow: visible; color: black}
1414
.nad-label-box {background-color: #6c6c6c20; width: max-content; padding: 10px; border-radius: 10px;}
1515
.nad-legend-square {width: 20px; height: 20px; background: var(--nad-vl-color, lightgrey);}
1616
.nad-edge-infos text, .nad-edge-label text {font: 20px serif; dominant-baseline:middle; stroke: #FFFFFFAA; stroke-width: 10; stroke-linejoin:round; paint-order: stroke}

network-area-diagram/src/main/resources/nominalStyle.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden}
1414
.nad-current {fill: #bd4802}
1515
.nad-text-background {flood-color: #90a4aeaa}
1616
.nad-text-nodes {font: 25px serif; fill: black; dominant-baseline: central}
17-
.nad-text-nodes foreignObject {overflow: visible; color: black}
17+
foreignObject.nad-text-nodes {overflow: visible; color: black}
1818
.nad-label-box {background-color: #6c6c6c20; width: max-content; padding: 10px; border-radius: 10px;}
1919
.nad-edge-infos text, .nad-edge-label text {font: 20px serif; dominant-baseline:middle; stroke: #FFFFFFAA; stroke-width: 10; stroke-linejoin:round; paint-order: stroke}
2020
.nad-vl0to30 {--nad-vl-color: #AFB42B}

network-area-diagram/src/main/resources/topologicalStyle.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ path.nad-arrow-in:not(.nad-state-in .nad-arrow-in) {visibility: hidden}
1414
.nad-current {fill: #bd4802}
1515
.nad-text-background {flood-color: #90a4aeaa}
1616
.nad-text-nodes {font: 25px serif; fill: black; dominant-baseline: central}
17-
.nad-text-nodes foreignObject {overflow: visible; color: black}
17+
foreignObject.nad-text-nodes {overflow: visible; color: black}
1818
.nad-label-box {background-color: #6c6c6c20; width: max-content; padding: 10px; border-radius: 10px;}
1919
.nad-legend-square {width: 20px; height: 20px; background: var(--nad-vl-color, black);}
2020
.nad-edge-infos text, .nad-edge-label text {font: 20px serif; dominant-baseline:middle; stroke: #FFFFFFAA; stroke-width: 10; stroke-linejoin:round; paint-order: stroke}

network-area-diagram/src/test/resources/3wt.svg

Lines changed: 8 additions & 12 deletions
Loading

network-area-diagram/src/test/resources/3wt_disconnected.svg

Lines changed: 8 additions & 12 deletions
Loading

network-area-diagram/src/test/resources/3wt_disconnected_topological.svg

Lines changed: 8 additions & 12 deletions
Loading

network-area-diagram/src/test/resources/3wt_overridden_styles.svg

Lines changed: 8 additions & 12 deletions
Loading

network-area-diagram/src/test/resources/3wt_partial.svg

Lines changed: 6 additions & 6 deletions
Loading

network-area-diagram/src/test/resources/3wt_pst.svg

Lines changed: 6 additions & 6 deletions
Loading

0 commit comments

Comments
 (0)