package gui.widgets;
import java.awt.Color;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import ast.type.Type;
import evaluator.IntegerValue;
import evaluator.Value;
import evaluator.ValueRepository;
import gui.listeners.EvaluateExpression;
public class IntegerFieldWidget implements IWidgetComponent {
private final String id;
private final Type variableType;
private JTextField widget;
private final ValueRepository valueRepository;
private IntegerValue value;
public IntegerFieldWidget(String id, Type variableType, ValueRepository valueRepository) {
this.id = id;
this.variableType = variableType;
this.valueRepository = valueRepository;
this.widget = new JTextField(10);
}
@Override
public JComponent getWidget() {
return this.widget;
}
@Override
public String getIdWidget() {
return this.id;
}
@Override
public Type getWidgetType() {
return variableType;
}
@Override
public void setValue(Value value) {
this.value = (IntegerValue) value;
int computation = (Integer) value.getValue();
widget.setText(String.valueOf(computation));
setDefaultBorder();
}
@Override
public IntegerValue getValue() {
String insertedValue = widget.getText().trim();
String regexDigits ="[-+]?\\d+(\\.\\d+)?";
if (!insertedValue.isEmpty() && insertedValue.matches(regexDigits)) {
setDefaultBorder();
return new IntegerValue(Integer.valueOf(insertedValue));
}
setWarningBorder();
return new IntegerValue(0);
}
@Override
public void setEnabled(boolean isEnabled) {
this.widget.setEnabled(isEnabled);
}
@Override
public void addDocListener(final EvaluateExpression evaluator) {
widget.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent arg0) {
valueRepository.putValue(getIdWidget().toString(), getValue());
evaluator.setValueInGUI();
}
public void insertUpdate(DocumentEvent arg0) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
valueRepository.putValue(getIdWidget().toString(), getValue());
evaluator.setValueInGUI();
}
});
}
public void removeUpdate(DocumentEvent arg0) {
valueRepository.putValue(getIdWidget().toString(), getValue());
}
});
}
@Override
public void setVisible(boolean visibility) {
widget.setVisible(visibility);
}
private void setWarningBorder() {
Border warningBorder = BorderFactory.createLineBorder(Color.RED, 1);
widget.setBorder(warningBorder);
}
private void setDefaultBorder() {
Border defaultBorder = BorderFactory.createLineBorder(Color.GRAY, 1);
widget.setBorder(defaultBorder);
}
}