package Ġk ot city . ui ĊĊ Ċ import Ġjavafx . collections . FX Collections Ċ import Ġjavafx . collections . List ChangeListener Ċ import Ġjavafx . collections . Observable List Ċ import Ġjavafx . concurrent . Task Ċ import Ġjavafx . concurrent . Worker State Event Ċ import Ġjavafx . geometry . Pos Ċ import Ġjavafx . scene . Group Ċ import Ġjavafx . scene . Scene Ċ import Ġjavafx . scene . control . Label Ċ import Ġjavafx . scene . control . ProgressBar Ċ import Ġjavafx . scene . control . Progress Indicator Ċ import Ġjavafx . scene . layout . Border Pane Ċ import Ġjavafx . scene . layout . V Box Ċ import Ġjavafx . scene . paint . Color Ċ import Ġjavafx . stage . Modal ity Ċ import Ġjavafx . stage . Stage Ċ import Ġjavafx . stage . Stage Style Ċ import Ġjavafx . stage . Window Ċ import Ġjava . util . function . Consumer Ċ import Ġjava . util . function . ToInt Function Ċ Ċ /** Ċ Ġ* ĠUsed Ġto Ġshow Ġa Ġspinner Ġwhen Ġwe Ġare Ġdoing Ġsome Ġwork ... Ċ Ġ* ĠP Ġ= ĠInput Ġparameter Ġtype . ĠGiven Ġto Ġthe Ġclosure Ġas Ġparameter . ĠReturn Ġtype Ġis Ġalways ĠInteger . Ċ Ġ* Ġ( cc ) Ġ@ im if os Ċ Ġ*/ Ċ class ĠWork Indicator Dialog < in ĠP >( owner : ĠWindow , Ġlabel : ĠString ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġanimation Worker : ĠTask < *> ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġtask Worker : ĠTask < Int >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġprogress Indicator Ġ= ĠProgress Indicator ( Progress Indicator . IN DE TERMIN ATE _ PROGRESS ) ĊĠĠĠ Ġprivate Ġval Ġdialog Ġ= ĠStage ( Stage Style . UN DE COR ATED ) ĊĠĠĠ Ġprivate Ġval Ġlabel Ġ= ĠLabel () ĊĠĠĠ Ġprivate Ġval Ġroot Ġ= ĠGroup () ĊĠĠĠ Ġprivate Ġval Ġscene Ġ= ĠScene ( root , Ġ 3 3 0 . 0 , Ġ 1 2 0 . 0 , ĠColor . WHITE ) ĊĠĠĠ Ġprivate Ġval Ġmain Pane Ġ= ĠBorder Pane () ĊĠĠĠ Ġprivate Ġval Ġv box Ġ= ĠV Box () ĊĊĠĠĠ Ġ/** ĠPl acing Ġa Ġlistener Ġon Ġthis Ġlist Ġallows Ġto Ġget Ġnotified ĠBY Ġthe Ġresult Ġwhen Ġthe Ġtask Ġhas Ġfinished . Ġ Ġ*/ ĊĠĠĠ Ġvar Ġresult Notification List : ĠObservable List < Int > Ġ= ĠFX Collections . observable ArrayList < Int >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġthose Ġthat Ġlike Ġbe ans Ġ:) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġresult Value : ĠInt ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġdialog . init Modal ity ( Modal ity . WINDOW _ MOD AL ) ĊĠĠĠĠĠĠĠ Ġdialog . init Owner ( owner ) ĊĠĠĠĠĠĠĠ Ġdialog . is Resizable Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġthis . label . text Ġ= Ġlabel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Task End Notification ( c : ĠConsumer < Int ?> ) Ġ{ ĊĠĠĠĠĠĠĠ Ġresult Notification List . addListener ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Notification List . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc . accept ( result Value ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠList ChangeListener < in ĠInt >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġexec ( parameter : ĠP , Ġfunc : ĠTo Int Function <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Dialog () ĊĠĠĠĠĠĠĠ Ġsetup Animation Thread () ĊĠĠĠĠĠĠĠ Ġsetup Worker Thread ( parameter , Ġfunc Ġas ĠTo Int Function < P >) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup Dialog () Ġ{ ĊĠĠĠĠĠĠĠ Ġroot . children . add ( main Pane ) ĊĠĠĠĠĠĠĠ Ġv box . spacing Ġ= Ġ 5 . 0 ĊĠĠĠĠĠĠĠ Ġv box . alignment Ġ= ĠPos . CENTER ĊĠĠĠĠĠĠĠ Ġv box . min Width Ġ= Ġ 3 3 0 . 0 ĊĠĠĠĠĠĠĠ Ġv box . min Height Ġ= Ġ 1 2 0 . 0 ĊĠĠĠĠĠĠĠ Ġv box . children . addAll ( label , Ġprogress Indicator ) ĊĠĠĠĠĠĠĠ Ġmain Pane . top Ġ= Ġv box ĊĠĠĠĠĠĠĠ Ġdialog . scene Ġ= Ġscene ĊĊĠĠĠĠĠĠĠ Ġdialog . setOn H iding Ġ{ Ġ/* ĠGets Ġnotified Ġwhen Ġtask Ġended , Ġbut ĠBE FORE ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġvalue Ġis Ġattribut ed . ĠUsing Ġthe Ġobservable Ġlist Ġabove Ġis ĊĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecommended . Ġ*/ Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdialog . show () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup Animation Thread () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprogress Indicator . progress Ġ= ĠProgress Bar . IN DE TERMIN ATE _ PROGRESS ĊĠĠĠĠĠĠĠ Ġprogress Indicator . progress Property (). unbind () ĊĊĠĠĠĠĠĠĠ Ġanimation Worker Ġ= Ġobject Ġ: ĠTask < Double >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcall (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠProgress Bar . IN DE TERMIN ATE _ PROGRESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġanimation Worker ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Indicator . progress Property (). bind ( it . progress Property ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . message Property (). addListener ({ Ġobservable , ĠoldValue , ĠnewValue Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDo Ġsomething Ġwhen Ġthe Ġanimation Ġvalue Ġticker Ġhas Ġchanged ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠThread ( animation Worker ). start () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsetup Worker Thread ( parameter : ĠP , Ġfunc : ĠTo Int Function < P >) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġtask Worker Ġ= Ġobject Ġ: ĠTask < Int >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublic Ġoverride Ġfun Ġcall (): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfunc . apply As Int ( parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġeh Ġ= Ġ{ Ġ_: ĠWorker State Event Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Worker !!. cancel ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Indicator . progress Property (). unbind () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdialog . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Value Ġ= Ġtask Worker !!. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Notification List . add ( result Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtask Worker !!. setOn Succeeded Ġ{ Ġe Ġ-> Ġeh ( e ) Ġ} ĊĠĠĠĠĠĠĠ Ġtask Worker !!. setOn Failed Ġ{ Ġe Ġ-> Ġeh ( e ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠThread ( task Worker ). start () ĊĠĠĠ Ġ} Ċ Ċ }