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.scenegraph.utils.GeometryUtils;
8 import org.simantics.utils.page.MarginUtils;
9 import org.simantics.utils.page.MarginUtils.Margins;
11 public class DistrictTransformUtil extends TransformUtil {
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);
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());
31 double controlAspectRatio = controlArea.getWidth() / controlArea.getHeight();
32 double canvasAspectRatio = diagramArea.getWidth() / diagramArea.getHeight();
33 // Control is really wide => center canvas horizontally, match vertically
37 if (controlAspectRatio>canvasAspectRatio)
39 scale = controlArea.getHeight() / diagramArea.getHeight();
40 tx = ( controlArea.getWidth() - diagramArea.getWidth() * scale ) / 2;
42 // Control is really tall => center canvas vertically, match horizontally
44 scale = controlArea.getWidth() / diagramArea.getWidth();
45 ty = ( controlArea.getHeight() - diagramArea.getHeight() * scale ) / 2;
47 AffineTransform current = getTransform();
48 double currentX = current.getScaleX();
49 double targetX = scale;
50 double toBeX = currentX;
52 if (toBeX < targetX) {
53 while ((toBeX) < targetX) {
57 while ((toBeX * 0.5) > targetX) {
61 //tx = tx * (1 - toBeX);
62 //ty = ty * (1 - toBeX);
63 AffineTransform at = new AffineTransform();
65 at.translate(controlArea.getMinX(), controlArea.getMinY());
66 at.scale(toBeX, toBeX);
67 at.translate(-diagramArea.getMinX(), -diagramArea.getMinY());
71 // negative, how, no can do?