package qls.ast.visitor.pagebuilder;
import java.util.List;
import ql.ast.visitor.TypeVisitor;
import ql.gui.Component;
import qls.ast.Statement;
import qls.ast.statement.Page;
import qls.ast.statement.Question;
import qls.ast.statement.Section;
import qls.ast.statement.Stylesheet;
import qls.ast.visitor.ExpressionVisitor;
import qls.ast.visitor.ProcessedCache;
import qls.ast.visitor.StatementVisitor;
import qls.ast.visitor.WidgetEnvironment;
import qls.ast.visitor.domaincreator.ConditionalDomain;
import qls.gui.structure.TabbedPanel;
import qls.gui.structure.UIPage;
import qls.gui.structure.UISection;
public class PageBuilder extends StatementVisitor<Component> implements ExpressionVisitor<Void>, TypeVisitor<Void> {
private ProcessedCache<Component> processedComponents;
private WidgetEnvironment widgetEnvironment;
private List<ConditionalDomain> domains;
private PageBuilder(List<ConditionalDomain> domains, WidgetEnvironment widgetEnvironment) {
super.setExpressionVisitor(this);
super.setTypeVisitor(this);
this.domains = domains;
this.widgetEnvironment = widgetEnvironment;
processedComponents = new ProcessedCache<Component>();
}
public static Component build(Statement tree, List<ConditionalDomain> domains, WidgetEnvironment widgetEnvironment) {
PageBuilder builder = new PageBuilder(domains, widgetEnvironment);
return tree.accept(builder);
}
private void scopeDown() {
processedComponents = new ProcessedCache<Component>(processedComponents);
}
private void scopeUp() {
processedComponents = processedComponents.getParent();
}
@Override
public Component visit(Page pageNode) {
scopeDown();
super.visit(pageNode);
UIPage page = new UIPage(pageNode.getIdentifier());
page.setSections(processedComponents.getProcessedObjects());
scopeUp();
processedComponents.addObject(page);
return null;
}
@Override
public Component visit(Question questionNode) {
processedComponents.addObject(widgetEnvironment.resolve(questionNode.getIdentifier()));
return null;
}
@Override
public Component visit(Section sectionNode) {
scopeDown();
super.visit(sectionNode);
UISection section = new UISection(sectionNode.getHeader());
section.setComponents(processedComponents.getProcessedObjects());
scopeUp();
processedComponents.addObject(section);
return null;
}
@Override
public Component visit(Stylesheet stylesheetNode) {
scopeDown();
super.visit(stylesheetNode);
TabbedPanel stylesheet = new TabbedPanel(stylesheetNode.getIdentifier(), domains);
stylesheet.setPages(processedComponents.getProcessedObjects());
scopeUp();
return stylesheet;
}
}