/* Soot - a J*va Optimization Framework
* Copyright (C) 2005 Jennifer Lhotak
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package ca.mcgill.sable.graph.editparts;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.draw2d.*;
import org.eclipse.gef.*;
import org.eclipse.gef.editparts.*;
import org.eclipse.draw2d.graph.*;
import java.util.*;
import ca.mcgill.sable.graph.model.*;
import ca.mcgill.sable.graph.figures.*;
import org.eclipse.draw2d.geometry.*;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import ca.mcgill.sable.graph.editpolicies.*;
public class ComplexNodeEditPart
extends AbstractGraphicalEditPart
implements NodeEditPart, PropertyChangeListener {
public ComplexNodeEditPart() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
protected void createEditPolicies() {
}
/* (non-Javadoc)
* @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
*/
public ConnectionAnchor getSourceConnectionAnchor(ConnectionEditPart arg0) {
return new ChopboxAnchor(getFigure());
}
/* (non-Javadoc)
* @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
*/
public ConnectionAnchor getTargetConnectionAnchor(ConnectionEditPart arg0) {
return new ChopboxAnchor(getFigure());
}
/* (non-Javadoc)
* @see org.eclipse.gef.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.Request)
*/
public ConnectionAnchor getSourceConnectionAnchor(Request arg0) {
return new ChopboxAnchor(getFigure());
}
/* (non-Javadoc)
* @see org.eclipse.gef.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.Request)
*/
public ConnectionAnchor getTargetConnectionAnchor(Request arg0) {
return new ChopboxAnchor(getFigure());
}
/* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
*/
protected IFigure createFigure() {
return new ComplexNodeFigure();
}
public void contributeNodesToGraph(DirectedGraph graph, HashMap map){
Node node = new Node(this);
node.width = getFigure().getBounds().width;//getNode().getWidth();
node.height = getFigure().getBounds().height;
graph.nodes.add(node);
map.put(this, node);
}
public void contributeEdgesToGraph(DirectedGraph graph, HashMap map) {
List outgoing = getSourceConnections();
for (int i = 0; i < outgoing.size(); i++){
EdgeEditPart edge = (EdgeEditPart)outgoing.get(i);
edge.contributeToGraph(graph, map);
}
}
public void applyGraphResults(DirectedGraph graph, HashMap map){
SimpleNode node = (SimpleNode)map.get(this);
List outgoing = getSourceConnections();
for (int i = 0; i < outgoing.size(); i++){
EdgeEditPart edge = (EdgeEditPart)outgoing.get(i);
edge.applyGraphResults(graph, map);
}
}
public ComplexNode getNode(){
return (ComplexNode)getModel();
}
public List getModelChildren(){
return ((ComplexNode)getNode()).getChildren();
}
public void propertyChange(PropertyChangeEvent event){
if (event.getPropertyName().equals(Element.COMPLEX_CHILD)){
refreshChildren();
}
}
protected void refreshVisuals(){
Iterator it = getChildren().iterator();
while (it.hasNext()){
Object next = it.next();
if (next instanceof SimpleNodeEditPart){
getFigure().add(((SimpleNodeEditPart)next).getFigure());
getFigure().setSize(getFigure().getBounds().width+((SimpleNodeEditPart)next).getFigure().getBounds().width, getFigure().getBounds().height+((SimpleNodeEditPart)next).getFigure().getBounds().height);
}
else if (next instanceof GraphEditPart){
getFigure().add(((GraphEditPart)next).getFigure());
getFigure().setSize(getFigure().getBounds().width+((GraphEditPart)next).getFigureWidth(), getFigure().getBounds().height+((GraphEditPart)next).getFigureHeight());
}
}
}
}