package nl.uva.bromance.QL.expressions.primitives; import javafx.scene.control.TextField; import javafx.scene.layout.VBox; import nl.uva.bromance.QL.expressions.unary.Primitive; import nl.uva.bromance.QL.gui.QLGUI; import nl.uva.bromance.QL.typechecking.SymbolTable; public class NumberPrimitive extends Primitive { private Integer value; private Boolean negative = false; public NumberPrimitive(Integer value, int lineNumber) { super(lineNumber); this.value = value; } public Integer getValue() { return value; } public NumberPrimitive addition(NumberPrimitive rhs, int lineNumber) { return new NumberPrimitive(this.value + rhs.getValue(), lineNumber); } public NumberPrimitive division(NumberPrimitive rhs, int lineNumber) { return new NumberPrimitive(this.value / rhs.getValue(), lineNumber); } public NumberPrimitive multiplication(NumberPrimitive rhs, int lineNumber) { return new NumberPrimitive(this.value * rhs.getValue(), lineNumber); } public NumberPrimitive subtraction(NumberPrimitive rhs, int lineNumber) { return new NumberPrimitive(this.value - rhs.getValue(), lineNumber); } public BooleanPrimitive biggerThanOrEqual(NumberPrimitive rhs, int lineNumber) { return new BooleanPrimitive(this.value >= rhs.getValue(),lineNumber); } public BooleanPrimitive smallerThanOrEqual(NumberPrimitive rhs, int lineNumber) { return new BooleanPrimitive(this.value <= rhs.getValue(), lineNumber); } public BooleanPrimitive smallerThan(NumberPrimitive rhs, int lineNumber) { return new BooleanPrimitive(this.value < rhs.getValue(), lineNumber); } public BooleanPrimitive biggerThan(NumberPrimitive rhs, int lineNumber) { return new BooleanPrimitive(this.value > rhs.getValue(), lineNumber); } @Override public BooleanPrimitive isEqual(Primitive rhs, int lineNumber) { return new BooleanPrimitive(value == ((NumberPrimitive) rhs).getValue(), lineNumber); } @Override public Primitive evaluate(SymbolTable s) { return this; } @Override public void drawQuestion(VBox questionArea, QLGUI qlGui) { TextField textField = new TextField(); textField.getStyleClass().add("question"); textField.setMaxWidth(100); if (value != null) textField.setText(value.toString()); else if (negative) textField.setText("-"); if (qlGui.getFocusUuid() == uuid) qlGui.setFocusedNode(textField); textField.positionCaret(textField.getLength()); // Disable any input other than numbers textField.textProperty().addListener((observable, oldValue, newValue) -> { if (newValue.matches("-?[0-9]*")) { if (newValue.length() == 0) { value = null; negative = false; } else if (newValue.equals("-")) { value = null; negative = true; } else { // Catch integer overflow try { value = Integer.parseInt(newValue); } catch (java.lang.NumberFormatException ex) { if (negative) value = Integer.MIN_VALUE; else value = Integer.MAX_VALUE; } } } qlGui.renderWithFocus(uuid); }); questionArea.getChildren().add(textField); } public static NumberPrimitive defaultValue(int lineNumber) { return new NumberPrimitive(0,lineNumber); } }