001package polaris.sdk.ui.controls; 002import polaris.sdk.ui.*; 003 004import java.util.Locale; 005public class NumberField extends TextField { 006 protected double min=-1e9,max=1e9,step=1,lastValid;protected int decimals=2; 007 public NumberField(){this(0);}public NumberField(double v){super("");number(v);} 008 public NumberField range(double a,double b){if(!Double.isFinite(a)||!Double.isFinite(b)||a>b)throw new IllegalArgumentException("range");min=a;max=b;number(lastValid);return this;} 009 public NumberField step(double s){if(!Double.isFinite(s)||s<=0)throw new IllegalArgumentException("step");step=s;return this;} 010 public NumberField decimals(int n){if(n<0||n>8)throw new IllegalArgumentException("decimals");decimals=n;number(lastValid);return this;} 011 public NumberField number(double v){if(!Double.isFinite(v))throw new IllegalArgumentException("number");lastValid=Math.max(min,Math.min(max,v));value(String.format(Locale.ROOT,"%."+decimals+"f",lastValid));return this;} 012 public double number(){try{double parsed=Double.parseDouble(text);return Double.isFinite(parsed)?Math.max(min,Math.min(max,parsed)):lastValid;}catch(Exception e){return lastValid;}} 013 @Override protected boolean accepts(String s){return s.matches("[-+]?\\d*(\\.\\d*)?");} 014 public void commit(){number(number());changed();} 015 @Override protected void submit(){commit();super.submit();} 016 @Override public void event(UiEvent e){if(e.type==UiEvent.Type.BLUR){commit();}if(e.type==UiEvent.Type.KEY&&(e.key==38||e.key==40)){number(number()+(e.key==38?step:-step));changed();e.handled=true;return;}super.event(e);} 017}