package nl.uva.sc.encoders.qlruntime.ui.control;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import nl.uva.sc.encoders.ql.ast.type.BooleanType;
import nl.uva.sc.encoders.ql.ast.type.IntegerType;
import nl.uva.sc.encoders.ql.ast.type.StringType;
import nl.uva.sc.encoders.ql.visitor.DataTypeVisitor;
import nl.uva.sc.encoders.qlruntime.model.RuntimeQuestion;
import nl.uva.sc.encoders.qlruntime.model.value.BooleanValue;
import nl.uva.sc.encoders.qlruntime.model.value.IntegerValue;
import nl.uva.sc.encoders.qlruntime.model.value.StringValue;
public class ControlGenerator implements DataTypeVisitor<ControlPropertyChangeWrapper> {
private RuntimeQuestion runtimeQuestion;
public ControlGenerator(RuntimeQuestion runtimeQuestion) {
this.runtimeQuestion = runtimeQuestion;
}
@Override
public CheckBoxPropertyChangeWrapper visit(BooleanType qlBoolean) {
CheckBox checkBox = new CheckBox("Yes");
checkBox.setOnAction(event -> {
CheckBox checkBox1 = (CheckBox) event.getSource();
runtimeQuestion.setValue(new BooleanValue(checkBox1.isSelected()));
});
return new CheckBoxPropertyChangeWrapper(checkBox);
}
@Override
public NumberFieldPropertyChangeWrapper visit(IntegerType integerType) {
final NumberField numberField = new NumberField();
numberField.setOnKeyReleased(event -> {
KeyCode keyCode = event.getCode();
if (!keyCode.isDigitKey()) {
return;
}
TextField textField1 = (TextField) event.getSource();
String text = textField1.getText();
Integer value = 0;
if (!text.isEmpty()) {
try {
value = Integer.valueOf(text);
} catch (NumberFormatException e) {
numberField.setNumber(value);
Alert alert = new Alert(AlertType.WARNING);
alert.setContentText(text + " is not a valid number.");
alert.show();
}
runtimeQuestion.setValue(new IntegerValue(value));
}
});
return new NumberFieldPropertyChangeWrapper(numberField);
}
@Override
public TextFieldPropertyChangeWrapper visit(StringType stringType) {
TextField textField = new TextField();
textField.setOnKeyReleased(event -> {
KeyCode keyCode = event.getCode();
if (keyCode.isNavigationKey() || keyCode.isFunctionKey() || keyCode.isMediaKey()) {
return;
}
TextField textField1 = (TextField) event.getSource();
StringValue value = new StringValue(textField1.getText());
runtimeQuestion.setValue(value);
});
return new TextFieldPropertyChangeWrapper(textField);
}
}