/* This file is part of the Joshua Machine Translation System.
*
* Joshua 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 joshua.ui.tree_visualizer;
import java.awt.Dimension;
import java.awt.Paint;
import java.awt.Color;
import java.awt.Stroke;
import java.awt.BasicStroke;
import java.awt.Shape;
import java.awt.geom.*;
import javax.swing.JLabel;
import edu.uci.ics.jung.algorithms.layout.CircleLayout;
import edu.uci.ics.jung.algorithms.layout.StaticLayout;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ModalGraphMouse;
import edu.uci.ics.jung.visualization.control.LayoutScalingControl;
import edu.uci.ics.jung.visualization.control.ViewScalingControl;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position;
import org.apache.commons.collections15.Transformer;
public class DerivationViewer extends VisualizationViewer<Node,DerivationTreeEdge> {
public static final int DEFAULT_HEIGHT = 500;
public static final int DEFAULT_WIDTH = 500;
public static final Color SRC = Color.WHITE;
private Color TGT;
public static final Color HIGHLIGHT = Color.pink;
public static enum AnchorType { ANCHOR_ROOT, ANCHOR_LEFTMOST_LEAF };
private AnchorType anchorStyle;
private Point2D anchorPoint;
public DerivationViewer(DerivationTree g, Dimension d, Color targetColor, AnchorType anchor)
{
super(new CircleLayout<Node,DerivationTreeEdge>(g));
anchorStyle = anchor;
DerivationTreeTransformer dtt = new DerivationTreeTransformer(g, d, false);
StaticLayout<Node,DerivationTreeEdge> derivationLayout = new StaticLayout<Node,DerivationTreeEdge>(g, dtt);
// derivationLayout.setSize(dtt.getSize());
setGraphLayout(derivationLayout);
scaleToLayout(new LayoutScalingControl());
// g.addCorrespondences();
setPreferredSize(new Dimension(DEFAULT_HEIGHT, DEFAULT_WIDTH));
getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Node>());
DefaultModalGraphMouse<Node,DerivationTreeEdge> graphMouse = new DefaultModalGraphMouse<Node,DerivationTreeEdge>();
graphMouse.setMode(ModalGraphMouse.Mode.TRANSFORMING);
setGraphMouse(graphMouse);
addKeyListener(graphMouse.getModeKeyListener());
this.setPickedVertexState(new DerivationTreePickedState(g));
getRenderContext().setVertexFillPaintTransformer(vp);
getRenderContext().setEdgeStrokeTransformer(es);
getRenderContext().setVertexShapeTransformer(ns);
getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR);
TGT = targetColor;
anchorPoint = dtt.getAnchorPosition(anchorStyle);
}
public void setGraph(DerivationTree tree)
{
DerivationTreeTransformer dtt = new DerivationTreeTransformer(tree, getSize(), true);
dtt.setAnchorPoint(anchorStyle, anchorPoint);
setGraphLayout(new StaticLayout<Node,DerivationTreeEdge>(tree, dtt));
}
private Transformer<Node,Paint> vp = new Transformer<Node,Paint>() {
public Paint transform(Node n)
{
if (n.isHighlighted())
return HIGHLIGHT;
if (n.isSource())
return SRC;
else
return TGT;
}
};
private static Transformer<DerivationTreeEdge,Stroke> es = new Transformer<DerivationTreeEdge,Stroke>() {
public Stroke transform(DerivationTreeEdge e)
{
if (e.pointsToSource())
return new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, new float[]{ 10.0f }, 0.0f);
else
return new BasicStroke(1.0f);
}
};
private static Transformer<Node,Shape> ns = new Transformer<Node,Shape>() {
public Shape transform(Node n)
{
JLabel x = new JLabel();
double len = x.getFontMetrics(x.getFont()).stringWidth(n.toString());
double margin = 5.0;
return new Rectangle2D.Double((len + margin) / (-2), 0, len + 2 * margin, 20);
}
};
}