package com.form.language.gui.program;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStream;
import com.form.language.GrammarLexer;
import com.form.language.GrammarParser;
import com.form.language.ast.form.Form;
import com.form.language.memory.Context;
public class MainFrame {
private static final int FRAME_WIDTH = 500;
private static final int FRAME_HEIGHT = 500;
private static final int TEXTFIELD_WIDTH = 460;
private static final int TEXTFIELD_HEIGHT = 100;
private JFrame frame;
private JTextArea textArea_input;
private JTextArea textArea_output;
private JButton button_parse;
private JButton button_createQuestionnaire;
private Form form;
public MainFrame() {
initialize();
}
private void initialize() {
final Context context = new Context();
createFrame();
createTextFieldInput();
createButtonParse(context);
createButtonQuestionnaire(context);
createTextFieldOutput();
}
private void createButtonQuestionnaire(final Context context) {
button_createQuestionnaire = new JButton("Create Questionnaire");
button_createQuestionnaire.setEnabled(false);
button_createQuestionnaire.setSize(TEXTFIELD_WIDTH, TEXTFIELD_HEIGHT);
frame.getContentPane().add(button_createQuestionnaire);
button_createQuestionnaire.addMouseListener(buttonClickCreateQuestionnaire(context));
}
private MouseAdapter buttonClickCreateQuestionnaire(final Context context) {
return new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
form.initMemory(context);
new QuestionnaireFrame(form, context);
}
};
}
private void createButtonParse(final Context context) {
button_parse = new JButton("Parse");
button_parse.setSize(TEXTFIELD_WIDTH, TEXTFIELD_HEIGHT);
frame.getContentPane().add(button_parse);
button_parse.addMouseListener(buttonClickParse(context));
}
private MouseAdapter buttonClickParse(final Context context) {
return new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
CharStream charStream = new ANTLRInputStream(textArea_input.getText());
GrammarLexer lexer = new GrammarLexer(charStream);
TokenStream tokenStream = new CommonTokenStream(lexer);
GrammarParser parser = new GrammarParser(tokenStream);
form = parser.form().result;
if(form == null){
textArea_output.setText("Cannot parse input");
} else {
form.checkTypes(context);
handleIssues(context);
}
}
private void handleIssues(final Context context) {
String issues = context.getWarnings();
if (context.hasErrors()) {
issues += "\n" + context.getErrors();
} else {
button_createQuestionnaire.setEnabled(true);
}
textArea_output.setText(issues);
}
};
}
private void createTextFieldOutput() {
textArea_output = new JTextArea();
textArea_output.setSize(TEXTFIELD_WIDTH, TEXTFIELD_HEIGHT);
frame.getContentPane().add(textArea_output);
}
private void createTextFieldInput() {
textArea_input = new JTextArea();
textArea_input.setSize(TEXTFIELD_WIDTH, TEXTFIELD_HEIGHT);
frame.getContentPane().add(textArea_input);
}
private void createFrame() {
frame = new JFrame();
frame.setVisible(true);
frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
BoxLayout boxLayout = new BoxLayout(frame.getContentPane(), BoxLayout.Y_AXIS); // top to bottom
frame.setLayout(boxLayout);
}
}