package nl.uva.softwcons.qls.ui.widget; import static nl.uva.softwcons.qls.ui.widget.RawValueAndTypeToConverterMap.TABLE; import java.util.Optional; import nl.uva.softwcons.ql.ast.form.Form; import nl.uva.softwcons.ql.ast.statement.Question; import nl.uva.softwcons.ql.ui.widget.CheckboxWidget; import nl.uva.softwcons.ql.ui.widget.TextFieldWidget; import nl.uva.softwcons.ql.ui.widget.Widget; import nl.uva.softwcons.ql.ui.widget.factory.DefaultWidgetFactory; import nl.uva.softwcons.ql.ui.widget.factory.WidgetFactory; import nl.uva.softwcons.qls.ast.stylesheet.Stylesheet; import nl.uva.softwcons.qls.ast.widgetstyle.type.CheckboxType; import nl.uva.softwcons.qls.ast.widgetstyle.type.DropdownType; import nl.uva.softwcons.qls.ast.widgetstyle.type.RadioButtonType; import nl.uva.softwcons.qls.ast.widgetstyle.type.SliderType; import nl.uva.softwcons.qls.ast.widgetstyle.type.TextType; import nl.uva.softwcons.qls.ast.widgetstyle.type.WidgetType; import nl.uva.softwcons.qls.ast.widgetstyle.type.WidgetTypeVisitor; import nl.uva.softwcons.qls.ui.style.StyleBlock; import nl.uva.softwcons.qls.ui.style.StylesheetResolver; public class StyledWidgetFactory implements WidgetFactory, WidgetTypeVisitor<Widget> { private final StylesheetResolver resolver; private final WidgetFactory defaultFactory; public StyledWidgetFactory(final Form form, final Stylesheet stylesheet) { this.resolver = new StylesheetResolver(stylesheet, form); this.defaultFactory = new DefaultWidgetFactory(); } @Override public Widget getWidget(final Question question) { final Optional<WidgetType> questionWidget = resolver.getWidgetType(question.getId()); if (questionWidget.isPresent()) { final Widget widget = getWidgetByType(questionWidget.get()); widget.setConverter(TABLE.get(widget.getClass(), question.getType())); return applyStyle(widget, resolver.getStyle(question.getId())); } return defaultFactory.getWidget(question); } @Override public Widget visit(final CheckboxType type) { return new CheckboxWidget(type.getYes()); } @Override public Widget visit(final DropdownType type) { return new DropdownWidget(type.getYes(), type.getNo()); } @Override public Widget visit(final RadioButtonType type) { return new RadioButtonWidget(type.getYes(), type.getNo()); } @Override public Widget visit(final SliderType type) { return new SliderWidget(type.getStart(), type.getEnd(), type.getStep()); } @Override public Widget visit(final TextType type) { return new TextFieldWidget(); } private Widget getWidgetByType(final WidgetType widgetType) { return widgetType.accept(this); } private Widget applyStyle(final Widget widget, final StyleBlock style) { widget.getWidget().setStyle(style.asString()); return widget; } }