package Ġcom . github . han se ter . json . editor . controls Ċ Ċ import Ġjavafx . beans . property . Property Ċ import Ġjavafx . scene . control . Spinner Ċ import Ġjavafx . scene . control . Spinner Value Factory Ċ import Ġjavafx . util . String Converter Ċ import Ġorg . ever it . json . schema . Number Schema Ċ import Ġjava . text . Decimal Format Ċ import Ġjava . text . Parse Position Ċ Ċ class ĠDouble Control ( schema : ĠNumber Schema ) Ġ: ĠControl With Property < Double ?> Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġconverter Ġ= ĠString Double Converter () ĊĊĠĠĠ Ġoverride Ġval Ġcontrol Ġ= ĠSp inner < Double ?> (). apply Ġ{ ĊĠĠĠĠĠĠĠ ĠminWidth Ġ= Ġ 1 5 0 . 0 ĊĠĠĠĠĠĠĠ Ġvalue Factory Ġ= ĠDouble Spinner Value Factory () ĊĠĠĠĠĠĠĠ Ġis Editable Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġval Ġproperty : ĠProperty < Double ?> Ġ= Ġcontrol . value Factory . value Property () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcontrol . focused Property (). addListener Ġ{ Ġ_, Ġ_, Ġnew Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! new Ġ&& Ġ( control . editor . text . isEmpty () Ġ|| Ġcontrol . editor . text Ġ== Ġ"- ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol . editor . text Ġ= Ġcontrol . value Factory . converter . toString ( property . value ?. toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontrol . editor . text Property (). addListener Ġ{ Ġ_, Ġ_, Ġnew Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol . increment ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( new . isNotEmpty () Ġ&& Ġnew Ġ!= Ġ"- ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconverter . fail On Trailing Separator Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol . increment ( 0 ) Ġ// Ġwon 't Ġchange Ġvalue , Ġbut Ġwill Ġcommit Ġeditor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontrol . editor . text Ġ= Ġcontrol . value Factory . converter . toString ( property . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ" 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠTr ailing Separator Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Nothing Ġto Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconverter . fail On Trailing Separator Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpreview Null ( b : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontrol . editor . prompt Text Ġ= Ġif Ġ( b ) ĠType Control . NULL _ PROMPT Ġelse Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠDouble Spinner Value Factory Ġ: ĠSp inner Value Factory < Double ?> () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinner Ġ= ĠDouble Spinner Value Factory (- Double . MAX _ VALUE , ĠDouble . MAX _ VALUE ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . converter Ġ= Ġthis @ Double Control . converter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner . converter Ġ= Ġthis . converter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdecrement ( steps : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner . decrement ( steps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġinner . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġincrement ( steps : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinner . increment ( steps ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġinner . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠString Double Converter Ġ: ĠString Converter < Double ?> () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfail On Trailing Separator Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (` object `: ĠDouble ?): ĠString ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(` object ` Ġ== Ġnull ) Ġ"" Ġelse ĠDEC IMAL _ FORMAT . format (` object `) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġfrom String ( string : ĠString ?): ĠDouble ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( string . isNull Or Blank ()) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparse Position Ġ= ĠParse Position ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= ĠDEC IMAL _ FORMAT . parse ( string , Ġparse Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parse Position . index Ġ!= Ġstring . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġjava . lang . Number FormatException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fail On Trailing Separator Ġ&& Ġis Trailing Separator ( string )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTr ailing Separator Exception () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnumber ?. toDouble () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġis Trailing Separator ( string : ĠString ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring . last () Ġ== ĠDEC IMAL _ FORMAT . decimal Format Symbols . decimal Separator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠTr ailing Separator Exception Ġ: ĠException () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEC IMAL _ FORMAT Ġ= ĠDecimal Format ("# 0 . ################ ") ĊĠĠĠ Ġ} Ċ Ċ }