package org.uva.qls.ast.builder;
import java.util.ArrayList;
import java.util.List;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.uva.qls.antlr.QLSBaseVisitor;
import org.uva.qls.antlr.QLSParser.BackgroundColorStyleContext;
import org.uva.qls.antlr.QLSParser.BoolTypeContext;
import org.uva.qls.antlr.QLSParser.CheckboxContext;
import org.uva.qls.antlr.QLSParser.DropdownContext;
import org.uva.qls.antlr.QLSParser.FontContext;
import org.uva.qls.antlr.QLSParser.FontSizeStyleContext;
import org.uva.qls.antlr.QLSParser.FontStyleContext;
import org.uva.qls.antlr.QLSParser.HeightStyleContext;
import org.uva.qls.antlr.QLSParser.IntTypeContext;
import org.uva.qls.antlr.QLSParser.PageContext;
import org.uva.qls.antlr.QLSParser.QuestionContext;
import org.uva.qls.antlr.QLSParser.RadioContext;
import org.uva.qls.antlr.QLSParser.RgbContext;
import org.uva.qls.antlr.QLSParser.SectionContext;
import org.uva.qls.antlr.QLSParser.SheetContext;
import org.uva.qls.antlr.QLSParser.SliderContext;
import org.uva.qls.antlr.QLSParser.SpinboxContext;
import org.uva.qls.antlr.QLSParser.StrTypeContext;
import org.uva.qls.antlr.QLSParser.StyleContext;
import org.uva.qls.antlr.QLSParser.StylePropContext;
import org.uva.qls.antlr.QLSParser.TextboxContext;
import org.uva.qls.antlr.QLSParser.WidgetStyleContext;
import org.uva.qls.antlr.QLSParser.WidthStyleContext;
import org.uva.qls.ast.CodePosition;
import org.uva.qls.ast.Node;
import org.uva.qls.ast.literal.ColorLiteral;
import org.uva.qls.ast.literal.IdentifierLiteral;
import org.uva.qls.ast.literal.IntLiteral;
import org.uva.qls.ast.literal.StrLiteral;
import org.uva.qls.ast.sheet.Page;
import org.uva.qls.ast.sheet.Question;
import org.uva.qls.ast.sheet.Section;
import org.uva.qls.ast.sheet.Sheet;
import org.uva.qls.ast.sheet.Style;
import org.uva.qls.ast.style.BackgroundColor;
import org.uva.qls.ast.style.Font;
import org.uva.qls.ast.style.Fontsize;
import org.uva.qls.ast.style.Height;
import org.uva.qls.ast.style.StyleProperty;
import org.uva.qls.ast.style.Width;
import org.uva.qls.ast.style.widget.CheckboxModel;
import org.uva.qls.ast.style.widget.DropdownModel;
import org.uva.qls.ast.style.widget.RadioModel;
import org.uva.qls.ast.style.widget.SliderModel;
import org.uva.qls.ast.style.widget.SpinboxModel;
import org.uva.qls.ast.style.widget.TextboxModel;
import org.uva.qls.ast.type.BoolType;
import org.uva.qls.ast.type.IntType;
import org.uva.qls.ast.type.StrType;
import org.uva.qls.ast.type.Type;
import org.uva.qls.ast.value.StrValue;
public class QLSImplVisitor extends QLSBaseVisitor<Node> {
@Override
public Node visitSlider(SliderContext ctx) {
System.out.println("Visiting slider Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
IntLiteral min = new IntLiteral(Integer.parseInt(ctx.min.getText()), pos);
IntLiteral max = new IntLiteral(Integer.parseInt(ctx.max.getText()), pos);
return new SliderModel(min, max, pos);
}
@Override
public Node visitFont(FontContext ctx) {
System.out.println("Visiting Font Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
StrLiteral strLiterael = new StrLiteral(ctx.getText(), pos);
Font font = new Font(strLiterael, pos);
return font;
}
@Override
public Node visitRgb(RgbContext ctx) {
System.out.println("Visiting RGB Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
int red = Integer.parseInt(ctx.red.getText());
int green = Integer.parseInt(ctx.green.getText());
int blue = Integer.parseInt(ctx.blue.getText());
return new ColorLiteral(red, green, blue, pos);
}
@Override
public Node visitIntType(IntTypeContext ctx) {
return new IntType();
}
@Override
public Node visitBoolType(BoolTypeContext ctx) {
return new BoolType();
}
@Override
public Node visitStrType(StrTypeContext ctx) {
return new StrType();
}
@Override
public Node visitDropdown(DropdownContext ctx) {
System.out.println("Visiting dropdown Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
DropdownModel model = new DropdownModel(ctx.firstLabel.getText(), ctx.secondLabel.getText(), pos);
return (Node) model;
}
@Override
public Node visitSpinbox(SpinboxContext ctx) {
System.out.println("Visiting Spinbox Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
List<IntLiteral> intLiteralList = new ArrayList<IntLiteral>();
for (TerminalNode node : ctx.IntegerLiteral()) {
int value = Integer.parseInt(node.getText());
IntLiteral intLiteral = new IntLiteral(value, pos);
intLiteralList.add(intLiteral);
}
SpinboxModel model = new SpinboxModel(intLiteralList, pos);
return model;
}
@Override
public Node visitTextbox(TextboxContext ctx) {
System.out.println("Visiting TextBox Style");
return new TextboxModel(CodePosition.getCodePosition(ctx));
}
@Override
public Node visitCheckbox(CheckboxContext ctx) {
System.out.println("Visiting Checkbox Style");
return new CheckboxModel(CodePosition.getCodePosition(ctx));
}
@Override
public Node visitRadio(RadioContext ctx) {
System.out.println("Visiting Radio Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
return new RadioModel(ctx.firstLabel.getText(), ctx.secondLabel.getText(), pos);
}
@Override
public Node visitStyle(StyleContext ctx) {
System.out.println("visiting style.");
CodePosition pos = CodePosition.getCodePosition(ctx);
Type type = (Type) ctx.type().accept(this);
Style style = new Style(type, pos);
for (StylePropContext styleCtx : ctx.styleProp()) {
System.out.println("WOOHOO");
style.addProperty((StyleProperty) styleCtx.accept(this));
}
return style;
}
@Override
public Node visitSection(SectionContext ctx) {
System.out.println("Visiting Section Style");
StrValue name = new StrValue(ctx.StringLiteral().getText());
CodePosition pos = CodePosition.getCodePosition(ctx);
StrLiteral sectionTitle = new StrLiteral(name, pos);
List<Style> styleList = new ArrayList<Style>();
for (StyleContext styleCtx : ctx.style()) {
styleList.add((Style) styleCtx.accept(this));
}
List<Question> questionList = new ArrayList<Question>();
for (QuestionContext quetionCtx : ctx.question()) {
questionList.add((Question) quetionCtx.accept(this));
}
Section section = new Section(sectionTitle, styleList, questionList, pos);
return section;
}
@Override
public Node visitPage(PageContext ctx) {
System.out.println("Visiting page");
StrValue name = new StrValue(ctx.Identifier().getText());
CodePosition pos = CodePosition.getCodePosition(ctx);
IdentifierLiteral identifier = new IdentifierLiteral(name, pos);
List<Style> styleList = new ArrayList<Style>();
for (StyleContext styleCtx : ctx.style()) {
styleList.add((Style) styleCtx.accept(this));
}
List<Section> sectionList = new ArrayList<Section>();
for (SectionContext sectionCtx : ctx.section()) {
sectionList.add((Section) sectionCtx.accept(this));
}
Page page = new Page(identifier, sectionList, styleList, pos);
return page;
}
@Override
public Node visitQuestion(QuestionContext ctx) {
System.out.println("Visiting Question Style");
StrValue name = new StrValue(ctx.Identifier().getText());
CodePosition pos = CodePosition.getCodePosition(ctx);
IdentifierLiteral identifier = new IdentifierLiteral(name, pos);
Question question = new Question(identifier, pos);
return question;
}
@Override
public Node visitSheet(SheetContext ctx) {
System.out.println("Visiting Sheet");
StrValue name = new StrValue(ctx.Identifier().getText());
CodePosition pos = CodePosition.getCodePosition(ctx);
IdentifierLiteral identifier = new IdentifierLiteral(name, pos);
Sheet sheet = new Sheet(identifier, pos);
for (PageContext pageCtx : ctx.page()) {
sheet.addPage((Page) pageCtx.accept(this));
}
return sheet;
}
@Override
public Node visitFontSizeStyle(FontSizeStyleContext ctx) {
System.out.println("Visiting Font ize Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
int size = Integer.parseInt(ctx.fontSizeProp.getText());
return new Fontsize(size, pos);
}
@Override
public Node visitFontStyle(FontStyleContext ctx) {
System.out.println("Visiting Font Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
return new Font(ctx.fontProp.getText(), pos);
}
@Override
public Node visitWidthStyle(WidthStyleContext ctx) {
System.out.println("Visiting Width Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
int width = Integer.parseInt(ctx.widthProp.getText());
return new Width(width, pos);
}
@Override
public Node visitBackgroundColorStyle(BackgroundColorStyleContext ctx) {
System.out.println("Visiting Color Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
ColorLiteral colorLit = (ColorLiteral) ctx.colorProp.accept(this);
BackgroundColor color = new BackgroundColor(colorLit, pos);
return color;
}
@Override
public Node visitHeightStyle(HeightStyleContext ctx) {
System.out.println("Visiting Height Style");
CodePosition pos = CodePosition.getCodePosition(ctx);
int height = Integer.parseInt(ctx.heightProp.getText());
return new Height(height, pos);
}
@Override
public Node visitWidgetStyle(WidgetStyleContext ctx) {
System.out.println("Visiting Widget Style");
return super.visitWidgetStyle(ctx);
}
}