blob: e9e31d84a95195a43434574f66c614b5e4692f41 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2001, 2007 Oracle 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Oracle Corporation - initial API and implementation
*******************************************************************************/
/**
*
*/
package org.eclipse.jst.pagedesigner.editpolicies;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.PositionConstants;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.PrecisionRectangle;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.gef.handles.RelativeHandleLocator;
class CornerRelativeHandleLocator extends RelativeHandleLocator
{
protected double relativeX = 0;
protected double relativeY = 0;
protected double offsetXMultiplier = 0;
protected double offsetYMultiplier = 0;
public CornerRelativeHandleLocator(IFigure reference, int location) {
super(reference, location);
// unfortunately, relativeX and relativeY are private in super
// so duplicate calc code here
switch (location & PositionConstants.NORTH_SOUTH)
{
case PositionConstants.NORTH:
relativeY = 0;
offsetYMultiplier = -1.0;
break;
case PositionConstants.SOUTH:
relativeY = 1.0;
offsetYMultiplier = 0;
break;
default:
relativeY = 0.5;
}
switch (location & PositionConstants.EAST_WEST)
{
case PositionConstants.WEST:
relativeX = 0;
offsetXMultiplier = -1.0;
break;
case PositionConstants.EAST:
relativeX = 1.0;
offsetXMultiplier = 0;
break;
default:
relativeX = 0.5;
}
}
/**
* Pass in targetBounds to be updated and newTargetSize. targetBounds will
* be applied to the figure that is being relocated immediately after this method
* @param targetBounds
* @param newTargetSize
*/
protected void relocateBounds(Rectangle targetBounds, Dimension newTargetSize)
{
// copied from super.relocate because relativeX/Y are private in super
// changed from super to remove div by 2 that centers target; we want
// it to be corner-to-corner
targetBounds.x
+= (int) (((targetBounds.width+2) * relativeX) + ((newTargetSize.width+1)*offsetXMultiplier));
targetBounds.y
+= (int) (targetBounds.height * relativeY + ((newTargetSize.height+1)*offsetYMultiplier));
targetBounds.setSize(newTargetSize);
}
/**
* @param relocateFigure
* @return a modifiable Rectangle that represents the bounds of the figure to be relocated
*/
protected Rectangle getCurrentTargetBounds(IFigure relocateFigure)
{
IFigure reference = getReferenceFigure();
Rectangle targetBounds = new PrecisionRectangle(getReferenceBox().getResized(-1, -1));
reference.translateToAbsolute(targetBounds);
relocateFigure.translateToRelative(targetBounds);
return targetBounds;
}
protected Dimension getNewTargetSize(IFigure relocateFigure)
{
return relocateFigure.getPreferredSize();
}
public void relocate(IFigure target) {
Rectangle targetBounds = getCurrentTargetBounds(target);
Dimension targetSize = getNewTargetSize(target);
relocateBounds(targetBounds, targetSize);
target.setBounds(targetBounds);
}
}