/* 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.*; import ca.mcgill.sable.graph.*; public class SimpleNodeEditPart extends AbstractGraphicalEditPart implements NodeEditPart, PropertyChangeListener { private Object data; public SimpleNodeEditPart() { super(); } /* (non-Javadoc) * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure() */ protected IFigure createFigure() { RectangleFigure rect = new RectangleFigure(); ToolbarLayout layout = new ToolbarLayout(); layout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER); rect.setLayoutManager(layout); Label label = new Label(); label.getInsets().top = 1; label.getInsets().bottom = 1; label.getInsets().right = 1; label.getInsets().left = 1; rect.add(label); return rect; } 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){ Node node = (Node)map.get(this); if (node != null){ getFigure().setBounds(new Rectangle(node.x+10, node.y, node.width, node.height));//getFigure().getBounds().height));//getFigure().getBounds().height)); List outgoing = getSourceConnections(); for (int i = 0; i < outgoing.size(); i++){ EdgeEditPart edge = (EdgeEditPart)outgoing.get(i); edge.applyGraphResults(graph, map); } } } public SimpleNode getNode(){ return (SimpleNode)getModel(); } /* (non-Javadoc) * @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies() */ protected void createEditPolicies() { } public List getModelSourceConnections(){ return getNode().getOutputs(); } public List getModelTargetConnections(){ return getNode().getInputs(); } /* (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()); } public void activate(){ super.activate(); getNode().addPropertyChangeListener(this); } public void deactivate(){ super.deactivate(); getNode().removePropertyChangeListener(this); } public void propertyChange(PropertyChangeEvent event){ if (event.getPropertyName().equals(Element.DATA)){ //System.out.println("new val: "+event.getNewValue()); setData(event.getNewValue()); refreshVisuals(); } else if (event.getPropertyName().equals(Element.INPUTS)){ refreshTargetConnections(); } else if (event.getPropertyName().equals(Element.OUTPUTS)){ refreshSourceConnections(); } } public List getModelChildren(){ return getNode().getChildren(); } protected void refreshVisuals(){ Iterator it = getFigure().getChildren().iterator(); while (it.hasNext()){ Object next = it.next(); if (next instanceof Label){ ((Label)next).setText(getData().toString()); if (getData() != null){ getFigure().setSize((getData().toString().length()*7)+10, ((((Label)next).getBounds().height/2)+10)); getFigure().revalidate(); ((GraphEditPart)getParent()).getFigure().revalidate(); } } } } private boolean expanded; private boolean topLevel; private boolean bottomLevel; public void switchToComplex(){ GraphPlugin.getDefault().getGenerator().expandGraph(getNode()); } /** * @return */ public Object getData() { return data; } /** * @param string */ public void setData(Object obj) { data = obj; } /** * @return */ public boolean isBottomLevel() { return bottomLevel; } /** * @return */ public boolean isExpanded() { return expanded; } /** * @return */ public boolean isTopLevel() { return topLevel; } /** * @param b */ public void setBottomLevel(boolean b) { bottomLevel = b; } /** * @param b */ public void setExpanded(boolean b) { expanded = b; } /** * @param b */ public void setTopLevel(boolean b) { topLevel = b; } }