package org.uva.ql.view;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import org.uva.ql.ast.expression.literal.Identifier;
import org.uva.ql.ast.questionnaire.Form;
import org.uva.ql.ast.questionnaire.Questionnaire;
import org.uva.ql.ast.statement.Block;
import org.uva.ql.ast.statement.IfElseStatement;
import org.uva.ql.ast.statement.IfStatement;
import org.uva.ql.ast.statement.QuestionComputed;
import org.uva.ql.ast.statement.QuestionNormal;
import org.uva.ql.ast.statement.Statement;
import org.uva.ql.ast.type.BoolType;
import org.uva.ql.ast.type.IntType;
import org.uva.ql.ast.type.StrType;
import org.uva.ql.ast.type.UndefinedType;
import org.uva.ql.ast.value.UndefinedValue;
import org.uva.ql.view.component.ExprQuestionItem;
import org.uva.ql.view.component.QuestionItem;
import org.uva.ql.view.listener.DoneButtonListener;
import org.uva.ql.view.listener.WidgetListener;
import org.uva.ql.view.panel.IfElseQuestionPanel;
import org.uva.ql.view.panel.IfQuestionPanel;
import org.uva.ql.view.panel.Panel;
import org.uva.ql.view.widget.CheckBox;
import org.uva.ql.view.widget.NumberTextField;
import org.uva.ql.view.widget.TextField;
import org.uva.ql.view.widget.Widget;
import org.uva.ql.visitor.QuestionnaireVisitor;
import org.uva.ql.visitor.StatementVisitor;
import org.uva.ql.visitor.TypeVisitor;
public class GUIVisitor implements StatementVisitor<Object>, TypeVisitor<Object>, QuestionnaireVisitor<Object> {
private WidgetListener widgetListener;
private FormFrame formView;
public GUIVisitor() {
formView = new FormFrame();
}
@Override
public IfQuestionPanel visit(IfStatement ifStatement) {
List<Panel> questionPanels = (ArrayList<Panel>) ifStatement.getIfBlock().accept(this);
IfQuestionPanel questionPanel = new IfQuestionPanel(questionPanels, ifStatement.getExpr());
formView.addIfQuestionPanel(questionPanel);
return questionPanel;
}
@Override
public QuestionItem visit(QuestionNormal questionStatement) {
Widget widget = (Widget) questionStatement.getType().accept(this);
widget.setIdentifier(questionStatement.getIdentifier());
Identifier identifier = questionStatement.getIdentifier();
QuestionItem questionItem = new QuestionItem(questionStatement, widget);
formView.addQuestionPanel(questionItem);
widgetListener.initializeValue(identifier, new UndefinedValue());
return questionItem;
}
@Override
public ExprQuestionItem visit(QuestionComputed questionComputeStatement) {
Identifier identifier = questionComputeStatement.getIdentifier();
Widget widget = (Widget) questionComputeStatement.getType().accept(this);
widget.setIdentifier(identifier);
ExprQuestionItem quetionItem = new ExprQuestionItem(questionComputeStatement, widget);
formView.addExprQuestionItem(quetionItem);
widgetListener.initializeValue(identifier, new UndefinedValue());
return quetionItem;
}
@Override
public List<Panel> visit(Block blockStatement) {
List<Panel> questionPannels = new ArrayList<Panel>();
for (Statement statement : blockStatement.getStatements()) {
questionPannels.add((Panel) statement.accept(this));
}
return questionPannels;
}
@Override
public FormFrame visit(Form form) {
widgetListener = new WidgetListener(formView);
form.getBlock().accept(this);
JButton button = new JButton("Done");
formView.addDoneButton(button);
button.addActionListener(new DoneButtonListener(widgetListener.getEvaluator()));
formView.setFrameVisible(true);
return formView;
}
@Override
public List<FormFrame> visit(Questionnaire questionnaire) {
List<FormFrame> formViews = new ArrayList<FormFrame>();
for (Form form : questionnaire.getForms()) {
formViews.add((FormFrame) form.accept(this));
}
return formViews;
}
@Override
public Widget visit(IntType node) {
return new NumberTextField(widgetListener);
}
@Override
public Widget visit(BoolType node) {
return new CheckBox(widgetListener);
}
@Override
public Widget visit(StrType node) {
return new TextField(widgetListener);
}
@Override
public Widget visit(UndefinedType undefiendType) {
return null;
}
@Override
public IfElseQuestionPanel visit(IfElseStatement ifElseStatement) {
List<Panel> ifQuestions = (ArrayList<Panel>) ifElseStatement.getIfBlock().accept(this);
List<Panel> elseQuestions = (ArrayList<Panel>) ifElseStatement.getElseBLock().accept(this);
IfElseQuestionPanel questionPanel = new IfElseQuestionPanel(ifQuestions, elseQuestions,
ifElseStatement.getExpr());
formView.addIfQuestionPanel(questionPanel);
return questionPanel;
}
}