]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/nodes/SVGNode.java
Dynamic terminals and connections
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / nodes / SVGNode.java
index cdd6a26458f578d4b30fbe3e5b8099a6191f6550..ec85fd75c86e7893a8b7341bcfde6641e380d244 100644 (file)
@@ -27,6 +27,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.WeakHashMap;
 
 import org.simantics.scenegraph.ExportableWidget.RasterOutputWidget;
@@ -56,53 +57,7 @@ import com.kitfox.svg.animation.AnimationElement;
 @RasterOutputWidget
 public class SVGNode extends G2DNode implements InitValueSupport, LoaderNode {
 
-       public static class SVGNodeAssignment {
-               public String elementId;
-               public String attributeNameOrId;
-               public String value;
-               public SVGNodeAssignment(String elementId, String attributeNameOrId, String value) {
-                       this.elementId = elementId;
-                       this.attributeNameOrId = attributeNameOrId;
-                       this.value = value;
-               }
-               @Override
-               public int hashCode() {
-                       final int prime = 31;
-                       int result = 1;
-                       result = prime * result + ((attributeNameOrId == null) ? 0 : attributeNameOrId.hashCode());
-                       result = prime * result + ((elementId == null) ? 0 : elementId.hashCode());
-                       result = prime * result + ((value == null) ? 0 : value.hashCode());
-                       return result;
-               }
-               @Override
-               public boolean equals(Object obj) {
-                       if (this == obj)
-                               return true;
-                       if (obj == null)
-                               return false;
-                       if (getClass() != obj.getClass())
-                               return false;
-                       SVGNodeAssignment other = (SVGNodeAssignment) obj;
-                       if (attributeNameOrId == null) {
-                               if (other.attributeNameOrId != null)
-                                       return false;
-                       } else if (!attributeNameOrId.equals(other.attributeNameOrId))
-                               return false;
-                       if (elementId == null) {
-                               if (other.elementId != null)
-                                       return false;
-                       } else if (!elementId.equals(other.elementId))
-                               return false;
-                       if (value == null) {
-                               if (other.value != null)
-                                       return false;
-                       } else if (!value.equals(other.value))
-                               return false;
-                       return true;
-               }
-       }
-       
-    private static final long serialVersionUID = 8508750881358776559L;
+       private static final long serialVersionUID = 8508750881358776559L;
 
     protected String          data             = null;
     protected String          defaultData      = null;
@@ -218,32 +173,55 @@ public class SVGNode extends G2DNode implements InitValueSupport, LoaderNode {
                     diagramCache = null;
                 }
 
-                // NOTE: hard-coded to assume all SVG data is encoded in UTF-8
-                byte[] dataBytes = data.getBytes("UTF-8");
+                
+                // Lets check for rootAssignment that contributes the whole SVG 
+                SVGNodeAssignment rootAssignment = null;
+                if (!assignments.isEmpty()) {
+                    for (SVGNodeAssignment ass : assignments) {
+                        if (ass.attributeNameOrId.equals("$root")) {
+                            rootAssignment = ass;
+                            break;
+                        }
+                    }
+                }
+                byte[] dataBytes;
+                if (rootAssignment != null) {
+                    dataBytes = rootAssignment.value.getBytes("UTF-8");
+                } else {
+                    // NOTE: hard-coded to assume all SVG data is encoded in UTF-8
+                    dataBytes = data.getBytes("UTF-8");
+                }
                 dataHash = digest(dataBytes, assignments);
                 URI uri = univ.loadSVG(new ByteArrayInputStream(dataBytes), dataHash);
                 diagramCache = univ.getDiagram(uri, false);
 
                 if (diagramCache != null) {
                     univ.incRefCount(diagramCache.getXMLBase());
-
-                    if (diagramCache.getRoot() == null) {
+                    SVGRoot root = diagramCache.getRoot();
+                    if (root == null) {
                         univ.decRefCount(diagramCache.getXMLBase());
                         diagramCache = univ.getDiagram(univ.loadSVG(BROKEN_SVG_DATA), false);
                         dataHash = "broken";
                         univ.incRefCount(diagramCache.getXMLBase());
                         bbox = (Rectangle2D) diagramCache.getRoot().getBoundingBox().clone();
                     } else {
-                        bbox = diagramCache.getRoot().getBoundingBox();
+                        bbox = root.getBoundingBox();
                         if (bbox.isEmpty()) {
-                            univ.decRefCount(diagramCache.getXMLBase());
-                            diagramCache = univ.getDiagram(univ.loadSVG(EMPTY_SVG_DATA), false);
-                            dataHash = "empty";
-                            univ.incRefCount(diagramCache.getXMLBase());
-                            bbox = (Rectangle2D) diagramCache.getRoot().getBoundingBox().clone();
+                            // Lets check if this should be visible or not
+                            Set presentationAttributes = root.getPresentationAttributes();
+                            if (!presentationAttributes.contains("display")) {
+                                // TODO: fix this - How can one read values of attributes in SVG salamander???
+                                univ.decRefCount(diagramCache.getXMLBase());
+                                diagramCache = univ.getDiagram(univ.loadSVG(EMPTY_SVG_DATA), false);
+                                dataHash = "empty";
+                                univ.incRefCount(diagramCache.getXMLBase());
+                                bbox = (Rectangle2D) root.getBoundingBox().clone();
+                            } else {
+                                bbox = new Rectangle2D.Double(0, 0, 0, 0);
+                            }
                         } else {
                             if (applyAssignments(diagramCache, assignments)) {
-                                bbox = (Rectangle2D) diagramCache.getRoot().getBoundingBox().clone();
+                                bbox = (Rectangle2D) root.getBoundingBox().clone();
                             } else {
                                 bbox = (Rectangle2D) bbox.clone();
                             }
@@ -273,12 +251,19 @@ public class SVGNode extends G2DNode implements InitValueSupport, LoaderNode {
             return false;
         boolean changed = false;
         for (SVGNodeAssignment ass : assignments) {
+//             System.err.println("assign: " + ass.elementId + " " + ass.attributeNameOrId + " " + ass.value);
+//             if("opacity".equals(ass.attributeNameOrId))
+//                     System.err.println("faaf");
             SVGElement e = diagram.getElement(ass.elementId);
             if (e != null) {
                 if ("$text".equals(ass.attributeNameOrId)) {
                     if (e instanceof Tspan) {
                         Tspan t = (Tspan) e;
-                        t.setText(ass.value);
+                        if (ass.value.trim().isEmpty()) {
+                               t.setText("-");
+                        } else {
+                               t.setText(ass.value);
+                        }
                         SVGElement parent = t.getParent();
                         if (parent instanceof Text)
                             ((Text) parent).rebuild();