]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictTransformUtil.java
Refactoring MapNode rendering & zooming to even zoom levels (0-20)
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / DistrictTransformUtil.java
diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictTransformUtil.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictTransformUtil.java
new file mode 100644 (file)
index 0000000..230c17c
--- /dev/null
@@ -0,0 +1,75 @@
+package org.simantics.district.network.ui;
+
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Rectangle2D;
+
+import org.simantics.g2d.participant.TransformUtil;
+import org.simantics.scenegraph.utils.GeometryUtils;
+import org.simantics.utils.page.MarginUtils;
+import org.simantics.utils.page.MarginUtils.Margins;
+
+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);
+            margins = new MarginUtils.Margins(margin, margin, margin, margin);
+        }
+        org.simantics.scenegraph.utils.GeometryUtils.expandRectangle(diagramArea, -1);
+        diagramArea = GeometryUtils.expandRectangle(diagramArea,
+                margins.top.diagramAbsolute,
+                margins.bottom.diagramAbsolute,
+                margins.left.diagramAbsolute,
+                margins.right.diagramAbsolute);
+        controlArea = GeometryUtils.expandRectangle(controlArea,
+                -margins.top.controlAbsolute    - margins.top.controlRelative * controlArea.getHeight(),
+                -margins.bottom.controlAbsolute - margins.bottom.controlRelative * controlArea.getHeight(),
+                -margins.left.controlAbsolute   - margins.left.controlRelative * controlArea.getWidth(),
+                -margins.right.controlAbsolute  - margins.right.controlRelative * controlArea.getWidth());
+
+        double controlAspectRatio = controlArea.getWidth() / controlArea.getHeight();
+        double canvasAspectRatio  = diagramArea.getWidth() / diagramArea.getHeight();
+        // Control is really wide => center canvas horizontally, match vertically
+        double scale = 1.0;
+        double tx = 0.0;
+        double ty = 0.0;
+        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;
+                }
+            } else {
+                while ((toBeX * 0.5) > targetX) {
+                    toBeX = toBeX * 0.5;
+                }
+            }
+            //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?
+            
+        }
+    }
+}