Package org.eclipse.jst.pagedesigner.editpolicies

Source Code of org.eclipse.jst.pagedesigner.editpolicies.CornerRelativeHandleLocator

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

/**
* A locator for handles that attach to the corner of square figures
* @author cbateman
*
*/
class CornerRelativeHandleLocator extends RelativeHandleLocator
{
    private double relativeX = 0;
    private double relativeY = 0;
    private double offsetXMultiplier = 0;
    private double offsetYMultiplier = 0;
   
    /**
     * @param reference
     * @param location
     */
    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;
    }
   
    /**
     * @param relocateFigure
     * @return the new target dimensions
     */
    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);       
    }
}
TOP

Related Classes of org.eclipse.jst.pagedesigner.editpolicies.CornerRelativeHandleLocator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.