import java.awt.geom.Rectangle2D;
import org.simantics.g2d.participant.TransformUtil;
+import org.simantics.maps.MapScalingTransform;
import org.simantics.scenegraph.utils.GeometryUtils;
import org.simantics.utils.page.MarginUtils;
import org.simantics.utils.page.MarginUtils.Margins;
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;
+ // let's check that targetX zoomLevel is between 0-20
+ AffineTransform tar = new AffineTransform();
+ tar.scale(toBeX, toBeX);
+ int tarZoomLevel = MapScalingTransform.zoomLevel(tar);
+ if (tarZoomLevel < 20 && tarZoomLevel > 0) {
+ if (toBeX < targetX) {
+ while ((toBeX * 0.5) < targetX) {
+ toBeX = toBeX * 2;
+ AffineTransform tr = new AffineTransform();
+ tr.scale(toBeX, toBeX);
+ int zoomLevel = MapScalingTransform.zoomLevel(tr);
+ if (zoomLevel >= 20) { // let's not zoom too close
+ break;
+ }
+ }
+ } else {
+ while ((toBeX * 0.25) > targetX) {
+ toBeX = toBeX * 0.5;
+ AffineTransform tr = new AffineTransform();
+ tr.scale(toBeX, toBeX);
+ if (MapScalingTransform.zoomLevel(tr) <= 0) { // let's not zoom too far away
+ break;
+ }
+ }
}
}
- //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?