//------------------------------------------------------------------------------ // 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(); } }