package org.uva.sea.ql.interpreter.widget;
import java.awt.event.FocusListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.EventListener;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.text.NumberFormatter;
import org.uva.sea.ql.ast.stmt.Question;
import org.uva.sea.ql.interpreter.value.Int;
import org.uva.sea.ql.interpreter.value.Undefined;
import org.uva.sea.ql.interpreter.value.Value;
public class IntInput extends Widget implements KeyListener {
JFormattedTextField widget;
NumberFormatter mf;
public IntInput(Question question, Value<?> value) {
mf = new NumberFormatter(NumberFormat.getIntegerInstance());
mf.setAllowsInvalid(false);
widget = new JFormattedTextField(mf);
widget.setColumns(10);
widget.setName(question.getIdent().getName());
setValue(value);
}
@Override
public void setValue(Value<?> value) {
if(value.getValue()!=null){
widget.setText(value.getValue().toString());
}
}
@Override
public Value<?> getValue() {
if(!widget.getText().isEmpty()){
String groupingSymbol = "\\"+String.valueOf(new DecimalFormatSymbols().getGroupingSeparator());
String stringValue = widget.getText();
return new Int(Integer.parseInt(stringValue.replaceAll(groupingSymbol, "")));
}
return new Undefined();
}
@Override
public JComponent getWidget() {
return widget;
}
@Override
public void setWidget(JComponent widget) {
this.widget = (JFormattedTextField) widget;
}
@Override
public void setActionListener(EventListener listener) {
widget.addFocusListener((FocusListener)listener);
widget.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
disallow();
}
@Override
public void keyPressed(KeyEvent e) {
disallow();
if(e.getKeyCode() == KeyEvent.VK_BACK_SPACE || e.getKeyCode() == KeyEvent.VK_DELETE){
if(widget.getText().length() == 1){
mf.setAllowsInvalid(true);
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
private void disallow(){
if(!mf.getAllowsInvalid()){
mf.setAllowsInvalid(false);
}
}
}