]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.maps/src/org/simantics/maps/eclipse/MapPainter.java
Add location & zoom node for network diagram - also OSM attribution
[simantics/district.git] / org.simantics.district.maps / src / org / simantics / maps / eclipse / MapPainter.java
index c519b9a5f1a3d53cadb779ded4ce78e07929b249..ef88e1c55ea9fdf266506ffbcd82c41b6a75a954 100644 (file)
@@ -13,24 +13,35 @@ package org.simantics.maps.eclipse;
 
 import java.awt.Color;
 import java.awt.geom.AffineTransform;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
 
 import org.simantics.g2d.canvas.Hints;
 import org.simantics.g2d.canvas.ICanvasContext;
 import org.simantics.g2d.canvas.impl.AbstractCanvasParticipant;
 import org.simantics.g2d.canvas.impl.SGNodeReflection.SGCleanup;
 import org.simantics.g2d.canvas.impl.SGNodeReflection.SGInit;
+import org.simantics.g2d.participant.MouseUtil;
+import org.simantics.maps.sg.MapAttributionNode;
+import org.simantics.maps.sg.MapLocationZoomInfoNode;
 import org.simantics.maps.sg.MapNode;
 import org.simantics.maps.sg.MapScaleNode;
 import org.simantics.maps.sg.commands.MapCommands;
 import org.simantics.scenegraph.g2d.G2DParentNode;
+import org.simantics.scenegraph.g2d.events.Event;
 import org.simantics.scenegraph.g2d.events.EventHandlerReflection.EventHandler;
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
 import org.simantics.scenegraph.g2d.events.command.CommandEvent;
 import org.simantics.scenegraph.g2d.events.command.Commands;
 import org.simantics.utils.datastructures.hints.HintListenerAdapter;
-import org.simantics.utils.datastructures.hints.IHintListener;
-import org.simantics.utils.datastructures.hints.IHintObservable;
 import org.simantics.utils.datastructures.hints.IHintContext.Key;
 import org.simantics.utils.datastructures.hints.IHintContext.KeyOf;
+import org.simantics.utils.datastructures.hints.IHintListener;
+import org.simantics.utils.datastructures.hints.IHintObservable;
+import org.simantics.utils.threads.AWTThread;
+import org.simantics.utils.threads.ThreadUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * MapPainter is an ICanvasContext participant that uses the scene graph
@@ -42,6 +53,8 @@ import org.simantics.utils.datastructures.hints.IHintContext.KeyOf;
  */
 public class MapPainter extends AbstractCanvasParticipant {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(MapPainter.class);
+
     /**
      * Grid enabled status. Default value is True
      */
@@ -68,6 +81,10 @@ public class MapPainter extends AbstractCanvasParticipant {
 
     private AffineTransform transform;
 
+    private MapLocationZoomInfoNode locationZoomInfoNode;
+
+    private ScheduledFuture<?> schedule;
+
     public MapPainter(AffineTransform transform) {
         this.transform = transform;
     }
@@ -118,6 +135,24 @@ public class MapPainter extends AbstractCanvasParticipant {
         return false;
     }
 
+    @EventHandler(priority = 31)
+    public boolean handleEvent(Event e) {
+        if (e instanceof MouseMovedEvent) {
+            // here we should somehow re-render ?
+            if (locationZoomInfoNode.isEnabled()) {
+                if (schedule == null || schedule.isDone()) {
+                    LOGGER.debug("current setDirty time" + System.currentTimeMillis());
+                    schedule = ThreadUtils.getNonBlockingWorkExecutor().schedule(() -> {
+                        AWTThread.getThreadAccess().asyncExec(this::setDirty);
+                    }, 100, TimeUnit.MILLISECONDS);
+                } else {
+                    //LOGGER.debug("ingoring setDirty time" + System.currentTimeMillis());
+                }
+            }
+        }
+        return false;
+    }
+
     @SGInit
     public void initSG(G2DParentNode parent) {
         node = parent.addNode("map", MapNode.class);
@@ -129,6 +164,18 @@ public class MapPainter extends AbstractCanvasParticipant {
         scaleNode.setTransform(transform);
         scaleNode.setEnabled(true);
         scaleNode.setZIndex(Integer.MAX_VALUE - 999); // Just under the grid
+        
+        locationZoomInfoNode = parent.addNode("locationZoomInfo", MapLocationZoomInfoNode.class);
+        locationZoomInfoNode.setTransform(transform);
+        locationZoomInfoNode.setEnabled(true);
+        MouseUtil mouseUtil = getContext().getAtMostOneItemOfClass(MouseUtil.class);
+        locationZoomInfoNode.setMouseUtil(mouseUtil);
+        locationZoomInfoNode.setZIndex(Integer.MAX_VALUE - 999); // Just under the grid
+        
+        MapAttributionNode addNode = parent.addNode("mapAttribution", MapAttributionNode.class);
+        addNode.setTransform(transform);
+        addNode.setEnabled(true);
+        addNode.setZIndex(Integer.MAX_VALUE - 999);
     }
 
     @SGCleanup