package ls.graph.script;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import javax.swing.JOptionPane;
import ls.graph.ui.MainWindow;
import ls.graph.ui.ScriptableVertexPaintFunction;
import ls.script.Scriptable;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.graph.Vertex;
import edu.uci.ics.jung.visualization.PickedState;
import edu.uci.ics.jung.visualization.VisualizationViewer;
public class ScriptUIUtils implements Scriptable
{
public String getBindingName()
{
return "GraphUI"; //assumption - only one instance per script engine
}
private MainWindow parentWindow = null;
private List<AlgorithmListener> algorithmListeners = new LinkedList<AlgorithmListener>();
private List<GraphUIListener> graphUIListeners = new LinkedList<GraphUIListener>();
public void addGraphUIListener(GraphUIListener l)
{
if (l != null) graphUIListeners.add(l);
}
public void popup(String msg)
{
if (msg == null) msg = "null";
JOptionPane.showMessageDialog(
this.getParentWindow(), msg,"Info",JOptionPane.INFORMATION_MESSAGE);
}
// Graph graph = null;
ScriptableVertexPaintFunction svpf = null;
ScriptableVertexStringer svs = null;
VisualizationViewer visualizationViewer = null;
ScriptUIUtils(Graph g, ScriptableVertexPaintFunction _svpf, ScriptableVertexStringer _svs)
{
super();
this.svpf = _svpf;
this.svs = _svs;
}
public ScriptableVertexPaintFunction SVPF() { return this.svpf; }
public ScriptableVertexStringer SVS() { return this.svs; }
public void setVertexColor(Vertex v,VertexColors vc)
{
this.SVPF().setColor(v, vc);
refreshGraph();
}
public void refreshGraph()
{
VisualizationViewer vv = this.getVisualizationViewer();
if (vv != null)
{
vv.repaint();
}
}
/**
* Retrieve the selected vertex. If a few are selected, the first one
* (as given by the set's operator) is returned - no order guaranteed.
* @return The selected vertex
*/
public Vertex getSelectedVertex()
{
VisualizationViewer vv = this.getVisualizationViewer();
PickedState ps = vv.getPickedState();
for (Vertex v : ((Set<Vertex>)ps.getPickedVertices()))
{
return v; //return the first vertex
}
return null;
}
public void setVertexLabel(Vertex v, String label)
{
this.SVS().setVertexLabel(v, label);
VisualizationViewer vv = this.getVisualizationViewer();
if (vv != null)
{
// vv.fireStateChanged();
vv.repaint();
}
}
public VisualizationViewer getVisualizationViewer()
{
return visualizationViewer;
}
public void setVisualizationViewer(VisualizationViewer visualizationViewer)
{
this.visualizationViewer = visualizationViewer;
this.visualizationViewer.getPickedState().addItemListener(new PickStateListener());
}
public void addAlgorithmListener(AlgorithmListener l)
{
if (l != null) this.algorithmListeners.add(l);
}
public Algorithm createAlgorithm()
{
Algorithm a = new Algorithm();
for (AlgorithmListener l : this.algorithmListeners) a.addListener(l);
return a;
}
public MainWindow getParentWindow()
{
return parentWindow;
}
public void setParentWindow(MainWindow parentWindow)
{
this.parentWindow = parentWindow;
}
public List<AlgorithmListener> getAlgorithmListeners()
{
return algorithmListeners;
}
private class PickStateListener implements ItemListener
{
public void itemStateChanged(ItemEvent evt)
{
Object o = evt.getItem();
Graph g = getVisualizationViewer().getGraphLayout().getGraph();
if (o instanceof Vertex)
fireVertexSelected(g,(Vertex)o);
}
}
private void fireVertexSelected(Graph g,Vertex v)
{
for (GraphUIListener l : this.graphUIListeners)
l.vertexSelected(g, v);
}
}