/**
 * 
 */
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);        
    }
}