]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/TextNode.java
Sync git svn branch with SVN repository r33368.
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / elements / TextNode.java
index ed8df095a72b587f297002fcc3ecca9d80852e04..b407796e7b814736614dc620e0274fc4987b3aa1 100644 (file)
@@ -11,8 +11,6 @@
  *******************************************************************************/\r
 package org.simantics.diagram.elements;\r
 \r
-import gnu.trove.list.array.TIntArrayList;\r
-\r
 import java.awt.AlphaComposite;\r
 import java.awt.BasicStroke;\r
 import java.awt.Color;\r
@@ -42,6 +40,7 @@ import java.text.AttributedString;
 import java.util.ArrayList;\r
 import java.util.Arrays;\r
 import java.util.Hashtable;\r
+import java.util.List;\r
 \r
 import org.simantics.datatypes.literal.RGB;\r
 import org.simantics.db.layer0.variable.RVI;\r
@@ -62,15 +61,17 @@ import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;\r
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin;\r
 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;\r
+import org.simantics.scenegraph.g2d.events.NodeEventHandler;\r
 import org.simantics.scenegraph.g2d.events.command.CommandEvent;\r
 import org.simantics.scenegraph.g2d.events.command.Commands;\r
-import org.simantics.scenegraph.g2d.events.NodeEventHandler;\r
 import org.simantics.scenegraph.utils.GeometryUtils;\r
 import org.simantics.scenegraph.utils.NodeUtil;\r
 import org.simantics.scl.runtime.function.Function1;\r
 import org.simantics.scl.runtime.function.Function2;\r
 import org.simantics.ui.colors.Colors;\r
 import org.simantics.ui.dnd.LocalObjectTransferable;\r
+import org.simantics.ui.dnd.MultiTransferable;\r
+import org.simantics.ui.dnd.PlaintextTransfer;\r
 import org.simantics.ui.fonts.Fonts;\r
 import org.simantics.utils.threads.AWTThread;\r
 \r
@@ -82,6 +83,8 @@ import com.lowagie.text.pdf.PdfFormField;
 import com.lowagie.text.pdf.PdfWriter;\r
 import com.lowagie.text.pdf.TextField;\r
 \r
+import gnu.trove.list.array.TIntArrayList;\r
+\r
 \r
 /**\r
  * TextNode which supports in-line editing.\r
@@ -670,6 +673,7 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
 \r
         // PDF \r
         PdfWriter writer = (PdfWriter) g.getRenderingHint(G2DPDFRenderingHints.KEY_PDF_WRITER);\r
+        boolean isRenderingPdf = writer != null;\r
         boolean isPdfField = false;\r
         String fieldName = null;\r
         if (writer != null) {\r
@@ -699,7 +703,7 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
 \r
                 // Base text\r
                 g.setColor(color);\r
-                renderText(g, xOffset);\r
+                renderText(g, xOffset, isRenderingPdf);\r
 \r
                 Shape clip = g.getClip();\r
 \r
@@ -712,8 +716,11 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
                         g.setColor(SELECTION_BACKGROUND_COLOR);\r
                         g.fill(selShape);\r
                         g.setColor(Color.WHITE);\r
-                        //line.layout.draw(g, 0, 0);\r
-                        g.drawString(line.getText(), 0, 0);\r
+                        // #6459: render as text in PDF and paths on screen\r
+                        if (isRenderingPdf)\r
+                            g.drawString(line.getText(), 0, 0);\r
+                        else\r
+                            line.layout.draw(g, 0, 0);\r
                         line.translateInv(g, xOffset, 0);\r
                     }\r
                 }\r
@@ -729,7 +736,7 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
 \r
                 if (renderText) {\r
                     g.setColor(color);\r
-                    renderText(g, 0);\r
+                    renderText(g, 0, isRenderingPdf);\r
                 }\r
 \r
             }\r
@@ -880,11 +887,14 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
           }\r
         }\r
     }\r
-    private void renderText(Graphics2D g, float xOffset) {\r
+    private void renderText(Graphics2D g, float xOffset, boolean isRenderingPdf) {\r
         //g.draw(tightBoundsCache); // DEBUG\r
         for (Line line : lines) {\r
-            //line.layout.draw(g, line.alignedPosX + xOffset, line.alignedPosY);\r
-            g.drawString(line.getText(), line.alignedPosX + xOffset, line.alignedPosY);\r
+            // #6459: render as text in PDF and paths on screen\r
+            if (isRenderingPdf)\r
+                g.drawString(line.getText(), line.alignedPosX + xOffset, line.alignedPosY);\r
+            else\r
+                line.layout.draw(g, line.alignedPosX + xOffset, line.alignedPosY);\r
             //g.draw(line.abbox); // DEBUG\r
         }\r
     }\r
@@ -1858,9 +1868,19 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
         if (isHovering()\r
                 && (isControlDown(e) || isShiftDown(e))\r
                 && e.context instanceof NodeEventHandler\r
-                && dataRVI != null)\r
+                && (dataRVI != null || text != null))\r
         {\r
-            e.transferable = new LocalObjectTransferable(dataRVI);\r
+            List<Transferable> trs = new ArrayList<>(2);\r
+            if (dataRVI != null) {\r
+                trs.add(new LocalObjectTransferable(dataRVI));\r
+                trs.add(new PlaintextTransfer(dataRVI.toString()));\r
+            } else if (text != null && !text.isEmpty()) {\r
+                trs.add(new PlaintextTransfer(text));\r
+            }\r
+            if (!trs.isEmpty()) {\r
+                e.transferable = new MultiTransferable(trs);\r
+                return true;\r
+            }\r
         }\r
         return false;\r
     }\r
@@ -1930,7 +1950,7 @@ public class TextNode extends G2DNode implements IDynamicSelectionPainterNode, L
     @Override\r
     public int getEventMask() {\r
         return EventTypes.KeyPressedMask | EventTypes.MouseMovedMask | EventTypes.MouseButtonPressedMask\r
-                | EventTypes.MouseClickMask | EventTypes.CommandMask;\r
+                | EventTypes.MouseClickMask | EventTypes.MouseDragBeginMask | EventTypes.CommandMask;\r
     }\r
 \r
     private MouseEvent lastMouseEvent = null;\r