diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/layout/RectangleGridLayoutDiagramConfiguration.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/layout/RectangleGridLayoutDiagramConfiguration.java index d9eb62068dbeb393cff521cfa93e5ffd1f806a94..4e5e6d7f2425f34f1e92ffce3dd6de17bb4662e6 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/layout/RectangleGridLayoutDiagramConfiguration.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/layout/RectangleGridLayoutDiagramConfiguration.java @@ -27,14 +27,15 @@ import static org.fortiss.tooling.base.ui.utils.LayoutDataUtils.setConnectorOffs import static org.fortiss.tooling.base.ui.utils.RectangleLayoutUtils.calculateRectangleBorderOrientation; import static org.fortiss.tooling.base.ui.utils.RectangleLayoutUtils.clampRectangularShapeSize; import static org.fortiss.tooling.base.ui.utils.SnapToGridUtils.snapToGrid; +import static org.fortiss.tooling.base.ui.utils.ZoomUtils.determineZoom; +import static org.fortiss.tooling.base.ui.utils.ZoomUtils.internalToScreenPoint; +import static org.fortiss.tooling.base.ui.utils.ZoomUtils.screenToInternalPoint; import static org.fortiss.tooling.base.utils.LayoutModelElementFactory.createDimension; import org.eclipse.draw2d.IFigure; -import org.eclipse.draw2d.Viewport; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; -import org.eclipse.gef.editparts.ScalableRootEditPart; import org.eclipse.gef.requests.ChangeBoundsRequest; import org.fortiss.tooling.base.model.layout.ILayoutedModelElement; import org.fortiss.tooling.base.model.layout.OffsetOrientation; @@ -52,7 +53,7 @@ import org.fortiss.tooling.base.ui.editpart.StickyConnectorEditPartBase; * @author hoelzl * @author $Author$ * @version $Rev$ - * @ConQAT.Rating GREEN Hash: 0CE64ACB8F262EFB9BCA06665C7E4AA7 + * @ConQAT.Rating YELLOW Hash: 554E256E48502ACEF16407FF74D3D28B */ public class RectangleGridLayoutDiagramConfiguration extends DiagramLayoutConfigurationBase { @@ -100,27 +101,22 @@ public class RectangleGridLayoutDiagramConfiguration extends DiagramLayoutConfig public void alterStickyConnectorMoveFeedbackRequest(ChangeBoundsRequest request, StickyConnectorEditPartBase<? extends ILayoutedModelElement> connectorEditPart, IFigure connectorFigure) { + double zoom = determineZoom(connectorEditPart.getRoot()); + Point moveDelta = screenToInternalPoint(request.getMoveDelta(), zoom); + // get the bounds of the parent Rectangle containerBounds = getContainerBounds(connectorEditPart); // get the child position relative to the parent Point childPos = connectorFigure.getBounds().getLocation() .getTranslated(containerBounds.getLocation().getNegated()); - // get the current mouse position - Point mousePos = request.getLocation(); - // fix offset in mouse position because of possibly scrolled editing - // window - Point clientAreaOffset = - new Point(((Viewport)((ScalableRootEditPart)connectorEditPart.getParentEditPart() - .getRoot()).getFigure()).getClientArea().getLocation()); - mousePos.translate(clientAreaOffset); - // get the mouse position relative to the parent - Point relativePos = mousePos.getTranslated(containerBounds.getLocation().getNegated()); + Point relativePos = childPos.getTranslated(moveDelta); // do border clamping OffsetOrientation orient = calculateRectangleBorderOrientation(relativePos, containerBounds.getSize(), DEFAULT_SHAPE_INSETS); + // snap to grid orient.setOffset(snapToGrid(orient.getOffset())); // use the calculated value for positioning @@ -136,7 +132,7 @@ public class RectangleGridLayoutDiagramConfiguration extends DiagramLayoutConfig // MoveDelta needs positions relative to the child relativePos.translate(childPos.getNegated()); - request.setMoveDelta(relativePos); + request.setMoveDelta(internalToScreenPoint(relativePos, zoom)); } /** diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/RectangleLayoutUtils.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/RectangleLayoutUtils.java index 7a8132f836aed7297e9eba33651eb30b17c0805c..0ef41515894690f850a72538c0fb7b22e51cbf15 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/RectangleLayoutUtils.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/RectangleLayoutUtils.java @@ -17,6 +17,7 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.base.ui.utils; +import static java.lang.Math.min; import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_CONNECTOR_SIZE; import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_SHAPE_INSETS; import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_SHAPE_MINIMUM_HEIGHT; @@ -34,8 +35,6 @@ import static org.fortiss.tooling.base.ui.utils.LayoutDataUtils.setNodePosition; import static org.fortiss.tooling.base.ui.utils.SnapToGridUtils.snapToGrid; import static org.fortiss.tooling.base.utils.LayoutModelElementFactory.createOffsetOrientation; -import java.awt.Polygon; - import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; @@ -52,7 +51,7 @@ import org.fortiss.tooling.base.ui.dnd.gef.ElementDropContext; * @author hoelzl * @author $Author$ * @version $Rev$ - * @ConQAT.Rating GREEN Hash: 4AC211E8ED3669B184AEB530916A8A5C + * @ConQAT.Rating YELLOW Hash: 118735F6573C95F19DDFBB5B6CFAE4A1 */ public class RectangleLayoutUtils { @@ -76,34 +75,24 @@ public class RectangleLayoutUtils { // The figure bounds Rectangle bounds = new Rectangle(0, 0, rectangleSize.width, rectangleSize.height); - // Divide the rectangle into four diagonal sectors - Polygon northSector = - new Polygon(new int[] {bounds.getCenter().x, bounds.x, bounds.width}, new int[] { - bounds.getCenter().y, bounds.y, bounds.y}, 3); - Polygon eastSector = - new Polygon(new int[] {bounds.getCenter().x, bounds.width, bounds.width}, - new int[] {bounds.getCenter().y, bounds.y, bounds.height}, 3); - Polygon southSector = - new Polygon(new int[] {bounds.getCenter().x, bounds.width, bounds.x}, new int[] { - bounds.getCenter().y, bounds.height, bounds.height}, 3); - Polygon westSector = - new Polygon(new int[] {bounds.getCenter().x, bounds.x, bounds.x}, new int[] { - bounds.getCenter().y, bounds.height, bounds.y}, 3); + int distanceToNorth = source.y; + int distanceToSouth = bounds.height - source.y; + int distanceToWest = source.x; + int distanceToEast = bounds.width - source.x; + int minDistance = + min(min(min(distanceToEast, distanceToNorth), distanceToWest), distanceToSouth); // Determine in which sector we are and clamp the position accordingly - if(northSector.contains(source.x, source.y)) { + if(minDistance == distanceToNorth) { orientation = NORTH; offset = (int)(source.x * (1 - (2 * inset) / (double)bounds.width)); - } - if(westSector.contains(source.x, source.y)) { + } else if(minDistance == distanceToWest) { orientation = WEST; offset = (int)(source.y * (1 - (2 * inset) / (double)bounds.height)); - } - if(southSector.contains(source.x, source.y)) { + } else if(minDistance == distanceToSouth) { orientation = SOUTH; offset = (int)(source.x * (1 - (2 * inset) / (double)bounds.width)); - } - if(eastSector.contains(source.x, source.y)) { + } else { orientation = EAST; offset = (int)(source.y * (1 - (2 * inset) / (double)bounds.height)); } diff --git a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/ZoomUtils.java b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/ZoomUtils.java index 30c6331a2e798238c6173b7e01bb5279d5fead4a..a7daa1fe417b55e3c8d61e417bcb139e6eb1ee39 100644 --- a/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/ZoomUtils.java +++ b/org.fortiss.tooling.base.ui/trunk/src/org/fortiss/tooling/base/ui/utils/ZoomUtils.java @@ -17,6 +17,8 @@ $Id$ +--------------------------------------------------------------------------*/ package org.fortiss.tooling.base.ui.utils; +import org.eclipse.draw2d.geometry.Dimension; +import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.RootEditPart; import org.eclipse.gef.editparts.ScalableFreeformRootEditPart; import org.eclipse.gef.editparts.ScalableRootEditPart; @@ -28,7 +30,7 @@ import org.eclipse.gef.requests.ChangeBoundsRequest; * @author hummel * @author $Author$ * @version $Rev$ - * @ConQAT.Rating GREEN Hash: 57E5F4C587CD015E3B85AC0666F7BA44 + * @ConQAT.Rating YELLOW Hash: 7629EF7289BEE454E9279494EB3A7413 */ public class ZoomUtils { @@ -51,7 +53,39 @@ public class ZoomUtils { if(zoom <= 0 || zoom == 1) { return; } - request.getMoveDelta().scale(1 / zoom); - request.getSizeDelta().scale(1 / zoom); + request.setMoveDelta(screenToInternalPoint(request.getMoveDelta(), zoom)); + request.setSizeDelta(screenToInternalDimension(request.getSizeDelta(), zoom)); + } + + /** + * Converts a point expressed in screen coordinates, into a point in internal coordinates, + * taking the zoom into account. + */ + public static Point screenToInternalPoint(Point pos, double zoom) { + return pos.scale(1 / zoom); + } + + /** + * Converts a point expressed in internal coordinates, into a point in screen coordinates, + * taking the zoom into account. + */ + public static Point internalToScreenPoint(Point pos, double zoom) { + return pos.scale(zoom); + } + + /** + * Converts a point expressed in screen coordinates, into a point in internal coordinates, + * taking the zoom into account. + */ + public static Dimension screenToInternalDimension(Dimension dim, double zoom) { + return dim.scale(1 / zoom); + } + + /** + * Converts a point expressed in internal coordinates, into a point in screen coordinates, + * taking the zoom into account. + */ + public static Dimension internalToScreenDimension(Dimension dim, double zoom) { + return dim.scale(zoom); } }