package org.seqcode.gseutils.graphs;
import java.util.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class Test extends JFrame {
public static void main(String[] args) {
new Test();
}
private DirectedAlgorithms algorithms;
private DirectedGraph graph;
private GraphTableModel tableModel;
public Test() {
super("Graph Tester");
Container c = (Container)getContentPane();
c.setLayout(new BorderLayout());
algorithms = null;
graph = null;
tableModel = new GraphTableModel();
JTable table = new JTable(tableModel);
JPanel tablePanel = new JPanel();
tablePanel.setLayout(new BorderLayout());
tablePanel.add(new JScrollPane(table));
tablePanel.setBorder(new TitledBorder("Graph"));
c.add(tablePanel, BorderLayout.CENTER);
setJMenuBar(createMenuBar());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
pack();
}
private JMenuBar createMenuBar() {
JMenuBar bar = new JMenuBar();
JMenu menu;
JMenuItem item;
bar.add(menu = new JMenu("File"));
menu.add(new JMenuItem(getLoadGraphAction()));
menu.add(item = new JMenuItem("Exit"));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
bar.add(menu = new JMenu("View"));
menu.add(item = new JMenuItem(getVisualizerAction()));
bar.add(menu = new JMenu("Algorithms"));
menu.add(new JMenuItem(getCycleCheckingAction()));
menu.add(new JMenuItem(getTopologicalOrderingAction()));
return bar;
}
public Action getLoadGraphAction() {
return new AbstractAction("Open...") {
public void actionPerformed(ActionEvent e) {
loadGraphFromFile();
}
};
}
public Action getVisualizerAction() {
return new AbstractAction("Visualize Graph") {
public void actionPerformed(ActionEvent e) {
GraphVisualizer viz = new GraphVisualizer(graph);
viz.putInFrame();
}
};
}
public Action getCycleCheckingAction() {
return new AbstractAction("Check for Cycle") {
public void actionPerformed(ActionEvent e) {
if(graph != null) {
CycleChecker checker = new DirectedCycleChecker(graph);
String message = checker.containsCycle() ?
"Graph contains cycle" : "Graph is acyclic";
JOptionPane.showMessageDialog(Test.this.getContentPane(),
message, "Cycle Check", JOptionPane.INFORMATION_MESSAGE);
}
}
};
}
public Action getTopologicalOrderingAction() {
return new AbstractAction("Topological Ordering") {
public void actionPerformed(ActionEvent e) {
if(graph != null) {
CycleChecker checker = new DirectedCycleChecker(graph);
String message = null;
String title = null;
if(checker.containsCycle()) {
title = "Error";
message = "Graph contains cycle";
} else {
Vector<String> ordering = algorithms.getTopologicalOrdering();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < ordering.size(); i++) {
sb.append((i > 0 ? "," : "") + ordering.get(i));
}
title = "Topological Ordering";
message = sb.toString();
}
JOptionPane.showMessageDialog(Test.this.getContentPane(),
message, title, JOptionPane.INFORMATION_MESSAGE);
}
}
};
}
public void loadGraphFromFile() {
JFileChooser chooser = new JFileChooser();
int retval = chooser.showOpenDialog(this);
if(retval == JFileChooser.APPROVE_OPTION) {
File f = chooser.getSelectedFile();
Parser p = new Parser(f);
try {
DirectedGraph dg = p.parseDirectedGraph();
setGraph(dg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void setGraph(DirectedGraph dg) {
graph = dg;
algorithms = new DirectedAlgorithms(graph);
tableModel.setGraph(dg);
}
}
class GraphTableModel implements TableModel {
private LinkedList<TableModelListener> listeners;
private Vector<String> vertices;
private DirectedGraph graph;
public GraphTableModel() {
vertices = new Vector<String>();
listeners = new LinkedList<TableModelListener>();
graph = null;
}
public void setGraph(DirectedGraph dg) {
graph = dg;
vertices = new Vector<String>(new TreeSet<String>(dg.getVertices()));
TableModelEvent evt = new TableModelEvent(this);
for(TableModelListener tml : listeners) {
tml.tableChanged(evt);
}
}
public void addTableModelListener(TableModelListener tml) {
listeners.addLast(tml);
}
public Class<?> getColumnClass(int c) {
switch(c) {
case 0: return String.class;
case 1: return String.class;
default: return null;
}
}
public int getColumnCount() {
return 2;
}
public String getColumnName(int c) {
switch(c) {
case 0: return "Vertex";
case 1: return "Parents";
default: return null;
}
}
public int getRowCount() {
return vertices.size();
}
public Object getValueAt(int r, int c) {
switch(c) {
case 0: return vertices.get(r);
case 1:
StringBuilder sb = new StringBuilder();
if(graph != null) {
for(String parent : graph.getParents(vertices.get(r))) {
sb.append(parent + ",");
}
}
return sb.toString();
default:
return null;
}
}
public boolean isCellEditable(int arg0, int arg1) {
return false;
}
public void removeTableModelListener(TableModelListener tml) {
listeners.remove(tml);
}
public void setValueAt(Object arg0, int arg1, int arg2) {
}
}