/******************************************************************************
 * Copyright (c) 2002, 2003 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.editpolicies;

import org.eclipse.gef.EditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.AbstractEditPolicy;

import org.eclipse.gmf.runtime.diagram.ui.requests.RequestConstants;

/** Open Shape Edit Policy
 * <p>
 * This edit policy handles double click (open) gestures on shapes. When the user
 * double clicks on an edit part, GEF creates a REQ_OPEN request and subclasses of this
 * edit policy should handle that request. This policy should be installed with the
 * policy role OPEN_ROLE. Normally, the corresponding edit policy role
 * would be defined in {@link org.eclipse.gef.EditPolicy}, but no such role currently exists.
 * <p>
 * This edit policy is different from "DirectEditPolicy" even though both are a result of
 * a double click on a representation in a diagram. With the DIRECT_EDIT_ROLE, some type 
 * of in-diagram editing is performed (e.g., modify a text label, move line segment nodes, 
 * etc.). The OPEN_ROLE policy is typically installed on edit part whose underlying data
 * can only be examined/modified by opening another editor window. For example, if an edit
 * part represented another diagram, then an "open" request on that edit part should result 
 * in the corresponding diagram being opened in another editor window.
 * <p>
 * Although edit policies for both DIRECT_EDIT_ROLE and OPEN_ROLE could be installed on 
 * an edit part, typically only one of these roles is appropriate.
 * <p>
 * @author Kevin Cornell
 */
public abstract class OpenEditPolicy extends AbstractEditPolicy {

    /**
     * Returns the <code>Command</code> to perform the open request.
     * @param request the Request
     * @return the command to perform the open
     */
    protected abstract Command getOpenCommand(Request request);

    /** 
     * Intercept a command request for REQ_OPEN.
     * <p>
     * @see org.eclipse.gef.EditPolicy#getCommand(org.eclipse.gef.Request)
     */
    public Command getCommand(Request request) {
        if (RequestConstants.REQ_OPEN.equals(request.getType()))
            return getOpenCommand(request);
        return null;
    }

    /** 
     * Determine if the request type is supported by this edit policy.
     * <p>
     * @see org.eclipse.gef.EditPolicy#understandsRequest(org.eclipse.gef.Request)
     */
    public boolean understandsRequest(Request request) {
        if (RequestConstants.REQ_OPEN.equals(request.getType()))
            return true;
        return false;
    }

    /**
     * By default, the target edit part is the host edit part.
     * <p>
     * @see org.eclipse.gef.EditPolicy#getTargetEditPart(Request)
     */
    public EditPart getTargetEditPart(Request request) {

        if (understandsRequest(request))
            return getHost();

        return null;
    }
}
