package Ġautom aton . constructor . view Ċ Ċ import Ġautom aton . constructor . model . State Ċ import Ġautom aton . constructor . model . transition . Transition Ċ import Ġautom aton . constructor . utils .* Ċ import Ġjavafx . beans . value . Observable Boolean Value Ċ import Ġjavafx . beans . value . Observable Double Value Ċ import Ġjavafx . beans . value . Observable Value Ċ import Ġjavafx . collections . Observable List Ċ import Ġjavafx . geometry . Point 2 D Ċ import Ġjavafx . scene . Group Ċ import Ġjavafx . scene . Node Ċ import Ġjavafx . scene . paint . Color Ċ import Ġjavafx . scene . shape . Circle Ċ import Ġjavafx . scene . shape . Line Ċ import Ġt orn ad of x .* Ċ import Ġjava . lang . Math . to Degrees Ċ import Ġkotlin . math . atan Ċ import Ġkotlin . math . sqrt Ċ Ċ enum Ġclass ĠTransition Label Position Ġ{ ĊĠĠĠ ĠCOUN TER _ CLOCK WISE , ĊĠĠĠ ĠA BO VE Ċ } Ċ Ċ class ĠLoop Edge Render Data ( val Ġcenter : ĠObservable Value < Point 2 D >) Ġ: ĠEdge Render Data Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠAR ROW _ START _ OFFSET _ Y Ġ= Ġ- 0 . 5 Ġ* ĠState View . RADIUS ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAR ROW _ START _ OFFSET _ X Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsqrt ( State View . RADIUS Ġ* ĠState View . RADIUS Ġ- ĠAR ROW _ START _ OFFSET _ Y Ġ* ĠAR ROW _ START _ OFFSET _ Y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġnorm X Property Ġ= Ġ 0 . 0 . to Property () ĊĠĠĠ Ġoverride Ġval Ġnorm X Ġby Ġnorm X Property ĊĠĠĠ Ġoverride Ġval Ġmid Point X Property Ġ= Ġcenter . x ĊĠĠĠ Ġoverride Ġval Ġmid Point X Ġby Ġmid Point X Property ĊĠĠĠ Ġoverride Ġval Ġnorm Y Property Ġ= Ġ(- 1 . 0 ). to Property () ĊĠĠĠ Ġoverride Ġval Ġnorm Y Ġby Ġnorm Y Property ĊĠĠĠ Ġoverride Ġval Ġmid Point Y Property Ġ= Ġcenter . y Ġ- Ġ( 2 . 0 Ġ* ĠState View . RADIUS ) ĊĠĠĠ Ġoverride Ġval Ġmid Point Y Ġby Ġmid Point Y Property ĊĠĠĠ Ġoverride Ġval Ġtext Angle In Degrees Property Ġ= Ġ 0 . 0 . to Property () ĊĠĠĠ Ġoverride Ġval Ġchildren Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠCircle (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ= ĠState View . RADIUS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter X Property (). bind ( center . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcenter Y Property (). bind ( center . y Ġ- ĠState View . RADIUS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfill Ġ= ĠColor . TRANSP ARENT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstroke Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠLine (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Property (). bind ( center . x Ġ+ ĠAR ROW _ START _ OFFSET _ X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Y Property (). bind ( center . y Ġ+ ĠAR ROW _ START _ OFFSET _ Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend X Property (). bind ( center . x Ġ+ Ġ( ARROW _ START _ OFFSET _ X Ġ+ Ġ 2 5 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Y Property (). bind ( center . y Ġ+ Ġ( ARROW _ START _ OFFSET _ Y Ġ- Ġ 2 5 . 0 )) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠLine (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Property (). bind ( center . x Ġ+ ĠAR ROW _ START _ OFFSET _ X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Y Property (). bind ( center . y Ġ+ ĠAR ROW _ START _ OFFSET _ Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend X Property (). bind ( center . x Ġ+ Ġ( ARROW _ START _ OFFSET _ X Ġ- Ġ 5 . 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Y Property (). bind ( center . y Ġ+ Ġ( ARROW _ START _ OFFSET _ Y Ġ- Ġ 3 5 . 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ċ } Ċ Ċ class ĠNon Loop Edge Render Data ( ĊĠĠĠ Ġval Ġsource Center : ĠObservable Value < Point 2 D >, ĊĠĠĠ Ġval Ġtarget Center : ĠObservable Value < Point 2 D >, ĊĠĠĠ Ġval Ġhas Opp osite Property : ĠObservable Boolean Value , ĊĠĠĠ Ġlabel Position : ĠTransition Label Position Ċ ) Ġ: ĠEdge Render Data Ġ{ ĊĠĠĠ Ġprivate Ġval Ġis Label Mir rored Property : ĠObservable Value < Boolean > Ġ= Ġwhen Ġ( label Position ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTransition Label Position . AB O VE Ġ-> Ġsource Center . x . greater Than ( target Center . x ) ĊĠĠĠĠĠĠĠ ĠTransition Label Position . COUNTER _ CLOCK WISE Ġ-> Ġfalse . to Property () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġval Ġis Label Mir rored : ĠBoolean Ġby Ġis Label Mir rored Property ĊĠĠĠ Ġprivate Ġval Ġnorm Factor Ġget () Ġ= Ġif Ġ( is Label Mir rored ) Ġ- 1 . 0 Ġelse Ġ 1 . 0 ĊĠĠĠ Ġoverride Ġval Ġnorm X Property Ġ= Ġsource Center . double Binding ( target Center , Ġis Label Mir rored Property ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnorm Factor Ġ* Ġ( target Center . value . y Ġ- Ġsource Center . value . y ) Ġ/ Ġsource Center . value . distance ( target Center . value ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġval Ġnorm X Ġby Ġnorm X Property ĊĠĠĠ Ġoverride Ġval Ġmid Point X Property Ġ= ĊĠĠĠĠĠĠĠ Ġnorm X Property . double Binding ( has Opp osite Property , Ġsource Center , Ġtarget Center ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Opp osite Property . value ) Ġ( source Center . value . x Ġ+ Ġtarget Center . value . x ) Ġ/ Ġ 2 Ġ+ Ġ 8 0 . 0 Ġ* Ġnorm X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( source Center . value . x Ġ+ Ġtarget Center . value . x ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġval Ġmid Point X Ġby Ġmid Point X Property ĊĠĠĠ Ġoverride Ġval Ġnorm Y Property Ġ= Ġsource Center . double Binding ( target Center , Ġis Label Mir rored Property ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnorm Factor Ġ* Ġ( source Center . value . x Ġ- Ġtarget Center . value . x ) Ġ/ Ġsource Center . value . distance ( target Center . value ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġval Ġnorm Y Ġby Ġnorm Y Property ĊĠĠĠ Ġoverride Ġval Ġmid Point Y Property Ġ= ĊĠĠĠĠĠĠĠ Ġnorm Y Property . double Binding ( has Opp osite Property , Ġsource Center , Ġtarget Center ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Opp osite Property . value ) Ġ( source Center . value . y Ġ+ Ġtarget Center . value . y ) Ġ/ Ġ 2 Ġ+ Ġ 8 0 . 0 Ġ* Ġnorm Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ( source Center . value . y Ġ+ Ġtarget Center . value . y ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġval Ġmid Point Y Ġby Ġmid Point Y Property ĊĠĠĠ Ġoverride Ġval Ġtext Angle In Degrees Property Ġ= Ġsource Center . double Binding ( target Center ) Ġ{ ĊĠĠĠĠĠĠĠ Ġto Degrees ( atan (( target Center . value . y Ġ- Ġsource Center . value . y ) Ġ/ Ġ( target Center . value . x Ġ- Ġsource Center . value . x ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toInt (). toDouble (). round To ( 3 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġchildren Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠLine (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart X Property (). bind ( source Center . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Y Property (). bind ( source Center . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend X Property (). bind ( mid Point X Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Y Property (). bind ( mid Point Y Property ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ ĠArrow ( Line (), Ġ 5 0 . 0 , Ġ 2 0 . 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . start X Property (). bind ( mid Point X Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . start Y Property (). bind ( mid Point Y Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Property Ġ= Ġtarget Center . non Null Object Binding ( mid Point X Property , Ġmid Point Y Property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Center . value Ġ- ĠState View . RADIUS Ġ* ĠVector 2 D ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Center . value . x Ġ- Ġmid Point X , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Center . value . y Ġ- Ġmid Point Y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). normalize () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . end X Property (). bind ( end Property . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . end Y Property (). bind ( end Property . y ) ĊĠĠĠĠĠĠĠ Ġ}) Ċ } Ċ Ċ interface ĠEdge Render Data Ġ{ ĊĠĠĠ Ġval Ġnorm X Property : ĠObservable Double Value ĊĠĠĠ Ġval Ġnorm X : ĠDouble ĊĠĠĠ Ġval Ġmid Point X Property : ĠObservable Double Value ĊĠĠĠ Ġval Ġmid Point X : ĠDouble ĊĠĠĠ Ġval Ġnorm Y Property : ĠObservable Double Value ĊĠĠĠ Ġval Ġnorm Y : ĠDouble ĊĠĠĠ Ġval Ġmid Point Y Property : ĠObservable Double Value ĊĠĠĠ Ġval Ġmid Point Y : ĠDouble ĊĠĠĠ Ġval Ġtext Angle In Degrees Property : ĠObservable Double Value ĊĊĠĠĠ Ġval Ġchildren : ĠList < Node > Ċ } Ċ Ċ class ĠEdge View ( ĊĠĠĠ Ġsource Center : ĠObservable Value < Point 2 D >, ĊĠĠĠ Ġtarget Center : ĠObservable Value < Point 2 D >, ĊĠĠĠ Ġlabel Position : ĠTransition Label Position Ġ= ĠTransition Label Position . COUNTER _ CLOCK WISE Ċ ) Ġ: ĠGroup () Ġ{ ĊĠĠĠ Ġconstructor ( source : ĠState , Ġtarget : ĠState ) Ġ: Ġthis ( source . position Property , Ġtarget . position Property ) ĊĊĠĠĠ Ġval Ġtransition Views : ĠObservable List < Transition View > Ġ= Ġobservable ListOf () ĊĠĠĠ Ġval Ġopposite Edge Property Ġ= Ġobject Property < Edge View ? >( null ) ĊĠĠĠ Ġvar Ġopposite Edge Ġby Ġopposite Edge Property ĊĠĠĠ Ġprivate Ġval Ġedge Render Data Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( source Center Ġ=== Ġtarget Center ) ĠLoop Edge Render Data ( source Center ) ĊĠĠĠĠĠĠĠ Ġelse ĠNon Loop Edge Render Data ( source Center , Ġtarget Center , Ġopposite Edge Property . isNotNull , Ġlabel Position ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġedge Render Data . children . forEach Ġ{ Ġadd ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtransitions Group Ġ= Ġgroup () ĊĊĠĠĠ Ġfun Ġadd Transition ( transition : ĠTransition ) Ġ= ĠTransition View ( transition , Ġtransition Views . size ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġtext . rotate Property (). bind ( edge Render Data . text Angle In Degrees Property ) ĊĠĠĠĠĠĠĠ Ġtext . translate To Center () ĊĠĠĠĠĠĠĠ Ġtext . x Property () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( edge Render Data . mid Point X Property . double Binding ( edge Render Data . norm X Property , Ġindex Property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedge Render Data . mid Point X Ġ+ Ġ 6 0 Ġ* Ġ( index Ġ+ Ġ 0 . 5 ) Ġ* Ġedge Render Data . norm X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġtext . y Property () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( edge Render Data . mid Point Y Property . double Binding ( edge Render Data . norm Y Property , Ġindex Property ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġedge Render Data . mid Point Y Ġ+ Ġ 6 0 Ġ* Ġ( index Ġ+ Ġ 0 . 5 ) Ġ* Ġedge Render Data . norm Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġtransitions Group . add ( text ) ĊĠĠĠĠĠĠĠ Ġtransition Views . add ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Transition ( transition : ĠTransition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtransition Views . remove If Ġ{ Ġtransition View Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatches Ġ= Ġtransition View . transition Ġ=== Ġtransition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matches ) Ġtransitions Group . children . remove ( transition View . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatches ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtransition Views . forEach Indexed Ġ{ Ġi , Ġtransition View Ġ-> Ġtransition View . index Ġ= Ġi Ġ} ĊĠĠĠ Ġ} Ċ } Ċ