package org.simantics.district.network.ui; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import org.simantics.g2d.participant.TransformUtil; import org.simantics.scenegraph.utils.GeometryUtils; import org.simantics.utils.page.MarginUtils; import org.simantics.utils.page.MarginUtils.Margins; public class DistrictTransformUtil extends TransformUtil { @Override public void fitArea(Rectangle2D controlArea, Rectangle2D diagramArea, Margins margins) { if (margins == null) { MarginUtils.Margin margin = MarginUtils.marginOf(40, 0, 0); margins = new MarginUtils.Margins(margin, margin, margin, margin); } org.simantics.scenegraph.utils.GeometryUtils.expandRectangle(diagramArea, -1); diagramArea = GeometryUtils.expandRectangle(diagramArea, margins.top.diagramAbsolute, margins.bottom.diagramAbsolute, margins.left.diagramAbsolute, margins.right.diagramAbsolute); controlArea = GeometryUtils.expandRectangle(controlArea, -margins.top.controlAbsolute - margins.top.controlRelative * controlArea.getHeight(), -margins.bottom.controlAbsolute - margins.bottom.controlRelative * controlArea.getHeight(), -margins.left.controlAbsolute - margins.left.controlRelative * controlArea.getWidth(), -margins.right.controlAbsolute - margins.right.controlRelative * controlArea.getWidth()); double controlAspectRatio = controlArea.getWidth() / controlArea.getHeight(); double canvasAspectRatio = diagramArea.getWidth() / diagramArea.getHeight(); // Control is really wide => center canvas horizontally, match vertically double scale = 1.0; double tx = 0.0; double ty = 0.0; if (controlAspectRatio>canvasAspectRatio) { scale = controlArea.getHeight() / diagramArea.getHeight(); tx = ( controlArea.getWidth() - diagramArea.getWidth() * scale ) / 2; } else // Control is really tall => center canvas vertically, match horizontally { scale = controlArea.getWidth() / diagramArea.getWidth(); ty = ( controlArea.getHeight() - diagramArea.getHeight() * scale ) / 2; } AffineTransform current = getTransform(); double currentX = current.getScaleX(); double targetX = scale; double toBeX = currentX; if (targetX > 0) { if (toBeX < targetX) { while ((toBeX) < targetX) { toBeX = toBeX * 2; } } else { while ((toBeX * 0.5) > targetX) { toBeX = toBeX * 0.5; } } //tx = tx * (1 - toBeX); //ty = ty * (1 - toBeX); AffineTransform at = new AffineTransform(); at.translate(tx, ty); at.translate(controlArea.getMinX(), controlArea.getMinY()); at.scale(toBeX, toBeX); at.translate(-diagramArea.getMinX(), -diagramArea.getMinY()); setTransform(at); } else { // negative, how, no can do? } } }