]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/connection/RouteGraphNode.java
Dynamic terminals and connections
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / nodes / connection / RouteGraphNode.java
index 687731f4c2f9d8528ab40cc0c6189151672828f4..0a2583fc6dd734552999376241b15b509f235086 100644 (file)
@@ -23,7 +23,9 @@ import java.awt.geom.Path2D;
 import java.awt.geom.Point2D;
 import java.awt.geom.Rectangle2D;
 import java.lang.reflect.Constructor;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 
 import org.simantics.diagram.connection.RouteGraph;
@@ -59,12 +61,16 @@ import org.simantics.scenegraph.g2d.events.command.CommandEvent;
 import org.simantics.scenegraph.g2d.events.command.Commands;
 import org.simantics.scenegraph.g2d.nodes.GridNode;
 import org.simantics.scenegraph.g2d.nodes.LinkNode;
+import org.simantics.scenegraph.g2d.nodes.SVGNodeAssignment;
 import org.simantics.scenegraph.g2d.nodes.connection.HighlightActionPointsAction.Action;
 import org.simantics.scenegraph.g2d.nodes.connection.HighlightActionPointsAction.Pick;
 import org.simantics.scenegraph.g2d.snap.ISnapAdvisor;
+import org.simantics.scenegraph.utils.ColorUtil;
 import org.simantics.scenegraph.utils.GeometryUtils;
 import org.simantics.scenegraph.utils.InitValueSupport;
 import org.simantics.scenegraph.utils.NodeUtil;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Logger;
 
 import gnu.trove.map.hash.THashMap;
 
@@ -73,7 +79,9 @@ import gnu.trove.map.hash.THashMap;
  */
 public class RouteGraphNode extends G2DNode implements ISelectionPainterNode, InitValueSupport  {
 
-    private static final long       serialVersionUID = -917194130412280965L;
+    private static final Logger LOGGER = LoggerFactory.getLogger(RouteGraphNode.class);
+
+       private static final long       serialVersionUID = -917194130412280965L;
 
     private static final double     TOLERANCE        = IAction.TOLERANCE;
     private static final Stroke     SELECTION_STROKE = new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER);
@@ -123,7 +131,7 @@ public class RouteGraphNode extends G2DNode implements ISelectionPainterNode, In
 
 
     protected transient Map<Object,ILineEndStyle> dynamicStyles = null;
-    
+
     private transient boolean ignoreSelection = false;
     
     @Override
@@ -132,6 +140,74 @@ public class RouteGraphNode extends G2DNode implements ISelectionPainterNode, In
         wrapRenderer();
     }
 
+    private static float tryParseFloat(String s, float def) {
+       try {
+               return Float.parseFloat(s);
+       } catch (NumberFormatException e) {
+               LOGGER.error("Could not parse '" + s + "' into float.");
+               return def;
+       }
+    }
+    
+    /*
+     * 1.0 BUTT MITER 1.0 0.0
+     */
+    private static Stroke parseStroke(String definition) {
+       
+       float width = 1.0f;
+       int cap = BasicStroke.CAP_BUTT;
+       int join = BasicStroke.JOIN_MITER;
+       float miterLimit = 1.0f;
+       float[] dash = { 1, 0};
+       float dash_phase = 0;
+
+       String[] parts = definition.split(" ");
+       
+       if(parts.length > 0) {
+               width = tryParseFloat(parts[0], width);
+       }
+       if(parts.length > 1) { 
+               if("BUTT".equals(parts[1])) cap = BasicStroke.CAP_BUTT;
+               else if("ROUND".equals(parts[1])) cap = BasicStroke.CAP_ROUND;
+               else if("SQUARE".equals(parts[1])) cap = BasicStroke.CAP_SQUARE;
+       }
+       if(parts.length > 2) { 
+               if("BEVEL".equals(parts[2])) cap = BasicStroke.JOIN_BEVEL;
+               else if("MITER".equals(parts[2])) cap = BasicStroke.JOIN_MITER;
+               else if("ROUND".equals(parts[2])) cap = BasicStroke.JOIN_ROUND;
+       }
+       if(parts.length > 3) {
+               miterLimit = tryParseFloat(parts[3], miterLimit);
+       } 
+       if(parts.length > 4) {
+               dash_phase = tryParseFloat(parts[4], dash_phase);
+       }
+       if(parts.length > 6) {
+               dash = new float[parts.length - 5];
+               for(int i=5;i<parts.length;i++) {
+                       dash[i-5] = tryParseFloat(parts[i], 1.0f);
+               }
+       }
+                       
+       
+       try {
+               return new BasicStroke(width, cap, join, miterLimit, dash, dash_phase);
+       } catch (IllegalArgumentException e) {
+               return new BasicStroke();
+       }
+       
+    }
+    
+    public void setAssignments(List<SVGNodeAssignment> assignments) {
+       for(SVGNodeAssignment ass : assignments) {
+               if("dynamicColor".equals(ass.elementId)) {
+                       setDynamicColor(ColorUtil.hexColor(ass.value));
+               } else if("dynamicStroke".equals(ass.elementId)) {
+                       setDynamicStroke(parseStroke(ass.value));
+               }
+       }
+    }
+
     public void setIgnoreSelection(boolean value) {
         ignoreSelection = value;
     }