/*******************************************************************************
* Copyright (c) 2000, 2005 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.gef.editpolicies;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.DirectEditRequest;
/**
* Shows DirectEdit feedback and creates the Command to perform a "direct edit". <I>Direct
* Edit</I> is when the User is editing a property of an EditPart directly (as opposed to
* in the Properties View) in the Viewer using a {@link
* org.eclipse.jface.viewers.CellEditor}. This EditPolicy is typically installed using
* {@link org.eclipse.gef.EditPolicy#DIRECT_EDIT_ROLE}.
* @author hudsonr
* @since 2.0
*/
public abstract class DirectEditPolicy
extends GraphicalEditPolicy
{
private boolean showing;
/**
* @see org.eclipse.gef.EditPolicy#eraseSourceFeedback(Request)
*/
public void eraseSourceFeedback(Request request) {
if (RequestConstants.REQ_DIRECT_EDIT == request.getType())
eraseDirectEditFeedback((DirectEditRequest)request);
}
/**
* If feedback is being shown, this method calls {@link
* #revertOldEditValue(DirectEditRequest)}.
* @param request the DirectEditRequest
*/
protected void eraseDirectEditFeedback(DirectEditRequest request) {
if (showing) {
revertOldEditValue(request);
showing = false;
}
}
/**
* @see org.eclipse.gef.EditPolicy#getCommand(Request)
*/
public Command getCommand(Request request) {
if (RequestConstants.REQ_DIRECT_EDIT == request.getType())
return getDirectEditCommand((DirectEditRequest)request);
return null;
}
/**
* Returns the <code>Command</code> to perform the direct edit.
* @param request the DirectEditRequest
* @return the command to perform the direct edit
*/
protected abstract Command getDirectEditCommand(DirectEditRequest request);
/**
* Helps erase feedback by reverting the original edit value. The rule when using GEF is
* that all feedback is removed before changes to the model are made. By default, the host
* is sent {@link org.eclipse.gef.EditPart#refresh()}, which should cause it to
* refresh all properties.
*
* Subclasses can override this method to perform a more specific revert.
* @see #storeOldEditValue(DirectEditRequest)
* @param request the DirectEditRequest
*/
protected void revertOldEditValue(DirectEditRequest request) {
getHost().refresh();
}
/**
* @see org.eclipse.gef.EditPolicy#showSourceFeedback(Request)
*/
public void showSourceFeedback(Request request) {
if (RequestConstants.REQ_DIRECT_EDIT == request.getType())
showDirectEditFeedback((DirectEditRequest)request);
}
/**
* Pushes the original edit value if necessary, and shows feedback.
* @param request the DirectEditRequest
*/
protected void showDirectEditFeedback(DirectEditRequest request) {
if (!showing) {
storeOldEditValue(request);
showing = true;
}
showCurrentEditValue(request);
}
/**
* Override to show the current direct edit value in the host's Figure. Although the
* CellEditor will probably cover the figure's display of this value, updating the figure
* will cause its preferred size to reflect the new value.
* @param request the DirectEditRequest
*/
protected abstract void showCurrentEditValue(DirectEditRequest request);
/**
* Called to remember the old value before direct edit feedback begins. After feedback is
* over, {@link #revertOldEditValue(DirectEditRequest)} is called to undo the changes done
* by feedback. By default, this method nothing.
* @param request the DirectEditRequest
*/
protected void storeOldEditValue(DirectEditRequest request) { }
/**
* Returns <code>true</code> for {@link RequestConstants#REQ_DIRECT_EDIT}. {@link
* org.eclipse.gef.ui.actions.DirectEditAction} will determine enablement based on whether
* the selected EditPart understands "direct edit".
* @see org.eclipse.gef.EditPolicy#understandsRequest(Request)
*/
public boolean understandsRequest(Request request) {
if (RequestConstants.REQ_DIRECT_EDIT.equals(request.getType()))
return true;
return super.understandsRequest(request);
}
}