]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictTransformUtil.java
Fix to zoom level handling in Map UI.
[simantics/district.git] / org.simantics.district.network.ui / src / org / simantics / district / network / ui / DistrictTransformUtil.java
1 package org.simantics.district.network.ui;
2
3 import java.awt.geom.AffineTransform;
4 import java.awt.geom.Rectangle2D;
5
6 import org.simantics.g2d.participant.TransformUtil;
7 import org.simantics.maps.MapScalingTransform;
8 import org.simantics.scenegraph.utils.GeometryUtils;
9 import org.simantics.utils.page.MarginUtils;
10 import org.simantics.utils.page.MarginUtils.Margins;
11
12 public class DistrictTransformUtil extends TransformUtil {
13
14     @Override
15     public void fitArea(Rectangle2D controlArea, Rectangle2D diagramArea, Margins margins) {
16         if (margins == null) {
17             MarginUtils.Margin margin = MarginUtils.marginOf(0, 0, 0);
18             margins = new MarginUtils.Margins(margin, margin, margin, margin);
19         }
20         org.simantics.scenegraph.utils.GeometryUtils.expandRectangle(diagramArea, -1);
21         diagramArea = GeometryUtils.expandRectangle(diagramArea,
22                 margins.top.diagramAbsolute,
23                 margins.bottom.diagramAbsolute,
24                 margins.left.diagramAbsolute,
25                 margins.right.diagramAbsolute);
26         controlArea = GeometryUtils.expandRectangle(controlArea,
27                 -margins.top.controlAbsolute    - margins.top.controlRelative * controlArea.getHeight(),
28                 -margins.bottom.controlAbsolute - margins.bottom.controlRelative * controlArea.getHeight(),
29                 -margins.left.controlAbsolute   - margins.left.controlRelative * controlArea.getWidth(),
30                 -margins.right.controlAbsolute  - margins.right.controlRelative * controlArea.getWidth());
31
32         double controlAspectRatio = controlArea.getWidth() / controlArea.getHeight();
33         double canvasAspectRatio  = diagramArea.getWidth() / diagramArea.getHeight();
34         // Control is really wide => center canvas horizontally, match vertically
35         double scale = 1.0;
36         double tx = 0.0;
37         double ty = 0.0;
38         if (controlAspectRatio>canvasAspectRatio)
39         {
40             scale = controlArea.getHeight() / diagramArea.getHeight();
41         } else
42             // Control is really tall => center canvas vertically, match horizontally
43         {
44             scale = controlArea.getWidth() / diagramArea.getWidth();
45         }
46         AffineTransform current = getTransform();
47         double currentX = current.getScaleX();
48         double targetX = scale;
49         double toBeX = currentX;
50         if (targetX > 0) {
51             // let's check that targetX zoomLevel is between 0-20
52             AffineTransform tar = new AffineTransform();
53             tar.scale(targetX, targetX);
54             int tarZoomLevel = MapScalingTransform.zoomLevel(tar);
55             if (tarZoomLevel < 20 && tarZoomLevel > 0) {
56                 toBeX = Math.pow(2.0, tarZoomLevel);
57             }
58             else {
59                 toBeX = targetX;
60             }
61             
62             if (controlAspectRatio>canvasAspectRatio) {
63                 tx = ( controlArea.getWidth() - diagramArea.getWidth() * toBeX ) / 2;
64                 ty = diagramArea.getHeight() * (targetX - toBeX) / 2;
65             }
66             else {
67                 ty = ( controlArea.getHeight() - diagramArea.getHeight() * toBeX ) / 2;
68                 tx = diagramArea.getWidth() * (targetX - toBeX) / 2;
69             }
70             
71             AffineTransform at = new AffineTransform();
72             at.translate(tx, ty);
73             at.translate(controlArea.getMinX(), controlArea.getMinY());
74             at.scale(toBeX, toBeX);
75             at.translate(-diagramArea.getMinX(), -diagramArea.getMinY());
76             setTransform(at);
77         } else {
78             // negative, how, no can do?
79             
80         }
81     }
82 }