@@ -638,8 +638,27 @@ private void drawHighlightedNode(XMLStreamWriter writer, VoltageLevelNode vlNode
638638 private void drawTextNodes (Graph graph , XMLStreamWriter writer ) throws XMLStreamException {
639639 writer .writeStartElement (GROUP_ELEMENT_NAME );
640640 writer .writeAttribute (CLASS_ATTRIBUTE , StyleProvider .TEXT_NODES_CLASS );
641- for (Pair <VoltageLevelNode , TextNode > nodePair : graph .getVoltageLevelTextPairs ()) {
642- writeTextNode (writer , nodePair .getSecond (), nodePair .getFirst (), labelProvider );
641+ List <Pair <VoltageLevelNode , TextNode >> simpleTextNodes = new ArrayList <>();
642+ List <Pair <VoltageLevelNode , TextNode >> detailedTextNodes = new ArrayList <>();
643+ graph .getVoltageLevelTextPairs ().stream ()
644+ .filter (nodePair -> nodePair .getSecond () != null )
645+ .forEach (nodePair -> {
646+ if (isDetailedTextNode (labelProvider .getVoltageLevelDescription (nodePair .getFirst ()))) {
647+ detailedTextNodes .add (nodePair );
648+ } else {
649+ simpleTextNodes .add (nodePair );
650+ }
651+ });
652+ for (Pair <VoltageLevelNode , TextNode > nodePair : simpleTextNodes ) {
653+ writeSimpleTextNode (writer , nodePair .getSecond (), labelProvider .getVoltageLevelDescription (nodePair .getFirst ()));
654+ }
655+ if (!detailedTextNodes .isEmpty ()) {
656+ TextNode firstNode = detailedTextNodes .get (0 ).getSecond ();
657+ writeForeignObject (writer , firstNode );
658+ for (Pair <VoltageLevelNode , TextNode > nodePair : detailedTextNodes ) {
659+ writeDetailedTextNode (writer , firstNode , nodePair .getSecond (), nodePair .getFirst (), labelProvider .getVoltageLevelDescription (nodePair .getFirst ()));
660+ }
661+ writer .writeEndElement ();
643662 }
644663 writer .writeEndElement ();
645664 }
@@ -656,34 +675,27 @@ private String getTranslateString(double x, double y) {
656675 return "translate(" + getFormattedValue (x ) + "," + getFormattedValue (y ) + ")" ;
657676 }
658677
659- private void writeTextNode (XMLStreamWriter writer , TextNode textNode , VoltageLevelNode vlNode , LabelProvider labelProvider ) throws XMLStreamException {
660- if (textNode == null ) {
661- return ;
662- }
663-
664- List <String > content = labelProvider .getVoltageLevelDescription (vlNode );
665- if (content .size () > 1 || svgParameters .isBusLegend () || svgParameters .isVoltageLevelDetails ()) {
666- writeDetailedTextNode (writer , textNode , vlNode , content );
667- } else {
668- writeSimpleTextNode (writer , textNode , content );
669- }
678+ private boolean isDetailedTextNode (List <String > content ) {
679+ return content .size () > 1 || svgParameters .isBusLegend () || svgParameters .isVoltageLevelDetails ();
670680 }
671681
672- private void writeDetailedTextNode (XMLStreamWriter writer , TextNode textNode , VoltageLevelNode vlNode , List < String > content ) throws XMLStreamException {
682+ private void writeForeignObject (XMLStreamWriter writer , TextNode textNode ) throws XMLStreamException {
673683 writer .writeStartElement (FOREIGN_OBJECT_ELEMENT_NAME );
674684 writeId (writer , textNode );
675685 writer .writeAttribute (Y_ATTRIBUTE , getFormattedValue (textNode .getY ()));
676686 writer .writeAttribute (X_ATTRIBUTE , getFormattedValue (textNode .getX ()));
677-
678- // width and height cannot be set to auto, and object is of width and height 0 if not specified
679- // using a fixed size of 1x1 and CSS {overflow: visible} to display it
680687 writer .writeAttribute (HEIGHT_ATTRIBUTE , "1" );
681688 writer .writeAttribute (WIDTH_ATTRIBUTE , "1" );
689+ }
682690
691+ private void writeDetailedTextNode (XMLStreamWriter writer , TextNode firstNode , TextNode textNode , VoltageLevelNode vlNode , List <String > content ) throws XMLStreamException {
683692 writer .writeStartElement ("" , DIV_ELEMENT_NAME , XHTML_NAMESPACE_URI );
684693 writer .writeDefaultNamespace (XHTML_NAMESPACE_URI );
685694 writer .writeAttribute (CLASS_ATTRIBUTE , StyleProvider .LABEL_BOX_CLASS );
686-
695+ long top = Math .round (textNode .getY () - firstNode .getY ());
696+ long left = Math .round (textNode .getX () - firstNode .getX ());
697+ writeStyleAttribute (writer , String .format ("position: absolute; top: %spx; left: %spx" , top , left ));
698+ writeId (writer , textNode );
687699 writeLines (content , writer );
688700
689701 if (svgParameters .isBusLegend ()) {
@@ -695,7 +707,6 @@ private void writeDetailedTextNode(XMLStreamWriter writer, TextNode textNode, Vo
695707 }
696708
697709 writer .writeEndElement ();
698- writer .writeEndElement ();
699710 }
700711
701712 private void writeLines (List <String > lines , XMLStreamWriter writer ) throws XMLStreamException {
0 commit comments