package jws;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.lang.reflect.InvocationTargetException;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import abs.backend.java.observing.ObjectView;
import edu.uci.ics.jung.algorithms.layout.AbstractLayout;
import edu.uci.ics.jung.algorithms.layout.FRLayout;
import edu.uci.ics.jung.algorithms.layout.FRLayout2;
import edu.uci.ics.jung.algorithms.layout.ISOMLayout;
import edu.uci.ics.jung.algorithms.layout.KKLayout;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.algorithms.layout.StaticLayout;
import edu.uci.ics.jung.algorithms.layout.util.Relaxer;
import edu.uci.ics.jung.algorithms.layout.util.VisRunner;
import edu.uci.ics.jung.algorithms.util.IterativeContext;
import edu.uci.ics.jung.graph.DirectedGraph;
import edu.uci.ics.jung.graph.DirectedSparseGraph;
import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
import edu.uci.ics.jung.visualization.BasicVisualizationServer;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.layout.LayoutTransition;
import edu.uci.ics.jung.visualization.renderers.Renderer;
import edu.uci.ics.jung.visualization.renderers.VertexLabelAsShapeRenderer;
import edu.uci.ics.jung.visualization.util.Animator;
public class JungObjectGraph extends AbstractObjectGraph implements
ObjectGraph {
@Override
public void addEdge(ObjectView source, ObjectView target, boolean cog) {
graph.addEdge(edgeCounter.incrementAndGet(), getID(source), getID(target));
vv.repaint();
}
@Override
public void addObject(ObjectView o, boolean COG) {
super.addObject(o, COG);
layout.initialize();
startAnimator();
vv.repaint();
}
private void startAnimator() {
Relaxer relaxer = new VisRunner((IterativeContext)layout);
relaxer.stop();
relaxer.prerelax();
StaticLayout<String,Integer> staticLayout =
new StaticLayout<String,Integer>(graph, layout);
LayoutTransition<String,Integer> lt =
new LayoutTransition<String,Integer>(vv, vv.getGraphLayout(),
staticLayout);
Animator animator = new Animator(lt);
animator.start();
}
private DirectedGraph<String, Integer> graph;
private VisualizationViewer<String, Integer> vv;
private AbstractLayout<String, Integer> layout;
@Override
public void begin() {
graph = new DirectedSparseGraph<String, Integer>();
layout = new FRLayout<String,Integer>(graph);
layout.setSize(new Dimension(600,600));
vv = new VisualizationViewer<String,Integer>(layout, new Dimension(600,600));
vv.setBackground(Color.white);
startAnimator();
VertexLabelAsShapeRenderer<String,Integer> vlasr = new VertexLabelAsShapeRenderer<String,Integer>(vv.getRenderContext());
// vv.getRenderContext().setVertexShapeTransformer(arg0)
vv.getRenderer().getVertexLabelRenderer().setPosition(Renderer.VertexLabel.Position.CNTR);
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
vv.getRenderContext().setVertexShapeTransformer(vlasr);
//vv.setPreferredSize(new Dimension(450,450)); //Sets the viewing area size
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Simple Graph View");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel pane = new JPanel();
pane.setLayout(new BorderLayout());
pane.add(vv, BorderLayout.CENTER);
frame.getContentPane().add(pane);
pane.setBorder(BorderFactory.createEmptyBorder(50,50,50,50));
frame.pack();
frame.setVisible(true);
}
});
} catch (InterruptedException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
@Override
public void end() {
}
}