@@ -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 {
0 commit comments