package ls.graph.ui;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.io.File;
import java.util.Collection;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextPane;
import javax.swing.WindowConstants;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.TabSet;
import javax.swing.text.TabStop;
import ls.graph.ControlListener;
import ls.graph.Controller;
import ls.graph.script.GraphScriptEngine;
import ls.graph.script.ScriptUIUtils;
import ls.graph.script.ScriptableGraph;
import ls.ui.msg.MessagePanel;
import edu.uci.ics.jung.graph.Vertex;
import edu.uci.ics.jung.visualization.Layout;
import edu.uci.ics.jung.visualization.PluggableRenderer;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.contrib.CircleLayout;
public class MainWindow extends JFrame implements ControlListener
{
private static final long serialVersionUID = 1L;
// private Graph graph = null;
private Layout graphLayout = null;
JTextPane txtScript;
JFileChooser fileChooser;
private Controller controller = null;
private final int INITIAL_WINDOW_W = 800;
private final int INITIAL_WINDOW_H = 600;
// ConfigurableScriptEngine scriptEngine = null;
private ScriptSettingsPanel scriptSettingsPanel;
// private ScriptUIUtils scriptUIUtils = null;
private UIMessagesHandler msgHandler;
private JSplitPane spltGraphScript;
private MainWindow() throws HeadlessException
{
super();
fileChooser = new JFileChooser();
String initialDir = Controller.getProperty("SCRIPTS_DIR","C:\\");
fileChooser.setCurrentDirectory(new File(initialDir));
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
msgHandler = new UIMessagesHandler(this);
//MessageManager.registerErrorHandler(msgHandler);
//MessageManager.registerMessageHandler(msgHandler);
}
// public MainWindow(ConfigurableScriptEngine engine,Graph g,ScriptUIUtils _suu,String defaultScript)
public MainWindow(Controller c,String defaultScript)
{
this();
this.controller = c;
this.controller.addListener(this);
// this.scriptUIUtils = _suu;
// this.graph = g;
// this.scriptEngine = engine;
initUI();
setLocation(100,100);
setPreferredSize(new Dimension(400,600));
setSize(INITIAL_WINDOW_W, INITIAL_WINDOW_H);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
if (defaultScript != null)
setScriptText(defaultScript);
}
public void popup(String msg)
{
if (msgHandler != null) msgHandler.handleMsg(msg);
}
/**
* Get the list of files to be included
* @return
*/
List<File> getScriptIncludes()
{
List<File> l = scriptSettingsPanel.getScriptIncludes();
return l;
}
void setScriptText(String scriptText)
{
if (txtScript != null)
{
txtScript.setText(scriptText);
}
}
private ScriptableGraph getGraph()
{
return this.controller.getGraph();
}
private JComponent getGraphComponent()
{
graphLayout = new CircleLayout(getGraph());
// graphLayout = new SpringLayout(this.graph);
Dimension d = new Dimension((int)(INITIAL_WINDOW_W * 0.7),(int)(INITIAL_WINDOW_H * 0.7));
graphLayout.initialize(d);
PluggableRenderer r = new PluggableRenderer();
ScriptUIUtils suu = controller.getGraphScriptEngine().getScriptUIUtils();
r.setVertexPaintFunction(suu.SVPF());
r.setVertexStringer(suu.SVS());
VisualizationViewer vv = new VisualizationViewer(graphLayout,r);
suu.setVisualizationViewer(vv);
//Check to see if we should display the default node labels
String showNodeLabels = Controller.getProperty("SHOW_NODE_LABELS", "FALSE");
if ("TRUE".equalsIgnoreCase(showNodeLabels))
{
for (Vertex v : (Collection<Vertex>)(getGraph().getVertices()))
suu.setVertexLabel(v, v.toString());
}
JScrollPane zoomPane = new JScrollPane(vv);
return zoomPane;
//return vv;
}
private void initUI()
{
setTitle("Graph Script");
getContentPane().setLayout(new BorderLayout());
spltGraphScript = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
this.getGraphComponent(),
createScriptPane());
spltGraphScript.setDividerLocation((int)(INITIAL_WINDOW_H * 0.7));
spltGraphScript.setResizeWeight(0.5);
getContentPane().add(createControlPane(),BorderLayout.SOUTH);
JSplitPane spltMain =
new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
spltGraphScript,
createRightPanel());
spltMain.setDividerLocation((int)(INITIAL_WINDOW_W * 0.7));
spltMain.setResizeWeight(0.5);
getContentPane().add(spltMain,BorderLayout.CENTER);
}
Container createStatusPanel()
{
StatusPanel panel = new StatusPanel();
controller
.getGraphScriptEngine()
.getScriptUIUtils()
.addAlgorithmListener(panel);
return panel;
}
private Container createRightPanel()
{
JTabbedPane tabbedPane = new JTabbedPane();
scriptSettingsPanel = new ScriptSettingsPanel();
tabbedPane.add("Script Settings", scriptSettingsPanel);
MessagePanel msgPanel = new MessagePanel();
tabbedPane.add("Messages",msgPanel);
GraphSettingsPanel graphPanel = new GraphSettingsPanel(this);
tabbedPane.add("Graph",graphPanel);
return tabbedPane;
}
private JPanel createScriptPane()
{
JPanel scriptPane = new JPanel();
scriptPane.setLayout(new BorderLayout());
txtScript = new JTextPane();
txtScript.setEditable(true);
txtScript.setEnabled(true);
txtScript.setAlignmentY(0.0f);
//txtScript.setFont(new Font("Arial",Font.PLAIN,11));
Style style = txtScript.addStyle("Script", null);
float tabLength = 7.0f;
style.addAttribute(
StyleConstants.FontConstants.TabSet,
new TabSet(new TabStop[]
{new TabStop(tabLength),
new TabStop(tabLength*2),
new TabStop(tabLength*3),
new TabStop(tabLength*4),
new TabStop(tabLength*5),
new TabStop(tabLength*6)}));
style.addAttribute(StyleConstants.FontConstants.FontFamily, "Courier New");
txtScript.setLogicalStyle(style);
JScrollPane scrollPanel = new JScrollPane(txtScript);
scriptPane.add(scrollPanel,BorderLayout.CENTER);
return scriptPane;
}
private JPanel createControlPane()
{
ControlPanel panel = new ControlPanel(this);
controller
.getGraphScriptEngine()
.getScriptUIUtils()
.addAlgorithmListener(panel);
return panel;
}
GraphScriptEngine getScriptEngine()
{
return this.controller.getGraphScriptEngine();
}
public void graphChanged(ScriptableGraph sg)
{
//refresh the graph display
spltGraphScript.setLeftComponent(getGraphComponent());
}
Controller getController()
{
return controller;
}
} //end of MainWindow class