package ql.gui.input;
import javafx.beans.value.ChangeListener;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import ql.gui.control.Control;
import ql.semantics.errors.Message;
import ql.semantics.values.Value;
/**
* Created by Nik on 3-3-15.
*/
public abstract class RegularInput<T extends Control> extends Input<T>
{
private final Text errorField;
public RegularInput(String id, T control)
{
super(id, control, false);
this.control.addListener(this.constructChangeListener());
this.errorField = new Text(null);
this.errorField.setFill(Color.FIREBRICK);
this.errorField.setVisible(false);
this.errorField.setManaged(false);
this.fillInputNode();
}
@Override
protected void fillInputNode()
{
super.fillInputNode();
this.inputNode.getChildren().add(this.errorField);
}
@Override
public void switchControl(T control)
{
super.switchControl(control);
this.control.addListener(this.constructChangeListener());
}
protected void addValidationError(Message validationError)
{
this.errorField.setText(validationError.getMessage());
this.errorField.setVisible(true);
this.errorField.setManaged(true);
}
protected void resetValidation()
{
this.errorField.setText(null);
this.errorField.setVisible(false);
this.errorField.setManaged(false);
}
private ChangeListener<Object> constructChangeListener() {
return (observable, oldValue, newValue) -> update();
}
private void update()
{
this.resetValidation();
Value val = this.convertUserInputToValue();
if (val.isUndefined())
{
this.addValidationError(this.getInvalidInputErrorMsg());
}
this.setChanged();
this.notifyObservers(val);
}
protected abstract Value convertUserInputToValue();
protected abstract Message getInvalidInputErrorMsg();
}