package uva.ql.interpreter.gui.elements; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.util.Observable; import java.util.Observer; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import uva.ql.ast.statements.Question; import uva.ql.ast.type.Type; import uva.ql.ast.type.TypeString; import uva.ql.ast.value.GenericValue; import uva.ql.ast.value.NumberValue; import uva.ql.ast.value.StringValue; import uva.ql.interpreter.gui.supporting.UpdateValue; public class UITextField extends Observable implements UIWidgetKit{ private GenericValue<?> value; private Observer observer; private Question question; public UITextField(Question question, GenericValue<?> value , Observer observer) { this.addObserver(observer); this.observer = observer; this.question = question; this.value = value; } @Override public JTextField rander() { JTextField textField = new JTextField(); textField.setText(this.getFieldText()); textField.setColumns(10); textField.setSelectionStart(0); textField.setSelectionEnd(0); textField.setEditable(this.isEnabled()); this.addDocumentListener(textField); this.setFocusListener(textField); return textField; } private String getFieldText(){ String valueText = this.getValueForQuestion(); if (valueText.equals("0")){ return ""; } else { return valueText; } } private String getValueForQuestion(){ GenericValue<?> value = this.value; return String.valueOf(value.getValue()); } private void setValue(String _value){ GenericValue<?> updateValue; if (_value.length() != 0){ updateValue = this.setUpdateValue(value, _value); } else { Type questionType = this.question.getQuestionType(); updateValue = questionType.typeInitialValue(); } this.observer.update(this, new UpdateValue(this.question.getQuestionIdentifier(), updateValue)); } private GenericValue<?> setUpdateValue(GenericValue<?> value, String textFieldValue){ try{ if (value.valueHasType().contains(new TypeString())){ return new StringValue(textFieldValue); } else { return new NumberValue(Integer.valueOf(textFieldValue)); } } catch (NumberFormatException formatException){ System.out.println("Exception: " + formatException.getMessage()); } return null; } private void addDocumentListener(JTextField textField){ textField.getDocument().addDocumentListener(new DocumentListener(){ public void insertUpdate(DocumentEvent e) { setValue(textField.getText()); } public void removeUpdate(DocumentEvent e) { setValue(textField.getText()); } public void changedUpdate(DocumentEvent e) { setValue(textField.getText()); } }); } private void setFocusListener(JTextField textField){ textField.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { textField.setSelectionEnd(0); textField.setSelectionStart(getValueForQuestion().length()); } @Override public void focusLost(FocusEvent e) {} }); } @Override public boolean isEnabled() { return !this.question.hasBinaryExpression(); } }