| /****************************************************************************** |
| * Copyright (c) 2003, 2008 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.tools; |
| |
| import org.eclipse.draw2d.geometry.Point; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.transaction.util.TransactionUtil; |
| import org.eclipse.gef.DragTracker; |
| import org.eclipse.gef.EditPart; |
| import org.eclipse.gef.Request; |
| import org.eclipse.gef.commands.Command; |
| import org.eclipse.gef.requests.CreateRequest; |
| import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequestFactory; |
| import org.eclipse.gmf.runtime.diagram.ui.requests.EditCommandRequestWrapper; |
| import org.eclipse.gmf.runtime.emf.type.core.IElementType; |
| import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest; |
| import org.eclipse.gmf.runtime.notation.View; |
| |
| /** |
| * This is the tool used for the AddUML commands associated with the popup bars. |
| * The creation tools for popup bars also need to impl DragTracker since the |
| * SelectionTool calls Handle.getDragTracker during mouseDown. |
| * |
| * @author affrantz, cmahoney |
| * |
| */ |
| |
| public class PopupBarTool |
| extends AbstractPopupBarTool |
| implements DragTracker { |
| |
| /** |
| * When creating shapes on a dgrm using the abar, we do not want to cover |
| * the new shape with the abar, so we offset the creation pnt by a y-offset |
| * 32 is not not arbitrary it is 2x16 which is the height of an icon. and 2 |
| * pixels bigger than the height of an action-bar row. |
| */ |
| static private int Y_OFFSET = 32; |
| |
| /** |
| * constructor |
| * |
| * @param epHost |
| * the host edit part for this tool |
| * @param elementType |
| */ |
| public PopupBarTool(EditPart epHost, IElementType elementType) { |
| super(epHost, elementType); |
| } |
| |
| /** |
| * constructor |
| * |
| * @param epHost |
| * @param theRequest |
| * the create request to be used |
| */ |
| public PopupBarTool(EditPart epHost, CreateRequest theRequest) { |
| super(epHost, theRequest); |
| } |
| |
| /** |
| * @see org.eclipse.gef.tools.TargetingTool#createTargetRequest() |
| */ |
| protected Request createTargetRequest() { |
| |
| /* if we have a request, use it */ |
| if (getCreateRequest() != null) { |
| return getCreateRequest(); |
| } |
| |
| return CreateViewRequestFactory.getCreateShapeRequest(getElementType(), |
| getPreferencesHint()); |
| } |
| |
| /** |
| * First tries to get a command based on the target request (a create view |
| * and element request). If this fails, tries to get a command with a |
| * request to create an element only. |
| * |
| * @see org.eclipse.gef.tools.TargetingTool#getCommand() |
| */ |
| protected Command getCommand() { |
| Request theRequest = this.getTargetRequest(); |
| |
| if (theRequest instanceof CreateRequest) { |
| Point thePoint = this.getCurrentInput().getMouseLocation(); |
| thePoint.y += Y_OFFSET; |
| ((CreateRequest) theRequest).setLocation(thePoint); |
| } |
| |
| EditPart target = getHost().getTargetEditPart(theRequest); |
| if (target == null){ |
| target = getHost(); |
| } |
| Command theCmd = target.getCommand(theRequest); |
| // if we return a cmd that cannot execute then later downstream an |
| // NPE can be generated. |
| if (theCmd != null && theCmd.canExecute()) { |
| return theCmd; |
| } |
| |
| return getCommandToCreateElementOnly(); |
| } |
| |
| /** |
| * Tries to get a command to create a new semantic element only. |
| * |
| * @return the command if valid; null otherwise |
| */ |
| private Command getCommandToCreateElementOnly() { |
| EObject hostElement = ViewUtil |
| .resolveSemanticElement((View) getHost().getModel()); |
| |
| if (hostElement != null && getElementType() != null) { |
| CreateElementRequest theReq = new CreateElementRequest( |
| TransactionUtil.getEditingDomain(hostElement), hostElement, |
| getElementType()); |
| EditCommandRequestWrapper semReq = new EditCommandRequestWrapper( |
| theReq); |
| |
| // an ICommandProxy that wraps the ICommand of the from the |
| // semantic provider |
| Command theRealCmd = ((IGraphicalEditPart) getHost()) |
| .getCommand(semReq); |
| |
| // if we return a cmd that cannot execute then later downstream an |
| // NPE can be generated. |
| if (theRealCmd != null && theRealCmd.canExecute()) { |
| return theRealCmd; |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * Asks the target editpart to show target feedback and sets the target |
| * feedback flag. |
| */ |
| protected void showTargetFeedback() { |
| // After adding items to the popup bar, the targeting tool sends |
| // createViewRequests |
| // potentially causing incorrect feedback updates. We must prevent these |
| // from |
| // getting though. |
| } |
| } |