/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package automenta.spacenet.space.geom.graph.arrange;
import automenta.spacenet.space.Repeat;
import automenta.spacenet.space.Space;
import automenta.spacenet.space.geom.Box;
import automenta.spacenet.space.geom.graph.GraphBox;
import automenta.spacenet.space.geom.graph.GraphBoxModel;
import com.ardor3d.scenegraph.Spatial;
import edu.uci.ics.jung.algorithms.layout.AbstractLayout;
import edu.uci.ics.jung.algorithms.util.IterativeContext;
import edu.uci.ics.jung.graph.Graph;
import java.awt.Dimension;
/**
*
* @author seh
*/
public class JungModel<N,E> extends Repeat implements GraphBoxModel<N,E> {
private GraphBox<N, E> graphBox;
private final AbstractLayout<N,E> layout;
double upscale = 800.0;
final static double updatePeriod = 0.05;
public JungModel(AbstractLayout<N,E> jungLayout) {
super(updatePeriod);
this.layout = jungLayout;
}
@Override
public void addedNode(N v, Box b) {
updatePositions();
}
@Override
public void removedNode(N v) {
updatePositions();
}
@Override
public void addedEdge(E e, Space s, Box from, Box to) {
updatePositions();
}
@Override
public void removedEdge(E e) {
updatePositions();
}
@Override
public void start(GraphBox<N, E> graphBox) {
this.graphBox = graphBox;
layout.setGraph((Graph<N,E>)graphBox.getGraph());
layout.setSize(new Dimension((int)upscale, (int)upscale));
layout.reset();
updatePositions();
}
protected void updatePositions() {
for (N n : graphBox.getGraph().getNodes()) {
double x = (layout.getX(n) / upscale)-0.5;
double y = (layout.getY(n) / upscale)-0.5;
Box b = graphBox.getNodeBox(n);
if (b!=null) {
//System.out.println(n + " @ " +x + " , " + y);
b.getPosition().set(x, y, 0);
}
}
}
@Override
public void stop() {
}
@Override
protected void update(double t, double dt, Spatial parent) {
if (layout instanceof IterativeContext) {
IterativeContext ic = (IterativeContext) layout;
if (!ic.done()) {
ic.step();
updatePositions();
}
}
}
}