package uva.qls.interpreter.gui.visitor;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.List;
import uva.qls.ast.ASTNode;
import uva.qls.ast.Page;
import uva.qls.ast.Prog;
import uva.qls.ast.StyleSheet;
import uva.qls.ast.component.Checkbox;
import uva.qls.ast.component.Component;
import uva.qls.ast.component.Dropdown;
import uva.qls.ast.component.Radio;
import uva.qls.ast.component.Slider;
import uva.qls.ast.component.Spinbox;
import uva.qls.ast.component.Textbox;
import uva.qls.ast.literal.BooleanLiteral;
import uva.qls.ast.literal.Identifier;
import uva.qls.ast.literal.IntLiteral;
import uva.qls.ast.literal.Literal;
import uva.qls.ast.literal.MoneyLiteral;
import uva.qls.ast.literal.StringLiteral;
import uva.qls.ast.statements.DefaultValue;
import uva.qls.ast.statements.Question;
import uva.qls.ast.statements.QuestionStringTable;
import uva.qls.ast.statements.Section;
import uva.qls.ast.statements.Statement;
import uva.qls.ast.statements.Subsection;
import uva.qls.ast.statements.visitor.*;
import uva.qls.ast.style.Color;
import uva.qls.ast.style.Font;
import uva.qls.ast.style.FontName;
import uva.qls.ast.style.FontSize;
import uva.qls.ast.style.Height;
import uva.qls.ast.style.Style;
import uva.qls.ast.style.Width;
import uva.qls.ast.type.Type;
import uva.qls.interpreter.gui.GUI;
import uva.qls.interpreter.gui.table.DefaultTableValue;
import uva.qls.interpreter.gui.table.QuestionValueTable;
import uva.qls.interpreter.gui.elements.*;
public class Renderer implements StatementVisitor<Object>{
private QuestionStringTable questionStringTable;
private QuestionValueTable table;
private GUI gui;
public Renderer(QuestionValueTable _table, GUI _gui, ASTNode ast){
this.table = _table;
this.gui = _gui;
this.questionStringTable = new QuestionStringTable();
this.questionStringTable = this.questionStringTable.getQLQuestionStrings(
this.gui.getTypeCheck().getTypeCheckQL(),
this.gui.getTypeCheck().getSymbolTable());
this.visitProg((Prog)ast);
}
@Override
public Object visitASTNode(ASTNode node) {
return null;
}
@Override
public Object visitProg(Prog prog) {
prog.getStyleSheet().accept(this);
return null;
}
@Override
public Object visitStyleSheet(StyleSheet styleSheet) {
for (Page page : styleSheet.getPage()){
page.accept(this);
}
return null;
}
@Override
public Object visitPage(Page page) {
UIScrollView scrollView = new UIScrollView(new Size(this.gui.getLargestWidth()+320, 300));
this.gui.getTabController().addTab(page.getIdentifier().evaluatedValue(), scrollView);
for (Question question : this.getPageQuestions(page.getStatement(), new ArrayList<Question>())){
question.accept(this);
}
return null;
}
private List<Question> getPageQuestions(List<Statement> list, List<Question> questions){
for (Statement s : list){
if (s.getClass().equals(Section.class)){
this.getPageQuestions(((Section)s).getStatement(), questions);
}
else if (s.getClass().equals(Question.class)){
questions.add((Question)s);
}
}
return questions;
}
@Override
public Object visitStatement(Statement statement) {
statement.accept(this);
return null;
}
@Override
public Object visitQuestion(Question question) {
DefaultTableValue value = this.table.retrieveValue(question);
Component questionComponent = value.getComponent();
// Get question text from QL
String questionText = this.questionStringTable.retrieveValue(question.getIdentifier().evaluatedValue());
questionText = questionText.replaceAll("[\"]", "");
UIComponent<?> component = (UIComponent<?>)questionComponent.accept(this);
UILabel label = new UILabel(questionText);
label.setFont(new java.awt.Font(value.getStyle().fontName(), java.awt.Font.PLAIN, value.getStyle().fontSize()));
UIContainer questionContainer = new UIContainer(new Size(value.getStyle().width(), value.getStyle().height()));
questionContainer.add(label);
questionContainer.add((java.awt.Component)component.getComponent());
this.gui.addFrameComponent(questionContainer);
return null;
}
@Override
public UICheckbox visitCheckBox(Checkbox checkBox) {
UICheckbox _box = new UICheckbox(checkBox);
return _box;
}
@Override
public UIDropdown visitDropDown(Dropdown dropDown) {
UIDropdown _dropdown = new UIDropdown(dropDown);
return _dropdown;
}
@Override
public UIRadio visitRadio(Radio radio) {
UIRadio _radio = new UIRadio(radio);
return _radio;
}
@Override
public UISlider visitSlider(Slider slider) {
UISlider _slider = new UISlider(slider);
return _slider;
}
@Override
public UISpinbox visitSpinbox(Spinbox spinbox) {
UISpinbox _spin = new UISpinbox(spinbox);
return _spin;
}
@Override
public UITextbox visitTextbox(Textbox textbox) {
UITextbox _box = new UITextbox(textbox);
return _box;
}
@Override
public Object visitDefaultValueComponent(DefaultValue defaultValue) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object visitDefaultValueStatements(DefaultValue defaultValue) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object visitSection(Section section) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object visitSubsection(Subsection subsection) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object visitStyle(Style style) {
style.accept(this);
return null;
}
@Override
public Object visitColor(Color color) {
return null;
}
@Override
public Object visitFont(Font font) {
return null;
}
@Override
public Object visitFontsize(FontSize fontSize) {
return null;
}
@Override
public Object visitFontName(FontName fontName) {
return null;
}
@Override
public Object visitHeight(Height height) {
return null;
}
@Override
public Object visitWidth(Width width) {
return null;
}
@Override
public Object visitBooleanLiteral(BooleanLiteral literal) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object visitIntLiteral(IntLiteral literal) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object visitIdentifier(Identifier identifier) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object visitLiteral(Literal literal) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object visitMoneyLiteral(MoneyLiteral literal) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object visitStringLiteral(StringLiteral literal) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object visitType(Type type) {
// TODO Auto-generated method stub
return null;
}
}