import Ġjavafx . application . Application Ċ import Ġjavafx . beans . binding . Bindings Ċ import Ġjavafx . beans . binding . When Ċ import Ġjavafx . beans . property . Double Property Ċ import Ġjavafx . beans . property . Simple Double Property Ċ import Ġjavafx . concurrent . Task Ċ import Ġjavafx . event . EventHandler Ċ import Ġjavafx . f xml . FXML Ċ import Ġjavafx . f xml . FXML Loader Ċ import Ġjavafx . geometry . Point 2 D Ċ import Ġjavafx . scene . Node Ċ import Ġjavafx . scene . Scene Ċ import Ġjavafx . scene . control . Label Ċ import Ġjavafx . scene . input .* Ċ import Ġjavafx . scene . layout . Anchor Pane Ċ import Ġjavafx . scene . shape . Circle Ċ import Ġjavafx . scene . shape . Cubic Curve Ċ import Ġjavafx . stage . Stage Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Serializable Ċ import Ġjava . util .* Ċ Ċ class ĠPoint 2 d Serial ( x : ĠDouble , Ġy : ĠDouble ) Ġ: ĠPoint 2 D ( x , Ġy ), ĠSerializable Ċ var Ġstate Add Link Ġ= ĠData Format (" link Add ") Ċ var Ġstate Add Node Ġ= ĠData Format (" node Add ") Ċ Ċ late init Ġvar Ġbtn 1 : ĠDrag gable Node Ċ late init Ġvar Ġbtn 2 : ĠDrag gable Node Ċ Ċ class ĠDrag gable Node Ġ: ĠAnchor Pane () Ġ{ ĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġvar Ġroot _ pane : ĠAnchor Pane ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġvar Ġleft _ link _ handle : ĠAnchor Pane ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġvar Ġright _ link _ handle : ĠAnchor Pane ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġvar Ġtitle _ bar : ĠLabel ? Ġ= Ġnull ĊĊĠĠĠ Ġlateinit Ġvar Ġcontext Drag Over : ĠEventHandler < Drag Event > ĊĠĠĠ Ġlateinit Ġvar Ġcontext Drag Dropped : ĠEventHandler < Drag Event > ĊĊĠĠĠ Ġlateinit Ġvar Ġlink Drag Detected : ĠEventHandler < MouseEvent > ĊĠĠĠ Ġlateinit Ġvar Ġlink Drag Dropped : ĠEventHandler < Drag Event > ĊĠĠĠ Ġlateinit Ġvar Ġcontext Link Drag Over : ĠEventHandler < Drag Event > ĊĠĠĠ Ġlateinit Ġvar Ġcontext Link Dag Dropped : ĠEventHandler < Drag Event > ĊĊĠĠĠ Ġvar Ġmy Link Ġ= ĠNode Link () ĊĠĠĠ Ġvar Ġoffset Ġ= ĠPoint 2 D ( 0 . 0 , Ġ 0 . 0 ) ĊĊĠĠĠ Ġvar Ġsuper Parent : ĠAnchor Pane ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġinitialize () Ġ{ ĊĠĠĠĠĠĠĠ Ġnode Handlers () ĊĠĠĠĠĠĠĠ Ġlink Handlers () ĊĊĠĠĠĠĠĠĠ Ġleft _ link _ handle !!. on Drag Detected Ġ= Ġlink Drag Detected ĊĠĠĠĠĠĠĠ Ġleft _ link _ handle !!. on Drag Dropped Ġ= Ġlink Drag Dropped ĊĠĠĠĠĠĠĠ Ġright _ link _ handle !!. on Drag Detected Ġ= Ġlink Drag Detected ĊĠĠĠĠĠĠĠ Ġright _ link _ handle !!. on Drag Dropped Ġ= Ġlink Drag Dropped ĊĊĠĠĠĠĠĠĠ Ġmy Link . isVisible Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġparent Property (). addListener { Ġo , Ġold , Ġnew Ġ-> Ġsuper Parent Ġ= Ġparent Ġas ĠAnchor Pane } ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Point ( p : ĠPoint 2 D ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlocal Ġ= Ġparent . scene ToLocal ( p ) ĊĠĠĠĠĠĠĠ Ġre locate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( local . x Ġ- Ġoffset . x ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( local . y Ġ- Ġoffset . y ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnode Handlers () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcontext Drag Over Ġ= ĠEventHandler Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Point ( Point 2 D ( event . scene X , Ġevent . scene Y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . consume () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext Drag Dropped Ġ= ĠEventHandler Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Dropped Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Over Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . is Drop Completed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . consume () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtitle _ bar !!. on Drag Detected Ġ= ĠEventHandler Ġ{ Ġevent -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Over Ġ= Ġcontext Drag Over ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Dropped Ġ= Ġcontext Drag Dropped ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= ĠPoint 2 D ( event . x , Ġevent . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Point ( Point 2 D ( event . scene X , Ġevent . scene Y )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠClip board Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent [ state Add Node ] Ġ= Ġ" node " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Drag And Drop (* Transfer Mode . ANY ). setContent ( content ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġlink Handlers () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġlink Drag Detected Ġ= ĠEventHandler Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Over Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Dropped Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Over Ġ= Ġcontext Link Drag Over ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Dropped Ġ= Ġcontext Link Dag Dropped ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Parent !!. children . add ( 0 , Ġmy Link ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Link . isVisible Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠPoint 2 D ( layout X Ġ+ Ġwidth / 2 , Ġlayout Y + height / 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Link . set Start ( p ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠClip board Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent [ state Add Link ] Ġ= Ġ" link " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Drag And Drop (* Transfer Mode . ANY ). setContent ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . consume () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlink Drag Dropped Ġ= ĠEventHandler Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" link Ġconnect ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Over Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Dropped Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Link . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Parent !!. children . remove At ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// val Ġsource Ġ= Ġevent . source Ġas ĠAnchor Pane ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlink Ġ= ĠNode Link () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlink . bind Start End ( btn 1 , Ġbtn 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Parent !!. children . add ( 0 , Ġlink ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= ĠClip board Content () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent [ state Add Link ] Ġ= Ġ" link " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Drag And Drop (* Transfer Mode . ANY ). setContent ( content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . is Drop Completed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . consume () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġcontext Link Drag Over Ġ= ĠEventHandler Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . accept Transfer Modes (* Transfer Mode . ANY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! my Link . isVisible ) Ġmy Link . isVisible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Link . set End ( Point 2 D ( event . x , Ġevent . y )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . consume () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext Link Dag Dropped Ġ= ĠEventHandler Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" link Ġdropped ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Dropped Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent . on Drag Over Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Link . isVisible Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Parent !!. children . remove At ( 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . is Drop Completed Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . consume () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf xml Loader Ġ= ĠF XML Loader ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class . getResource ("/ resources / Drag gable Node . f xml ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġf xml Loader . set Root ( this ) ĊĠĠĠĠĠĠĠ Ġf xml Loader . set Controller ( this ) ĊĠĠĠĠĠĠĠ Ġf xml Loader . load < Any >() ĊĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠNode Link Ġ: ĠAnchor Pane () Ġ{ ĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġvar Ġnode _ link : ĠC ubic Curve ? Ġ= Ġnull ĊĊĠĠĠ Ġval Ġoffset X Ġ= ĠSimple Double Property () ĊĠĠĠ Ġval Ġoffset Y Ġ= ĠSimple Double Property () ĊĠĠĠ Ġval Ġoffset Dir X 1 Ġ= ĠSimple Double Property () ĊĠĠĠ Ġval Ġoffset Dir X 2 Ġ= ĠSimple Double Property () ĊĠĠĠ Ġval Ġoffset Dir Y 1 Ġ= ĠSimple Double Property () ĊĠĠĠ Ġval Ġoffset Dir Y 2 Ġ= ĠSimple Double Property () ĊĊĠĠĠ Ġ@ FXML ĊĠĠĠ Ġprivate Ġfun Ġinitialize () Ġ{ ĊĠĠĠĠĠĠĠ Ġoffset X . set ( 1 0 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġoffset Y . set ( 5 0 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġoffset Dir X 1 . bind ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWhen ( node _ link !!. start X Property (). greater Than ( node _ link !!. end X Property ())). then (- 1 . 0 ). otherwise ( 1 . 0 )) ĊĊĠĠĠĠĠĠĠ Ġoffset Dir X 2 . bind ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWhen ( node _ link !!. start X Property (). greater Than ( node _ link !!. end X Property ())). then ( 1 . 0 ). otherwise (- 1 . 0 )) ĊĊĠĠĠĠĠĠĠ Ġnode _ link !!. control X 1 Property (). bind ( Bindings . add ( node _ link !!. start X Property (), Ġoffset X . multiply ( offset Dir X 1 ))) ĊĠĠĠĠĠĠĠ Ġnode _ link !!. control X 2 Property (). bind ( Bindings . add ( node _ link !!. end X Property (), Ġoffset X . multiply ( offset Dir X 2 ))) ĊĠĠĠĠĠĠĠ Ġnode _ link !!. control Y 1 Property (). bind ( Bindings . add ( node _ link !!. start Y Property (), Ġoffset Y . multiply ( offset Dir Y 1 ))) ĊĠĠĠĠĠĠĠ Ġnode _ link !!. control Y 2 Property (). bind ( Bindings . add ( node _ link !!. end Y Property (), Ġoffset Y . multiply ( offset Dir Y 2 ))) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Start ( point : ĠPoint 2 D ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode _ link !!. start X Ġ= Ġpoint . x ĊĠĠĠĠĠĠĠ Ġnode _ link !!. start Y Ġ= Ġpoint . y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset End ( point : ĠPoint 2 D ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode _ link !!. end X Ġ= Ġpoint . x ĊĠĠĠĠĠĠĠ Ġnode _ link !!. end Y Ġ= Ġpoint . y ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbind Start End ( source 1 : ĠDrag gable Node , Ġsource 2 : ĠDrag gable Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode _ link !!. start X Property (). bind ( Bindings . add ( source 1 . layout X Property (), Ġsource 1 . width / 2 . 0 )) ĊĠĠĠĠĠĠĠ Ġnode _ link !!. start Y Property (). bind ( Bindings . add ( source 1 . layout Y Property (), Ġsource 1 . height / 2 . 0 )) ĊĠĠĠĠĠĠĠ Ġnode _ link !!. end X Property (). bind ( Bindings . add ( source 2 . layout X Property (), Ġsource 2 . width / 2 . 0 )) ĊĠĠĠĠĠĠĠ Ġnode _ link !!. end Y Property (). bind ( Bindings . add ( source 2 . layout Y Property (), Ġsource 2 . height / 2 . 0 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġf xml Loader Ġ= ĠF XML Loader ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Class . getResource ("/ resources / Node Link . f xml ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġf xml Loader . set Root ( this ) ĊĠĠĠĠĠĠĠ Ġf xml Loader . set Controller ( this ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf xml Loader . load < Any >() ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġid Ġ= ĠUUID . randomUUID (). toString () ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ class ĠD n D 2 : ĠApplication () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġstart ( primary Stage : ĠStage ) Ġ{ ĊĠĠĠĠĠĠĠ Ġbtn 1 Ġ= ĠDrag gable Node () ĊĠĠĠĠĠĠĠ Ġbtn 2 Ġ= ĠDrag gable Node () ĊĊĠĠĠĠĠĠĠ Ġvar Ġroot Ġ= ĠAnchor Pane () ĊĠĠĠĠĠĠĠ Ġroot . children . add ( btn 1 ) ĊĠĠĠĠĠĠĠ Ġroot . children . add ( btn 2 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġscene Ġ= ĠScene ( root , Ġ 6 4 0 . 0 , Ġ 4 8 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġprimary Stage . scene Ġ= Ġscene ĊĠĠĠĠĠĠĠ Ġprimary Stage . show () ĊĠĠĠ Ġ} ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch ( Dn D 2 :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }