/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 . ĠJetBrains Ġs . r . o . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġjet brains . datal ore . plot . builder Ċ Ċ import Ġjet brains . datal ore . base . event . Event Ċ import Ġjet brains . datal ore . base . g common . base . Throw ables Ċ import Ġjet brains . datal ore . base . geometry . Double Rectangle Ċ import Ġjet brains . datal ore . base . geometry . Double Vector Ċ import Ġjet brains . datal ore . base . logging . Portable Logging Ċ import Ġjet brains . datal ore . base . registration . Registration Ċ import Ġjet brains . datal ore . base . values . Color Ċ import Ġjet brains . datal ore . base . values . Some Fig Ċ import Ġjet brains . datal ore . plot . Feature Switch . PLOT _ DEBUG _ DRAW ING Ċ import Ġjet brains . datal ore . plot . base . render . svg . Svg Component Ċ import Ġjet brains . datal ore . plot . base . render . svg . Text Label Ċ import Ġjet brains . datal ore . plot . base . render . svg . Text Label . Horizontal Anchor Ċ import Ġjet brains . datal ore . plot . base . render . svg . Text Label . Vertical Anchor Ċ import Ġjet brains . datal ore . plot . builder . event . MouseEvent Peer Ċ import Ġjet brains . datal ore . plot . builder . guide . Orientation Ċ import Ġjet brains . datal ore . plot . builder . interact . Plot Interactor Ċ import Ġjet brains . datal ore . plot . builder . interact . Plot Tooltip Bounds Ċ import Ġjet brains . datal ore . plot . builder . layout .* Ċ import Ġjet brains . datal ore . plot . builder . layout . Plot Layout Util . live Map Bounds Ċ import Ġjet brains . datal ore . plot . builder . presentation . Style Ċ import Ġjet brains . datal ore . plot . builder . theme . Theme Ċ import Ġjet brains . datal ore . vis . svg . Svg Element Ċ import Ġjet brains . datal ore . vis . svg . Svg G Element Ċ import Ġjet brains . datal ore . vis . svg . Svg Node Ċ import Ġjet brains . datal ore . vis . svg . Svg Rect Element Ċ import Ġjet brains . datal ore . vis . svg . event . Svg EventHandler Ċ import Ġjet brains . datal ore . vis . svg . event . Svg Event Spec Ċ Ċ class ĠPlot Svg Component ( ĊĠĠĠ Ġprivate Ġval Ġtitle : ĠString ?, ĊĠĠĠ Ġprivate Ġval Ġlayers By Tile : ĠList < List < Geom Layer >>, ĊĠĠĠ Ġprivate Ġvar Ġplot Layout : ĠPlot Layout , ĊĠĠĠ Ġprivate Ġval Ġframe Of Reference Provider : ĠTile Frame Of Reference Provider , ĊĠĠĠ Ġprivate Ġval Ġlegend Box Infos : ĠList < Legend Box Info >, ĊĠĠĠ Ġval Ġinteractions Enabled : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġtheme : ĠTheme Ċ ) Ġ: ĠSvg Component () Ġ{ ĊĊĠĠĠ Ġval Ġf lipped Axis Ġ= Ġframe Of Reference Provider . flip Axis ĊĠĠĠ Ġval Ġmouse Event Peer Ġ= ĠMouseEvent Peer () ĊĊĠĠĠ Ġvar Ġinter actor : ĠPlot Interactor ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( field Ġ== Ġnull ) Ġ{ Ġ" Can Ġbe Ġint ial ize Ġonly Ġonce ." Ġ} Ġ// ĠTODO : Ġto Ġnot Ġwaste Ġtime Ġon Ġan Ġex haustive ĠDis posable Ġlifecycle Ġcontrol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPlot Interactor Ġcontrols Ġsub scri bt ions Ġand Ġclears Ġthem Ġout Ġon ĠDispose ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon View Reset Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on View Reset () ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon View P anning Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on View P anning ($ it )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon View Zoom Area Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on View Area ($ it )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon View Zoom In Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" on View Zoom In ($ it )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġvar Ġlive Map Fig ures : ĠList < Some Fig > Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġvar Ġplot Size : ĠDouble Vector Ġ= ĠDEF _ PLOT _ SIZE ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġfun Ġhas Title (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! title . isNull Or Blank () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTo Do : Ġremove ĊĠĠĠ Ġprivate Ġval Ġaxis Title Left : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( has Axis Title Left ()) Ġ{ Ġ" No Ġleft Ġaxis Ġtitle " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġframe Of Reference Provider . v Axis Label !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTo Do : Ġremove ĊĠĠĠ Ġprivate Ġval Ġaxis Title Bottom : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( has Axis Title Bottom ()) Ġ{ Ġ" No Ġbottom Ġaxis Ġtitle " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġframe Of Reference Provider . h Axis Label !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTo Do : Ġremove ĊĠĠĠ Ġprivate Ġfun Ġhas Axis Title Left (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! frame Of Reference Provider . v Axis Label . isNull OrEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTo Do : Ġremove ĊĠĠĠ Ġprivate Ġfun Ġhas Axis Title Bottom (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! frame Of Reference Provider . h Axis Label . isNull OrEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtile Layers ( tile Index : ĠInt ): ĠList < Geom Layer > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlayers By Tile [ tile Index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcontains Live Map : ĠBoolean Ġ= Ġlayers By Tile . flatten (). any ( Geom Layer :: is Live Map ) ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Component () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Plot () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ( e ) Ġ{ Ġ" build Plot " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Cause Ġ= ĠThrow ables . getRoot Cause ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessages Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġbuilding Ġplot : Ġ" Ġ+ Ġroot Cause :: class . simple Name , Ġif Ġ( root Cause . message Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"'" Ġ+ Ġroot Cause . message Ġ+ Ġ"'" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< no Ġmessage >" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġy Ġ= Ġplot Size . y Ġ/ Ġ 2 Ġ- Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( s Ġin Ġmessages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Label Ġ= ĠText Label ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Label . setHorizontal Anchor ( Horizontal Anchor . MIDDLE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Label . set Vertical Anchor ( Vertical Anchor . CENTER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Label . moveTo ( plot Size . x Ġ/ Ġ 2 , Ġy ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Group . children (). add ( error Label . root Group ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ+= Ġ 1 6 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Plot () Ġ{ ĊĠĠĠĠĠĠĠ Ġroot Group . addClass ( Style . PLOT ) ĊĠĠĠĠĠĠĠ Ġbuild Plot Components () ĊĊĠĠĠĠĠĠĠ Ġreg ( object Ġ: ĠRegistration () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdo Remove () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinter actor ?. dispose () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Map Fig ures Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġresize ( plot Size : ĠDouble Vector ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( plot Size . x Ġ<= Ġ 0 Ġ|| Ġplot Size . y Ġ<= Ġ 0 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( plot Size Ġ== Ġthis . plot Size ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġthis . plot Size Ġ= Ġplot Size ĊĊĠĠĠĠĠĠĠ Ġ// Ġjust Ġinvalidate ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠ Ġ} ĊĊ Ċ // ĠĠĠ Ġprivate Ġfun Ġrebuild Plot () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġclear () Ċ // ĠĠĠĠĠĠĠ Ġbuild Plot () Ċ // ĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġcreate Tile ( ĊĠĠĠĠĠĠĠ Ġtiles Origin : ĠDouble Vector , ĊĠĠĠĠĠĠĠ Ġtile Info : ĠTile Layout Info , ĊĠĠĠĠĠĠĠ Ġtile Layers : ĠList < Geom Layer >, ĊĠĠĠĠĠĠĠ Ġtheme : ĠTheme , ĊĠĠĠ Ġ): ĠPlot Tile Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġframe Of Reference : ĠTile Frame Of Reference Ġ= Ġframe Of Reference Provider . create Frame Of Reference ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtile Info , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDEBUG _ DRAW ING ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġtile Ġ= ĠPlot Tile ( tile Layers , Ġtiles Origin , Ġtile Info , Ġtheme , Ġframe Of Reference ) ĊĠĠĠĠĠĠĠ Ġtile . isDebug Drawing Ġ= ĠDEBUG _ DRAW ING ĊĠĠĠĠĠĠĠ Ġreturn Ġtile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Axis Title ( ĊĠĠĠĠĠĠĠ Ġtext : ĠString , ĊĠĠĠĠĠĠĠ Ġorientation : ĠOrientation , ĊĠĠĠĠĠĠĠ Ġplot Bounds : ĠDouble Rectangle , ĊĠĠĠĠĠĠĠ Ġgeom Bounds : ĠDouble Rectangle ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhorizontal Anchor Ġ= ĠHorizontal Anchor . MIDDLE ĊĠĠĠĠĠĠĠ Ġval Ġvertical Anchor : ĠVertical Anchor Ġ= Ġwhen Ġ( orientation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . LEFT , ĠOrientation . RIGHT , ĠOrientation . TOP Ġ-> ĠVertical Anchor . TOP ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . BOTTOM Ġ-> ĠVertical Anchor . BOTTOM ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtitle Location : ĠDouble Vector ĊĠĠĠĠĠĠĠ Ġvar Ġrotation Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġwhen Ġ( orientation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Location Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( plot Bounds . left Ġ+ ĠPlot Layout Util . AXIS _ TITLE _ OUT ER _ M ARGIN , Ġgeom Bounds . center . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Ġ= Ġ- 9 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Location Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( plot Bounds . right Ġ- ĠPlot Layout Util . AXIS _ TITLE _ OUT ER _ M ARGIN , Ġgeom Bounds . center . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrotation Ġ= Ġ 9 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . TOP Ġ-> Ġtitle Location Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( geom Bounds . center . x , Ġplot Bounds . top Ġ+ ĠPlot Layout Util . AXIS _ TITLE _ OUT ER _ M ARGIN ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . BOTTOM Ġ-> Ġtitle Location Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( geom Bounds . center . x , Ġplot Bounds . bottom Ġ- ĠPlot Layout Util . AXIS _ TITLE _ OUT ER _ M ARGIN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtitle Label Ġ= ĠText Label ( text ) ĊĠĠĠĠĠĠĠ Ġtitle Label . setHorizontal Anchor ( horizontal Anchor ) ĊĠĠĠĠĠĠĠ Ġtitle Label . set Vertical Anchor ( vertical Anchor ) ĊĠĠĠĠĠĠĠ Ġtitle Label . moveTo ( title Location ) ĊĠĠĠĠĠĠĠ Ġtitle Label . rotate ( rotation ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtitle Element Ġ= Ġtitle Label . root Group ĊĠĠĠĠĠĠĠ Ġtitle Element . addClass ( Style . AXIS _ TITLE ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġhack : Ġwe Ġhave Ġstyle : Ġ". axis Ġ. title Ġtext " Ġand Ġwe Ġdon 't Ġwant Ġto Ġbreak Ġbackward - compatibility Ġwith Ġ' c ensus ' Ġcharts ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= ĠSvg G Element () ĊĠĠĠĠĠĠĠ Ġparent . addClass ( Style . AXIS ) ĊĊĠĠĠĠĠĠĠ Ġparent . children (). add ( title Element ) ĊĊĠĠĠĠĠĠĠ Ġadd ( parent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠonMouse Move ( e : ĠSvg Element , Ġmessage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . add EventHandler ( Svg Event Spec . MOUSE _ MOVE , Ġobject Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSvg EventHandler < Event > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle ( node : ĠSvg Node , Ġe : ĠEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Plot Components () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoverall Rect Ġ= ĠDouble Rectangle ( Double Vector . ZERO , Ġplot Size ) ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Constant Condition If ") ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG _ DRAW ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠSvg Rect Element ( overall Rect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . stroke Color (). set ( Color . MAG ENT A ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . stroke Width (). set ( 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . fill Opacity (). set ( 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonMouse Move ( rect , Ġ" MAG ENT A : Ġpreferred Ġsize : Ġ$ overall Rect ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( rect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġcompute Ġgeom Ġbounds ĊĠĠĠĠĠĠĠ Ġval Ġentire Plot Ġ= Ġif Ġ( contains Live Map ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlive Map Bounds ( overall Rect ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverall Rect ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsubtract Ġtitle Ġsize ĊĠĠĠĠĠĠĠ Ġval Ġwithout Title Ġ= Ġif Ġ( has Title ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Size Ġ= ĠPlot Layout Util . title Dimensions ( title !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Rectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentire Plot . origin . add ( Double Vector ( 0 . 0 , Ġtitle Size . y )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentire Plot . dimension . subtract ( Double Vector ( 0 . 0 , Ġtitle Size . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentire Plot ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadjust Ġfor Ġlegend Ġboxes ĊĠĠĠĠĠĠĠ Ġvar Ġboxes Layout Result : ĠLegend Boxes Layout . Result ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġlegend Theme Ġ= Ġtheme . legend () ĊĠĠĠĠĠĠĠ Ġval Ġwithout Title And Leg ends Ġ= Ġif Ġ( legend Theme . position (). is Fixed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlegend Boxes Layout Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLegend Boxes Layout ( without Title , Ġlegend Theme ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboxes Layout Result Ġ= Ġlegend Boxes Layout . do Layout ( legend Box Infos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboxes Layout Result . plot Inner Bounds Without Legend Boxes ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwithout Title ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Constant Condition If ") ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG _ DRAW ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠSvg Rect Element ( without Title And Leg ends ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . stroke Color (). set ( Color . BLUE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . stroke Width (). set ( 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . fill Opacity (). set ( 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonMouse Move ( rect , Ġ" BLUE : Ġplot Ġwithout Ġtitle Ġand Ġleg ends : Ġ$ without Title And Leg ends ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( rect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġsubtract Ġleft Ġaxis Ġtitle Ġwidth ĊĠĠĠĠĠĠĠ Ġvar Ġgeom And Axis Ġ= Ġwithout Title And Leg ends ĊĠĠĠĠĠĠĠ Ġval Ġaxis Enabled Ġ= Ġ! contains Live Map ĊĠĠĠĠĠĠĠ Ġif Ġ( axis Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Axis Title Left ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Size Ġ= ĠPlot Layout Util . axis Title Dimensions ( axis Title Left ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthickness Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Size . y Ġ+ ĠPlot Layout Util . AXIS _ TITLE _ OUT ER _ M ARGIN Ġ+ ĠPlot Layout Util . AXIS _ TITLE _ INNER _ M ARGIN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeom And Axis Ġ= ĠDouble Rectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeom And Axis . left Ġ+ Ġthickness , Ġgeom And Axis . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeom And Axis . width Ġ- Ġthickness , Ġgeom And Axis . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsubtract Ġbottom Ġaxis Ġtitle Ġheight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Axis Title Bottom ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Size Ġ= ĠPlot Layout Util . axis Title Dimensions ( axis Title Bottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthickness Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Size . y Ġ+ ĠPlot Layout Util . AXIS _ TITLE _ OUT ER _ M ARGIN Ġ+ ĠPlot Layout Util . AXIS _ TITLE _ INNER _ M ARGIN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeom And Axis Ġ= ĠDouble Rectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeom And Axis . left , Ġgeom And Axis . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeom And Axis . width , Ġgeom And Axis . height Ġ- Ġthickness ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠLayout Ġplot Ġin ners ĊĠĠĠĠĠĠĠ Ġval Ġplot Info Ġ= Ġplot Layout . do Layout ( geom And Axis . dimension ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( plot Info . tiles . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġgeom Area Bounds Ġ= ĠPlot Layout Util . absolute Geom Bounds ( geom And Axis . origin , Ġplot Info ) ĊĠĠĠĠĠĠĠ Ġif Ġ( legend Theme . position (). is Overlay ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġput Ġ' overlay ' Ġin Ġ' geom ' Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlegend Boxes Layout Ġ= ĠLegend Boxes Layout ( geom Area Bounds , Ġlegend Theme ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboxes Layout Result Ġ= Ġlegend Boxes Layout . do Layout ( legend Box Infos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġtiles ĊĠĠĠĠĠĠĠ Ġval Ġtiles Origin Ġ= Ġgeom And Axis . origin ĊĠĠĠĠĠĠĠ Ġfor Ġ( tile Layout Info Ġin Ġplot Info . tiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtile Layers Index Ġ= Ġtile Layout Info . true Index Ċ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" plot Ġoffset : Ġ" Ġ+ Ġtile Info . plot Offset ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ĠĠĠĠ Ġbounds : Ġ" Ġ+ Ġtile Info . bounds ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" geom Ġbounds : Ġ" Ġ+ Ġtile Info . geom Bounds ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" clip Ġbounds : Ġ" Ġ+ Ġtile Info . clip Bounds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtile Ġ= Ġcreate Tile ( tiles Origin , Ġtile Layout Info , Ġtile Layers ( tile Layers Index ), Ġtheme ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġplot Origin Absolute Ġ= Ġtiles Origin . add ( tile Layout Info . plot Origin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtile . moveTo ( plot Origin Absolute ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( tile ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtile . live Map Figure ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive Map Fig ures Ġ= Ġlive Map Fig ures Ġ+ ĠlistOf ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeom Bounds Absolute Ġ= Ġtile Layout Info . geom Bounds . add ( plot Origin Absolute ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtooltip Bounds Ġ= ĠPlot Tooltip Bounds ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplacement Area Ġ= Ġgeom Bounds Absolute , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandling Area Ġ= Ġtile . geom Drawing Bounds . add ( geom Bounds Absolute . origin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinter actor ?. on Tile Added ( geom Bounds Absolute , Ġtooltip Bounds , Ġtile . target Loc ators ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Constant Condition If ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG _ DRAW ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠSvg Rect Element ( tooltip Bounds . handling Area ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . stroke Color (). set ( Color . OR ANGE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . stroke Width (). set ( 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . fill Opacity (). set ( 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( rect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Constant Condition If ") ĊĠĠĠĠĠĠĠ Ġif Ġ( DEBUG _ DRAW ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠSvg Rect Element ( geom Area Bounds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . stroke Color (). set ( Color . RED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . stroke Width (). set ( 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrect . fill Opacity (). set ( 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( rect ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġplot Ġtitle ĊĠĠĠĠĠĠĠ Ġif Ġ( has Title ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Label Ġ= ĠText Label ( title !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Label . add ClassName ( Style . PLOT _ TITLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Label . setHorizontal Anchor ( Horizontal Anchor . LEFT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Label . set Vertical Anchor ( Vertical Anchor . CENTER ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Size Ġ= ĠPlot Layout Util . title Dimensions ( title ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtitle Bounds Ġ= ĠDouble Rectangle ( geom Area Bounds . origin . x , Ġ 0 . 0 , Ġtitle Size . x , Ġtitle Size . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Label . moveTo ( Double Vector ( title Bounds . left , Ġtitle Bounds . center . y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( title Label ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" Constant Condition If ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( DEBUG _ DRAW ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrect Ġ= ĠSvg Rect Element ( title Bounds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . stroke Color (). set ( Color . BLUE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . stroke Width (). set ( 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrect . fill Opacity (). set ( 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( rect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġaxis Ġtitles ĊĠĠĠĠĠĠĠ Ġif Ġ( axis Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Axis Title Left ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Axis Title ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaxis Title Left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . LEFT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwithout Title And Leg ends , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeom Area Bounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Axis Title Bottom ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Axis Title ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaxis Title Bottom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrientation . BOTTOM , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwithout Title And Leg ends , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgeom Area Bounds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġleg ends ĊĠĠĠĠĠĠĠ Ġif Ġ( boxes Layout Result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( box With Location Ġin Ġboxes Layout Result . box With Location List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlegend Box Ġ= Ġbox With Location . legend Box . create Legend Box () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlegend Box . moveTo ( box With Location . location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( legend Box ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠPort able Logging . logger ( Plot Svg Component :: class ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEF _ PLOT _ SIZE Ġ= ĠDouble Vector ( 6 0 0 . 0 , Ġ 4 0 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDEBUG _ DRAW ING Ġ= ĠPL OT _ DEBUG _ DRAW ING ĊĠĠĠ Ġ} Ċ } Ċ