]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictTransformUtil.java
Allow starting/ending of manual network creation to vertices only
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / DistrictTransformUtil.java
index 230c17cd55fedfce2cfd48d7ceaf4bae00e3dfb9..4f4583d1a02dc62421d90507022b0f54d26ed652 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;
@@ -13,7 +14,7 @@ public class DistrictTransformUtil extends TransformUtil {
     @Override
     public void fitArea(Rectangle2D controlArea, Rectangle2D diagramArea, Margins margins) {
         if (margins == null) {
-            MarginUtils.Margin margin = MarginUtils.marginOf(40, 0, 0);
+            MarginUtils.Margin margin = MarginUtils.marginOf(0, 0, 0);
             margins = new MarginUtils.Margins(margin, margin, margin, margin);
         }
         org.simantics.scenegraph.utils.GeometryUtils.expandRectangle(diagramArea, -1);
@@ -37,35 +38,44 @@ public class DistrictTransformUtil extends TransformUtil {
         if (controlAspectRatio>canvasAspectRatio)
         {
             scale = controlArea.getHeight() / diagramArea.getHeight();
-            tx = ( controlArea.getWidth() - diagramArea.getWidth() * scale ) / 2;
         } else
             // Control is really tall => center canvas vertically, match horizontally
         {
             scale = controlArea.getWidth() / diagramArea.getWidth();
-            ty = ( controlArea.getHeight() - diagramArea.getHeight() * scale ) / 2;
         }
         AffineTransform current = getTransform();
         double currentX = current.getScaleX();
         double targetX = scale;
         double toBeX = currentX;
         if (targetX > 0) {
-            if (toBeX < targetX) {
-                while ((toBeX) < targetX) {
-                    toBeX = toBeX * 2;
-                }
+            // let's check that targetX zoomLevel is between 0-20
+            AffineTransform tar = new AffineTransform();
+            tar.scale(targetX, targetX);
+            int tarZoomLevel = MapScalingTransform.zoomLevel(tar);
+            if (tarZoomLevel < 20 && tarZoomLevel > 0) {
+                toBeX = Math.pow(2.0, tarZoomLevel);
+            } else if (tarZoomLevel > 20) {
+                toBeX = Math.pow(2.0, 20);
+            } else if (tarZoomLevel < 0) {
+                toBeX = 2;
             } else {
-                while ((toBeX * 0.5) > targetX) {
-                    toBeX = toBeX * 0.5;
-                }
+                toBeX = targetX;
             }
-            //tx = tx * (1 - toBeX);
-            //ty = ty * (1 - toBeX);
+            
+            if (controlAspectRatio>canvasAspectRatio) {
+                tx = ( controlArea.getWidth() - diagramArea.getWidth() * toBeX ) / 2;
+                ty = diagramArea.getHeight() * (targetX - toBeX) / 2;
+            }
+            else {
+                ty = ( controlArea.getHeight() - diagramArea.getHeight() * toBeX ) / 2;
+                tx = diagramArea.getWidth() * (targetX - toBeX) / 2;
+            }
+            
             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?