blob: 45987f561f3265139be7601d270dcb2400ec8825 [file] [log] [blame]
//------------------------------------------------------------------------------
// Copyright (c) 2005, 2006 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 implementation
//------------------------------------------------------------------------------
package org.eclipse.epf.authoring.gef.edit;
import java.util.Iterator;
import java.util.List;
import org.eclipse.draw2d.ChopboxAnchor;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.epf.authoring.gef.commands.CreateLinkCommand;
import org.eclipse.epf.authoring.gef.commands.DeleteCommand;
import org.eclipse.epf.authoring.gef.commands.ReconnectLinkCommand;
import org.eclipse.epf.authoring.gef.util.ConnectionAnchorLocator;
import org.eclipse.epf.diagram.model.Link;
import org.eclipse.epf.diagram.model.ModelFactory;
import org.eclipse.epf.diagram.model.ModelPackage;
import org.eclipse.epf.diagram.model.Node;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.ComponentEditPolicy;
import org.eclipse.gef.editpolicies.GraphicalNodeEditPolicy;
import org.eclipse.gef.editpolicies.LayoutEditPolicy;
import org.eclipse.gef.requests.CreateConnectionRequest;
import org.eclipse.gef.requests.CreateRequest;
import org.eclipse.gef.requests.GroupRequest;
import org.eclipse.gef.requests.ReconnectRequest;
/**
* Provides support for connections, and installs EditPolicy for (
* {@link EditPolicy.COMPONENT_ROLE}, {@link EditPolicy.GRAPHICAL_NODE_ROLE},
* {@linkEditPolicy.SELECTION_FEEDBACK_ROLE})
*
* @author Phong Nguyen Le
* @since 1.0
*/
public abstract class NodeEditPart extends BaseEditPart implements
org.eclipse.gef.NodeEditPart {
public NodeEditPart(Node model) {
super(model);
}
protected void createEditPolicies() {
super.createEditPolicies();
installEditPolicy(EditPolicy.COMPONENT_ROLE, new ComponentEditPolicy() {
protected Command createDeleteCommand(GroupRequest deleteRequest) {
Boolean bool = (Boolean) deleteRequest.getExtendedData().get(
DeleteCommand.KEY_PERM_DELETE);
boolean permDelete = bool == null ? false : bool.booleanValue();
DeleteCommand cmd = new DeleteCommand(permDelete);
cmd.setPartToBeDeleted(getHost().getModel());
return cmd;
}
});
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE,
new GraphicalNodeEditPolicy() {
protected Command getConnectionCompleteCommand(
CreateConnectionRequest request) {
CreateLinkCommand cmd = (CreateLinkCommand) request
.getStartCommand();
cmd.setTarget((Node) getHost().getModel());
if (request.getTargetEditPart() instanceof ConnectionAnchorLocator) {
if (request.getTargetEditPart().equals(
request.getSourceEditPart())) {
} else {
cmd
.setTargetEndPoint(((ConnectionAnchorLocator) request
.getTargetEditPart())
.getLocation(request
.getLocation()));
}
}
return cmd;
}
protected Command getConnectionCreateCommand(
CreateConnectionRequest request) {
CreateLinkCommand cmd = new CreateLinkCommand(
ModelFactory.eINSTANCE.createLink(),
(Node) getHost().getModel());
if (request.getTargetEditPart() instanceof ConnectionAnchorLocator) {
cmd
.setSourceEndPoint(((ConnectionAnchorLocator) request
.getTargetEditPart())
.getLocation(request.getLocation()));
} else {
cmd.setSourceEndPoint(request.getLocation());
}
request.setStartCommand(cmd);
return cmd;
}
protected Command getReconnectSourceCommand(
ReconnectRequest request) {
Link link = (Link) request.getConnectionEditPart()
.getModel();
ReconnectLinkCommand cmd = new ReconnectLinkCommand(
link, (Node) getHost().getModel(), true);
if (request.getTarget() instanceof ConnectionAnchorLocator) {
cmd.setEndPoint(((ConnectionAnchorLocator) request
.getTarget()).getLocation(request
.getLocation()));
}
return cmd;
}
protected Command getReconnectTargetCommand(
ReconnectRequest request) {
Link link = (Link) request.getConnectionEditPart()
.getModel();
ReconnectLinkCommand cmd = new ReconnectLinkCommand(
link, (Node) getHost().getModel(), false);
if (request.getTarget() instanceof ConnectionAnchorLocator) {
cmd.setEndPoint(((ConnectionAnchorLocator) request
.getTarget()).getLocation(request
.getLocation()));
}
return cmd;
}
});
installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, null);
// By default, can't add anything to a node
installEditPolicy(EditPolicy.LAYOUT_ROLE, new LayoutEditPolicy() {
protected EditPolicy createChildEditPolicy(EditPart child) {
return null;
}
protected Command getCreateCommand(CreateRequest request) {
return null;
}
protected Command getDeleteDependantCommand(Request request) {
return null;
}
protected Command getMoveChildrenCommand(Request request) {
return null;
}
});
}
protected Node getNode() {
return (Node) getModel();
}
protected List getModelSourceConnections() {
return getNode().getOutgoingConnections();
}
protected List getModelTargetConnections() {
return getNode().getIncomingConnections();
}
public ConnectionAnchor getSourceConnectionAnchor(
ConnectionEditPart connection) {
return new ChopboxAnchor(getFigure());
}
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
return new ChopboxAnchor(getFigure());
}
public ConnectionAnchor getTargetConnectionAnchor(
ConnectionEditPart connection) {
return new ChopboxAnchor(getFigure());
}
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
return new ChopboxAnchor(getFigure());
}
protected void handlePropertyChanged(Notification msg) {
switch (msg.getFeatureID(Node.class)) {
case ModelPackage.NODE__LOCATION:
case ModelPackage.NODE__WIDTH:
case ModelPackage.NODE__HEIGHT:
refreshVisuals();
break;
case ModelPackage.NODE__READ_ONLY:
refreshVisuals();
for (Iterator iter = getTargetConnections().iterator(); iter
.hasNext();) {
ConnectionEditPart conn = (ConnectionEditPart) iter.next();
conn.refresh();
}
break;
case ModelPackage.NODE__OUTGOING_CONNECTIONS:
refreshSourceConnections();
break;
case ModelPackage.NODE__INCOMING_CONNECTIONS:
refreshTargetConnections();
break;
}
}
protected void refreshVisuals() {
super.refreshVisuals();
Rectangle constraint = new Rectangle(0, 0, -1, -1);
if (getNode().getLocation() != null)
constraint.setLocation(getNode().getLocation());
constraint.width = getNode().getWidth();
((GraphicalEditPart) getParent()).setLayoutConstraint(this,
getFigure(), constraint);
}
/**
* @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#activate()
*/
public void activate() {
super.activate();
((Node) getModel()).addConsumer(this);
}
/**
* @see org.eclipse.epf.authoring.gef.edit.BaseEditPart#deactivate()
*/
public void deactivate() {
((Node) getModel()).removeConsumer(this);
super.deactivate();
}
}