package org.uva.student.calinwouter.qlqls.ql.gui.widgets;
import org.uva.student.calinwouter.qlqls.ql.model.StateWrapper;
import org.uva.student.calinwouter.qlqls.ql.QLInterpreter;
import org.uva.student.calinwouter.qlqls.ql.model.VariableTable;
import org.uva.student.calinwouter.qlqls.ql.types.IntegerValue;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import java.awt.*;
public class IntboxWidget implements IWidget {
private final JTextField widget;
private final String questionIdentifier;
private final QLInterpreter qlInterpreter;
private final StateWrapper stateWrapper;
private final static Integer MAX_TEXTBOX_LENGTH_FOR_INTEGER = (int) Math.log10(Integer.MAX_VALUE - 1) + 1;
public Component getWidgetComponent() {
return widget;
}
public void resetValue() {
widget.setText("");
}
private void resetVariable(VariableTable variableTable) {
variableTable.setVariable(questionIdentifier, new IntegerValue(0));
}
private void trySetVariable(VariableTable variableTable) {
try {
final Integer newValue = Integer.parseInt(widget.getText());
final IntegerValue integerValue = new IntegerValue(newValue);
variableTable.setVariable(questionIdentifier, integerValue);
} catch(NumberFormatException e) {
resetVariable(variableTable);
}
}
private DocumentListener createIntboxChangeListener() {
return new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
updateField();
}
public void removeUpdate(DocumentEvent e) {
updateField();
}
public void changedUpdate(DocumentEvent e) {
updateField();
}
private void updateField() {
VariableTable variableTable = stateWrapper.getVariableTable();
trySetVariable(variableTable);
VariableTable newVariableTable = qlInterpreter.interpret(variableTable);
stateWrapper.setVariableTable(newVariableTable);
}
};
}
public IntboxWidget(String questionIdentifier, QLInterpreter qlInterpreter, StateWrapper stateWrapper) {
this.questionIdentifier = questionIdentifier;
this.qlInterpreter = qlInterpreter;
this.stateWrapper = stateWrapper;
this.widget = new JTextField(MAX_TEXTBOX_LENGTH_FOR_INTEGER);
widget.getDocument().addDocumentListener(createIntboxChangeListener());
}
}