package Ġkotlin map fx . component Ċ Ċ import Ġjavafx . collections . FX Collections Ċ import Ġjavafx . collections . List ChangeListener Ċ import Ġjavafx . collections . Observable List Ċ import Ġjavafx . scene . Group Ċ import Ġjavafx . scene . Node Ċ import Ġjavafx . scene . paint . Color Ċ import Ġjavafx . scene . shape . Close Path Ċ import Ġjavafx . scene . shape . MoveTo Ċ import Ġjavafx . scene . shape . Path Ċ import Ġkotlin map fx . coord . Lat Lon Ċ Ċ /** Ċ Ġ* Ġ@ author ĠM ate us z ĠBe cker Ċ Ġ*/ Ċ interface ĠShape < out ĠT > Ġwhere ĠT Ġ: ĠAnchor Ġ{ ĊĠĠĠ Ġval Ġanchors : ĠList < T > ĊĠĠĠ Ġvar Ġeditable : ĠBoolean ĊĠĠĠ Ġvar Ġsize : ĠDouble ĊĠĠĠ Ġvar Ġcolor : ĠColor ĊĠĠĠ Ġvar Ġcolor Opacity : ĠDouble ĊĊĠĠĠ Ġfun Ġget View (): ĠNode Ċ } Ċ Ċ abstract Ġclass ĠAbstract Shape < T > Ġ: ĠGroup (), ĠShape < T > Ġwhere ĠT Ġ: ĠAnchor Ġ{ ĊĊĠĠĠ Ġprotected Ġval Ġshape : ĠPath Ġ= ĠPath () ĊĠĠĠ Ġprotected Ġval Ġmutable An chors : ĠObservable List < T > Ġ= ĠFX Collections . observable ArrayList () ĊĠĠĠ Ġoverride Ġval Ġanchors : ĠList < T > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmutable An chors . toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġvar Ġeditable : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanchors . forEach Ġ{ Ġit . editable Ġ= Ġvalue Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġvar Ġsize : ĠDouble Ġ= Ġ 2 . 0 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape . stroke Width Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġvar Ġcolor : ĠColor Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape . fill Ġ= ĠColor . color ( value . red , Ġvalue . green , Ġvalue . blue , Ġcolor Opacity ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġvar Ġcolor Opacity : ĠDouble Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape . fill Ġ= ĠColor . color ( color . red , Ġcolor . green , Ġcolor . blue , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġchildren Ġ+= Ġshape ĊĠĠĠĠĠĠĠ Ġshape . stroke Width Ġ= Ġsize ĊĠĠĠĠĠĠĠ Ġshape . fill Ġ= ĠColor . color ( color . red , Ġcolor . green , Ġcolor . blue , Ġcolor Opacity ) Ċ Ċ // ĠĠĠĠĠĠĠ Ġmutable An chors . addListener Ġ{ Ġc : ĠList ChangeListener . Change < out ĠAnchor > Ġ-> Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( c . next ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . was Added ()) Ġ{ Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c . was Removed ()) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġc . removed . forEach Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ-= Ġit . getView () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshape . elements Ġ-= Ġit . path Element Ċ //// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanchors Ġ+= Ġit Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget View (): ĠNode Ġ= Ġthis Ċ } Ċ Ċ class ĠPolygon Shape ( positions : ĠList < Lat Lon >) Ġ: ĠAbstract Shape < Circle Anchor >() Ġ{ ĊĠĠĠ Ġprivate Ġval Ġclose Path Ġ= ĠClose Path () ĊĠĠĠ Ġvar Ġclose able : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value ) Ġshape . elements Ġ+= Ġclose Path Ġelse Ġshape . elements Ġ-= Ġclose Path ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġanchor Factory : Ġ( index : ĠInt , Ġlat Lon : ĠLat Lon ) Ġ-> ĠCircle Anchor Ġ= Ġ{ Ġindex , Ġlat Lon Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCircle Anchor ( lat Lon , ĠMove To ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCircle Anchor ( lat Lon ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġpositions . map Indexed ( anchor Factory ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ+= Ġit . getView () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape . elements Ġ+= Ġit . path Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable An chors Ġ+= Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( close able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape . elements Ġ+= ĠClose Path () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }