]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/styles/DistrictNetworkStaticInfoStyle.java
Usability fixes for district network node hover info showing
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / styles / DistrictNetworkStaticInfoStyle.java
index e452a17b1f52188d8ab43b48de2a4302c5ad2a8a..5c5c80b7f6cc3b644c630936551fd6f5092c61fc 100644 (file)
@@ -9,6 +9,7 @@ import org.simantics.db.Resource;
 import org.simantics.db.common.procedure.adapter.TransientCacheListener;
 import org.simantics.db.common.request.ResourceRead;
 import org.simantics.db.exception.DatabaseException;
+import org.simantics.db.layer0.exception.MissingVariableException;
 import org.simantics.db.layer0.exception.MissingVariableValueException;
 import org.simantics.db.layer0.exception.PendingVariableException;
 import org.simantics.db.layer0.util.Layer0Utils;
@@ -19,22 +20,35 @@ import org.simantics.diagram.stubs.DiagramResource;
 import org.simantics.district.network.DistrictNetworkUtil;
 import org.simantics.district.network.ontology.DistrictNetworkResource;
 import org.simantics.district.network.profile.MidBranchEdgeSetRequest;
+import org.simantics.district.network.ui.nodes.DeferredRenderingNode;
+import org.simantics.district.network.ui.nodes.DistrictNetworkEdgeNode;
 import org.simantics.district.network.ui.nodes.DistrictNetworkNodeUtils;
 import org.simantics.district.network.ui.nodes.DistrictNetworkStaticInfoNode;
 import org.simantics.layer0.Layer0;
 import org.simantics.scenegraph.INode;
+import org.simantics.scenegraph.ParentNode;
+import org.simantics.scenegraph.g2d.IG2DNode;
+import org.simantics.scenegraph.g2d.nodes.ConnectionNode;
+import org.simantics.scenegraph.g2d.nodes.spatial.RTreeNode;
 import org.simantics.scenegraph.profile.EvaluationContext;
 import org.simantics.scenegraph.profile.common.ProfileVariables;
+import org.simantics.scenegraph.utils.NodeUtil;
 import org.simantics.scl.compiler.top.ValueNotFound;
 import org.simantics.scl.osgi.SCLOsgi;
 import org.simantics.scl.runtime.SCLContext;
 import org.simantics.scl.runtime.function.Function1;
 import org.simantics.structural.stubs.StructuralResource2;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class DistrictNetworkStaticInfoStyle extends StyleBase<DistrictNetworkStaticInfoStyle.StyleResult> {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(DistrictNetworkStaticInfoStyle.class);
+
        private static final String ACTIONS_MODULE = "Actions";
        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) {
@@ -49,7 +63,7 @@ public class DistrictNetworkStaticInfoStyle extends StyleBase<DistrictNetworkSta
        }
        
        public DistrictNetworkStaticInfoStyle(Resource style) {
-               super(style);
+               super();
        }
        
        @Override
@@ -94,6 +108,11 @@ public class DistrictNetworkStaticInfoStyle extends StyleBase<DistrictNetworkSta
                        result = Simantics.applySCLRead(graph, function, moduleVariable);
                } 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 + ">";
                }
                
                if (isVertex) {
@@ -122,6 +141,12 @@ public class DistrictNetworkStaticInfoStyle extends StyleBase<DistrictNetworkSta
                        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;
@@ -138,6 +163,12 @@ public class DistrictNetworkStaticInfoStyle extends StyleBase<DistrictNetworkSta
                        Point2D direction = new Point2D.Double(0.5 * sign * (p1.getX() - p2.getX()), 0.5 * sign * (p1.getY() - p2.getY()));
                        
                        node.setLocation(origin, direction);
+                       
+                       for (IG2DNode n : ((ConnectionNode)parent).getNodes()) {
+                               if (n instanceof DistrictNetworkEdgeNode) {
+                                       node.setEdgeNode((DistrictNetworkEdgeNode) n);
+                               }
+                       }
                }
                
                node.setInfo(result.info);