package nl.uva.se.ql.gui.widgets.questions;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import javafx.scene.Node;
import javafx.scene.control.TextField;
import nl.uva.se.ql.ast.statement.Question;
import nl.uva.se.ql.evaluation.value.DecimalValue;
import nl.uva.se.ql.gui.listeners.Listener;
import nl.uva.se.ql.gui.mediators.Mediator;
import nl.uva.se.ql.gui.validators.DecimalValidator;
import nl.uva.se.ql.gui.validators.IntegerValidator;
public class DecimalQuestion extends BaseQuestion<String> {
private TextField textField = new TextField();
public DecimalQuestion(Question question, Mediator mediator) {
super(question, mediator);
Listener<String> listener = new Listener<String>(getMediator());
textField.textProperty().addListener(
listener.addListener(this, getValidator()));
}
@Override
public String undoChange(String newValue, String oldValue) {
IntegerValidator integerValidator = new IntegerValidator();
if (integerValidator.isValid(newValue)) {
textField.setText(newValue + ".0");
return textField.getText();
}
if (newValue.isEmpty() || !integerValidator.isValid(newValue)
&& oldValue.isEmpty()) {
textField.setText("0.0");
return textField.getText();
}
textField.setText(oldValue);
return textField.getText();
}
@Override
public DecimalValidator initValidator() {
return new DecimalValidator();
}
@Override
public DecimalValue getValue() {
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(',');
symbols.setDecimalSeparator('.');
String pattern = "#0.0#";
DecimalFormat decimalFormat = new DecimalFormat(pattern, symbols);
decimalFormat.setParseBigDecimal(true);
// parse the string
BigDecimal bigDecimal;
try {
bigDecimal = (BigDecimal) decimalFormat.parse(textField.getText());
return new DecimalValue(bigDecimal);
} catch (ParseException e) {
return new DecimalValue(new BigDecimal(0.0));
}
}
@Override
public Node getWidget() {
return this.textField;
}
}