/*******************************************************************************
* Copyright (c) 2003, 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.examples.flow.parts;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;
import java.util.Map;
import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.draw2d.graph.CompoundDirectedGraph;
import org.eclipse.draw2d.graph.Node;
import org.eclipse.draw2d.graph.Subgraph;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.EditPolicy;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.NodeEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.tools.DirectEditManager;
import org.eclipse.gef.examples.flow.model.Activity;
import org.eclipse.gef.examples.flow.model.FlowElement;
import org.eclipse.gef.examples.flow.policies.ActivityDirectEditPolicy;
import org.eclipse.gef.examples.flow.policies.ActivityEditPolicy;
import org.eclipse.gef.examples.flow.policies.ActivityNodeEditPolicy;
import org.eclipse.gef.examples.flow.policies.ActivitySourceEditPolicy;
/**
* @author hudsonr
* Created on Jun 30, 2003
*/
public abstract class ActivityPart
extends AbstractGraphicalEditPart
implements PropertyChangeListener, NodeEditPart
{
protected DirectEditManager manager;
/**
* @see org.eclipse.gef.EditPart#activate()
*/
public void activate() {
super.activate();
getActivity().addPropertyChangeListener(this);
}
protected void applyGraphResults(CompoundDirectedGraph graph, Map map) {
Node n = (Node)map.get(this);
getFigure().setBounds(new Rectangle(n.x, n.y, n.width, n.height));
for (int i = 0; i < getSourceConnections().size(); i++) {
TransitionPart trans = (TransitionPart) getSourceConnections().get(i);
trans.applyGraphResults(graph, map);
}
}
public void contributeEdgesToGraph(CompoundDirectedGraph graph, Map map) {
List outgoing = getSourceConnections();
for (int i = 0; i < outgoing.size(); i++) {
TransitionPart part = (TransitionPart)getSourceConnections().get(i);
part.contributeToGraph(graph, map);
}
for (int i = 0; i < getChildren().size(); i++) {
ActivityPart child = (ActivityPart)children.get(i);
child.contributeEdgesToGraph(graph, map);
}
}
public abstract void contributeNodesToGraph(CompoundDirectedGraph graph, Subgraph s, Map map);
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
protected void createEditPolicies() {
installEditPolicy(EditPolicy.GRAPHICAL_NODE_ROLE, new ActivityNodeEditPolicy());
installEditPolicy(EditPolicy.CONTAINER_ROLE, new ActivitySourceEditPolicy());
installEditPolicy(EditPolicy.COMPONENT_ROLE, new ActivityEditPolicy());
installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new ActivityDirectEditPolicy());
}
/**
* @see org.eclipse.gef.EditPart#deactivate()
*/
public void deactivate() {
super.deactivate();
getActivity().removePropertyChangeListener(this);
}
/**
* Returns the Activity model associated with this EditPart
* @return the Activity model
*/
protected Activity getActivity() {
return (Activity)getModel();
}
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelSourceConnections()
*/
protected List getModelSourceConnections() {
return getActivity().getOutgoingTransitions();
}
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getModelTargetConnections()
*/
protected List getModelTargetConnections() {
return getActivity().getIncomingTransitions();
}
abstract int getAnchorOffset();
/**
* @see NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
*/
public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart connection) {
return new BottomAnchor(getFigure(), getAnchorOffset());
}
/**
* @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.Request)
*/
public ConnectionAnchor getSourceConnectionAnchor(Request request) {
return new BottomAnchor(getFigure(), getAnchorOffset());
}
/**
* @see NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
*/
public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart connection) {
return new TopAnchor(getFigure(), getAnchorOffset());
}
/**
* @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.Request)
*/
public ConnectionAnchor getTargetConnectionAnchor(Request request) {
return new TopAnchor(getFigure(), getAnchorOffset());
}
protected void performDirectEdit() {
}
/**
* @see org.eclipse.gef.EditPart#performRequest(org.eclipse.gef.Request)
*/
public void performRequest(Request request) {
if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
performDirectEdit();
}
/**
* @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
*/
public void propertyChange(PropertyChangeEvent evt) {
String prop = evt.getPropertyName();
if (FlowElement.CHILDREN.equals(prop))
refreshChildren();
else if (FlowElement.INPUTS.equals(prop))
refreshTargetConnections();
else if (FlowElement.OUTPUTS.equals(prop))
refreshSourceConnections();
else if (Activity.NAME.equals(prop))
refreshVisuals();
// Causes Graph to re-layout
((GraphicalEditPart)(getViewer().getContents())).getFigure().revalidate();
}
/**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#setFigure(org.eclipse.draw2d.IFigure)
*/
protected void setFigure(IFigure figure) {
figure.getBounds().setSize(0,0);
super.setFigure(figure);
}
/**
* @see org.eclipse.gef.editparts.AbstractEditPart#toString()
*/
public String toString() {
return getModel().toString();
}
}