package qls.gui;
import ql.gui.SimpleModeler;
import ql.gui.canvas.Canvas;
import ql.gui.segment.Row;
import ql.gui.segment.RowStyle;
import ql.gui.segment.Segment;
import ql.semantics.CondQuestionTable;
import qls.ast.Page;
import qls.ast.Stylesheet;
import qls.ast.StylesheetVisitor;
import qls.ast.rule.Rules;
import qls.ast.statement.*;
import qls.semantics.QuestionStyles;
import qls.semantics.RowStyleBuilder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Nik on 10-3-15.
*/
public class StyledModeler extends SimpleModeler implements StylesheetVisitor<Void>, StatementVisitor<Segment>
{
private final Stylesheet stylesheet;
private final QuestionStyles questionStyles;
private List<ql.gui.segment.Page> pages;
public StyledModeler(CondQuestionTable condQuestionTable, Stylesheet stylesheet, QuestionStyles questionStyles)
{
super(condQuestionTable);
this.stylesheet = stylesheet;
this.questionStyles = questionStyles;
}
@Override
public Canvas buildCanvas()
{
this.pages = new ArrayList<>();
this.stylesheet.accept(this);
return new Canvas(this.getCondQuestionTable().getTitle(), this.pages);
}
@Override
public Void visit(Stylesheet s)
{
for (Page p : s.getBody())
{
p.accept(this);
}
return null;
}
@Override
public Void visit(Page p)
{
List<Segment> segments = new ArrayList<>();
for (Statement stat : p.getBody())
{
if (stat.isRenderable())
{
Segment segment = stat.accept(this);
segments.add(segment);
}
}
this.pages.add(new ql.gui.segment.Page(segments, p.getTitle()));
return null;
}
@Override
public Segment visit(Section s)
{
List<Segment> segments = new ArrayList<>();
s.getBody().stream()
.filter(stat -> stat.isRenderable())
.forEach(stat -> segments.add(stat.accept(this)));
return new ql.gui.segment.Section(s.getName(), segments);
}
@Override
public Segment visit(qls.ast.statement.Question q)
{
return getConditional(q.getId());
}
@Override
public Segment visit(QuestionWithRules q)
{
return getConditional(q.getId());
}
private Segment getConditional(String id)
{
ql.ast.statement.Question q = this.getQuestion(id);
Row row = q.accept(this);
Rules rules = questionStyles.getStyleForQuestion(id);
RowStyle style = RowStyleBuilder.build(rules);
row.applyStyle(style);
return row;
}
@Override
public Segment visit(DefaultStat d)
{
throw new IllegalStateException("Visiting a default node is not allowed");
}
}