]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictTransformUtil.java
Add refresh to context menu in district network breakdown view
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / DistrictTransformUtil.java
index 230c17cd55fedfce2cfd48d7ceaf4bae00e3dfb9..ce28aba5428a76efa822a607e28ae6692314d801 100644 (file)
@@ -4,6 +4,7 @@ import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
 
 import org.simantics.g2d.participant.TransformUtil;
+import org.simantics.maps.MapScalingTransform;
 import org.simantics.scenegraph.utils.GeometryUtils;
 import org.simantics.utils.page.MarginUtils;
 import org.simantics.utils.page.MarginUtils.Margins;
@@ -49,23 +50,37 @@ public class DistrictTransformUtil extends TransformUtil {
         double targetX = scale;
         double toBeX = currentX;
         if (targetX > 0) {
-            if (toBeX < targetX) {
-                while ((toBeX) < targetX) {
-                    toBeX = toBeX * 2;
-                }
-            } else {
-                while ((toBeX * 0.5) > targetX) {
-                    toBeX = toBeX * 0.5;
+            // let's check that targetX zoomLevel is between 0-20
+            AffineTransform tar = new AffineTransform();
+            tar.scale(toBeX, toBeX);
+            int tarZoomLevel = MapScalingTransform.zoomLevel(tar);
+            if (tarZoomLevel < 20 && tarZoomLevel > 0) {
+                if (toBeX < targetX) {
+                    while ((toBeX * 0.5) < targetX) {
+                        toBeX = toBeX * 2;
+                        AffineTransform tr = new AffineTransform();
+                        tr.scale(toBeX, toBeX);
+                        int zoomLevel = MapScalingTransform.zoomLevel(tr);
+                        if (zoomLevel >= 20) { // let's not zoom too close
+                            break;
+                        }
+                    }
+                } else {
+                    while ((toBeX * 0.25) > targetX) {
+                        toBeX = toBeX * 0.5;
+                        AffineTransform tr = new AffineTransform();
+                        tr.scale(toBeX, toBeX);
+                        if (MapScalingTransform.zoomLevel(tr) <= 0) { // let's not zoom too far away
+                            break;
+                        }
+                    }
                 }
             }
-            //tx = tx * (1 - toBeX);
-            //ty = ty * (1 - toBeX);
             AffineTransform at = new AffineTransform();
             at.translate(tx, ty);
             at.translate(controlArea.getMinX(), controlArea.getMinY());
             at.scale(toBeX, toBeX);
             at.translate(-diagramArea.getMinX(), -diagramArea.getMinY());
-            
             setTransform(at);
         } else {
             // negative, how, no can do?