blob: 6a8b0814db8c29100d5223dabe773e54a1050aa4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 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
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.common.ui.figures;
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;
/**
* Override the normal relative handle locator. This is required to move the
* handles out of the absolute corners and closer to the "apparent" bounds of
* the figure.
*/
public class InsetRelativeHandleLocator extends RelativeHandleLocator {
int fVerticalInset;
int fHorizontalInset;
int fLocation;
/**
* @param reference
* @param aLocation
* @param verticalInset
* @param horizontalInset
*/
public InsetRelativeHandleLocator(IFigure reference, int aLocation,
int verticalInset, int horizontalInset) {
super(reference, aLocation);
this.fVerticalInset = verticalInset;
this.fHorizontalInset = horizontalInset;
this.fLocation = aLocation;
}
/**
* @see org.eclipse.draw2d.RelativeLocator#relocate(org.eclipse.draw2d.IFigure)
*/
@Override
public void relocate(IFigure target) {
IFigure reference = getReferenceFigure();
Rectangle targetBounds = new PrecisionRectangle(getReferenceBox()
.getResized(-1, -1));
reference.translateToAbsolute(targetBounds);
target.translateToRelative(targetBounds);
targetBounds.resize(1, 1);
Dimension targetSize = target.getPreferredSize();
switch (fLocation & PositionConstants.EAST_WEST) {
case PositionConstants.WEST:
targetBounds.x -= (targetSize.width) / 2;
targetBounds.x += fHorizontalInset;
break;
case PositionConstants.EAST:
targetBounds.x += targetBounds.width - (targetSize.width) / 2;
targetBounds.x -= fHorizontalInset;
break;
// Only North || South is given
default :
targetBounds.x += targetBounds.width/2 ;
break;
}
switch (fLocation & PositionConstants.NORTH_SOUTH) {
case PositionConstants.NORTH:
targetBounds.y -= (targetSize.height) / 2;
targetBounds.y += fVerticalInset;
break;
case PositionConstants.SOUTH:
targetBounds.y += targetBounds.height - (targetSize.height + 2) / 2;
targetBounds.y -= fVerticalInset;
break;
// Only West || East is given
default :
targetBounds.y += targetBounds.height/2 ;
break;
}
targetBounds.setSize(targetSize);
target.setBounds(targetBounds);
}
}