X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.network.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fnetwork%2Fui%2FDistrictPanZoomRotateHandler.java;h=05866bdabb3fea2b6bf14f4562267d5309bf11f9;hb=refs%2Fchanges%2F66%2F2766%2F2;hp=f9d9fccca449b8a265d4f0983d41952138cd39e8;hpb=835710a4f22ec2d91c287295fb176a0af62d1186;p=simantics%2Fdistrict.git diff --git a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictPanZoomRotateHandler.java b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictPanZoomRotateHandler.java index f9d9fccc..05866bda 100644 --- a/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictPanZoomRotateHandler.java +++ b/org.simantics.district.network.ui/src/org/simantics/district/network/ui/DistrictPanZoomRotateHandler.java @@ -2,11 +2,16 @@ package org.simantics.district.network.ui; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; +import java.util.Collection; +import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import org.simantics.g2d.canvas.ICanvasContext; import org.simantics.g2d.canvas.impl.DependencyReflection.Dependency; import org.simantics.g2d.canvas.impl.DependencyReflection.Reference; +import org.simantics.g2d.diagram.DiagramHints; +import org.simantics.g2d.diagram.IDiagram; import org.simantics.g2d.diagram.participant.Selection; import org.simantics.g2d.element.ElementUtils; import org.simantics.g2d.element.IElement; @@ -74,14 +79,44 @@ public class DistrictPanZoomRotateHandler extends PanZoomRotateHandler { } private boolean zoomToFit() { - return false; + CanvasBoundsParticipant boundsParticipant = getContext().getAtMostOneItemOfClass(CanvasBoundsParticipant.class); + if (boundsParticipant == null) + return false; + + final Rectangle2D controlBounds = boundsParticipant.getControlBounds().getFrame(); + if (controlBounds == null || controlBounds.isEmpty()) + return false; + + IDiagram d = getHint(DiagramHints.KEY_DIAGRAM); + if (d == null) + return false; + + Rectangle2D diagramRect = ElementUtils.getSurroundingElementBoundsOnDiagram(getMapElements(d.getElements())); + if (diagramRect == null) + return false; + if (diagramRect.isEmpty()) + return false; + + org.simantics.scenegraph.utils.GeometryUtils.expandRectangle(diagramRect, 1); + + // System.out.println("zoomToFit(" + controlArea + ", " + diagramRect + ")"); + util.fitArea(controlBounds, diagramRect, null); + + return true; + } + + protected static List getMapElements(Collection elements) { + List justMapElements = elements.stream() + .filter(e -> "DistrictNetworkEdgeElement".equals(e.getElementClass().getId()) + || "DistrictNetworkVertexElement".equals(e.getElementClass().getId())) + .collect(Collectors.toList()); + return justMapElements; } private boolean zoomToPage() { int currentZoomLevel = MapScalingTransform.zoomLevel(util.getTransform()); util.setTransform(new AffineTransform(2,0,0,2,270,270)); -// util.setTransform(new AffineTransform(MapScalingTransform.INSTANCE)); return true; } @@ -95,7 +130,11 @@ public class DistrictPanZoomRotateHandler extends PanZoomRotateHandler { return false; Set selections = selection.getAllSelections(); - Rectangle2D diagramRect = ElementUtils.getSurroundingElementBoundsOnDiagram(selections); + if (selections == null || selections.isEmpty()) { + // no can do, + return zoomToPage(); + } + Rectangle2D diagramRect = ElementUtils.getSurroundingElementBoundsOnDiagram(getMapElements(selections)); // Make sure that even empty bounds can be zoomed into. org.simantics.scenegraph.utils.GeometryUtils.expandRectangle(diagramRect, 1); @@ -136,26 +175,34 @@ public class DistrictPanZoomRotateHandler extends PanZoomRotateHandler { @Override public boolean mouseWheelMoved(MouseWheelMovedEvent me) { if (navigationEnabled && zoomEnabled) { - double z; - if (me.wheelRotation > 0) { - z = DISTRICT_TRANSLATE_AMOUNT; + // check if min/max zoom already + AffineTransform transform = getTransform(); + int zoomLevel = MapScalingTransform.zoomLevel(transform); + + if (0 < zoomLevel && zoomLevel < 20 || (zoomLevel == 0 && me.wheelRotation > 0) || (zoomLevel == 20 && me.wheelRotation < 0)) { + double z; + if (me.wheelRotation > 0) { + z = DISTRICT_TRANSLATE_AMOUNT; + } else { + z = 1.0d / DISTRICT_TRANSLATE_AMOUNT; + } + //double scroll = Math.min(0.9, -me.wheelRotation / 20.0); + //double z = 1 - scroll; + double dx = (me.controlPosition.getX() - transform.getTranslateX()) / transform.getScaleX(); + double dy = (me.controlPosition.getY() - transform.getTranslateY()) / transform.getScaleY(); + dx = dx * (1 - z); + dy = dy * (1 - z); +// double limitedScale = limitScaleFactor(z); +// if (limitedScale != 1.0) { + translate(dx, dy); + scale(z, z); + transformChanged(); + dropQuality(); + repaint(); +// } } else { - z = 1.0d / DISTRICT_TRANSLATE_AMOUNT; + // max zoom level reached } - //double scroll = Math.min(0.9, -me.wheelRotation / 20.0); - //double z = 1 - scroll; - double dx = (me.controlPosition.getX() - transform.getTranslateX()) / transform.getScaleX(); - double dy = (me.controlPosition.getY() - transform.getTranslateY()) / transform.getScaleY(); - dx = dx * (1 - z); - dy = dy * (1 - z); -// double limitedScale = limitScaleFactor(z); -// if (limitedScale != 1.0) { - translate(dx, dy); - scale(z, z); - transformChanged(); - dropQuality(); - repaint(); -// } } return false; }