package nl.uva.softwcons.qls.ui.widget; import static javafx.collections.FXCollections.observableArrayList; import static nl.uva.softwcons.qls.ui.widget.DropdownWidget.StringValueWrapper.NO_STRING_VALUE; import static nl.uva.softwcons.qls.ui.widget.DropdownWidget.StringValueWrapper.NO_VALUE_WRAPPER; import static nl.uva.softwcons.qls.ui.widget.DropdownWidget.StringValueWrapper.YES_STRING_VALUE; import static nl.uva.softwcons.qls.ui.widget.DropdownWidget.StringValueWrapper.YES_VALUE_WRAPPER; import javafx.scene.Node; import javafx.scene.control.ComboBox; import nl.uva.softwcons.ql.eval.ValueChangeListener; import nl.uva.softwcons.ql.eval.value.Value; import nl.uva.softwcons.ql.ui.converter.ValueConverter; import nl.uva.softwcons.ql.ui.widget.Widget; public class DropdownWidget extends Widget { private ValueConverter<String> converter; private final ComboBox<StringValueWrapper> comboBox; public DropdownWidget(final String yesString, final String noString) { this.comboBox = new ComboBox<StringValueWrapper>(observableArrayList(new StringValueWrapper(YES_STRING_VALUE, yesString), new StringValueWrapper(NO_STRING_VALUE, noString))); } public DropdownWidget(final String yesString, final String noString, final ValueConverter<String> converter) { this(yesString, noString); this.converter = converter; } @Override public void addListener(final ValueChangeListener<Value> listener) { comboBox.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { listener.processValueChange(converter.toValue(newValue.toString())); }); } @Override public void setValue(final Value value) { if (value.inConditionalContext()) { comboBox.setValue(YES_VALUE_WRAPPER); return; } comboBox.setValue(NO_VALUE_WRAPPER); } @Override public void setEditable(final boolean editable) { this.comboBox.setDisable(!editable); } @Override public Node getWidget() { return comboBox; } @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void setConverter(final ValueConverter converter) { this.converter = converter; } public static final class StringValueWrapper { public static final String YES_STRING_VALUE = "YES"; public static final String NO_STRING_VALUE = "NO"; public static final StringValueWrapper YES_VALUE_WRAPPER = new StringValueWrapper(YES_STRING_VALUE, null); public static final StringValueWrapper NO_VALUE_WRAPPER = new StringValueWrapper(NO_STRING_VALUE, null); private final String label; private final String value; public StringValueWrapper(final String value, final String label) { this.label = label; this.value = value; } @Override public String toString() { return label; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((value == null) ? 0 : value.hashCode()); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final StringValueWrapper other = (StringValueWrapper) obj; return value.equals(other.value); } } }