| /******************************************************************************* |
| * Copyright (c) 2001, 2007 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.wst.wsdl.ui.internal.asd.design.editparts; |
| import java.util.Iterator; |
| import java.util.List; |
| import org.eclipse.draw2d.ConnectionAnchor; |
| import org.eclipse.draw2d.Figure; |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.PositionConstants; |
| import org.eclipse.draw2d.geometry.Point; |
| import org.eclipse.draw2d.geometry.Rectangle; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.EditPartViewer; |
| import org.eclipse.gef.GraphicalEditPart; |
| import org.eclipse.gef.LayerConstants; |
| import org.eclipse.gef.editparts.AbstractGraphicalEditPart; |
| import org.eclipse.gef.editparts.LayerManager; |
| import org.eclipse.wst.wsdl.ui.internal.asd.design.figures.ComponentReferenceConnection; |
| |
| |
| class EditPartNavigationHandlerUtil |
| { |
| static GraphicalEditPart getRelativeEditPart(GraphicalEditPart focusEditPart, int direction) |
| { |
| // these 'delta' values need to be set to some value that's large enough to cross the gap |
| // between adjacent edit parts (since some layouts may space the edit parts out a bit) |
| int dx = 5; |
| int dy = 5; |
| |
| IFigure contentPane = focusEditPart.getContentPane(); |
| |
| // we attempt to compute a rectangle that represents our current location |
| Rectangle r = focusEditPart.getFigure().getBounds().getCopy(); |
| focusEditPart.getFigure().translateToAbsolute(r); |
| if (contentPane != focusEditPart.getFigure()) |
| { |
| // if the EditPart has a contentPane (that's no the figure) then we assume |
| // effective rectangle is only the header portion of the figure |
| // |
| Rectangle contentPaneBounds = contentPane.getBounds().getCopy(); |
| contentPane.translateToAbsolute(contentPaneBounds); |
| |
| // we assume that when the editpart's figure and contentPane are different |
| // that portion of the 'hittable' portion of editpart should not include the contentPane |
| if (contentPaneBounds.y > r.y) |
| { |
| // if the contentPane is lower than the figure we only want the rectangle |
| // above the contentPane |
| r.height = contentPaneBounds.y - r.y; |
| // we adjust the rectangle the right slightly since the content is nested a bit |
| r.x = contentPaneBounds.x; |
| } |
| if (contentPaneBounds.x > r.x) |
| { |
| // if the contentPane is to the right of the figure we only want the rectangle |
| // to the left of the content pane |
| r.width = contentPaneBounds.x - r.x; |
| } |
| } |
| Point p = null; |
| if (direction == PositionConstants.NORTH) |
| { |
| p = r.getTopLeft(); |
| p.y -= dy; |
| } |
| else if (direction == PositionConstants.SOUTH) |
| { |
| p = r.getBottomLeft(); |
| p.x += dx; |
| p.y += dy; |
| } |
| else if (direction == PositionConstants.EAST) |
| { |
| p = r.getTopRight(); |
| p.x += dx; |
| } |
| else if (direction == PositionConstants.WEST) |
| { |
| p = r.getLeft(); |
| p.x -= dx; |
| } |
| EditPart t = focusEditPart.getViewer().findObjectAt(p); |
| |
| if (t instanceof ColumnEditPart || t instanceof DefinitionsEditPart) |
| { |
| t = focusEditPart; |
| while ((t instanceof ColumnEditPart || t instanceof DefinitionsEditPart) && t.getChildren().size() > 0) |
| { |
| t = (EditPart) t.getChildren().get(0); |
| } |
| } |
| return (GraphicalEditPart)t; |
| } |
| |
| static EditPart getNextSibling(EditPart editPart) |
| { |
| EditPart result = null; |
| EditPart parent = editPart.getParent(); |
| if (parent != null) |
| { |
| List children = parent.getChildren(); |
| int index = children.indexOf(editPart); |
| if (index + 1 < children.size()) |
| { |
| result = (EditPart)children.get(index + 1); |
| } |
| } |
| return result; |
| } |
| |
| static EditPart getPrevSibling(EditPart editPart) |
| { |
| EditPart result = null; |
| EditPart parent = editPart.getParent(); |
| if (parent != null) |
| { |
| List children = parent.getChildren(); |
| int index = children.indexOf(editPart); |
| if (index - 1 >= 0) |
| { |
| // if this is the first child |
| // |
| result = (EditPart)children.get(index - 1); |
| } |
| } |
| return result; |
| } |
| |
| static EditPart getNextInterface(EditPart editPart) |
| { |
| EditPart result = null; |
| for (EditPart e = editPart; e != null; e = e.getParent()) |
| { |
| if (e instanceof InterfaceEditPart) |
| { |
| InterfaceEditPart ie = (InterfaceEditPart)e; |
| result = EditPartNavigationHandlerUtil.getNextSibling(ie); |
| break; |
| } |
| } |
| return result; |
| } |
| |
| static EditPart getNextService(EditPart editPart) |
| { |
| EditPart result = null; |
| for (EditPart e = editPart; e != null; e = e.getParent()) |
| { |
| if (e instanceof ServiceEditPart) |
| { |
| ServiceEditPart ie = (ServiceEditPart)e; |
| result = EditPartNavigationHandlerUtil.getNextSibling(ie); |
| break; |
| } |
| } |
| return result; |
| } |
| |
| static EditPart getSourceConnectionEditPart(AbstractGraphicalEditPart editPart) |
| { |
| // find the first connection that targets this editPart |
| // navigate backward along the connection (to the left) to find the sourc edit part |
| EditPart result = null; |
| EditPartViewer viewer = editPart.getViewer(); |
| LayerManager manager = (LayerManager)editPart.getViewer().getEditPartRegistry().get(LayerManager.ID); |
| IFigure layer = manager.getLayer(LayerConstants.CONNECTION_LAYER); |
| for (Iterator i = layer.getChildren().iterator(); i.hasNext(); ) |
| { |
| Figure figure = (Figure)i.next(); |
| if (figure instanceof ComponentReferenceConnection) |
| { |
| ComponentReferenceConnection componentReferenceConnection = (ComponentReferenceConnection)figure; |
| ConnectionAnchor targetAnchor = componentReferenceConnection.getTargetAnchor(); |
| if (targetAnchor.getOwner() == editPart.getFigure()) |
| { |
| ConnectionAnchor sourceAnchor = componentReferenceConnection.getSourceAnchor(); |
| IFigure sourceFigure = sourceAnchor.getOwner(); |
| EditPart part = null; |
| while (part == null && sourceFigure != null) |
| { |
| part = (EditPart)viewer.getVisualPartMap().get(sourceFigure); |
| sourceFigure = sourceFigure.getParent(); |
| } |
| result = part; |
| break; |
| } |
| } |
| } |
| return result; |
| } |
| } |