X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2Fstyles%2FDistrictNetworkHoverInfoStyle.java;h=a5fa89d42b952415f25fb527d2e36c962b32d5ce;hb=db676ef698d299ae757d2c405d25b6eba8872d53;hp=f01fa2aeece9cdd63dc1e340908307f98158399d;hpb=38cb4b0b42c4c35a696bb46ffcf8129ca8d89103;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/styles/DistrictNetworkHoverInfoStyle.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/styles/DistrictNetworkHoverInfoStyle.java index f01fa2ae..a5fa89d4 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/styles/DistrictNetworkHoverInfoStyle.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/styles/DistrictNetworkHoverInfoStyle.java @@ -11,6 +11,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; @@ -20,26 +21,36 @@ import org.simantics.diagram.profile.StyleBase; import org.simantics.diagram.stubs.DiagramResource; import org.simantics.district.network.DistrictNetworkUtil; import org.simantics.district.network.ontology.DistrictNetworkResource; +import org.simantics.district.network.ui.nodes.DeferredRenderingNode; import org.simantics.district.network.ui.nodes.DistrictNetworkHoverInfoNode; import org.simantics.district.network.ui.nodes.DistrictNetworkNodeUtils; import org.simantics.layer0.Layer0; import org.simantics.modeling.ModelingResources; import org.simantics.scenegraph.INode; +import org.simantics.scenegraph.ParentNode; +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.scl.runtime.tuple.Tuple3; import org.simantics.structural.stubs.StructuralResource2; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class DistrictNetworkHoverInfoStyle extends StyleBase { + public static final String HOVER_INFO_DEFERRED = "hoverInfo"; + + private static final Logger LOGGER = LoggerFactory.getLogger(DistrictNetworkHoverInfoStyle.class); + private static final String ACTIONS_MODULE = "Actions"; private static final String HOVER_CONTRIBUTION = "hoverContribution"; - public class StyleResult { + public static class StyleResult { Point2D origin; List labels; @@ -70,75 +81,97 @@ public class DistrictNetworkHoverInfoStyle extends StyleBase> function = getUCTextGridFunctionCached(graph, moduleType); - if (function == null) - return null; - - List result; - try { - Variable variable = Variables.getVariable(graph, module); - Variable moduleVariable = Variables.possibleActiveVariable(graph, variable); - if (moduleVariable == null) - moduleVariable = variable; - - result = Simantics.applySCLRead(graph, function, moduleVariable); - } catch (PendingVariableException | MissingVariableValueException e) { - result = Collections.singletonList(new Tuple3("", "", "")); - } - - Point2D point; - DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); - if (graph.isInstanceOf(mapElement, DN.Vertex)) { - double[] coords = graph.getRelatedValue(mapElement, DIA.HasLocation); - point = DistrictNetworkNodeUtils.calculatePoint2D(new Point2D.Double(coords[0], coords[1]), null); - } - else if (graph.isInstanceOf(mapElement, DN.Edge)) { - 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); - point = DistrictNetworkNodeUtils.calculatePoint2D(new Point2D.Double((coords1[0] + coords2[0]) / 2, (coords1[1] + coords2[1]) / 2), null); - } - else { - return null; - } - - return new StyleResult(point, result); - } - + + @Override + public StyleResult calculateStyle(ReadGraph graph, Resource runtimeDiagram, Resource entry, Resource mapElement, + Variable configuration) throws DatabaseException { + //return doCalculateStyleResult(graph, runtimeDiagram, mapElement); + return new StyleResult(calculatePoint(graph, mapElement), Collections.emptyList()); + } + + public static StyleResult doCalculateStyleResult(ReadGraph graph, Resource runtimeDiagram, Resource mapElement) throws DatabaseException { + DiagramResource DIA = DiagramResource.getInstance(graph); + StructuralResource2 STR = StructuralResource2.getInstance(graph); + + String variableURI = graph.getPossibleRelatedValue(runtimeDiagram, DIA.RuntimeDiagram_HasVariable, + Bindings.STRING); + Variable activeVariable = org.simantics.db.layer0.variable.Variables.getPossibleVariable(graph, variableURI); + if (activeVariable == null) + return null; + + Resource module = DistrictNetworkUtil.getMappedComponentCached(graph, mapElement); + if (module == null) + return null; + + Resource moduleType = graph.getPossibleType(module, STR.Component); + if (moduleType == null) + return null; + + Function1> function = getUCTextGridFunctionCached(graph, moduleType); + if (function == null) + return null; + + List result; + try { + Variable variable = Variables.getVariable(graph, module); + Variable moduleVariable = Variables.possibleActiveVariable(graph, variable); + if (moduleVariable == null) + moduleVariable = variable; + + result = Simantics.applySCLRead(graph, function, moduleVariable); + } catch (PendingVariableException | MissingVariableValueException e) { + result = Collections.singletonList(new Tuple3("", "", "")); + } 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 = Collections.singletonList(new Tuple3("<" + message + ">", "", "")); + } + + Point2D point = calculatePoint(graph, mapElement); + + return new StyleResult(point, result); + } + + public static Point2D calculatePoint(ReadGraph graph, Resource mapElement) throws DatabaseException { + Point2D point; + DiagramResource DIA = DiagramResource.getInstance(graph); + DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph); + if (graph.isInstanceOf(mapElement, DN.Vertex)) { + double[] coords = graph.getRelatedValue(mapElement, DIA.HasLocation); + point = DistrictNetworkNodeUtils.calculatePoint2D(new Point2D.Double(coords[0], coords[1]), null); + } else if (graph.isInstanceOf(mapElement, DN.Edge)) { + 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); + point = DistrictNetworkNodeUtils.calculatePoint2D( + new Point2D.Double((coords1[0] + coords2[0]) / 2, (coords1[1] + coords2[1]) / 2), null); + } else { + return null; + } + return point; + } + @Override public void applyStyleForNode(EvaluationContext observer, INode parent, StyleResult results) { - if (results == null) { - cleanupStyleForNode(observer, parent); - return; - } - - DistrictNetworkHoverInfoNode node = ProfileVariables.claimChild(parent, "*", DistrictNetworkHoverInfoNode.NODE_KEY, DistrictNetworkHoverInfoNode.class, observer); - if (node == null) - return; - - node.setLabels(results.getLabels()); - node.setOrigin(results.getOrigin()); +// if (results == null) { +// cleanupStyleForNode(observer, parent); +// return; +// } +// +// DistrictNetworkHoverInfoNode node = ProfileVariables.claimChild(parent, "*", DistrictNetworkHoverInfoNode.NODE_KEY, DistrictNetworkHoverInfoNode.class, observer); +// if (node == null) +// return; +// +// ParentNode root = (ParentNode) NodeUtil.getNearestParentOfType(parent, RTreeNode.class); +// if (root != null) { +// DeferredRenderingNode deferred = ProfileVariables.claimChild(root, "", HOVER_INFO_DEFERRED, DeferredRenderingNode.class, observer); +// deferred.setZIndex(Integer.MAX_VALUE); +// } +// +// node.setLabels(results.getLabels()); +// node.setOrigin(results.getOrigin()); } @Override