]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.diagram/src/org/simantics/diagram/elements/SVGNode.java
Supply SVG text editor with element measurement context
[simantics/platform.git] / bundles / org.simantics.diagram / src / org / simantics / diagram / elements / SVGNode.java
index 8084c2a41fcef9e6e2c8a235719cf648e381f24b..4d654791925080230f51a9b525cc777a1f7760d7 100644 (file)
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2010 Association for Decentralized Information Management
+ * Copyright (c) 2007, 2017 Association for Decentralized Information Management
  * in Industry THTH ry.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -28,13 +28,19 @@ import org.simantics.scenegraph.g2d.events.command.CommandEvent;
 import org.simantics.scenegraph.g2d.nodes.SVGNodeAssignment;
 import org.simantics.scenegraph.g2d.nodes.SingleElementNode;
 import org.simantics.scenegraph.utils.NodeUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.kitfox.svg.SVGDiagram;
 import com.kitfox.svg.SVGException;
+import com.kitfox.svg.Text;
+import com.kitfox.svg.Tspan;
 
 @RasterOutputWidget
 public class SVGNode extends org.simantics.scenegraph.g2d.nodes.SVGNode {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(SVGNode.class);
+
     private static final long serialVersionUID = 4735066193941274186L;
 
     transient EditorStateManager esm  = null;
@@ -51,12 +57,14 @@ public class SVGNode extends org.simantics.scenegraph.g2d.nodes.SVGNode {
     public void render(Graphics2D g2d) {
         if (!parametersProcessed) {
             SingleElementNode sne = getSingleElementNode();
-            Boolean enableEditing = sne.getParameter("enableEditing");
-            if (enableEditing != null && enableEditing) {
-                esm = new EditorStateManager(this);
-                addEventHandler(this);
+            if (sne != null) {
+                Boolean enableEditing = sne.getParameter("enableEditing");
+                if (enableEditing != null && enableEditing) {
+                    esm = new EditorStateManager(this);
+                    addEventHandler(this);
+                }
+                parametersProcessed = true;
             }
-            parametersProcessed = true;
         }
 
         super.render(g2d);
@@ -76,7 +84,9 @@ public class SVGNode extends org.simantics.scenegraph.g2d.nodes.SVGNode {
     }
 
     private boolean isSelected(IG2DNode node) {
-        ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(this);
+        ICanvasContext ctx = DiagramNodeUtil.getPossibleCanvasContext(this);
+        if (ctx == null)
+            return false;
         IElement ie = DiagramNodeUtil.getElement(ctx, node);
         if (ie == null)
             return false;
@@ -119,10 +129,6 @@ public class SVGNode extends org.simantics.scenegraph.g2d.nodes.SVGNode {
     }
 
     SingleElementNode getSingleElementNode() {
-        ICanvasContext ctx = DiagramNodeUtil.getCanvasContext(this);
-        // FIXME: needed only because eventdelegator registrations are done before adding node to scene graph.
-        if (ctx == null)
-            return null;
         return (SingleElementNode)NodeUtil.getNearestParentOfType(this, SingleElementNode.class);
     }
 
@@ -150,4 +156,22 @@ public class SVGNode extends org.simantics.scenegraph.g2d.nodes.SVGNode {
         return EventTypes.KeyPressedMask | EventTypes.MouseClickMask | EventTypes.CommandMask;
     }
 
+    public void modifyTextElement(String id, String newText) {
+        Text text = (Text) diagramCache.getElement(id);
+
+        EditorState es = new EditorState();
+        es.base = new EditorStateStatic();
+        es.base.textElementId = text.getId();
+
+        Tspan span = (Tspan)text.getContent().get(0);
+
+        try {
+            span.setText(newText);
+            text.rebuild();
+            diagramCache.updateTime(0);
+        } catch (SVGException e) {
+            LOGGER.error("Failed to update text span element " + id + " with text " + newText, e);
+        }
+    }
+
 }