blob: 9935190b219948cb44aa18b47617a53329c8c99b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 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.draw2d.Connection;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.ConnectionLayer;
import org.eclipse.draw2d.ConnectionRouter;
import org.eclipse.draw2d.PolylineConnection;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.NodeEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.CreateConnectionRequest;
import org.eclipse.gef.requests.DropRequest;
import org.eclipse.gef.requests.ReconnectRequest;
/**
* A GraphicalNodeEditPolicy is responsible for creating and reconnecting
* connections graphically.
*
* Created on :Nov 11, 2002
*
* @author hudsonr
* @since 2.0
*/
public abstract class GraphicalNodeEditPolicy extends GraphicalEditPolicy {
/**
* the current FeedbackHelper
*/
protected FeedbackHelper feedbackHelper;
/**
* The connection feedback displayed during creates
*/
protected Connection connectionFeedback;
/**
* Returns a connection to be used as feeback during creates.
*
* @param req
* the operation being performed
* @return a connection to use as feedback
*/
protected Connection createDummyConnection(Request req) {
return new PolylineConnection();
}
/**
* @see org.eclipse.gef.EditPolicy#deactivate()
*/
public void deactivate() {
if (connectionFeedback != null) {
removeFeedback(connectionFeedback);
feedbackHelper = null;
connectionFeedback = null;
}
super.deactivate();
}
/**
* Erases connection feedback if necessary. Frees unused fields.
*
* @param request
* the CreateConnectionRequest
*/
protected void eraseCreationFeedback(CreateConnectionRequest request) {
if (connectionFeedback != null) {
removeFeedback(connectionFeedback);
feedbackHelper = null;
connectionFeedback = null;
}
}
/**
* Calls {@link #eraseCreationFeedback(CreateConnectionRequest)} when
* appropriate.
*
* @see org.eclipse.gef.EditPolicy#eraseSourceFeedback(Request)
*/
public void eraseSourceFeedback(Request request) {
if (REQ_CONNECTION_END.equals(request.getType()))
eraseCreationFeedback((CreateConnectionRequest) request);
}
/**
* Override to erase target feedback. Does nothing by default.
*
* @param request
* the DropRequest
*/
protected void eraseTargetConnectionFeedback(DropRequest request) {
}
/**
* Calls {@link #eraseTargetConnectionFeedback(DropRequest)} when
* appropriate.
*
* @see org.eclipse.gef.EditPolicy#eraseTargetFeedback(Request)
*/
public void eraseTargetFeedback(Request request) {
if (REQ_CONNECTION_START.equals(request.getType())
|| REQ_CONNECTION_END.equals(request.getType())
|| REQ_RECONNECT_SOURCE.equals(request.getType())
|| REQ_RECONNECT_TARGET.equals(request.getType()))
eraseTargetConnectionFeedback((DropRequest) request);
}
/**
* Factors the request into one of four abstract methods. Subclasses must
* implement these methods.
*
* @see org.eclipse.gef.EditPolicy#getCommand(Request)
*/
public Command getCommand(Request request) {
if (REQ_CONNECTION_START.equals(request.getType()))
return getConnectionCreateCommand((CreateConnectionRequest) request);
if (REQ_CONNECTION_END.equals(request.getType()))
return getConnectionCompleteCommand((CreateConnectionRequest) request);
if (REQ_RECONNECT_TARGET.equals(request.getType()))
return getReconnectTargetCommand((ReconnectRequest) request);
if (REQ_RECONNECT_SOURCE.equals(request.getType()))
return getReconnectSourceCommand((ReconnectRequest) request);
return null;
}
/**
* Returns the Command that will create the connection. This is second part
* of creation. {@link CreateConnectionRequest#getStartCommand()} is used
* here to obtain the contribution from the EditPart from which the User
* started the <i>creation</i>.
*
* @param request
* the CreateConnectionRequest
* @return the complete command to create a connection
*/
protected abstract Command getConnectionCompleteCommand(
CreateConnectionRequest request);
/**
* Returns the Command that represents the first half of creating a
* connection. This Command will be passed to the target node EditPart. The
* target node may do anything necessary to create a Command that represents
* the entire creation.
*
* @param request
* the CreateConnectionRequest
* @see #getConnectionCompleteCommand(CreateConnectionRequest)
* @return a Command representing half of a connection creation
*/
protected abstract Command getConnectionCreateCommand(
CreateConnectionRequest request);
/**
* Returns the ConnectionRouter for the creation feedback's connection.
*
* @param request
* the create request
* @return a connection router
* @since 3.2
*/
protected ConnectionRouter getDummyConnectionRouter(
CreateConnectionRequest request) {
return ((ConnectionLayer) getLayer(LayerConstants.CONNECTION_LAYER))
.getConnectionRouter();
}
/**
* Returns the FeedbackHelper that is ready to use. The feedback helper must
* be configured with the connection that will be used to display feedback,
* and that connection must be added to the appropriate layer in the
* diagram.
*
* @param request
* the CreateConnectionRequest
* @return a FeedbackHelper
*/
protected FeedbackHelper getFeedbackHelper(CreateConnectionRequest request) {
if (feedbackHelper == null) {
feedbackHelper = new FeedbackHelper();
Point p = request.getLocation();
connectionFeedback = createDummyConnection(request);
connectionFeedback
.setConnectionRouter(getDummyConnectionRouter(request));
connectionFeedback
.setSourceAnchor(getSourceConnectionAnchor(request));
feedbackHelper.setConnection(connectionFeedback);
addFeedback(connectionFeedback);
feedbackHelper.update(null, p);
}
return feedbackHelper;
}
/**
* Returns the <code>Command</code> to reconnect a connection's
* <i>target</i> end to the host.
*
* @param request
* the ReconnectRequest
* @return a Command
*/
protected abstract Command getReconnectTargetCommand(
ReconnectRequest request);
/**
* Returns the <code>Command</code> to reconnect a connection's
* <i>source</i> end to the host.
*
* @param request
* the ReconnectRequest
* @return a Command
*/
protected abstract Command getReconnectSourceCommand(
ReconnectRequest request);
/**
* Called during the display of creation feedback to snap the feedback to
* the nearest source ConnectionAnchor.
*
* @param request
* CreateConnectionRequest
* @return <code>null</code> or the nearest source ConnectionAnchor
*/
protected ConnectionAnchor getSourceConnectionAnchor(
CreateConnectionRequest request) {
EditPart source = request.getSourceEditPart();
return source instanceof NodeEditPart ? ((NodeEditPart) source)
.getSourceConnectionAnchor(request) : null;
}
/**
* Called during the display of creation feedback to snap the feedback to
* the nearest target ConnectionAnchor.
*
* @param request
* CreateConnectionRequest
* @return <code>null</code> or the nearest target ConnectionAnchor
*/
protected ConnectionAnchor getTargetConnectionAnchor(
CreateConnectionRequest request) {
EditPart target = request.getTargetEditPart();
return target instanceof NodeEditPart ? ((NodeEditPart) target)
.getTargetConnectionAnchor(request) : null;
}
/**
* Returns the <i>host</i> for the appropriate <code>Requests</code>.
* Returns <code>null</code> otherwise.
*
* @see org.eclipse.gef.EditPolicy#getTargetEditPart(Request)
*/
public EditPart getTargetEditPart(Request request) {
if (REQ_CONNECTION_START.equals(request.getType())
|| REQ_CONNECTION_END.equals(request.getType())
|| REQ_RECONNECT_SOURCE.equals(request.getType())
|| REQ_RECONNECT_TARGET.equals(request.getType()))
return getHost();
return null;
}
/**
* Shows feedback during a creation.
*
* @param request
* CreateConnectionRequest
*/
protected void showCreationFeedback(CreateConnectionRequest request) {
FeedbackHelper helper = getFeedbackHelper(request);
Point p = new Point(request.getLocation());
helper.update(getTargetConnectionAnchor(request), p);
}
/**
* calls {@link #showCreationFeedback(CreateConnectionRequest)} when
* appropriate.
*
* @see org.eclipse.gef.EditPolicy#showSourceFeedback(Request)
*/
public void showSourceFeedback(Request request) {
if (REQ_CONNECTION_END.equals(request.getType()))
showCreationFeedback((CreateConnectionRequest) request);
}
/**
* Override to show target connection feedback. Does nothing by default.
*
* @param request
* the DropRequest
*/
protected void showTargetConnectionFeedback(DropRequest request) {
}
/**
* Calls {@link #showTargetConnectionFeedback(DropRequest)} when
* appropriate.
*
* @see org.eclipse.gef.EditPolicy#showTargetFeedback(Request)
*/
public void showTargetFeedback(Request request) {
if (REQ_CONNECTION_START.equals(request.getType())
|| REQ_CONNECTION_END.equals(request.getType())
|| REQ_RECONNECT_SOURCE.equals(request.getType())
|| REQ_RECONNECT_TARGET.equals(request.getType()))
showTargetConnectionFeedback((DropRequest) request);
}
}