/* Soot - a J*va Optimization Framework
* Copyright (C) 2004 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.soot.cfg.editParts;
import org.eclipse.draw2d.*;
import org.eclipse.gef.editparts.*;
import org.eclipse.draw2d.graph.*;
import org.eclipse.gef.*;
import org.eclipse.draw2d.geometry.*;
import java.util.*;
import ca.mcgill.sable.soot.cfg.model.*;
import java.beans.*;
public class CFGGraphEditPart extends AbstractGraphicalEditPart
implements PropertyChangeListener {
private int figureWidth = 20000;
private int figureHeight = 20000;
public CFGGraphEditPart() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
*/
protected IFigure createFigure() {
IFigure f = new Figure() {
public void setBound(Rectangle rect){
int x = bounds.x;
int y = bounds.y;
boolean resize = (rect.width != bounds.width) || (rect.height != bounds.height),
translate = (rect.x != x) || (rect.y != y);
if (isVisible() && (resize || translate))
erase();
if (translate) {
int dx = rect.x - x;
int dy = rect.y - y;
primTranslate(dx, dy);
}
bounds.width = rect.width;
bounds.height = rect.height;
if (resize || translate) {
fireMoved();
repaint();
}
}
};
f.setLayoutManager(new CFGGraphLayoutManager(this));
return f;
}
protected void setFigure(IFigure figure){
figure.getBounds().setSize(getFigureWidth(),getFigureHeight());
super.setFigure(figure);
}
/* (non-Javadoc)
* @see org.eclipse.gef.editparts.AbstractEditPart#createEditPolicies()
*/
protected void createEditPolicies() {
}
public void contributeNodesToGraph(DirectedGraph graph, HashMap map){
Iterator it = getChildren().iterator();
while (it.hasNext()){
Object next = it.next();
if (next instanceof CFGNodeEditPart){
((CFGNodeEditPart)next).contributeNodesToGraph(graph, map);
}
}
}
public void contributeEdgesToGraph(DirectedGraph graph, HashMap map){
Iterator it = getChildren().iterator();
while (it.hasNext()){
Object next = it.next();
if (next instanceof CFGNodeEditPart){
((CFGNodeEditPart)next).contributeEdgesToGraph(graph, map);
}
}
}
public void applyGraphResults(DirectedGraph graph, HashMap map){
Iterator it = getChildren().iterator();
while (it.hasNext()){
Object next = it.next();
if (next instanceof CFGNodeEditPart){
((CFGNodeEditPart)next).applyGraphResults(graph, map);
}
}
determineGraphBounds(graph);
}
public void resetChildColors(){
Iterator it = getChildren().iterator();
while (it.hasNext()){
Object next = it.next();
if (next instanceof CFGNodeEditPart){
((CFGNodeEditPart)next).resetColors();
}
}
}
private void determineGraphBounds(DirectedGraph graph){
Iterator it = graph.nodes.iterator();
int width = 0;
int height = 0;
while (it.hasNext()){
Node n = (Node)it.next();
if (width < n.x){
width = n.x + 300;
}
height = max(height, n.height);
}
setFigureWidth(width);
setFigureHeight(height);
}
private int max(int i, int j){
return i < j ? j : i;
}
public CFGGraph getGraph(){
return (CFGGraph)getModel();
}
public List getModelChildren(){
return getGraph().getChildren();
}
public void activate(){
super.activate();
getGraph().addPropertyChangeListener(this);
}
public void deactivate(){
super.deactivate();
getGraph().removePropertyChangeListener(this);
}
public void propertyChange(PropertyChangeEvent event){
if (event.getPropertyName().equals(CFGElement.CHILDREN)){
refreshChildren();
}
else if (event.getPropertyName().equals(CFGElement.NEW_FLOW_DATA)){
resetChildColors();
}
((GraphicalEditPart)(getViewer().getContents())).getFigure().revalidate();
}
/**
* @return
*/
public int getFigureHeight() {
return figureHeight;
}
/**
* @return
*/
public int getFigureWidth() {
return figureWidth;
}
/**
* @param i
*/
public void setFigureHeight(int i) {
figureHeight = i;
}
/**
* @param i
*/
public void setFigureWidth(int i) {
figureWidth = i;
}
public void handleClickEvent(Object evt){
((CFGGraph)getModel()).handleClickEvent(evt);
}
}