package edu.brown.gui;
import java.awt.Color;
import java.awt.Container;
import java.awt.Paint;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Point2D;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPopupMenu;
import org.apache.commons.collections15.Transformer;
import org.voltdb.catalog.Procedure;
import org.voltdb.utils.Pair;
import edu.brown.gui.common.GraphVisualizationPanel;
import edu.brown.markov.MarkovEdge;
import edu.brown.markov.MarkovGraph;
import edu.brown.markov.MarkovVertex;
import edu.brown.utils.ArgumentsParser;
import edu.uci.ics.jung.algorithms.layout.Layout;
import edu.uci.ics.jung.graph.Graph;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.PickingGraphMousePlugin;
import edu.uci.ics.jung.visualization.control.PluggableGraphMouse;
import edu.uci.ics.jung.visualization.control.TranslatingGraphMousePlugin;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
/**
*
*
*/
public class MarkovViewer extends AbstractViewer {
/**
* @param args
* @param title
*/
public MarkovViewer(ArgumentsParser args, String title) {
super(args, title);
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see edu.brown.gui.AbstractViewer#viewerInit()
*/
@Override
protected void viewerInit() {
// TODO Auto-generated method stub
}
public static GraphVisualizationPanel<MarkovVertex, MarkovEdge> getPanel(
Graph<MarkovVertex, MarkovEdge> test_graph) {
GraphVisualizationPanel<MarkovVertex, MarkovEdge> graph_panel = GraphVisualizationPanel
.factory(test_graph);
Transformer<MarkovVertex, Paint> transformer = new VertexTransformer<MarkovVertex, Paint>();
graph_panel.getRenderContext().setVertexFillPaintTransformer(
transformer);
graph_panel.getRenderContext().setEdgeLabelTransformer(
new ToStringLabeller<MarkovEdge>());
PluggableGraphMouse gm = new PluggableGraphMouse();
gm.add(new PopupMousePlugin<MarkovVertex, MarkovEdge>());
gm.add(new TranslatingGraphMousePlugin(MouseEvent.BUTTON1_MASK));
graph_panel.setGraphMouse(gm);
Transformer<MarkovVertex, String> labelTransform = new VertexLabelTransformer<MarkovVertex, String>();
graph_panel.getRenderContext()
.setVertexLabelTransformer(labelTransform);
return graph_panel;
}
static JComboBox makePartitionComboBox(
Map<Pair<Procedure, Integer>, MarkovGraph> grafs) {
JComboBox jcb = new JComboBox(grafs.keySet().toArray());
ActionListener l = new PartitionActionListener(grafs);
jcb.addActionListener(l);
return jcb;
}
static JComboBox makeComboBox(Map<Procedure, MarkovGraph> grafs) {
String[] nameArray = new String[grafs.keySet().size()];
int i = 0;
for (Object p : grafs.keySet().toArray()) {
nameArray[i] = ((Procedure) p).toString();
i++;
}
JComboBox jcb = new JComboBox(nameArray);
ActionListener l = null; // FIXME(svelagap) new MyActionListener(grafs);
jcb.addActionListener(l);
return jcb;
}
static JComboBox makeAlphabetizedComboBox(Map<Procedure, MarkovGraph> grafs) {
List<Procedure> ls = new LinkedList<Procedure>();
List<String> names = new LinkedList<String>();
ls.addAll(grafs.keySet());
for (Procedure p : ls) {
names.add(p.getName().toLowerCase());
}
Collections.sort(names);
JComboBox jcb = new JComboBox(names.toArray());
ActionListener l = null; // FIXME(svelagap) new MyActionListener(grafs);
jcb.addActionListener(l);
return jcb;
}
public class MyActionListener implements ActionListener {
Map<Procedure, MarkovGraph> procedureGraphs;
public MyActionListener(Map<Procedure, MarkovGraph> procedureGraphs){
this.procedureGraphs = procedureGraphs;
}
@Override
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox) e.getSource();
JFrame frame = getFrame(cb);
Procedure proc = MarkovViewer.this.args.catalog_db.getProcedures()
.get((String) cb.getSelectedItem());
MarkovGraph g = procedureGraphs.get(
proc);
assert (g != null);
GraphVisualizationPanel<MarkovVertex, MarkovEdge> graph_panel = MarkovViewer.getPanel(g);
graph_panel.add(cb);
frame.setContentPane(graph_panel);
frame.setBounds(50, 50, 500, 500);
frame.setVisible(true);
// The BasicVisualizationServer<V,E> is parameterized by the edge
// types
}
}
public static class PartitionActionListener implements ActionListener {
Map<Pair<Procedure, Integer>, MarkovGraph> partitionGraphs;
public PartitionActionListener(Map<Pair<Procedure, Integer>, MarkovGraph> partitionGraphs){
this.partitionGraphs = partitionGraphs;
}
@Override
public void actionPerformed(ActionEvent e) {
JComboBox cb = (JComboBox) e.getSource();
JFrame frame = (JFrame) cb.getParent().getParent().getParent().getParent();
Pair<Procedure, Integer> proc = (Pair<Procedure, Integer>) cb.getSelectedItem();
MarkovGraph g = partitionGraphs.get(proc);
assert (g != null);
GraphVisualizationPanel<MarkovVertex, MarkovEdge> graph_panel = MarkovViewer.getPanel(g);
graph_panel.add(cb);
frame.setContentPane(graph_panel);
frame.setBounds(50, 50, 500, 500);
frame.setVisible(true);
}
}
public static class PopupMousePlugin<V,E> extends PickingGraphMousePlugin<V,E> {
public PopupMousePlugin(){
this.modifiers = MouseEvent.BUTTON3_MASK;
}
public void mouseClicked(MouseEvent e){
super.mouseClicked(e);
VisualizationViewer<V,E> vv = (GraphVisualizationPanel<V,E>)e.getSource();
Layout layout = vv.getGraphLayout();
Point2D p = e.getPoint();
vertex = vv.getPickSupport().getVertex(layout,p.getX(), p.getY());
if(vertex != null){
MarkovVertex v = (MarkovVertex)vertex;
/** JPopupMenu j = new JPopupMenu(v.toString());
j.setLightWeightPopupEnabled(false);
j.addSeparator();
j.addMouseListener(new PopupMouseListener());
j.add(("Single Sited: "+v.getSingleSitedProbability()));
j.addSeparator();
j.add(("AbortProbability: "+v.getAbortProbability()));
j.addSeparator();
JMenu readonly = new JMenu("Read Only");
//TODO: This doesn't show the read-only information right now
for(int i : MarkovViewer.getAllPartitions()){
readonly.add(new JMenuItem(i+" "+v.getReadOnlyProbability(i)));
}
j.add(readonly);
j.addSeparator();
j.add(("Done: "+v.getReadOnlyProbability(0)));
j.setLocation(e.getLocationOnScreen());
j.setVisible(true);
**/
// FIXME(pavlo) v.printProbabilities(MarkovViewer.this.args.catalog_db);
}
}
}
public static class PopupMouseListener implements MouseListener{
@Override
public void mouseClicked(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON3){
((JPopupMenu)(e.getSource())).setVisible(false);
}
}
@Override
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {
}
@Override
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON1){
((JPopupMenu)(e.getSource())).setLocation(e.getLocationOnScreen());
}
}
}
public static class VertexTransformer<T1, T2> implements
Transformer<MarkovVertex, Paint> {
@Override
public Paint transform(MarkovVertex v) {
Color ret = Color.GREEN;
if(v.isReadOnly()){
ret = Color.GRAY;
}
switch (v.getType()) {
case START:
ret = Color.BLACK;
break;
case COMMIT:
ret = Color.red;
break;
case ABORT:
ret = Color.BLUE;
break;
} // SWITCH
return (ret);
}
}
public static class VertexLabelTransformer<T1, T2> implements
Transformer<MarkovVertex, String> {
@Override
public String transform(MarkovVertex arg0) {
return arg0.getCatalogKey()+"\n"+arg0.getPartitions().toString();
}
}
public static JFrame getFrame(Container cb) {
return (JFrame) cb.getParent().getParent().getParent().getParent().getParent();
}
public static void launch(
Map<Pair<Procedure, Integer>, MarkovGraph> partitionGraphs,
Pair<Procedure,Integer> selection) {
JFrame frame = new JFrame("Simple Graph View");
JComboBox partcombo = MarkovViewer.makePartitionComboBox(partitionGraphs);
MarkovGraph test_graph = partitionGraphs.get(selection);
frame.setContentPane(MarkovViewer.getPanel(test_graph));
frame.add(partcombo);
partcombo.setSelectedItem(selection);
frame.setBounds(50, 50, 2000, 500);
frame.setVisible(true);
}
public static void visualize(final MarkovGraph g){
JFrame frame = new JFrame("Simple Graph View");
frame.setContentPane(MarkovViewer.getPanel(g));
frame.setBounds(50, 50, 2000, 500);
frame.setVisible(true);
}
}