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