]> gerrit.simantics Code Review - simantics/district.git/blob - 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
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.scenegraph.utils.GeometryUtils;
8 import org.simantics.utils.page.MarginUtils;
9 import org.simantics.utils.page.MarginUtils.Margins;
10
11 public class DistrictTransformUtil extends TransformUtil {
12
13     @Override
14     public void fitArea(Rectangle2D controlArea, Rectangle2D diagramArea, Margins margins) {
15         if (margins == null) {
16             MarginUtils.Margin margin = MarginUtils.marginOf(40, 0, 0);
17             margins = new MarginUtils.Margins(margin, margin, margin, margin);
18         }
19         org.simantics.scenegraph.utils.GeometryUtils.expandRectangle(diagramArea, -1);
20         diagramArea = GeometryUtils.expandRectangle(diagramArea,
21                 margins.top.diagramAbsolute,
22                 margins.bottom.diagramAbsolute,
23                 margins.left.diagramAbsolute,
24                 margins.right.diagramAbsolute);
25         controlArea = GeometryUtils.expandRectangle(controlArea,
26                 -margins.top.controlAbsolute    - margins.top.controlRelative * controlArea.getHeight(),
27                 -margins.bottom.controlAbsolute - margins.bottom.controlRelative * controlArea.getHeight(),
28                 -margins.left.controlAbsolute   - margins.left.controlRelative * controlArea.getWidth(),
29                 -margins.right.controlAbsolute  - margins.right.controlRelative * controlArea.getWidth());
30
31         double controlAspectRatio = controlArea.getWidth() / controlArea.getHeight();
32         double canvasAspectRatio  = diagramArea.getWidth() / diagramArea.getHeight();
33         // Control is really wide => center canvas horizontally, match vertically
34         double scale = 1.0;
35         double tx = 0.0;
36         double ty = 0.0;
37         if (controlAspectRatio>canvasAspectRatio)
38         {
39             scale = controlArea.getHeight() / diagramArea.getHeight();
40             tx = ( controlArea.getWidth() - diagramArea.getWidth() * scale ) / 2;
41         } else
42             // Control is really tall => center canvas vertically, match horizontally
43         {
44             scale = controlArea.getWidth() / diagramArea.getWidth();
45             ty = ( controlArea.getHeight() - diagramArea.getHeight() * scale ) / 2;
46         }
47         AffineTransform current = getTransform();
48         double currentX = current.getScaleX();
49         double targetX = scale;
50         double toBeX = currentX;
51         if (targetX > 0) {
52             if (toBeX < targetX) {
53                 while ((toBeX) < targetX) {
54                     toBeX = toBeX * 2;
55                 }
56             } else {
57                 while ((toBeX * 0.5) > targetX) {
58                     toBeX = toBeX * 0.5;
59                 }
60             }
61             //tx = tx * (1 - toBeX);
62             //ty = ty * (1 - toBeX);
63             AffineTransform at = new AffineTransform();
64             at.translate(tx, ty);
65             at.translate(controlArea.getMinX(), controlArea.getMinY());
66             at.scale(toBeX, toBeX);
67             at.translate(-diagramArea.getMinX(), -diagramArea.getMinY());
68             
69             setTransform(at);
70         } else {
71             // negative, how, no can do?
72             
73         }
74     }
75 }