package ql.ast.form.answer; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JTextField; import ql.ast.environment.Environment; import ql.ast.expr.exprType.Ident; import ql.ast.form.Form; import ql.ast.value.Int; import ql.ast.value.Value; public class IntComponent extends AnswerComponent{ private JTextField answer; @Override public JComponent getAnswerField(boolean enabled, final Environment environment, final Form form, final Ident id) { answer = new JTextField(15); answer.setEnabled(enabled); answer.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (isValidInteger()) submitResult(environment, form, id); else showErrorMessageAndClearField(); form.eval(); } }); answer.addFocusListener(new FocusListener() { @Override public void focusLost(FocusEvent e) { if (isValidInteger()) { submitResult(environment, form, id); form.eval(); } else if (!answer.getText().equals("")) { showErrorMessageAndClearField(); } } @Override public void focusGained(FocusEvent e) {} }); return answer; } @Override public boolean hasValue() { return isValidInteger(); } @Override public Value getAnswerValue() { if(isValidInteger()) return new Int(Integer.parseInt(answer.getText())); return new Int(); } @Override public void setAnswerValue(Value value) { if (value.getClass().equals(Int.class)) { answer.setText(((Int)value).getValue().toString()); } else { throw new IllegalArgumentException("The given value should be a Integer type"); } } @Override public void setVisible(boolean visible) { answer.setVisible(visible); } private boolean isValidInteger() { try { Integer.parseInt(answer.getText()); } catch (NumberFormatException e) { return false; } return true; } private void showErrorMessageAndClearField() { JOptionPane.showMessageDialog(null, "The value should be an Integer!"); answer.setText(""); } }