]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/TextNode.java
Merge "Counting of pending nodes does not work if null text is saved as """
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / elements / TextNode.java
index 4554decee2c01a41b032be9dab5c77ecec2af2f7..bf1bf563b32c9f9e89c2c2355902d2a5b5f1ef02 100644 (file)
@@ -51,6 +51,8 @@ import org.simantics.scenegraph.LoaderNode;
 import org.simantics.scenegraph.ScenegraphUtils;
 import org.simantics.scenegraph.g2d.G2DNode;
 import org.simantics.scenegraph.g2d.G2DPDFRenderingHints;
+import org.simantics.scenegraph.g2d.G2DRenderingHints;
+import org.simantics.scenegraph.g2d.G2DRenderingHints.TextRenderingMode;
 import org.simantics.scenegraph.g2d.events.Event;
 import org.simantics.scenegraph.g2d.events.EventTypes;
 import org.simantics.scenegraph.g2d.events.KeyEvent.KeyPressedEvent;
@@ -60,7 +62,6 @@ import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
-import org.simantics.scenegraph.g2d.events.NodeEventHandler;
 import org.simantics.scenegraph.g2d.events.command.CommandEvent;
 import org.simantics.scenegraph.g2d.events.command.Commands;
 import org.simantics.scenegraph.utils.GeometryUtils;
@@ -402,13 +403,14 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
         if (hasState(STATE_EDITING))
             return;
 
-        this.text = new String(text != null ? text : "");
+        this.text = text;
         this.font = font;
         this.color = color;
         this.scale = scale;
         this.scaleRecip = 1.0 / scale;
         this.caret = 0;
         this.selectionTail = 0;
+        
 
         resetCaches();
     }
@@ -468,8 +470,8 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
         // no value => value
         if(this.text == null && text != null) NodeUtil.decreasePending(this);
 
-        this.text = text != null ? text : "";
-        caret = Math.min(caret, this.text.length());
+        this.text = text;
+        caret = text != null ? Math.min(caret, text.length()) : 0;
         selectionTail = caret;
 
         resetCaches();
@@ -710,7 +712,8 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
 
         // PDF 
         PdfWriter writer = (PdfWriter) g.getRenderingHint(G2DPDFRenderingHints.KEY_PDF_WRITER);
-        boolean isRenderingPdf = writer != null;
+        TextRenderingMode renderingMode = (TextRenderingMode) g.getRenderingHint(G2DRenderingHints.KEY_TEXT_RENDERING_MODE);
+        boolean renderAsText = writer != null || renderingMode == TextRenderingMode.AS_TEXT;
         /// PDF
 
         Color backgroundColor = hasState(STATE_VALID) ? this.backgroundColor : Color.red;
@@ -730,7 +733,7 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
 
                 // Base text
                 g.setColor(color);
-                renderText(g, xOffset, isRenderingPdf);
+                renderText(g, xOffset, renderAsText);
 
                 Shape clip = g.getClip();
 
@@ -744,7 +747,7 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
                         g.fill(selShape);
                         g.setColor(Color.WHITE);
                         // #6459: render as text in PDF and paths on screen
-                        if (isRenderingPdf)
+                        if (renderAsText)
                             g.drawString(line.getText(), 0, 0);
                         else
                             line.layout.draw(g, 0, 0);
@@ -760,7 +763,7 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
 
                 if (renderText) {
                     g.setColor(color);
-                    renderText(g, 0, isRenderingPdf);
+                    renderText(g, 0, renderAsText);
                 }
 
             }
@@ -823,11 +826,11 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
           }
         }
     }
-    private void renderText(Graphics2D g, float xOffset, boolean isRenderingPdf) {
+    private void renderText(Graphics2D g, float xOffset, boolean renderAsText) {
         //g.draw(tightBoundsCache); // DEBUG
         for (Line line : lines) {
             // #6459: render as text in PDF and paths on screen
-            if (isRenderingPdf)
+            if (renderAsText)
                 g.drawString(line.getText(), line.alignedPosX + xOffset, line.alignedPosY);
             else
                 line.layout.draw(g, line.alignedPosX + xOffset, line.alignedPosY);
@@ -855,6 +858,18 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
     protected void renderSelectedHover(Graphics2D g, boolean isSelected, boolean isHovering) {
     }
 
+    public String editText(String text) {
+
+        String error = validator != null ? validator.apply(text) : null;
+        if (error == null) {
+            this.text = text;
+            if (textListener != null) {
+                textListener.textEditingEnded();
+            }
+        }
+        return error;
+    }
+
     /**
      * Replaces the current selection with the content or inserts
      * the content at caret. After the insertion the caret
@@ -1423,6 +1438,9 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
             y += line.layout.getDescent() + line.layout.getLeading() + line.layout.getAscent();
 
             Rectangle2D bbox = line.layout.getLogicalHighlightShape(0, lineText.length()).getBounds2D();
+            // HighlightShape is not large enough, if font is italic.
+            Rectangle2D bbox2 = line.layout.getBounds();
+            bbox.add(bbox2);
             bbox.setFrame(bbox.getX(), bbox.getY() + line.drawPosY, bbox.getWidth(), bbox.getHeight());
             line.bbox = bbox;
         }
@@ -1803,7 +1821,6 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
     protected boolean mouseDragged(MouseDragBegin e) {
         if (isHovering()
                 && (isControlDown(e) || isShiftDown(e))
-                && e.context instanceof NodeEventHandler
                 && (dataRVI != null || text != null))
         {
             List<Transferable> trs = new ArrayList<>(2);