package nl.uva.softwcons.qls.ui.renderer; import java.util.HashMap; import java.util.Map; import nl.uva.softwcons.ql.ast.expression.identifier.Identifier; import nl.uva.softwcons.ql.ui.layout.FormLayout; import nl.uva.softwcons.ql.ui.layout.Layout; import nl.uva.softwcons.ql.ui.layout.QuestionLayout; import nl.uva.softwcons.ql.ui.renderer.Renderer; import nl.uva.softwcons.qls.ast.segment.Page; import nl.uva.softwcons.qls.ast.segment.Question; import nl.uva.softwcons.qls.ast.segment.Section; import nl.uva.softwcons.qls.ast.segment.SegmentValueVisitor; import nl.uva.softwcons.qls.ast.stylesheet.Stylesheet; import nl.uva.softwcons.qls.ast.stylesheet.StylesheetVisitor; import nl.uva.softwcons.qls.ui.layout.PageLayout; import nl.uva.softwcons.qls.ui.layout.SectionLayout; public class QLSRenderer implements Renderer, StylesheetVisitor<Void>, SegmentValueVisitor<Void, Layout> { private final Map<Identifier, QuestionLayout> questionLayouts; private final Stylesheet stylesheet; private FormLayout formLayout; public QLSRenderer(final Stylesheet stylesheet) { this.stylesheet = stylesheet; this.questionLayouts = new HashMap<>(); } @Override public Layout getLayout() { formLayout = new FormLayout(); stylesheet.accept(this); return formLayout; } @Override public void add(final QuestionLayout node) { this.questionLayouts.put(node.getQuestionId(), node); } @Override public Void visit(final Stylesheet stylesheet) { stylesheet.getPages().forEach(p -> { p.accept(this, formLayout); }); return null; } @Override public Void visit(final Page page, final Layout layout) { final Layout pageLayout = new PageLayout(); page.getSegments().forEach(s -> { s.accept(this, pageLayout); }); layout.add(pageLayout); return null; } @Override public Void visit(final Question question, final Layout layout) { final QuestionLayout questionLayout = questionLayouts.get(question.getId()); layout.add(questionLayout); return null; } @Override public Void visit(final Section section, final Layout layout) { final Layout pageLayout = new SectionLayout(); section.getContent().forEach(s -> { s.accept(this, pageLayout); }); layout.add(pageLayout); return null; } }