package ui;
import java.util.*;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.PushbackReader;
import java.io.StringReader;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JFileChooser;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTree;
import javax.swing.KeyStroke;
import javax.swing.JOptionPane;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
import ui.smallstep.SmallStepGUI;
import ui.smallstep.SmallStepView;
import expressions.Expression;
public class Mainwindow extends JFrame {
private JTabbedPane tabbedPane;
private JTree treeView;
private JMenuBar mainMenu;
private static final String defaultExpression = "let rec f = lambda x. if x = 0 then 1 else x * f (x - 1) in f 3";
private static final String SIMPLE = "let f = ref (lambda x.x) in let fact = lambda x.if x = 0 then 1 else x * (!f (x - 1)) in (f := fact, !f 3)";
private LinkedList<SourceFile> fileList = new LinkedList<SourceFile>();
private LinkedList<EditorWindow> editorList = new LinkedList<EditorWindow>();
public Mainwindow() {
super();
setTitle("Projektgruppe v.01");
initComponents();
pack();
setSize(640, 480);
}
private void initComponents() {
tabbedPane = new JTabbedPane();
JScrollPane scrollPane = new JScrollPane();
treeView = new JTree();
scrollPane.setViewportView(treeView);
JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true,
scrollPane, tabbedPane);
getContentPane().setLayout(
new BoxLayout(getContentPane(), BoxLayout.X_AXIS));
getContentPane().add(splitPane);
ActionListener fileMenuListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "New")
handleNew();
else if (e.getActionCommand() == "Save")
handleSave();
else if (e.getActionCommand() == "Save as")
handleSaveAs();
else if (e.getActionCommand() == "Close")
handleClose();
else if (e.getActionCommand() == "Exit")
handleExit();
}
};
this.mainMenu = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.setMnemonic(KeyEvent.VK_F);
this.mainMenu.add(fileMenu);
JMenuItem newItem = fileMenu.add("New");
newItem.addActionListener(fileMenuListener);
newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,
KeyEvent.CTRL_MASK));
newItem.setMnemonic(KeyEvent.VK_N);
fileMenu.addSeparator();
JMenuItem saveItem = fileMenu.add("Save");
saveItem.addActionListener(fileMenuListener);
saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
KeyEvent.CTRL_MASK));
saveItem.setMnemonic(KeyEvent.VK_S);
JMenuItem saveAsItem = fileMenu.add("Save as");
saveAsItem.addActionListener(fileMenuListener);
saveAsItem.setMnemonic(KeyEvent.VK_A);
fileMenu.addSeparator();
JMenuItem closeItem = fileMenu.add("Close");
closeItem.addActionListener(fileMenuListener);
closeItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W,
KeyEvent.CTRL_MASK));
closeItem.setMnemonic(KeyEvent.VK_C);
fileMenu.addSeparator();
JMenuItem exitItem = fileMenu.add("Exit");
exitItem.addActionListener(fileMenuListener);
exitItem.setMnemonic(KeyEvent.VK_X);
JMenu editMenu = new JMenu("Edit");
editMenu.setMnemonic(KeyEvent.VK_E);
this.mainMenu.add(editMenu);
JMenuItem preferences = editMenu.add("Preferences");
preferences.setMnemonic(KeyEvent.VK_P);
preferences.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
SettingsGUI gui = new SettingsGUI(Mainwindow.this, false);
gui.setVisible(true);
}
});
JMenu actionsMenu = new JMenu("Actions");
actionsMenu.setMnemonic(KeyEvent.VK_A);
this.mainMenu.add(actionsMenu);
JMenuItem smallStepItem = actionsMenu.add("SmallStep");
smallStepItem.setAccelerator(KeyStroke.getKeyStroke("F11"));
smallStepItem.setMnemonic(KeyEvent.VK_S);
smallStepItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
handleSmallStep();
}
});
JMenuItem typeCheckerItem = actionsMenu.add("TypeChecker");
typeCheckerItem.setAccelerator(KeyStroke.getKeyStroke("F12"));
typeCheckerItem.setMnemonic(KeyEvent.VK_T);
typeCheckerItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
handleTypeChecker();
}
});
setJMenuBar(this.mainMenu);
// open first tab
handleNew();
}
private void handleExit() {
dispose();
}
private void handleNew() {
SourceFile newFile = new SourceFile();
try {
// newFile.getDocument().insertString(0, "let rec f = lambda x. if x = 0 then 1 else x * f (x-1) in f 5", null);
// newFile.getDocument().insertString(0, "let twice = lambda f.lambda x.f (f x) in twice", null);
// newFile.getDocument().insertString(0, "snd (fst, snd (true, fst)) (#8_1, #10_2)", null);
newFile.getDocument().insertString(0, SIMPLE, null);
} catch (Exception e) { }
// EditorWindow newEditor = new EditorWindow(newFile, this);
EditorWindow newEditor = null;
tabbedPane.add(newEditor);
fileList.add(newFile);
editorList.add(newEditor);
}
private void handleSave() {
// JFileChooser chooser = new JFileChooser();
}
private void handleClose() {
int index = tabbedPane.getSelectedIndex();
// guiTest.closeFile (index);
tabbedPane.remove(index);
}
private void handleSaveAs() {
JFileChooser chooser = new JFileChooser();
/*
* // Note: source for ExampleFileFilter can be found in FileChooserDemo, //
* under the demo/jfc directory in the JDK. ExampleFileFilter filter = new
* ExampleFileFilter(); filter.addExtension("jpg");
* filter.addExtension("gif"); filter.setDescription("JPG & GIF Images");
* chooser.setFileFilter(filter);
*/
int returnVal = chooser.showOpenDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
}
}
private Expression getExpression() {
int index = tabbedPane.getSelectedIndex();
SourceFile sf = fileList.get(index);
Expression result = null;
try {
/*
// Allocate the parser
Parser parser = new Parser(new Lexer(new PushbackReader(new StringReader(
sf.getDocument().getText(0, sf.getDocument().getLength())), 1024)));
// Parse the input
Start tree = parser.parse();
// translate the AST to a small step expression
Translator translator = new Translator();
tree.apply(translator);
result = translator.getExpression();
*/
} catch (Exception e) {
JOptionPane.showMessageDialog(this, e.getLocalizedMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
return result;
}
private EditorWindow getEditor() {
int index = tabbedPane.getSelectedIndex();
return (editorList.get(index));
}
private void handleSmallStep() {
int index = tabbedPane.getSelectedIndex();
SourceFile sf = fileList.get(index);
try {
//SmallStepGUI gui = new SmallStepGUI (this, "SmallStep", true, sf.getDocument().getText(0, sf.getDocument().getLength()));
//gui.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
/*
DebugView dbv = new DebugView (this, "narf", true, new SmallStepView ());
dbv.setSize(600, 800);
dbv.setVisible(true);
*/
/*
* XXX handleSmallStep is degraded to a debug view
Font f = new JComboBox().getFont();
SmallStepModel model = new SmallStepModel(getExpression());
model.setFont(f);
// evaluate the resulting small step expression
SmallStepGUI gui = new SmallStepGUI(this, "SmallStep", false, model);
gui.setVisible(true);
((EditorWindow)getEditor()).handleSmallStep(gui);
*/
}
private void handleTypeChecker() {
// TypeCheckerGUI gui = new TypeCheckerGUI (this, "TypeChecker", true);
// gui.startTypeChecking (getExpression ());
// gui.setVisible(true);
}
}