### Eclipse Workspace Patch 1.0 #P org.eclipse.gef Index: src/org/eclipse/gef/tools/ResizeTracker.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.gef/plugins/org.eclipse.gef/src/org/eclipse/gef/tools/ResizeTracker.java,v retrieving revision 1.38 diff -u -r1.38 ResizeTracker.java --- src/org/eclipse/gef/tools/ResizeTracker.java 7 Jun 2005 19:57:36 -0000 1.38 +++ src/org/eclipse/gef/tools/ResizeTracker.java 30 Apr 2008 21:20:42 -0000 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2005 IBM Corporation and others. + * Copyright (c) 2000, 2008 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,10 +10,12 @@ *******************************************************************************/ package org.eclipse.gef.tools; +import java.util.Collections; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Cursor; +import org.eclipse.swt.widgets.Display; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.PositionConstants; @@ -23,6 +25,7 @@ import org.eclipse.draw2d.geometry.PrecisionPoint; import org.eclipse.draw2d.geometry.PrecisionRectangle; +import org.eclipse.gef.AutoexposeHelper; import org.eclipse.gef.EditPart; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.Request; @@ -55,7 +58,96 @@ private GraphicalEditPart owner; private PrecisionRectangle sourceRect; private SnapToHelper snapToHelper; +private PrecisionPoint sourceRelativeStartPoint; +private AutoexposeHelper exposeHelper; + +class QueuedAutoexpose implements Runnable { + public void run() { + if (exposeHelper != null) + doAutoexpose(); + } +} +/** + * Called to perform an iteration of the autoexpose process. If the expose helper is set, + * it will be asked to step at the current mouse location. If it returns true, another + * expose iteration will be queued. There is no delay between autoexpose events, other + * than the time required to perform the step(). + */ +protected void doAutoexpose() { + if (exposeHelper == null) + return; + if (exposeHelper.step(getLocation())) { + handleAutoexpose(); + Display.getCurrent().asyncExec(new QueuedAutoexpose()); + } else + setAutoexposeHelper(null); +} +protected void handleAutoexpose() { + updateSourceRequest(); + showSourceFeedback(); + showTargetFeedback(); + setCurrentCommand(getCommand()); +} +/** + * Returns null or the current autoexpose helper. + * @return null or a helper + */ +protected AutoexposeHelper getAutoexposeHelper() { + return exposeHelper; +} +/** + * Sets the active autoexpose helper to the given helper, or null. If the + * helper is not null, a runnable is queued on the event thread that will + * trigger a subsequent {@link #doAutoexpose()}. The helper is typically updated only on + * a hover event. + * @param helper the new autoexpose helper or null + */ +protected void setAutoexposeHelper(AutoexposeHelper helper) { + exposeHelper = helper; + if (exposeHelper == null) + return; + Display.getCurrent().asyncExec(new QueuedAutoexpose()); + + if (sourceRelativeStartPoint == null && isInDragInProgress()) { + IFigure figure = getTargetEditPart().getFigure(); + sourceRelativeStartPoint = new PrecisionPoint(getStartLocation()); + figure.translateToRelative(sourceRelativeStartPoint); + } +} +/** + * Updates the active {@link AutoexposeHelper}. Does nothing if there is still an active + * helper. Otherwise, obtains a new helper (possible null) at the current + * mouse location and calls {@link #setAutoexposeHelper(AutoexposeHelper)}. + */ +protected void updateAutoexposeHelper() { + if (exposeHelper != null) + return; + AutoexposeHelper.Search search; + search = new AutoexposeHelper.Search(getLocation()); + getCurrentViewer() + .findObjectAtExcluding(getLocation(), Collections.EMPTY_LIST, search); + setAutoexposeHelper(search.result); +} + +/** + * If auto scroll (also called auto expose) is being performed, the start location moves + * during the scroll. This method updates that location. + */ +protected void repairStartLocation() { + if (sourceRelativeStartPoint == null) + return; + IFigure figure = getTargetEditPart().getFigure(); + PrecisionPoint newStart = (PrecisionPoint)sourceRelativeStartPoint.getCopy(); + figure.translateToAbsolute(newStart); + Point delta = new Point(newStart.x - getStartLocation().x, + newStart.y - getStartLocation().y); + setStartLocation(newStart); + // sourceRect needs to be updated as well when auto-scrolling + if (sourceRect != null) + sourceRect.translate(delta); +; +} /** * Constructs a resize tracker that resizes in the specified direction. The direction is * specified using {@link PositionConstants#NORTH}, {@link PositionConstants#NORTH_EAST}, @@ -133,6 +225,8 @@ // For the case where ESC key was hit while resizing eraseTargetFeedback(); + sourceRelativeStartPoint = null; + setAutoexposeHelper(null); sourceRect = null; snapToHelper = null; super.deactivate(); @@ -234,8 +328,14 @@ showTargetFeedback(); setCurrentCommand(getCommand()); } + return true; } +protected boolean handleHover() { + if (isInDragInProgress()) + updateAutoexposeHelper(); + return true; +} /** * This method is invoked as the drag is happening. It notifies the @@ -251,6 +351,8 @@ * @see org.eclipse.gef.tools.SimpleDragTracker#updateSourceRequest() */ protected void updateSourceRequest() { + repairStartLocation(); + ChangeBoundsRequest request = (ChangeBoundsRequest) getSourceRequest(); Dimension d = getDragMoveDelta();