]> gerrit.simantics Code Review - simantics/district.git/blob - 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
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(40, 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             tx = ( controlArea.getWidth() - diagramArea.getWidth() * scale ) / 2;
42         } else
43             // Control is really tall => center canvas vertically, match horizontally
44         {
45             scale = controlArea.getWidth() / diagramArea.getWidth();
46             ty = ( controlArea.getHeight() - diagramArea.getHeight() * scale ) / 2;
47         }
48         AffineTransform current = getTransform();
49         double currentX = current.getScaleX();
50         double targetX = scale;
51         double toBeX = currentX;
52         if (targetX > 0) {
53             // let's check that targetX zoomLevel is between 0-20
54             AffineTransform tar = new AffineTransform();
55             tar.scale(toBeX, toBeX);
56             int tarZoomLevel = MapScalingTransform.zoomLevel(tar);
57             if (tarZoomLevel < 20 && tarZoomLevel > 0) {
58                 if (toBeX < targetX) {
59                     while ((toBeX * 0.5) < targetX) {
60                         toBeX = toBeX * 2;
61                         AffineTransform tr = new AffineTransform();
62                         tr.scale(toBeX, toBeX);
63                         int zoomLevel = MapScalingTransform.zoomLevel(tr);
64                         if (zoomLevel >= 20) { // let's not zoom too close
65                             break;
66                         }
67                     }
68                 } else {
69                     while ((toBeX * 0.25) > targetX) {
70                         toBeX = toBeX * 0.5;
71                         AffineTransform tr = new AffineTransform();
72                         tr.scale(toBeX, toBeX);
73                         if (MapScalingTransform.zoomLevel(tr) <= 0) { // let's not zoom too far away
74                             break;
75                         }
76                     }
77                 }
78             }
79             AffineTransform at = new AffineTransform();
80             at.translate(tx, ty);
81             at.translate(controlArea.getMinX(), controlArea.getMinY());
82             at.scale(toBeX, toBeX);
83             at.translate(-diagramArea.getMinX(), -diagramArea.getMinY());
84             setTransform(at);
85         } else {
86             // negative, how, no can do?
87             
88         }
89     }
90 }