package Ġio . github . f jo ss inet . rn artist . gui Ċ Ċ import Ġio . github . f jo ss inet . rn artist . Mediator Ċ import Ġio . github . f jo ss inet . rn artist . core . layout Ċ import Ġio . github . f jo ss inet . rn artist . core . model .* Ċ import Ġjava . awt . Color Ċ import Ġjava . awt . Graphics 2 D Ċ import Ġjava . awt . geom . Affine Transform Ċ import Ġjava . awt . geom . Ellipse 2 D Ċ import Ġjava . awt . geom . Path 2 D Ċ import Ġjava . awt . geom . Point 2 D ĊĊ Ċ class ĠJ unction Kn ob ( Ġval Ġmedi ator : ĠMed iator , Ġval Ġj unction : ĠJ unction Drawing ) Ġ{ ĊĊĠĠĠ Ġval Ġconnector s Ġ= Ġmutable ListOf < J unction Connector >() ĊĠĠĠ Ġprivate Ġval Ġarrows Ġ= Ġmutable ListOf < J unction Arrow >() ĊĠĠĠ Ġvar Ġconnector Radius : Double Ġ= Ġ 0 . 0 ĊĠĠĠ Ġ// late init Ġvar Ġdetails Button : Details Button ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . update () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Structural Domain (): ĠStructural Domain Drawing Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . junction ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . connector Radius Ġ= Ġ( if Ġ( junction . circle . width Ġ< Ġ 1 0 0 . 0 ) Ġ Ġj unction . circle . width Ġelse Ġ 1 0 0 . 0 )* Math . PI /( 1 6 . 0 * 3 . 5 ) ĊĠĠĠĠĠĠĠ Ġthis . connectors . clear () ĊĠĠĠĠĠĠĠ Ġthis . arrows . clear () ĊĠĠĠĠĠĠĠ Ġif Ġ( this . junction . junction Type Ġ!= ĠJ unction Type . Ap ical Loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnector Ġ= ĠJ unction Connector ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConnector Id . s , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj unction . center . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj unction . center . y Ġ+ Ġ( if Ġ( junction . circle . width Ġ< Ġ 1 0 0 . 0 ) Ġ Ġj unction . circle . width Ġelse Ġ 1 0 0 . 0 ) Ġ Ġ/ Ġ 2 . 0 Ġ* Ġ 2 . 0 Ġ/ Ġ 3 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . connectors . add ( connector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġ 1 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġrotate Point ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnector . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj unction . center , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ* Ġ 3 6 0 . 0 Ġ/ Ġ 1 6 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ_ connector Ġ= ĠJ unction Connector ( get Connector Id ( i ), Ġfalse , Ġp . x , Ġp . y , Ġthis ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . connectors . add (_ connector ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . arrows . addAll ( array ListOf ( Up ( this ), ĠDown ( this ), ĠLeft ( this ), ĠRight ( this ))); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . load J unction Layout () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// this . details Button Ġ= Ġ ĠDetails Button ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . arrows . addAll ( array ListOf ( Up ( this ), ĠDown ( this ))); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// this . details Button Ġ= Ġ ĠDetails Button ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw ( g : ĠGraphics 2 D , Ġat : Affine Transform ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Color Ġ= Ġg . color ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( c Ġin Ġthis . connectors ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc . draw ( g , Ġat ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( arrow Ġin Ġthis . arrows ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarrow . draw ( g , Ġat ) ĊĊĠĠĠĠĠĠĠ Ġ// this . details Button . draw ( g , Ġat ) ĊĊĠĠĠĠĠĠĠ Ġg . color Ġ= Ġprevious Color ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcontains ( x : ĠDouble , Ġy : ĠDouble , Ġat : ĠAff ine Transform ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* if Ġ( at . create Trans formed Shape ( this . details Button . inner Circle ). contains ( x , Ġy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . details Button . mouse C lik ed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠ Ġfor Ġ( connector Ġin Ġthis . connectors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! connector . isIn Id Ġ&& Ġat . create Trans formed Shape ( connector . circle ). contains ( x , Ġy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnector . mouse Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( arrow Ġin Ġthis . arrows ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arrow . contains ( x , Ġy , Ġat )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarrow . mouse Clicked () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget J unction Layout (): ĠList < Connector Id > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlayout Ġ= Ġmutable ListOf < Connector Id >() ĊĠĠĠĠĠĠĠ Ġ// first Ġwe Ġsearch Ġthe Ġcircle Ġfor Ġthe ĠIn Id ĊĠĠĠĠĠĠĠ Ġvar ĠstartIndex : Int Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġthis . connectors . forEach Ġ{ Ġconnector Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connector . isIn Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartIndex Ġ= Ġthis . connectors . indexOf ( connector ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Pos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( current Pos Ġ<= Ġ 1 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Pos ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . connectors [( startIndex + current Pos )% 1 6 ]. selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlayout . add ( get Connector Id ( current Pos )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlayout ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload J unction Layout () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . clear () ĊĠĠĠĠĠĠĠ Ġthis . connectors . forEach Ġ{ Ġconnector Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connector . connector Id Ġ== Ġj unction . in Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnector . isIn Id Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnector . selected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj unction . connected J unction s . keys . to Mutable List (). forEach Ġ{ Ġconnector Id Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( connector . connector Id Ġ== Ġconnector Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnector . selected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . connectors . forEach Ġ{ Ġconnector Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnector . isIn Id Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnector . selected Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠJ unction Connector ( val Ġconnector Id : ĠConnector Id , Ġvar Ġselected : Boolean Ġ= Ġfalse , Ġcenter X : Double , Ġcenter Y : Double , Ġprivate Ġval Ġkn ob : J unction Kn ob ) Ġ{ ĊĊĠĠĠ Ġvar ĠisIn Id Ġ= Ġfalse ĊĠĠĠ Ġvar Ġcircle : Ellipse 2 D ĊĠĠĠ Ġvar ĠstrokeWidth Ġ= Ġ 0 . 5 ĊĠĠĠ Ġval Ġcenter ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠPoint 2 D . Double ( this . circle . x + kn ob . connector Radius , Ġthis . circle . y + kn ob . connector Radius ) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . circle Ġ= ĠEl lipse 2 D . Double ( center X - Ġkn ob . connector Radius , Ġcenter Y - kn ob . connector Radius , kn ob . connector Radius * 2 , kn ob . connector Radius * 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdraw ( g : ĠGraphics 2 D , Ġat : ĠAff ine Transform ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( isIn Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ; ĊĠĠĠĠĠĠĠ Ġ/* else Ġif Ġ( selected Ġ&& Ġthis . kn ob . junction . drawing Configuration . params . containsKey ( Drawing Configuration Parameter . Full Details . toString ()) Ġ&& Ġthis . kn ob . junction . drawing Configuration . params [ Drawing Configuration Parameter . Full Details . toString ()]. equals (" true ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= ĠColor . GREEN ĊĠĠĠĠĠĠĠ Ġelse Ġif Ġ( selected Ġ&& Ġthis . kn ob . junction . drawing Configuration . params . containsKey ( Drawing Configuration Parameter . Full Details . toString ()) Ġ&& Ġthis . kn ob . junction . drawing Configuration . params [ Drawing Configuration Parameter . Full Details . toString ()]. equals (" false ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= ĠColor . RED ĊĠĠĠĠĠĠĠ Ġelse */ ĊĠĠĠĠĠĠĠ Ġif Ġ( selected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= ĠColor . DARK _ GRAY ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= ĠColor . LIGHT _ GRAY ĊĊĠĠĠĠĠĠĠ Ġg . fill ( at . create Trans formed Shape ( this . circle )) ĊĠĠĠĠĠĠĠ Ġg . color Ġ= Ġg . color . dark er () ĊĠĠĠĠĠĠĠ Ġg . draw ( at . create Trans formed Shape ( this . circle )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmouse Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġselected Count Ġ= Ġkn ob . connectors . count Ġ{ Ġit . selected Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Count Ġ< Ġkn ob . junction . junction Type . value Ġ- Ġ 1 Ġ&& Ġ! this . isIn Id Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . selected Ġ= Ġ! this . selected ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( selected Count Ġ>= Ġkn ob . junction . junction Type . value Ġ- Ġ 1 Ġ&& Ġ! this . isIn Id Ġ) Ġ{ Ġ// we Ġcan Ġonly Ġun select ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . selected Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// after Ġthe Ġclick , Ġif Ġwe Ġhave Ġthe Ġselected Ġcircles Ġcorresponding Ġto Ġhe lix Count - 1 Ġ(- 1 Ġsince Ġthe Ġinner Ġhe lix Ġin Ġred Ġdoesn 't Ġcount ) ĊĠĠĠĠĠĠĠ Ġselected Count Ġ= Ġkn ob . connectors . count Ġ{ Ġit . selected Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( selected Count Ġ== Ġkn ob . junction . junction Type . value Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . junction . apply Layout ( layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj unction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ Ġkn ob . junction . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout _ ids Ġ= Ġkn ob . get J unction Layout (). map Ġ{ Ġit . toString () Ġ}. join ToString ( separator Ġ= Ġ" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . medi ator . drawing Displayed . get () !!. kn obs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġkn ob . medi ator . canvas 2 D . rep aint () ĊĠĠĠĠĠĠĠ Ġkn ob . medi ator . editor . set J unction Layout ("\" ${ this . kn ob . junction . current Layout . map Ġ{ Ġit . name Ġ}. join ToString ( separator Ġ= Ġ" Ġ" )} \"", Ġ"${ ( this . kn ob . junction . current Layout . size + 1 )} ", Ġkn ob . junction . location ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠJ unction Arrow Ġ{ ĊĊĠĠĠ Ġfun Ġmouse Clicked () ĊĊĠĠĠ Ġfun Ġmouse Released () ĊĊĠĠĠ Ġfun Ġcontains ( x : Double , y : Double , at : ĠAff ine Transform ): Boolean ĊĊĠĠĠ Ġfun Ġdraw ( g : ĠGraphics 2 D , Ġat : ĠAff ine Transform ) Ċ Ċ } Ċ Ċ abstract Ġclass ĠAbstract J unction Arrow : J unction Arrow Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġshape : ĠPath 2 D ĊĠĠĠ Ġvar Ġcolor Ġ= ĠColor . LIGHT _ GRAY ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( x : Double , y : Double , at : ĠAff ine Transform ): Boolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġat . create Trans formed Shape ( this . shape ). contains ( x , y ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw ( g : ĠGraphics 2 D , Ġat : ĠAff ine Transform ) Ġ{ ĊĠĠĠĠĠĠĠ Ġg . color Ġ= Ġthis . color ĊĠĠĠĠĠĠĠ Ġg . fill ( at . create Trans formed Shape ( this . shape )) ĊĠĠĠĠĠĠĠ Ġg . color Ġ= Ġg . color . dark er () ĊĠĠĠĠĠĠĠ Ġg . draw ( at . create Trans formed Shape ( this . shape )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠUp ( private Ġval Ġkn ob : J unction Kn ob ): Abstract J unction Arrow () Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . shape Ġ= ĠPath 2 D . Double () ĊĠĠĠĠĠĠĠ Ġif Ġ( kn ob . junction . junction Type Ġ== ĠJ unction Type . Ap ical Loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . moveTo ( kn ob . junction . center . x , Ġkn ob . junction . center . y Ġ- Ġ 8 Ġ* Ġkn ob . connector Radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . x Ġ- Ġkn ob . connector Radius Ġ* Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . y Ġ- Ġ 3 * kn ob . connector Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . x Ġ+ Ġkn ob . connector Radius Ġ* Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . y Ġ- Ġ 3 * kn ob . connector Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . moveTo ( kn ob . junction . center . x , Ġkn ob . junction . center . y Ġ- Ġ 4 Ġ* Ġkn ob . connector Radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . x Ġ- Ġkn ob . connector Radius Ġ* Ġ 1 . 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . y Ġ- Ġ 2 Ġ* Ġkn ob . connector Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . x Ġ+ Ġkn ob . connector Radius Ġ* Ġ 1 . 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . y Ġ- Ġ 2 Ġ* Ġkn ob . connector Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . shape . close Path () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw ( g : ĠGraphics 2 D , Ġat : ĠAff ine Transform ) Ġ{ ĊĠĠĠĠĠĠĠ Ġg . color Ġ= Ġthis . color ĊĠĠĠĠĠĠĠ Ġg . fill ( at . create Trans formed Shape ( this . shape )) ĊĠĠĠĠĠĠĠ Ġg . color Ġ= Ġg . color . dark er () ĊĠĠĠĠĠĠĠ Ġg . draw ( at . create Trans formed Shape ( this . shape )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . kn ob . junction . apply Layout ( layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj unction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ Ġkn ob . junction . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ= Ġkn ob . junction . radius Ġ* Ġ 1 . 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} !! ) ĊĊĠĠĠĠĠĠĠ Ġthis . kn ob . medi ator . drawing Displayed . get () !!. kn obs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . update () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . kn ob . medi ator . canvas 2 D . rep aint () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Released () Ġ{ ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠDown ( private Ġval Ġkn ob : J unction Kn ob ): Abstract J unction Arrow () Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . shape Ġ= ĠPath 2 D . Double () ĊĠĠĠĠĠĠĠ Ġif Ġ( kn ob . junction . junction Type Ġ== ĠJ unction Type . Ap ical Loop ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . moveTo ( kn ob . junction . center . x , Ġkn ob . junction . center . y Ġ+ Ġ 8 Ġ* Ġkn ob . connector Radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . x Ġ- Ġkn ob . connector Radius Ġ* Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . y Ġ+ Ġ 3 * kn ob . connector Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . x Ġ+ Ġkn ob . connector Radius Ġ* Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . y Ġ+ Ġ 3 * kn ob . connector Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . moveTo ( kn ob . junction . center . x , Ġkn ob . junction . center . y Ġ+ Ġ 4 Ġ* Ġkn ob . connector Radius ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . x Ġ- Ġkn ob . connector Radius Ġ* Ġ 1 . 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . y Ġ+ Ġ 2 Ġ* Ġkn ob . connector Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . x Ġ+ Ġkn ob . connector Radius Ġ* Ġ 1 . 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . junction . center . y Ġ+ Ġ 2 Ġ* Ġkn ob . connector Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . shape . close Path () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . kn ob . junction . apply Layout ( layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj unction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ Ġkn ob . junction . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius Ġ= Ġkn ob . junction . radius Ġ* Ġ 0 . 9 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} !! ) ĊĠĠĠĠĠĠĠ Ġthis . kn ob . medi ator . drawing Displayed . get () !!. kn obs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . update () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . kn ob . medi ator . canvas 2 D . rep aint () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Released () Ġ{ ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠLeft ( private Ġval Ġkn ob : J unction Kn ob ): Abstract J unction Arrow () Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . shape Ġ= ĠPath 2 D . Double () ĊĠĠĠĠĠĠĠ Ġthis . shape . moveTo ( kn ob . junction . center . x - 4 * kn ob . connector Radius , Ġkn ob . junction . center . y ) ĊĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( kn ob . junction . center . x - 2 * kn ob . connector Radius , Ġkn ob . junction . center . y - 1 . 5 * kn ob . connector Radius ) ĊĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( kn ob . junction . center . x - 2 * kn ob . connector Radius , Ġkn ob . junction . center . y + 1 . 5 * kn ob . connector Radius ) ĊĠĠĠĠĠĠĠ Ġthis . shape . close Path () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// first Ġwe Ġsearch Ġthe Ġconnector Ġin ID Ġ( the Ġred Ġcircle ĊĠĠĠĠĠĠĠ Ġvar Ġin ID Index : Int Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ(_ connector Ġin Ġthis . kn ob . connectors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ connector . isIn Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin ID Index Ġ= Ġthis . kn ob . connectors . indexOf (_ connector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . kn ob . connectors [( in ID Index + 1 )% 1 6 ]. selected ) Ġ{ Ġ// if Ġnot Ġwe Ġdo Ġnothing , Ġa Ġselected Ġcircle Ġis Ġjust Ġon Ġthe Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Pos Ġ= Ġ( in ID Index + 1 )% 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Pos Ġ!= Ġin ID Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . kn ob . connectors [ current Pos ]. isIn Id Ġ&& Ġthis . kn ob . connectors [ current Pos ]. selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . connectors [ current Pos ]. selected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . connectors [ if Ġ( current Pos - 1 Ġ== Ġ- 1 ) Ġ 1 5 Ġelse Ġcurrent Pos - 1 ]. selected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Pos Ġ= Ġ( current Pos + 1 )% 1 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . junction . apply Layout ( layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj unction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ Ġkn ob . junction . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout _ ids Ġ= Ġkn ob . get J unction Layout (). map Ġ{ Ġit . toString () Ġ}. join ToString ( separator Ġ= Ġ" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . medi ator . drawing Displayed . get () !!. kn obs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . medi ator . canvas 2 D . rep aint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . medi ator . editor . set J unction Layout ("\" ${ this . kn ob . junction . current Layout . map Ġ{ Ġit . name Ġ}. join ToString ( separator Ġ= Ġ" Ġ" )} \"", Ġ"${ ( this . kn ob . junction . current Layout . size + 1 )} ", Ġkn ob . junction . location ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Released () Ġ{ ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠRight ( private Ġval Ġkn ob : J unction Kn ob ): Abstract J unction Arrow () Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . shape Ġ= ĠPath 2 D . Double () ĊĠĠĠĠĠĠĠ Ġthis . shape . moveTo ( kn ob . junction . center . x + 4 * kn ob . connector Radius , Ġkn ob . junction . center . y ) ĊĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( kn ob . junction . center . x + 2 * kn ob . connector Radius , Ġkn ob . junction . center . y - 1 . 5 * kn ob . connector Radius ) ĊĠĠĠĠĠĠĠ Ġthis . shape . lineTo ( kn ob . junction . center . x + 2 * kn ob . connector Radius , Ġkn ob . junction . center . y + 1 . 5 * kn ob . connector Radius ) ĊĠĠĠĠĠĠĠ Ġthis . shape . close Path () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Clicked () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// first Ġwe Ġsearch Ġthe Ġconnector Ġin ID Ġ( the Ġred Ġcircle ) ĊĠĠĠĠĠĠĠ Ġvar Ġin ID Index : Int Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ(_ connector Ġin Ġthis . kn ob . connectors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ connector . isIn Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin ID Index Ġ= Ġthis . kn ob . connectors . indexOf (_ connector ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! this . kn ob . connectors [ if Ġ( in ID Index - 1 Ġ== Ġ- 1 ) Ġ 1 5 Ġelse Ġin ID Index - 1 ]. selected ) Ġ{ Ġ// if Ġnot Ġwe Ġdo Ġnothing , Ġa Ġselected Ġcircle Ġis Ġjust Ġon Ġthe Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Pos Ġ= Ġif Ġ( in ID Index - 1 Ġ== Ġ- 1 ) Ġ 1 5 Ġelse Ġin ID Index - 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( current Pos Ġ!= Ġin ID Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . kn ob . connectors [ current Pos ]. isIn Id Ġ&& Ġthis . kn ob . connectors [ current Pos ]. selected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . connectors [ current Pos ]. selected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . connectors [( current Pos + 1 )% 1 6 ]. selected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Pos Ġ= Ġif Ġ( current Pos - 1 Ġ== Ġ- 1 ) Ġ 1 5 Ġelse Ġcurrent Pos - 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . junction . apply Layout ( layout Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġj unction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ Ġkn ob . junction . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout _ ids Ġ= Ġkn ob . get J unction Layout (). map Ġ{ Ġit . toString () Ġ}. join ToString ( separator Ġ= Ġ" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . medi ator . drawing Displayed . get () !!. kn obs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . update () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . kn ob . medi ator . canvas 2 D . rep aint () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkn ob . medi ator . editor . set J unction Layout ("\" ${ this . kn ob . junction . current Layout . map Ġ{ Ġit . name Ġ}. join ToString ( separator Ġ= Ġ" Ġ" )} \"", Ġ"${ ( this . kn ob . junction . current Layout . size + 1 )} ", Ġkn ob . junction . location ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmouse Released () Ġ{ ĊĊĠĠĠ Ġ} Ċ Ċ }