package ui;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.PushbackReader;
import java.io.StringReader;
import typer.Translator;
import typer.lexer.Lexer;
import typer.node.Start;
import typer.parser.Parser;
import typing.MonoType;
import typing.ProofNode;
public class TypeEnterGUI extends JComponent {
private JTextField textField = null;
private ProofNode node = null;
public TypeEnterGUI (ProofNode node) {
this.node = node;
setLayout(new BoxLayout(this, BoxLayout.LINE_AXIS));
JPanel panel = new JPanel ();
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
JLabel label = new JLabel("Type: ");
panel.add (label);
textField = new JTextField ();
panel.add(textField);
add(panel);
panel.setBorder (new BevelBorder (BevelBorder.RAISED));
setBorder(new LineBorder (java.awt.Color.BLACK, 1));
textField.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent event) {
handleTypeEntered ();
}
});
textField.addKeyListener(new KeyAdapter() {
public void keyReleased (KeyEvent key) {
if (key.getKeyCode() == KeyEvent.VK_ESCAPE) {
fireRejected ();
}
}
});
}
public void setFocus () {
this.textField.grabFocus();
}
public void addTypeEnterListener (TypeEnterListener listener) {
this.listenerList.add(TypeEnterListener.class, listener);
}
public void removeTypeEnterListener (TypeEnterListener listener) {
this.listenerList.remove(TypeEnterListener.class, listener);
}
private void handleTypeEntered () {
try {
// Allocate the parser
Parser parser = new Parser(new Lexer(new PushbackReader(new StringReader(
textField.getText()), 1024)));
// Parse the input
Start tree = parser.parse();
// translate the AST to a small step expression
Translator translator = new Translator();
tree.apply(translator);
fireAccepted (textField.getText(), translator.getType());
}
catch (Exception e) {
JOptionPane.showMessageDialog(this, e.getLocalizedMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
}
private void fireAccepted (String typeString, MonoType type) {
Object objects[] = this.listenerList.getListenerList();
for (int i=objects.length-2; i>=0; i-=2) {
if (objects[i] == TypeEnterListener.class) {
((TypeEnterListener)objects[i+1]).typeAccepted(this, typeString, node, type);
}
}
}
private void fireRejected () {
Object objects[] = this.listenerList.getListenerList();
for (int i=objects.length-2; i>=0; i-=2) {
if (objects[i] == TypeEnterListener.class) {
((TypeEnterListener)objects[i+1]).typeRejected(this);
}
}
}
}