package org.mindswap.swoop.utils.graph.hierarchy;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import org.apache.commons.collections.Predicate;
import edu.uci.ics.jung.graph.Vertex;
import edu.uci.ics.jung.visualization.PluggableRenderer;
/*
* Created on Jul 17, 2005
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
/**
* @author Dave Wang
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class OntologyWithClassHierarchyRenderer extends PluggableRenderer
{
// determines whether a node or an edge is to be drawn or not
class VisibilityPredicate implements Predicate
{
public boolean evaluate(Object obj)
{
// if vertex is not visible, then don't draw it
if (obj instanceof SwoopOntologyVertex)
{
SwoopOntologyVertex vertex = (SwoopOntologyVertex)obj;
return vertex.isVisible();
}
return false;
}
}
protected boolean isDrawContent = true;
public OntologyWithClassHierarchyRenderer()
{
super();
vertexIncludePredicate = new VisibilityPredicate();
}
public void paintVertex( Graphics g, Vertex v, int x, int y)
{
if (!vertexIncludePredicate.evaluate(v))
return;
Graphics2D g2d = (Graphics2D)g;
AffineTransform form = g2d.getTransform();
Stroke old_stroke = g2d.getStroke();
Stroke new_stroke = vertexStrokeFunction.getStroke(v);
if (new_stroke != null)
g2d.setStroke(new_stroke);
Paint old_paint = g2d.getPaint();
// get the shape to be rendered
Shape s = vertexShapeFunction.getShape(v);
// create a transform that translates to the location of
// the vertex to be rendered
AffineTransform xform = AffineTransform.getTranslateInstance(x,y);
// transform the vertex shape with xtransform
s = xform.createTransformedShape(s);
// get Paints for filling and drawing
// (filling is done first so that drawing and label use same Paint)
Paint fill_paint = vertexPaintFunction.getFillPaint(v);
if (fill_paint != null)
{
g2d.setPaint(fill_paint);
g2d.fill(s);
}
Paint draw_paint = vertexPaintFunction.getDrawPaint(v);
if (draw_paint != null)
{
g2d.setPaint(draw_paint);
g2d.draw(s);
}
if (new_stroke != null)
g2d.setStroke(old_stroke);
// use existing paint for text if no draw paint specified
if (draw_paint == null)
g2d.setPaint(old_paint);
// draw content
if (isDrawContent)
{
HierarchicalVertexDataRenderer rend = HierarchicalVertexDataRenderer.getInstance();
OntologyGraphNode node = (OntologyGraphNode)v.getUserDatum( OntologyWithClassHierarchyGraph.DATA );
int size = node.getDiameter();
rend.render(g2d, x, y, node.getTreeNode() );
}
String label = vertexStringer.getLabel(v);
if ( (label != null) && ( label.length() > 1 )) {
labelVertex(g, v, label, x, y);
}
g2d.setPaint(old_paint);
double[] matrix = new double[6];
form.getMatrix(matrix);
double zoomFactor = matrix[0];
Point2D.Double origin = new Point2D.Double(0, 0);
origin = (Point2D.Double) form.transform(origin, origin);
// create identity matrix
matrix[0] = 1;
matrix[1] = 0;
matrix[2] = 0;
matrix[3] = 1;
matrix[4] = 0;
matrix[5] = 0;
AffineTransform textForm = new AffineTransform( matrix );
g2d.setTransform(textForm);
g2d.setColor(Color.BLACK);
g2d.drawString("" + zoomFactor, 20, 20);
g2d.setTransform( form );
}
public void setIsDrawContent( boolean flag )
{ isDrawContent = flag; }
public boolean getIsDrawContent()
{ return isDrawContent; }
}