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(40, 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();
41 tx = ( controlArea.getWidth() - diagramArea.getWidth() * scale ) / 2;
43 // Control is really tall => center canvas vertically, match horizontally
45 scale = controlArea.getWidth() / diagramArea.getWidth();
46 ty = ( controlArea.getHeight() - diagramArea.getHeight() * scale ) / 2;
48 AffineTransform current = getTransform();
49 double currentX = current.getScaleX();
50 double targetX = scale;
51 double toBeX = currentX;
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) {
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
69 while ((toBeX * 0.25) > targetX) {
71 AffineTransform tr = new AffineTransform();
72 tr.scale(toBeX, toBeX);
73 if (MapScalingTransform.zoomLevel(tr) <= 0) { // let's not zoom too far away
79 AffineTransform at = new AffineTransform();
81 at.translate(controlArea.getMinX(), controlArea.getMinY());
82 at.scale(toBeX, toBeX);
83 at.translate(-diagramArea.getMinX(), -diagramArea.getMinY());
86 // negative, how, no can do?