/******************************************************************************
 * 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.
	}
}
