]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - runtime/org.argeo.slc.support.gis/src/main/java/org/argeo/slc/geotools/swing/VersatileZoomTool.java
GisFieldViewer before leaving to field trip
[gpl/argeo-slc.git] / runtime / org.argeo.slc.support.gis / src / main / java / org / argeo / slc / geotools / swing / VersatileZoomTool.java
index 862e0a82d020a963ba7e836b7daf9c95f3b02f8c..796cb4f83b905317a9c12229c1cd5cc691ac8a38 100644 (file)
@@ -37,6 +37,8 @@ public class VersatileZoomTool extends AbstractZoomTool {
        private boolean computingZoomBox;
        private boolean panning;
 
+       private Point2D fieldPosition;
+
        /**
         * Constructor
         */
@@ -69,19 +71,32 @@ public class VersatileZoomTool extends AbstractZoomTool {
         */
        @Override
        public void onMouseClicked(MapMouseEvent e) {
-               centerMapToEvent(e);
+               if (SwingUtilities.isLeftMouseButton(e))
+                       centerMapToEvent(e, getZoom());
+               else if (SwingUtilities.isRightMouseButton(e))
+                       centerMapToEvent(e, 1 / getZoom());
+               else if (SwingUtilities.isMiddleMouseButton(e)) {
+                       if (fieldPosition != null) {
+                               Envelope2D env = new Envelope2D();
+                               final double increment = 1d;
+                               env.setFrameFromDiagonal(fieldPosition.getX() - increment,
+                                               fieldPosition.getY() - increment, fieldPosition.getX()
+                                                               + increment, fieldPosition.getY() + increment);
+                               getMapPane().setDisplayArea(env);
+                       }
+               }
        }
 
-       protected void centerMapToEvent(MapMouseEvent e) {
+       protected void centerMapToEvent(MapMouseEvent e, Double zoomArg) {
                Rectangle paneArea = getMapPane().getVisibleRect();
                DirectPosition2D mapPos = e.getMapPosition();
 
                double scale = getMapPane().getWorldToScreenTransform().getScaleX();
-               // double newScale = scale * zoom;
-               //
+               double newScale = scale * zoomArg;
+
                DirectPosition2D corner = new DirectPosition2D(mapPos.getX() - 0.5d
-                               * paneArea.getWidth() / scale, mapPos.getY() + 0.5d
-                               * paneArea.getHeight() / scale);
+                               * paneArea.getWidth() / newScale, mapPos.getY() + 0.5d
+                               * paneArea.getHeight() / newScale);
 
                Envelope2D newMapArea = new Envelope2D();
                newMapArea.setFrameFromCenter(mapPos, corner);
@@ -100,7 +115,8 @@ public class VersatileZoomTool extends AbstractZoomTool {
                if (SwingUtilities.isLeftMouseButton(ev)) {
                        startDragPos = new DirectPosition2D();
                        startDragPos.setLocation(ev.getMapPosition());
-               } else if (SwingUtilities.isMiddleMouseButton(ev)) {
+               } else if (SwingUtilities.isMiddleMouseButton(ev)
+                               || SwingUtilities.isRightMouseButton(ev)) {
                        panePos = ev.getPoint();
                        panning = true;
                }
@@ -195,6 +211,10 @@ public class VersatileZoomTool extends AbstractZoomTool {
                });
        }
 
+       public void setFieldPosition(Point2D fieldPosition) {
+               this.fieldPosition = fieldPosition;
+       }
+
        /**
         * Custom drag box (hacked from JMapPane) so that we can change the behavior
         * depending on whether we pan or zoom.