package ql.gui.control; import javafx.beans.value.ChangeListener; import javafx.scene.Node; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.scene.text.TextAlignment; import ql.semantics.values.DecValue; import ql.semantics.values.IntValue; import ql.semantics.values.UndefValue; import ql.semantics.values.Value; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; /** * Created by Nik on 16-3-15. */ public class Slider extends ControlElement implements IntControl, DecControl { private final javafx.scene.control.Slider slider; private final Text sliderTextValue; private final VBox controlNode; private Double defaultValue; private NumberFormat formatter; public Slider(Integer startValue, Integer endValue, Integer step) { this(startValue.doubleValue(), endValue.doubleValue(), step.doubleValue(), "#0"); } public Slider(BigDecimal startValue, BigDecimal endValue, BigDecimal step) { this(startValue.doubleValue(), endValue.doubleValue(), step.doubleValue(), "#0.00"); } private Slider(Double startValue, Double endValue, Double step, String format) { this.slider = new javafx.scene.control.Slider(startValue, endValue, step); this.formatter = new DecimalFormat(format); this.defaultValue = startValue; this.sliderTextValue = new Text(); this.sliderTextValue.setTextAlignment(TextAlignment.RIGHT); this.controlNode = new VBox(); this.controlNode.getChildren().addAll(this.slider, this.sliderTextValue); this.slider.valueProperty().addListener(this.createSliderTextUpdateListener()); this.slider.setValue(this.defaultValue); } @Override public void setDisabled(Boolean disabled) { this.slider.setDisable(disabled); } @Override public void setValue(Value value) { value.accept(this); } @Override public Void visit(DecValue val) { this.slider.setValue(val.getValue().doubleValue()); return null; } @Override public Void visit(IntValue val) { this.slider.setValue(val.getValue().doubleValue()); return null; } @Override public Void visit(UndefValue val) { this.slider.setValue(this.defaultValue); return null; } @Override public Node getControlNode() { return this.controlNode; } @Override public void addListener(ChangeListener listener) { this.slider.valueProperty().addListener(listener); } @Override public Value getIntValue() { Double d = this.slider.getValue(); Long rounded = Math.round(d); return new IntValue(rounded.intValue()); } @Override public Value getDecValue() { Double v = this.slider.getValue(); BigDecimal bd = new BigDecimal(v.doubleValue()); return new DecValue(bd); } private ChangeListener<Number> createSliderTextUpdateListener() { return (observable, oldValue, newValue) -> sliderTextValue.setText(formatter.format(newValue).toString()); } }