package curve;

import java.awt.*;
import java.awt.event.*;

//Text field to accept only numeric data (including floating point)
public class NumericTextField extends TextField
{
  protected String lastGoodValue;
  protected int lastCaretPosition;

  public NumericTextField() {
    init();
  };

  public NumericTextField(String s) {
    try {
      setText(s);
      new Double(getText());
      lastGoodValue=s;
    } catch (Exception e) {
      setText("");
    };
    init();
  };

  public void init() {
    setColumns(8);
    MyTextListener textListener=new MyTextListener();
    this.addTextListener(textListener);
  };

  //Return text as a double
  public double asDouble() {
    Double d;
    testNumber(); //Make sure latest number stands
    setText(lastGoodValue);
    d=new Double(getText());
    return d.doubleValue();
  };

  protected void testNumber() {
    try {
      if(getText().length()!=0) new Double(getText());
      lastGoodValue=getText();
      lastCaretPosition=getCaretPosition();
    } catch (Exception e) { //Text is not a number, so return to last known good number
      if(getText().compareTo(".")==0) {
        setText("0.");
        setCaretPosition(2);
        lastGoodValue="0.";
      } else if(getText().compareTo("-.")==0) {
        setText("-0.");
        setCaretPosition(3);
        lastGoodValue="-0.";
      } else if(getText().compareTo("-")!=0) {
        setText(lastGoodValue);
        setCaretPosition(lastCaretPosition);
      };
    };
  };
    
  //Every time text is changed, it is tested as a number
  class MyTextListener implements TextListener
  {
    //Is text a number?
    public void textValueChanged(TextEvent event)
    {
      testNumber();
    }
  }

};