]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/styles/DistrictNetworkStaticInfoStyle.java
Interim fix for orientation/location of static info on network branches
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / styles / DistrictNetworkStaticInfoStyle.java
index ad72279772c94321c8e82de362492414464e0125..ebdc01418e848423c3d3f30b0fd3f4a3f38251c8 100644 (file)
@@ -1,6 +1,7 @@
 package org.simantics.district.network.ui.styles;
 
 import java.awt.geom.Point2D;
+import java.util.Objects;
 import java.util.Set;
 
 import org.simantics.Simantics;
@@ -49,55 +50,76 @@ public class DistrictNetworkStaticInfoStyle extends StyleBase<DistrictNetworkSta
        private static final String PIPELINE_INFO = "pipelineInfo";
 
        public static final String STATIC_INFO_DEFERRED = "staticInfo";
-       
+
        public static class StyleResult {
-               public StyleResult(Point2D p1, Point2D p2, String info) {
+               public StyleResult(Resource r, Point2D p1, String info) {
+                       this.r = r;
                        this.p1 = p1;
-                       this.p2 = p2;
                        this.info = info;
                }
-               
-               public Point2D p1;
-               public Point2D p2;
-               public String info;
+
+               public final Resource r;
+               public final Point2D p1;
+               public final String info;
+
+               @Override
+               public int hashCode() {
+                       final int prime = 31;
+                       int result = 1;
+                       result = prime * result + r.hashCode();
+                       result = prime * result + ((info == null) ? 0 : info.hashCode());
+                       result = prime * result + ((p1 == null) ? 0 : p1.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;
+                       StyleResult other = (StyleResult) obj;
+                       return r.equals(other.r) && Objects.equals(info, other.info) && Objects.equals(p1, other.p1);
+               }
        }
-       
+
        public DistrictNetworkStaticInfoStyle(Resource style) {
                super(style);
        }
-       
+
+       private static final Point2D EDGE = new Point2D.Double();
+
        @Override
        public StyleResult calculateStyle(ReadGraph graph, Resource runtimeDiagram, Resource entry, Resource mapElement)
                        throws DatabaseException {
                DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
-               
-               boolean isEdge = graph.isInstanceOf(mapElement, DN.Edge);
-               boolean isVertex = graph.isInstanceOf(mapElement, DN.Vertex);
+               Set<Resource> types = graph.getTypes(mapElement);
+               boolean isEdge = types.contains(DN.Edge);
+               boolean isVertex = types.contains(DN.Vertex);
                if (!isEdge && !isVertex)
                        return null;
-               
+
                if (isEdge) {
                        Resource diagram = graph.getSingleObject(mapElement, Layer0.getInstance(graph).PartOf);
                        Set<Resource> edgesToUse = graph.syncRequest(new MidBranchEdgeSetRequest(diagram), TransientCacheListener.instance());
                        if (!edgesToUse.contains(mapElement))
                                return null;
                }
-               
-               DiagramResource DIA = DiagramResource.getInstance(graph);
-               StructuralResource2 STR = StructuralResource2.getInstance(graph);
-               
+
                Resource module = DistrictNetworkUtil.getMappedComponentCached(graph, mapElement);
                if (module == null)
                        return null;
 
+               StructuralResource2 STR = StructuralResource2.getInstance(graph);
                Resource moduleType = graph.getPossibleType(module, STR.Component);
                if (moduleType == null)
                        return null;
-               
+
                Function1<Variable, String> function = getUCPipelineInfoFunctionCached(graph, moduleType);
                if (function == null)
                        return null;
-               
+
                String result;
                try {
                        Variable variable = Variables.getVariable(graph, module);
@@ -109,76 +131,61 @@ public class DistrictNetworkStaticInfoStyle extends StyleBase<DistrictNetworkSta
                } catch (PendingVariableException | MissingVariableValueException e) {
                        result = null;
                } catch (MissingVariableException e) {
-                   // the requested variable is missing from the UC
-               String message = e.getMessage();
-                   LOGGER.warn("Missing variable for calculating style with function {} {}", function, message);
-                   result = "<" + message + ">";
+                       // the requested variable is missing from the UC
+                       String message = e.getMessage();
+                       LOGGER.warn("Missing variable for calculating style with function {} {}", function, message);
+                       result = "<" + message + ">";
                }
-               
+
                if (isVertex) {
+                       DiagramResource DIA = DiagramResource.getInstance(graph);
                        double[] coords = graph.getRelatedValue(mapElement, DIA.HasLocation);
                        Point2D p = DistrictNetworkNodeUtils.calculatePoint2D(new Point2D.Double(coords[0], coords[1]), null);
-                       return new StyleResult(p, p, result);
-               }
-               else if (isEdge) {
-                       Resource v1 = graph.getSingleObject(mapElement, DN.HasStartVertex);
-                       double[] coords1 = graph.getRelatedValue(v1, DIA.HasLocation);
-                       Resource v2 = graph.getSingleObject(mapElement, DN.HasEndVertex);
-                       double[] coords2 = graph.getRelatedValue(v2, DIA.HasLocation);
-                       Point2D p1 = DistrictNetworkNodeUtils.calculatePoint2D(new Point2D.Double(coords1[0], coords1[1]), null);
-                       Point2D p2 = DistrictNetworkNodeUtils.calculatePoint2D(new Point2D.Double(coords2[0], coords2[1]), null);
-                       
-                       return new StyleResult(p1, p2, result);
+                       return new StyleResult(mapElement, p, result);
+               } else if (isEdge) {
+                       return new StyleResult(mapElement, EDGE, result);
                }
-               
                return null;
        }
-       
+
        @Override
        public void applyStyleForNode(EvaluationContext evaluationContext, INode parent, StyleResult result) {
                if (result == null) {
                        cleanupStyleForNode(evaluationContext, parent);
                        return;
                }
-               
+
                ParentNode<?> root = (ParentNode<?>) NodeUtil.getNearestParentOfType(parent, RTreeNode.class);
                if (root != null) {
                        DeferredRenderingNode deferred = ProfileVariables.claimChild(root, "", STATIC_INFO_DEFERRED, DeferredRenderingNode.class, evaluationContext);
                        deferred.setZIndex(Integer.MAX_VALUE-1);
                }
-               
+
                DistrictNetworkStaticInfoNode node = ProfileVariables.claimChild(parent, "*", DistrictNetworkStaticInfoNode.NODE_KEY, DistrictNetworkStaticInfoNode.class, evaluationContext);
                if (node == null)
                        return;
 
                Point2D p1 = result.p1;
-               Point2D p2 = result.p2;
-               
-               if (p1.equals(p2)) {
+               if (p1 != EDGE) {
                        node.setLocation(p1, new Point2D.Double(1.0, 0.0));
-               }
-               else {
-                       double sign = Math.signum(p1.getX() - p2.getX());
-                       Point2D.Double origin = new Point2D.Double(0.5 * (p1.getX() + p2.getX()), 0.5 * (p1.getY() + p2.getY()));
-                       Point2D direction = new Point2D.Double(0.5 * sign * (p1.getX() - p2.getX()), 0.5 * sign * (p1.getY() - p2.getY()));
-                       
-                       node.setLocation(origin, direction);
-                       
+               } else {
+                       // StaticInfoNode takes care of positioning the text during render
+                       // based on the found DistrictNetworkEdgeNode's information.
                        for (IG2DNode n : ((ConnectionNode)parent).getNodes()) {
                                if (n instanceof DistrictNetworkEdgeNode) {
                                        node.setEdgeNode((DistrictNetworkEdgeNode) n);
                                }
                        }
                }
-               
+
                node.setInfo(result.info);
        }
-       
+
        private static Function1<Variable, String> getUCPipelineInfoFunctionCached(ReadGraph graph, Resource componentType)
                        throws DatabaseException {
                return graph.syncRequest(new UCPipelineInfoRequest(componentType), TransientCacheListener.instance());
        }
-       
+
        private static final class UCPipelineInfoRequest extends ResourceRead<Function1<Variable, String>> {
                public UCPipelineInfoRequest(Resource resource) {
                        super(resource);
@@ -190,7 +197,7 @@ public class DistrictNetworkStaticInfoStyle extends StyleBase<DistrictNetworkSta
                        Resource actionsModule = Layer0Utils.getPossibleChild(graph, resource, ACTIONS_MODULE);
                        if (actionsModule == null || !graph.isInstanceOf(actionsModule, Layer0.getInstance(graph).SCLModule))
                                return null;
-                       
+
                        String uri = graph.getURI(actionsModule);
                        SCLContext sclContext = SCLContext.getCurrent();
                        Object oldGraph = sclContext.get("graph");
@@ -204,9 +211,10 @@ public class DistrictNetworkStaticInfoStyle extends StyleBase<DistrictNetworkSta
                        }
                }
        }
-       
+
        @Override
        protected void cleanupStyleForNode(EvaluationContext evaluationContext, INode node) {
                ProfileVariables.denyChild(node, "*", DistrictNetworkStaticInfoNode.NODE_KEY);
        }
+
 }