@@ -628,12 +628,20 @@ private void drawHighlightedNode(XMLStreamWriter writer, VoltageLevelNode vlNode
628628 }
629629
630630 private void drawTextNodes (Graph graph , XMLStreamWriter writer ) throws XMLStreamException {
631- writer .writeStartElement (GROUP_ELEMENT_NAME );
632- writer .writeAttribute (CLASS_ATTRIBUTE , StyleProvider .TEXT_NODES_CLASS );
633- for (Pair <VoltageLevelNode , TextNode > nodePair : graph .getVoltageLevelTextPairs ()) {
634- writeTextNode (writer , nodePair .getSecond (), nodePair .getFirst (), labelProvider );
631+ List <Pair <VoltageLevelNode , TextNode >> textNodes = graph .getVoltageLevelTextPairs ().stream ()
632+ .filter (nodePair -> nodePair .getSecond () != null )
633+ .toList ();
634+
635+ if (!textNodes .isEmpty ()) {
636+ writeForeignObject (writer );
637+ writer .writeStartElement ("" , DIV_ELEMENT_NAME , XHTML_NAMESPACE_URI );
638+ writer .writeDefaultNamespace (XHTML_NAMESPACE_URI );
639+ for (Pair <VoltageLevelNode , TextNode > nodePair : textNodes ) {
640+ writeDetailedTextNode (writer , nodePair .getSecond (), nodePair .getFirst ());
641+ }
642+ writer .writeEndElement ();
643+ writer .writeEndElement ();
635644 }
636- writer .writeEndElement ();
637645 }
638646
639647 private String getTranslateString (Node node ) {
@@ -648,24 +656,22 @@ private String getTranslateString(double x, double y) {
648656 return "translate(" + getFormattedValue (x ) + "," + getFormattedValue (y ) + ")" ;
649657 }
650658
651- private void writeTextNode (XMLStreamWriter writer , TextNode textNode , VoltageLevelNode vlNode , LabelProvider labelProvider ) throws XMLStreamException {
652- if (textNode == null ) {
653- return ;
654- }
655-
659+ private void writeForeignObject (XMLStreamWriter writer ) throws XMLStreamException {
656660 writer .writeStartElement (FOREIGN_OBJECT_ELEMENT_NAME );
657- writeId (writer , textNode );
658- writer .writeAttribute (Y_ATTRIBUTE , getFormattedValue (textNode .getY ()));
659- writer .writeAttribute (X_ATTRIBUTE , getFormattedValue (textNode .getX ()));
660-
661- // width and height cannot be set to auto, and object is of width and height 0 if not specified
661+ // width and height can be set neither to auto nor 0, due to firefox not displaying it in those cases
662662 // using a fixed size of 1x1 and CSS {overflow: visible} to display it
663663 writer .writeAttribute (HEIGHT_ATTRIBUTE , "1" );
664664 writer .writeAttribute (WIDTH_ATTRIBUTE , "1" );
665+ writeStyleClasses (writer , StyleProvider .TEXT_NODES_CLASS );
666+ }
665667
668+ private void writeDetailedTextNode (XMLStreamWriter writer , TextNode textNode , VoltageLevelNode vlNode ) throws XMLStreamException {
666669 writer .writeStartElement ("" , DIV_ELEMENT_NAME , XHTML_NAMESPACE_URI );
667- writer .writeDefaultNamespace (XHTML_NAMESPACE_URI );
668670 writer .writeAttribute (CLASS_ATTRIBUTE , StyleProvider .LABEL_BOX_CLASS );
671+ long top = Math .round (textNode .getY ());
672+ long left = Math .round (textNode .getX ());
673+ writeStyleAttribute (writer , String .format ("position: absolute; top: %spx; left: %spx" , top , left ));
674+ writeId (writer , textNode );
669675
670676 List <String > vlDescription = labelProvider .getVoltageLevelDescription (vlNode );
671677 writeLines (vlDescription , writer );
@@ -676,7 +682,6 @@ private void writeTextNode(XMLStreamWriter writer, TextNode textNode, VoltageLev
676682 writeLines (vlDetails , writer );
677683
678684 writer .writeEndElement ();
679- writer .writeEndElement ();
680685 }
681686
682687 private void writeLines (List <String > lines , XMLStreamWriter writer ) throws XMLStreamException {
0 commit comments