package org.tax.parser;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.tax.datatypes.QLType;
import org.tax.expression.Expression;
import org.tax.exprgen.ExprLexer;
import org.tax.exprgen.ExprParser;
import org.tax.exprgen.ExprVisitor;
import org.tax.taxgen.TaxBaseListener;
import org.tax.taxgen.TaxParser;
public class TaxCodeGen extends TaxBaseListener {
private volatile JFrame frame = null;
private volatile JPanel panel = null;
private volatile GridBagConstraints c;
private Map<JComponent, String> componentToVarMap;
// private Map<String, String> varToComponentMap;
private Map<String, Variable> varToComponentMap;
private String currentVariable = null;
private Type currentType = null;
enum Type {
INTEGER, MONEY, DATE, BOOLEAN, STRING, DECIMAL
}
TaxCodeGen() {
componentToVarMap = new ConcurrentHashMap<>();
varToComponentMap = new ConcurrentHashMap<>();
}
@Override public void enterProg(TaxParser.ProgContext ctx) {
System.out.println("We are parsing it.");
try {
javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
createAndShowGUI();
}
});
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void createAndShowGUI() {
frame = new JFrame("Questionnaire");
panel = new JPanel();
panel.setLayout(new GridBagLayout());
c = new GridBagConstraints();
frame.add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override public void exitProg(TaxParser.ProgContext ctx) {
frame.pack();
frame.setVisible(true);
}
@Override public void exitVariable(TaxParser.VariableContext ctx) {
currentVariable = ctx.getText();
}
@Override public void exitExpression(TaxParser.ExpressionContext ctx) {
// ExprLexer lexer = new ExprLexer(new ANTLRInputStream(ctx.getText()));
// ExprParser parser = new ExprParser(new CommonTokenStream(lexer));
// ParseTree tree = parser.expression();
// System.out.println(ctx.getText());
//
// ExprVisitor<Expression<? extends FormType>> eval = new ExprManVisitor(varToComponentMap);
// eval.visit(tree);
// System.out.println("inside expression ----------------");
// System.out.println(ctx.getParent().getParent().getChild(0).getText());
// if (ctx.getParent().getText().equals("money")) {
// System.out.print("type is money and the expression is ");
// System.out.println(ctx.getText());
//
// }
}
@Override public void exitBracketedquestionlist(TaxParser.BracketedquestionlistContext ctx) {
}
private Expression<? extends QLType> parseExpression(String expr, String type) {
System.out.println("type is " + type);
ExprLexer lexer = new ExprLexer(new ANTLRInputStream(expr));
ExprParser parser = new ExprParser(new CommonTokenStream(lexer));
ParseTree tree = parser.expression();
ExprVisitor<Expression<? extends QLType>> eval = new ExprManVisitor(varToComponentMap, type);
return eval.visit(tree);
}
@Override public void exitQuestion(TaxParser.QuestionContext ctx) {
// System.out.println(ctx.variable().getText() + ", and the type is : " + ctx.type().getText());
Variable var = null;
System.out.println(ctx.getText());
if (ctx.type().expression() != null) {
System.out.println(ctx.variable().getText() + " primitive type " + ctx.type().primitiveType().getText());
Expression<? extends QLType> expr = parseExpression(ctx.type().expression().getText(), ctx.type().primitiveType().getText());
System.out.println("Evaluated expresssion" + ctx.variable().getText() + " " + expr.evaluate());
var = new VariableWithExpr<>(ctx.variable().getText(), expr.evaluate().toString(), ctx.type().primitiveType().getText(), expr);
}
else var = new Variable(ctx.variable().getText(), "0", ctx.type().getText());
varToComponentMap.put(ctx.variable().getText(), var);
}
@Override public void exitQuestionStatement(TaxParser.QuestionStatementContext ctx) {
JLabel emptyLabel = new JLabel(ctx.getText());
c.gridx = 0;
panel.add(emptyLabel, c);
}
@Override public void exitPrimitiveType(TaxParser.PrimitiveTypeContext ctx) {
currentType = Type.valueOf(ctx.getText().toUpperCase());
}
@Override public void exitType(TaxParser.TypeContext ctx) {
if (ctx.expression() != null) {
// expressionTypeChecker(ctx.expression(), ctx.primitiveType());
}
String[] booleanStrings = { "Yes", "No"};
// if (ctx.getText().equals("boolean")) {
if (currentType == Type.BOOLEAN) {
JComboBox<String> booleanCombo = new JComboBox<>(booleanStrings);
booleanCombo.setSelectedIndex(0);
booleanCombo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
@SuppressWarnings("unchecked")
JComboBox<String> cb = (JComboBox<String>)e.getSource();
// componentToVarMap.put(cb, componentToVarMap.get(cb));
updateMaps(cb);
printStringMap();
}
});
c.gridx = 1;
panel.add(booleanCombo, c);
componentToVarMap.put(booleanCombo, currentVariable);
varToComponentMap.put(currentVariable, new Variable(currentVariable, "Yes", "Boolean"));
}
// if (ctx.getText().equals("money")) {
if (currentType == Type.MONEY) {
addTextField(ctx, "0.0");
}
// if (ctx.getText().equals("integer")) {
if (currentType == Type.INTEGER) {
addTextField(ctx, "0");
}
// if (ctx.getText().equals("date")) {
if (currentType == Type.DATE) {
addTextField(ctx, "01-01-2001");
}
// if (ctx.getText().equals("decimal")) {
if (currentType == Type.DECIMAL) {
addTextField(ctx, "0.0");
}
}
// private void expressionTypeChecker(ExpressionContext expression,
// PrimitiveTypeContext primitiveTypeContext) {
// if (expression.literal() != null) {
// System.out.println(expression.literal().getText());
// }
// }
private void addTextField(TaxParser.TypeContext ctx, String initialValue) {
if (ctx.getText().equals("money")) {
JTextField field = new JTextField();
field.setPreferredSize(new Dimension(200, 24));
field.setText("0.0");
field.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
JTextField f = (JTextField) e.getSource();
// variableMap.put(currentVariable, (String)f.getText());
// componentToVarMap.put(f, componentToVarMap.get(f));
updateMaps(f);
printStringMap();
}
});
c.gridx = 1;
panel.add(field, c);
// variableMap.put(currentVariable, initialValue);
componentToVarMap.put(field, currentVariable);
//amir check below
varToComponentMap.put(currentVariable, new Variable(currentVariable, initialValue, "String"));
}
}
private void printStringMap() {
// TODO Auto-generated method stub
Iterator<Map.Entry<String, Variable>> i = varToComponentMap.entrySet().iterator();
while(i.hasNext()){
String key = i.next().getKey();
System.out.println(key + ", "+ varToComponentMap.get(key));
}
System.out.println("----------------------------");
}
@SuppressWarnings({ "unchecked", "unused" })
private void printAllValues() {
Iterator<Map.Entry<JComponent, String>> i = componentToVarMap.entrySet().iterator();
while(i.hasNext()){
JComponent key = i.next().getKey();
if (key instanceof JTextField)
System.out.println((String)((JTextField)(key)).getText()+", "+componentToVarMap.get(key));
if (key instanceof JComboBox)
System.out.println((String)((JComboBox<String>)(key)).getSelectedItem()+", "+componentToVarMap.get(key));
}
System.out.println("----------------------------");
}
@SuppressWarnings("unchecked")
private void updateMaps(JComponent comp) {
String varName = componentToVarMap.get(comp);
componentToVarMap.put(comp, varName);
// if (comp instanceof JTextField) {
// varToComponentMap.put(varName, new Variable(varName, (String)((JTextField)comp).getText(), String.class));
// }
// if (comp instanceof JComboBox) {
// varToComponentMap.put(varName, new Variable(varName, (String)((JComboBox<String>)comp).getSelectedItem(), Boolean.class));
// }
}
@Override public void enterIfquestionlist(TaxParser.IfquestionlistContext ctx) {
}
}