import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ScheduledFuture;
import org.simantics.district.network.ontology.DistrictNetworkResource;
import org.simantics.district.network.profile.RuntimeDynamicVisualisationsRequest;
import org.simantics.district.network.ui.DistrictDiagramViewer;
+import org.simantics.district.network.ui.nodes.DeferredRenderingNode;
+import org.simantics.district.network.ui.nodes.DistrictNetworkEdgeArrayNode;
import org.simantics.district.network.ui.nodes.DistrictNetworkHoverInfoNode;
import org.simantics.district.network.ui.nodes.DynamicVisualisationContributionsNode;
import org.simantics.district.network.ui.styles.DistrictNetworkHoverInfoStyle;
import org.simantics.g2d.canvas.ICanvasContext;
import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant;
import org.simantics.g2d.canvas.impl.SGNodeReflection.SGInit;
-import org.simantics.layer0.Layer0;
+import org.simantics.scenegraph.INode;
import org.simantics.scenegraph.g2d.G2DParentNode;
import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler;
import org.simantics.scenegraph.g2d.events.command.CommandEvent;
+import org.simantics.utils.datastructures.Pair;
import org.simantics.utils.datastructures.hints.HintListenerAdapter;
import org.simantics.utils.datastructures.hints.IHintContext.Key;
import org.simantics.utils.datastructures.hints.IHintListener;
}
}
};
-
+
private DynamicVisualisationContributionsNode node;
private AffineTransform transform;
-
private DistrictNetworkHoverInfoNode hoverInfoNode;
+ private DeferredRenderingNode deferredEdgeArrowRendererNode;
public DynamicVisualisationContributionsParticipant(AffineTransform tr) {
this.transform = tr;
getHintStack().addKeyHintListener(getThread(), DistrictDiagramViewer.KEY_MAP_SIZING_OBJECTS, hintListener);
getHintStack().addKeyHintListener(getThread(), DistrictDiagramViewer.KEY_MAP_SIZE_BAR_OPTIONS, hintListener);
}
-
+
@Override
public void removedFromContext(ICanvasContext ctx) {
+ // Ensure hover polling is stopped
+ if (hoverUpdateSchedule != null && !hoverUpdateSchedule.isDone()) {
+ hoverUpdateSchedule.cancel(false);
+ }
+
getHintStack().removeKeyHintListener(getThread(), DistrictDiagramViewer.KEY_MAP_COLORING_OBJECTS, hintListener);
getHintStack().removeKeyHintListener(getThread(), DistrictDiagramViewer.KEY_MAP_COLOR_BAR_OPTIONS, hintListener);
getHintStack().removeKeyHintListener(getThread(), DistrictDiagramViewer.KEY_MAP_SIZING_OBJECTS, hintListener);
node.setTransform(transform);
node.setEnabled(true);
node.setZIndex(1000);
-
+
hoverInfoNode = parent.addNode("districtNetworkHoverInfoNode", DistrictNetworkHoverInfoNode.class);
hoverInfoNode.setLookupId("districtNetworkHoverInfoNode");
hoverInfoNode.setTransform(transform);
hoverInfoNode.setZIndex(Integer.MAX_VALUE - 500);
+
+ Pair<String, Class<DeferredRenderingNode>> dearn = DistrictNetworkEdgeArrayNode.renderer();
+ deferredEdgeArrowRendererNode = parent.addNode(dearn.first, dearn.second);
}
-
+
@EventHandler(priority = 0)
protected boolean handleKeyEvent(CommandEvent e) {
if (e.command.equals(DistrictDiagramViewer.MAP_COLOR_BAR_OPTIONS_CHANGE)) {
}
return false;
}
-
-// @Override
-// protected boolean handleCommand(CommandEvent e) {
-// if (e.command.equals(DistrictDiagramViewer.MAP_COLOR_BAR_OPTIONS_CHANGE)) {
-// ICanvasContext context = (ICanvasContext) e.getContext();
-// ColorBarOptions options = context.getHintStack().getHint(DistrictDiagramViewer.KEY_MAP_COLOR_BAR_OPTIONS);
-// this.colorBarsOptions = options;
-// repaint();
-// return true;
-// } else {
-// return super.handleCommand(e);
-// }
-// }
-
+
protected void updateNode() {
node.setDynamicColoringObjects(getDynamicColoringObjects());
node.setColorBarOptions(getColorBarOptions());
node.setSizeBarOptions(getSizeBarOptions());
}
- private Map<String,DynamicColorContribution> getDynamicColoringObjects() {
- Map<String,DynamicColorContribution> objects = getHint(DistrictDiagramViewer.KEY_MAP_COLORING_OBJECTS);
- return objects;
+ private Map<String, DynamicColorContribution> getDynamicColoringObjects() {
+ return getHint(DistrictDiagramViewer.KEY_MAP_COLORING_OBJECTS);
}
private ColorBarOptions getColorBarOptions() {
- ColorBarOptions options = getHint(DistrictDiagramViewer.KEY_MAP_COLOR_BAR_OPTIONS);
- return options;
+ return getHint(DistrictDiagramViewer.KEY_MAP_COLOR_BAR_OPTIONS);
}
private Map<String, DynamicSizeContribution> getDynamicSizingObjects() {
- Map<String, DynamicSizeContribution> objects = getHint(DistrictDiagramViewer.KEY_MAP_SIZING_OBJECTS);
- return objects;
+ return getHint(DistrictDiagramViewer.KEY_MAP_SIZING_OBJECTS);
}
private SizeBarOptions getSizeBarOptions() {
- SizeBarOptions options = getHint(DistrictDiagramViewer.KEY_MAP_SIZE_BAR_OPTIONS);
- return options;
+ return getHint(DistrictDiagramViewer.KEY_MAP_SIZE_BAR_OPTIONS);
}
private ScheduledFuture<?> hoverUpdateSchedule;
-
- public void hoverNode(Resource runtimeDiagram, Resource mapElement, G2DParentNode hoveredNode) {
+ private static final Object COMPLETE = new Object();
+
+ public void hoverNode(Resource runtimeDiagram, Resource mapElement, INode hoveredNode, int zoomLevel) {
IThreadWorkQueue thread = getThread();
Simantics.getSession().asyncRequest(new ReadRequest() {
-
@Override
public void run(ReadGraph graph) throws DatabaseException {
DynamicVisualisation visualisation = graph.syncRequest(new RuntimeDynamicVisualisationsRequest(runtimeDiagram));
if (visualisation == null)
return;
- if (hoverUpdateSchedule != null && !hoverUpdateSchedule.isDone()) {
- hoverUpdateSchedule.cancel(false);
- }
- hoverUpdateSchedule = ThreadUtils.getNonBlockingWorkExecutor().scheduleWithFixedDelay(() -> {
-
- CompletableFuture<Object> future = new CompletableFuture<>();
- try {
- Simantics.getSession().syncRequest(new ReadRequest() {
-
- @Override
- public void run(ReadGraph graph) throws DatabaseException {
- boolean keyVariablesVertexHover = visualisation.isKeyVariablesVertexHover();
- boolean keyVariablesEdgesHover = visualisation.isKeyVariablesEdgesHover();
-
- Resource mapElementInstanceOf = graph.getSingleObject(mapElement, Layer0.getInstance(graph).InstanceOf);
- DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
-
- boolean doHover = true;
- if (mapElementInstanceOf.equals(DN.Vertex) && !keyVariablesVertexHover) {
- doHover = false;
- } else if (mapElementInstanceOf.equals(DN.Edge) && !keyVariablesEdgesHover) {
- doHover = false;
- }
- final boolean finalDoHover = doHover;
-
- StyleResult results = DistrictNetworkHoverInfoStyle.doCalculateStyleResult(graph, runtimeDiagram, mapElement);
- if (results != null) {
- Point2D location = DistrictNetworkHoverInfoStyle.calculatePoint(graph, mapElement);
- thread.asyncExec(() -> {
- if (isRemoved())
- return;
- if (finalDoHover) {
- hoverInfoNode.setLabels(results.getLabels());
- hoverInfoNode.setOrigin(results.getOrigin());
-
- hoverInfoNode.setMousePosition(location);
- hoverInfoNode.hover2(hoveredNode);
- } else {
- hoverInfoNode.hover2(null);
- }
- future.complete(new Object());
- });
- } else {
- future.complete(new Object());
- }
+ cancelCurrentHoverUpdate();
+ hoverUpdateSchedule = ThreadUtils.getNonBlockingWorkExecutor().scheduleWithFixedDelay(
+ () -> updateHoverInfo(runtimeDiagram, mapElement, hoveredNode, zoomLevel, visualisation, thread),
+ 0,
+ visualisation.getInterval(),
+ TimeUnit.MILLISECONDS);
+ }
+ });
+ }
+
+ private void updateHoverInfo(Resource runtimeDiagram, Resource mapElement, INode hoveredNode, int zoomLevel, DynamicVisualisation visualisation, IThreadWorkQueue thread) {
+ CompletableFuture<Object> future = new CompletableFuture<>();
+ try {
+ Simantics.getSession().syncRequest(new ReadRequest() {
+ @Override
+ public void run(ReadGraph graph) throws DatabaseException {
+ Set<Resource> mapElementTypes = graph.getTypes(mapElement);
+ if (mapElementTypes.isEmpty()) {
+ future.complete(COMPLETE);
+ return;
+ }
+
+ DistrictNetworkResource DN = DistrictNetworkResource.getInstance(graph);
+
+ boolean doHover =
+ (mapElementTypes.contains(DN.Vertex) && visualisation.isKeyVariablesVertexHover())
+ || (mapElementTypes.contains(DN.Edge) && visualisation.isKeyVariablesEdgesHover());
+
+ StyleResult results = DistrictNetworkHoverInfoStyle.doCalculateStyleResult(graph, runtimeDiagram, mapElement);
+ if (results != null) {
+ Point2D location = DistrictNetworkHoverInfoStyle.calculatePoint(hoveredNode, zoomLevel, null);
+ thread.asyncExec(() -> {
+ if (isRemoved())
+ return;
+ if (doHover) {
+ hoverInfoNode.setLabels(results.getLabels());
+ hoverInfoNode.setOrigin(results.getOrigin());
+ hoverInfoNode.setMousePosition(location);
+ hoverInfoNode.setHoveredNode(hoveredNode);
+ } else {
+ hoverInfoNode.setHoveredNode(null);
}
+ future.complete(COMPLETE);
});
- } catch (DatabaseException e) {
- future.completeExceptionally(e);
- }
- // this waits until everything is done
- try {
- future.get();
- } catch (InterruptedException | ExecutionException e) {
- LOGGER.debug("Interrupted hovering", e);
+ } else {
+ future.complete(COMPLETE);
}
- }, 0, visualisation.getInterval(), TimeUnit.MILLISECONDS);
- }
- });
+ }
+ });
+ } catch (DatabaseException e) {
+ future.completeExceptionally(e);
+ }
+ // this waits until everything is done
+ try {
+ future.get();
+ } catch (InterruptedException | ExecutionException e) {
+ LOGGER.debug("Interrupted hovering", e);
+ }
}
public boolean doHover(boolean hover, boolean isConnectionTool) {
+ if (!hover)
+ cancelCurrentHoverUpdate();
return hoverInfoNode.hover(hover, isConnectionTool);
}
+
+ private void cancelCurrentHoverUpdate() {
+ if (hoverUpdateSchedule != null && !hoverUpdateSchedule.isDone())
+ hoverUpdateSchedule.cancel(false);
+ }
+
}