1 package org.simantics.district.network.ui;
3 import java.awt.geom.AffineTransform;
4 import java.awt.geom.Rectangle2D;
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;
12 public class DistrictTransformUtil extends TransformUtil {
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);
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());
32 double controlAspectRatio = controlArea.getWidth() / controlArea.getHeight();
33 double canvasAspectRatio = diagramArea.getWidth() / diagramArea.getHeight();
34 // Control is really wide => center canvas horizontally, match vertically
38 if (controlAspectRatio>canvasAspectRatio)
40 scale = controlArea.getHeight() / diagramArea.getHeight();
42 // Control is really tall => center canvas vertically, match horizontally
44 scale = controlArea.getWidth() / diagramArea.getWidth();
46 AffineTransform current = getTransform();
47 double currentX = current.getScaleX();
48 double targetX = scale;
49 double toBeX = currentX;
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 } else if (tarZoomLevel > 20) {
58 toBeX = Math.pow(2.0, 20);
59 } else if (tarZoomLevel < 0) {
65 if (controlAspectRatio>canvasAspectRatio) {
66 tx = ( controlArea.getWidth() - diagramArea.getWidth() * toBeX ) / 2;
67 ty = diagramArea.getHeight() * (targetX - toBeX) / 2;
70 ty = ( controlArea.getHeight() - diagramArea.getHeight() * toBeX ) / 2;
71 tx = diagramArea.getWidth() * (targetX - toBeX) / 2;
74 AffineTransform at = new AffineTransform();
76 at.translate(controlArea.getMinX(), controlArea.getMinY());
77 at.scale(toBeX, toBeX);
78 at.translate(-diagramArea.getMinX(), -diagramArea.getMinY());
81 // negative, how, no can do?