/****************************************************************************** * Copyright (c) 2003, 2006 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.gmf.runtime.diagram.ui.handles; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.ImageFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.Locator; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.StackLayout; import org.eclipse.draw2d.TreeSearch; import org.eclipse.gef.DragTracker; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.handles.AbstractHandle; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.internal.l10n.DiagramUIPluginImages; import org.eclipse.gmf.runtime.diagram.ui.internal.tools.ConnectionHandleTool; import org.eclipse.gmf.runtime.diagram.ui.l10n.SharedImages; import org.eclipse.swt.graphics.Image; /** * This is the handle figure used to represent a connection handle. * * @author cmahoney */ public class ConnectionHandle extends AbstractHandle { /** * An enumeration of connection directions. * OUTGOING = source to target * INCOMING = target to source */ public static final class HandleDirection { private HandleDirection() { // empty } /** source to target */ public static final HandleDirection OUTGOING = new HandleDirection(); /** target to source */ public static final HandleDirection INCOMING = new HandleDirection(); } /** the error icon that can be superimposed on the connection handle image */ private static final ImageFigure ERROR_IMAGE = new ImageFigure(SharedImages .get(SharedImages.IMG_ERROR)); static { ERROR_IMAGE.setSize(SharedImages.get(SharedImages.IMG_ERROR) .getBounds().width, SharedImages.get(SharedImages.IMG_ERROR) .getBounds().height); } /** direction that the relationship is to be created */ private HandleDirection handleDirection; /** * Creates a new <code>ConnectionHandle</code>. * @param ownerEditPart the editpart for which the handle belongs * @param relationshipDirection direction that the relationship is to be created * @param tooltip the tooltip */ public ConnectionHandle( IGraphicalEditPart ownerEditPart, HandleDirection relationshipDirection, String tooltip) { setOwner(ownerEditPart); setRelationshipDirection(relationshipDirection); setToolTip(new Label(tooltip)); // A stack layout is used so that the error icon can be overlayed on top. setLayoutManager(new StackLayout()); } /** * @see org.eclipse.gef.handles.AbstractHandle#createDragTracker() */ protected DragTracker createDragTracker() { return new ConnectionHandleTool(this); } /** * @see org.eclipse.draw2d.IFigure#findFigureAt(int, int, org.eclipse.draw2d.TreeSearch) */ public IFigure findFigureAt(int x, int y, TreeSearch search) { // return the ConnectionHandle and not the children figures if (containsPoint(x, y)) { return this; } return super.findFigureAt(x, y, search); } /** * Make public. * @see org.eclipse.gef.handles.AbstractHandle#setLocator(org.eclipse.draw2d.Locator) */ public void setLocator(Locator locator) { super.setLocator(locator); } /** * Make public. * @see org.eclipse.gef.handles.AbstractHandle#getOwner() */ public GraphicalEditPart getOwner() { return super.getOwner(); } /** * Sets the direction that the relationship is to be created. * @param direction the <code>HandleDirection</code> that the relationship is to be created */ protected void setRelationshipDirection(HandleDirection direction) { handleDirection = direction; } /** * Is this for incoming relationships? * @return true if this is for incoming relationships, false otherwise */ public boolean isIncoming() { return handleDirection == HandleDirection.INCOMING; } /** * Superimposes an error icon on this connection handle. */ public void addErrorIcon() { add(ERROR_IMAGE); } /** * Removes the error icon if it is being displayed. */ public void removeErrorIcon() { if (getChildren().contains(ERROR_IMAGE)) { remove(ERROR_IMAGE); } } /** * Updates the images used for the handles, based on the side they will * appear on. Sets the location of the handles using the locator. * @see org.eclipse.draw2d.IFigure#validate() */ public void validate() { if (isValid()) return; removeAll(); int side = ((ConnectionHandleLocator) getLocator()) .getBorderSide(); Image image = getImage(side); ImageFigure imageFigure = new ImageFigure(image); imageFigure.setSize(image.getBounds().width, image.getBounds().height); add(imageFigure); setSize(imageFigure.getSize().getUnioned(ERROR_IMAGE.getSize())); super.validate(); } /** * Gets the image to be used for the connection handle given the side of the * shape where the connection handle will appear. A call to * <code>isIncoming()</code> will reveal the direction of the handle. * * @param side * the side of the shape where the connection handle will appear, * a value in PositionConstants * @return the image to be used for the connection handle */ protected Image getImage(int side) { if (side == PositionConstants.WEST) { return isIncoming() ? DiagramUIPluginImages .get(DiagramUIPluginImages.IMG_HANDLE_INCOMING_WEST) : DiagramUIPluginImages .get(DiagramUIPluginImages.IMG_HANDLE_OUTGOING_WEST); } else if (side == PositionConstants.EAST) { return isIncoming() ? DiagramUIPluginImages .get(DiagramUIPluginImages.IMG_HANDLE_INCOMING_EAST) : DiagramUIPluginImages .get(DiagramUIPluginImages.IMG_HANDLE_OUTGOING_EAST); } else if (side == PositionConstants.SOUTH) { return isIncoming() ? DiagramUIPluginImages .get(DiagramUIPluginImages.IMG_HANDLE_INCOMING_SOUTH) : DiagramUIPluginImages .get(DiagramUIPluginImages.IMG_HANDLE_OUTGOING_SOUTH); } else { return isIncoming() ? DiagramUIPluginImages .get(DiagramUIPluginImages.IMG_HANDLE_INCOMING_NORTH) : DiagramUIPluginImages .get(DiagramUIPluginImages.IMG_HANDLE_OUTGOING_NORTH); } } }