/* Ċ Ġ* Ġ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 . tooltip . layout Ċ Ċ import Ġjet brains . datal ore . base . geometry . Double Rectangle Ċ import Ġjet brains . datal ore . base . geometry . Double Vector Ċ import Ġjet brains . datal ore . plot . base . interact . Tip Layout Hint . Kind Ċ import Ġjet brains . datal ore . plot . base . interact . Tip Layout Hint . Kind .* Ċ import Ġjet brains . datal ore . plot . builder . guide . Tooltip Anchor Ċ import Ġjet brains . datal ore . plot . builder . interact . Math Util . Double Range Ċ import Ġjet brains . datal ore . plot . builder . interact . Tooltip Spec Ċ import Ġjet brains . datal ore . plot . builder . presentation . Defaults . Common . Tooltip . M ARGIN _ B ETWEEN _ TOOL TI PS Ċ import Ġjet brains . datal ore . plot . builder . tooltip . Tooltip Box Ċ import Ġjet brains . datal ore . plot . builder . tooltip . layout . LayoutManager . Vertical Alignment . BOTTOM Ċ import Ġjet brains . datal ore . plot . builder . tooltip . layout . LayoutManager . Vertical Alignment . TOP Ċ import Ġkotlin . math . min Ċ Ċ class ĠLayout Manager ( ĊĠĠĠ Ġprivate Ġval Ġmy Viewport : ĠDouble Rectangle , ĊĠĠĠ Ġprivate Ġval Ġmy Preferred Horizontal Alignment : ĠHorizontal Alignment , ĊĠĠĠ Ġprivate Ġval Ġmy Tooltip Anchor : ĠTooltip Anchor Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmy Horizontal Space : ĠDouble Range Ġ= ĠDouble Range . with Start And End ( my Viewport . left , Ġmy Viewport . right ) ĊĠĠĠ Ġprivate Ġvar Ġmy Vertical Space : ĠDouble Range Ġ= ĠDouble Range . with Start And End ( 0 . 0 , Ġ 0 . 0 ) ĊĠĠĠ Ġprivate Ġvar Ġmy Cursor Coord : ĠDouble Vector Ġ= ĠDouble Vector . ZERO ĊĠĠĠ Ġprivate Ġvar Ġmy Horizontal Geom Space Ġ= ĠDouble Range . with Start And End ( my Viewport . left , Ġmy Viewport . right ) ĊĠĠĠ Ġprivate Ġvar Ġmy Vertical Geom Space Ġ= ĠDouble Range . with Start And End ( my Viewport . top , Ġmy Viewport . bottom ) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmy Vertical Alignment Resolver : ĠVertical Alignment Resolver ĊĊĠĠĠ Ġfun Ġarrange ( tooltip s : ĠList < Measured Tooltip >, Ġcursor Coord : ĠDouble Vector , Ġgeom Bounds : ĠDouble Rectangle ?): ĠList < Position ed Tooltip > Ġ{ ĊĠĠĠĠĠĠĠ Ġmy Cursor Coord Ġ= Ġcursor Coord ĊĠĠĠĠĠĠĠ Ġmy Vertical Space Ġ= ĠDouble Range . with Start And End ( my Viewport . top , Ġmy Viewport . bottom ) ĊĠĠĠĠĠĠĠ Ġmy Vertical Alignment Resolver Ġ= ĠVertical Alignment Resolver ( my Vertical Space ) ĊĠĠĠĠĠĠĠ Ġif Ġ( geom Bounds Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Horizontal Geom Space Ġ= ĠDouble Range . with Start And Length ( geom Bounds . origin . x , Ġgeom Bounds . dimension . x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Vertical Geom Space Ġ= ĠDouble Range . with Start And Length ( geom Bounds . origin . y , Ġgeom Bounds . dimension . y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdesired Position Ġ= ĠArrayList < Position ed Tooltip >() ĊĊĠĠĠĠĠĠĠ Ġ// Ġx - axis Ġtooltip ĊĠĠĠĠĠĠĠ Ġtooltip s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . hint Kind Ġ=== ĠX _ AXIS _ TOOL TIP Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġx Axis Tooltip Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition ed Tooltip Ġ= Ġcalculate Vertical Tooltip Position ( xAxis Tooltip , ĠBOTTOM , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesired Position . add ( position ed Tooltip ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLimit Ġavailable Ġvertical Ġspace Ġfor Ġother Ġtooltip s Ġby Ġthe Ġaxis Ġor Ġtop Ġside Ġof Ġthe Ġtooltip Ġ( if Ġnot Ġfit Ġunder Ġthe Ġaxis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Vertical Space Ġ= ĠDouble Range . with Start And End ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Viewport . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition ed Tooltip . stem Coord . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġposition ed Tooltip . top ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Vertical Alignment Resolver Ġ= ĠVertical Alignment Resolver ( my Vertical Space ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġy - axis Ġtooltip ĊĠĠĠĠĠĠĠ Ġtooltip s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . hint Kind Ġ=== ĠY _ AXIS _ TOOL TIP Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġdesired Position . add ( calculate Horizontal Tooltip Position ( it )) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġcorner Ġtooltip s ĊĠĠĠĠĠĠĠ Ġtooltip s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter (:: is Corner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġdesired Position Ġ+= Ġcalculate Corner Tooltip s Position ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġall Ġother Ġtooltip s Ġ( axis Ġand Ġcorner Ġtooltip s Ġare Ġignored Ġin Ġthis Ġmethod ) ĊĠĠĠĠĠĠĠ Ġdesired Position Ġ+= Ġcalculate Data Tooltip s Position ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip s , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlimit Ġhorizontal Ġtooltip s Ġby Ġy - axis Ġtooltip s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdesired Position . select ( Y _ AXIS _ TOOL TIP ). map Ġ{ Ġit . rect () Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġre arrange Without Over lapping ( desired Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Data Tooltip s Position ( ĊĠĠĠĠĠĠĠ Ġtooltip s : ĠList < Measured Tooltip >, ĊĠĠĠĠĠĠĠ Ġrestrictions : ĠList < Double Rectangle > ĊĠĠĠ Ġ): ĠList < Position ed Tooltip > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplacement List Ġ= ĠArrayList < Position ed Tooltip >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( meas ured Tooltip Ġin Ġtooltip s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Corner ( meas ured Tooltip )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCor ner Ġtooltip s Ġshould Ġbe Ġprocessed Ġseparately Ġto Ġconfigure Ġcorner Ġspace . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( meas ured Tooltip . hint Kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV ERT ICAL _ TOOL TIP Ġ-> Ġplacement List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Vertical Tooltip Position ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasured Tooltip , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTOP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠH ORIZONTAL _ TOOL TIP Ġ-> Ġplacement List . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Horizontal Tooltip Position ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasured Tooltip , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestrictions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCUR SOR _ TOOL TIP Ġ-> Ġplacement List . add ( calculate Cursor Tooltip Position ( meas ured Tooltip )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX _ AXIS _ TOOL TIP Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠX _ AXIS Ġshould Ġbe Ġprocessed Ġseparately Ġto Ġconfigure Ġvertical Ġspace . ĠIf Ġprocess Ġaxis Ġtooltip Ġwith Ġnarrow ed Ġspace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY Ġcoords Ġwill Ġbe Ġmoved Ġtoo Ġfar Ġfrom Ġaxis . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠY _ AXIS _ TOOL TIP Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠY _ AXIS Ġshould Ġbe Ġprocessed Ġseparately Ġto Ġconfigure Ġhorizontal Ġspace . ĠIf Ġprocess Ġaxis Ġtooltip Ġwith Ġnarrow ed Ġspace ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠX Ġcoords Ġwill Ġbe Ġmoved Ġtoo Ġfar Ġfrom Ġaxis . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġplacement List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Corner Tooltip s Position ( corner Tooltip s : ĠList < Measured Tooltip >): ĠList < Position ed Tooltip > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġplacement List Ġ= ĠArrayList < Position ed Tooltip >() ĊĊĠĠĠĠĠĠĠ Ġval Ġtooltip s Height Ġ= Ġcorner Tooltip s . sum By Double Ġ{ Ġit . size . y Ġ} Ġ+ ĠM ARGIN _ B ETWEEN _ TOOL TI PS Ġ* Ġcorner Tooltip s . size ĊĠĠĠĠĠĠĠ Ġval Ġvertical Tooltip Range Ġ= Ġwhen Ġ( my Tooltip Anchor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// top ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTooltip Anchor . TOP _ LEFT , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTooltip Anchor . TOP _ RIGHT Ġ-> Ġright Aligned ( my Vertical Geom Space . start (), Ġtooltip s Height , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġleft Aligned ( my Vertical Geom Space . end (), Ġtooltip s Height , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġtooltip Y Ġ= Ġvertical Tooltip Range . start () ĊĠĠĠĠĠĠĠ Ġcorner Tooltip s . forEach Ġ{ Ġtooltip Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition ed Tooltip Ġ= Ġcalculate Plot Corner Tooltip Position ( tooltip , Ġtooltip Y , Ġvertical Tooltip Range ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplacement List . add ( position ed Tooltip ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Y Ġ+= Ġposition ed Tooltip . height Ġ+ ĠM ARGIN _ B ETWEEN _ TOOL TI PS ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġplacement List ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġre arrange Without Over lapping ( ĊĠĠĠĠĠĠĠ Ġtooltip s : ĠList < Position ed Tooltip > ĊĠĠĠ Ġ): ĠList < Position ed Tooltip > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( tooltip s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtooltip s ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrestrictions Ġ= ĠArrayList < Double Rectangle >() ĊĠĠĠĠĠĠĠ Ġval Ġseparated Tooltip s Ġ= ĠArrayList < Position ed Tooltip >() ĊĊĠĠĠĠĠĠĠ Ġfun Ġfix ate ( position ed Tooltip : ĠPosition ed Tooltip ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseparated Tooltip s . add ( position ed Tooltip ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrestrictions . add ( position ed Tooltip . rect ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġadd Ġtooltip s Ġwith Ġpre - arrange d Ġposition ĊĠĠĠĠĠĠĠ Ġtooltip s . select ( CURSOR _ TOOL TIP , ĠX _ AXIS _ TOOL TIP , ĠY _ AXIS _ TOOL TIP ). forEach (:: fix ate ) ĊĠĠĠĠĠĠĠ Ġtooltip s . select Corner (). forEach (:: fix ate ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġtry Ġto Ġspace Ġout Ġother Ġtooltip s . ĊĠĠĠĠĠĠĠ Ġ// ĠOrder Ġmatters Ġ- Ġvertical Ġtooltip s Ġshould Ġbe Ġadded Ġlast , Ġbecause Ġit 's Ġeasier Ġto Ġspace Ġthem Ġout . ĊĠĠĠĠĠĠĠ Ġ// ĠInclude Ġover l apped Ġcorner Ġtooltip s . ĊĊĠĠĠĠĠĠĠ Ġtooltip s . select ( HORIZONTAL _ TOOL TIP ). with Over l apped ( tooltip s . select Corner ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ Ġhorizontal Tooltip s Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( horizontal Tooltip s . sum By Double ( Position ed Tooltip :: height ) Ġ< Ġmy Vertical Space . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHorizontal Tooltip Expand er ( my Vertical Space ). fix Over lapping ( horizontal Tooltip s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach (:: fix ate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Tooltip s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . stem Coord . y Ġ< Ġmy Cursor Coord . y Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. max By Ġ{ Ġit . stem Coord . y Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let (:: fix ate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtooltip s . select ( VERTICAL _ TOOL TIP ). with Over l apped ( tooltip s . select Corner ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVertical Tooltip Rot ating Expand er ( my Vertical Space , Ġmy Horizontal Space ). fix Over lapping ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestrictions ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach (:: fix ate ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġseparated Tooltip s ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Vertical Tooltip Position ( ĊĠĠĠĠĠĠĠ Ġmeasured Tooltip : ĠMe as ured Tooltip , ĊĠĠĠĠĠĠĠ Ġalignment : ĠVertical Alignment , ĊĠĠĠĠĠĠĠ Ġignore Cursor : ĠBoolean ĊĠĠĠ Ġ): ĠPosition ed Tooltip Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtooltip X Ġ= Ġcenter Inside Range ( meas ured Tooltip . hint Coord . x , Ġmeasured Tooltip . size . x , Ġmy Horizontal Space ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstem Y : ĠDouble ĊĠĠĠĠĠĠĠ Ġval Ġtooltip Y : ĠDouble ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Coord Y Ġ= Ġmeasured Tooltip . hint Coord . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstem Length Ġ= Ġmeasured Tooltip . stem Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Top Point Ġ= Ġtarget Coord Y Ġ- Ġmeasured Tooltip . hint Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Bottom Point Ġ= Ġtarget Coord Y Ġ+ Ġmeasured Tooltip . hint Radius ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtooltip Height Ġ= Ġmeasured Tooltip . size . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Tooltip Range Ġ= Ġleft Aligned ( target Top Point , Ġtooltip Height , Ġstem Length ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Tooltip Range Ġ= Ġright Aligned ( target Bottom Point , Ġtooltip Height , Ġstem Length ). let Ġ{ Ġbottom Tooltip Range Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbottom Ġrange Ġof Ġthe Ġaxis Ġtooltip Ġis Ġout Ġof Ġthe Ġvertical Ġspace Ġ=> Ġmove Ġit Ġto Ġthe Ġborder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( meas ured Tooltip . hint Kind Ġ== ĠX _ AXIS _ TOOL TIP Ġ&& Ġ! bottom Tooltip Range . inside ( my Vertical Space )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Aligned ( my Vertical Space . end (), Ġtooltip Height , Ġstem Length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Tooltip Range ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcursor Vertical Range Ġ= Ġif Ġ(! ignore Cursor Ġ&& Ġoverlap s Cursor Horizontal Range ( meas ured Tooltip , Ġtooltip X )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Range . with Start And Length ( my Cursor Coord . y , ĠCUR SOR _ DIMENSION . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEMPTY _ DOUBLE _ RANGE ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( my Vertical Alignment Resolver . resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Tooltip Range , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Tooltip Range , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalignment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Vertical Range ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ=== ĠTOP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Y Ġ= Ġtop Tooltip Range . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstem Y Ġ= Ġtarget Top Point ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Y Ġ= Ġbottom Tooltip Range . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstem Y Ġ= Ġtarget Bottom Point ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPosition ed Tooltip ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmeasured Tooltip Ġ= Ġmeasured Tooltip , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Coord Ġ= ĠDouble Vector ( tooltip X , Ġtooltip Y ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstem Coord Ġ= ĠDouble Vector ( meas ured Tooltip . hint Coord . x , Ġstem Y ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Horizontal Tooltip Position ( ĊĠĠĠĠĠĠĠ Ġmeasured Tooltip : ĠMe as ured Tooltip , ĊĠĠĠĠĠĠĠ Ġrestrictions : ĠList < Double Rectangle > Ġ= Ġempty List () ĊĠĠĠ Ġ): ĠPosition ed Tooltip Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtooltip Y Ġ= Ġcenter Inside Range ( meas ured Tooltip . hint Coord . y , Ġmeasured Tooltip . size . y , Ġmy Vertical Space ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtooltip X : ĠDouble ĊĠĠĠĠĠĠĠ Ġval Ġstem X : ĠDouble ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Coord X Ġ= Ġmeasured Tooltip . hint Coord . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtooltip Width Ġ= Ġmeasured Tooltip . size . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhint Size Ġ= Ġmeasured Tooltip . hint Radius ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstem Length Ġ= Ġmeasured Tooltip . stem Length ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmargin Ġ= Ġhint Size Ġ+ Ġstem Length ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Tooltip Placement Ġ= Ġleft Aligned ( target Coord X , Ġtooltip Width , Ġmargin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Tooltip Placement Ġ= Ġright Aligned ( target Coord X , Ġtooltip Width , Ġmargin ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġtooltip Ġshould Ġfit Ġin Ġhorizontal Ġspace Ġand Ġnot Ġintersect Ġrestrictions , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrestrictions Ġare Ġexpected Ġto Ġcontain Ġonly Ġy - axis Ġtooltip . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġchange Ġcan Fit Right Ġas Ġit Ġis Ġnot Ġaffected Ġby Ġrestrictions Ġ( as Ġlong Ġas Ġy - axis Ġis Ġon Ġthe Ġleft Ġside ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcan Fit Left Ġ= Ġleft Tooltip Placement . inside ( my Horizontal Space ) Ġ&& Ġrestrictions . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtooltip Rect Ġ= ĠDouble Rectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble Vector ( left Tooltip Placement . start (), Ġtooltip Y ), Ġmeasured Tooltip . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! it . intersect s ( tooltip Rect ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcan Fit Right Ġ= Ġright Tooltip Placement . inside ( my Horizontal Space ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasured Tooltip . hint Kind Ġ== ĠY _ AXIS _ TOOL TIP Ġ&& Ġ! can Fit Left Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmove Ġaxis Ġtooltip Ġto Ġthe Ġborder Ġif Ġit Ġdoesn 't Ġfit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip X Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstem X Ġ= Ġtarget Coord X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ!( can Fit Left Ġ|| Ġcan Fit Right ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip X Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstem X Ġ= Ġtarget Coord X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Preferred Horizontal Alignment Ġ== ĠHorizontal Alignment . LEFT Ġ&& Ġcan Fit Left Ġ|| Ġ! can Fit Right Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip X Ġ= Ġleft Tooltip Placement . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstem X Ġ= Ġtarget Coord X Ġ- Ġhint Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip X Ġ= Ġright Tooltip Placement . start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstem X Ġ= Ġtarget Coord X Ġ+ Ġhint Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstem Coord Ġ= ĠDouble Vector ( stem X , Ġmeasured Tooltip . hint Coord . y ) ĊĠĠĠĠĠĠĠ Ġval Ġtooltip Coord Ġ= ĠDouble Vector ( tooltip X , Ġtooltip Y ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPosition ed Tooltip ( meas ured Tooltip , Ġtooltip Coord , Ġstem Coord ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Cursor Tooltip Position ( meas ured Tooltip : ĠMe as ured Tooltip ): ĠPosition ed Tooltip Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtooltip X Ġ= Ġcenter Inside Range ( my Cursor Coord . x , Ġmeasured Tooltip . size . x , Ġmy Horizontal Space ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Coord Y Ġ= Ġmy Cursor Coord . y ĊĠĠĠĠĠĠĠ Ġval Ġtooltip Height Ġ= Ġmeasured Tooltip . size . y ĊĠĠĠĠĠĠĠ Ġval Ġvertical Margin Ġ= Ġmeasured Tooltip . stem Length ĊĊĠĠĠĠĠĠĠ Ġval Ġtop Tooltip Placement Ġ= Ġleft Aligned ( target Coord Y , Ġtooltip Height , Ġvertical Margin ) ĊĠĠĠĠĠĠĠ Ġval Ġbottom Tooltip Placement Ġ= Ġright Aligned ( target Coord Y , Ġtooltip Height , Ġvertical Margin ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtooltip Y Ġ= Ġif Ġ( top Tooltip Placement . inside ( my Vertical Space )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Tooltip Placement . start () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Tooltip Placement . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtooltip Coord Ġ= ĠDouble Vector ( tooltip X , Ġtooltip Y ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPosition ed Tooltip ( meas ured Tooltip , Ġtooltip Coord , Ġmy Cursor Coord ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Anchor X ( meas ured Tooltip : ĠMe as ured Tooltip , Ġhorizontal Alignment : ĠHorizontal Alignment ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( horizontal Alignment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHorizontal Alignment . RIGHT Ġ-> Ġmy Horizontal Geom Space . end () Ġ- Ġmeasured Tooltip . size . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġmy Horizontal Space . start () Ġ+ Ġmy Horizontal Geom Space . start () Ġ+ ĠM ARGIN _ B ETWEEN _ TOOL TI PS ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcalculate Plot Corner Tooltip Position ( ĊĠĠĠĠĠĠĠ Ġmeasured Tooltip : ĠMe as ured Tooltip , ĊĠĠĠĠĠĠĠ Ġtooltip Y : ĠDouble , ĊĠĠĠĠĠĠĠ Ġvertical Tooltip Range : ĠDouble Range ĊĠĠĠ Ġ): ĠPosition ed Tooltip Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġhorizontal Alignment Ġ= Ġwhen Ġ( my Tooltip Anchor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTooltip Anchor . TOP _ RIGHT , ĠTooltip Anchor . BOTTOM _ RIGHT Ġ-> ĠHorizontal Alignment . RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠHorizontal Alignment . LEFT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġtooltip X Ġ= Ġcalculate Anchor X ( meas ured Tooltip , Ġhorizontal Alignment ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcheck Ġposition Ġunder Ġcursor ĊĠĠĠĠĠĠĠ Ġval Ġis Overlap X Ġ= Ġoverlap s Cursor Horizontal Range ( meas ured Tooltip , Ġtooltip X ) ĊĠĠĠĠĠĠĠ Ġval Ġis Overlap Y Ġ= Ġoverlap s Cursor Vertical Range ( vertical Tooltip Range ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Overlap X Ġ&& Ġis Overlap Y ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip X Ġ= Ġcalculate Anchor X ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmeasured Tooltip , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhorizontal Alignment . in versed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġtooltip Coord Ġ= ĠDouble Vector ( tooltip X , Ġtooltip Y ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPosition ed Tooltip ( meas ured Tooltip , Ġtooltip Coord , Ġtooltip Coord ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġoverlap s Cursor Horizontal Range ( meas ured Tooltip : ĠMe as ured Tooltip , Ġtooltip X : ĠDouble ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhorizontal Tooltip Range Ġ= ĠDouble Range . with Start And Length ( tooltip X , Ġmeasured Tooltip . size . x ) ĊĠĠĠĠĠĠĠ Ġval Ġcursor Horizontal Range Ġ= ĠDouble Range . with Start And Length ( my Cursor Coord . x , ĠCUR SOR _ DIMENSION . x ) ĊĠĠĠĠĠĠĠ Ġreturn Ġhorizontal Tooltip Range . overlap s ( cursor Horizontal Range ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġoverlap s Cursor Vertical Range ( vertical Tooltip Range : ĠDouble Range ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcursor Vertical Range Ġ= ĠDouble Range . with Start And Length ( my Cursor Coord . y , ĠCUR SOR _ DIMENSION . y ) ĊĠĠĠĠĠĠĠ Ġreturn Ġvertical Tooltip Range . overlap s ( cursor Vertical Range ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġuse Corner Tooltip s (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmy Tooltip Anchor Ġ!= ĠTooltip Anchor . NONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Corner ( tooltip Spec : ĠTooltip Spec ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( use Corner Tooltip s ()) Ġ! tooltip Spec . is Out lier Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Corner ( tooltip : ĠMe as ured Tooltip ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Corner ( tooltip . tooltip Spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Corner ( tooltip : ĠPosition ed Tooltip ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġis Corner ( tooltip . tooltip Spec ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠList < Position ed Tooltip >. select Corner (): ĠList < Position ed Tooltip > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . filter (:: is Corner ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġenum Ġclass ĠVertical Alignment Ġ{ ĊĠĠĠĠĠĠĠ ĠTOP , ĊĠĠĠĠĠĠĠ ĠBOTTOM ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠHorizontal Alignment Ġ{ ĊĠĠĠĠĠĠĠ ĠLEFT , ĊĠĠĠĠĠĠĠ ĠRIGHT , ĊĠĠĠĠĠĠĠ ĠC ENTER ; ĊĊĠĠĠĠĠĠĠ Ġfun Ġin versed (): ĠHorizontal Alignment Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLEFT Ġ-> ĠRIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRIGHT Ġ-> ĠLEFT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC ENTER Ġ-> ĠC ENTER ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠPosition ed Tooltip Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtooltip Box : ĠTooltip Box ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġtooltip Size : ĠDouble Vector ĊĠĠĠĠĠĠĠ Ġval Ġtooltip Spec : ĠTooltip Spec ĊĠĠĠĠĠĠĠ Ġval Ġtooltip Coord : ĠDouble Vector ĊĠĠĠĠĠĠĠ Ġval Ġstem Coord : ĠDouble Vector ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġleft Ġget () Ġ= Ġtooltip Coord . x ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġtop Ġget () Ġ= Ġtooltip Coord . y ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġwidth Ġget () Ġ= Ġtooltip Size . x ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġheight Ġget () Ġ= Ġtooltip Size . y ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġbottom Ġget () Ġ= Ġtooltip Coord . y Ġ+ Ġheight ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġright Ġget () Ġ= Ġtooltip Coord . x Ġ+ Ġwidth ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġhint Kind Ġget () Ġ= Ġtooltip Spec . layout Hint . kind ĊĊĠĠĠĠĠĠĠ Ġinternal Ġconstructor ( meas ured Tooltip : ĠMe as ured Tooltip , Ġtooltip Coord : ĠDouble Vector , Ġstem Coord : ĠDouble Vector ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Spec Ġ= Ġmeasured Tooltip . tooltip Spec ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Size Ġ= Ġmeasured Tooltip . size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Box Ġ= Ġmeasured Tooltip . tooltip Box ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . tooltip Coord Ġ= Ġtooltip Coord ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . stem Coord Ġ= Ġstem Coord ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconstructor ( position ed Tooltip : ĠPosition ed Tooltip , Ġnew Tooltip Coord : ĠDouble Vector ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Spec Ġ= Ġposition ed Tooltip . tooltip Spec ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Size Ġ= Ġposition ed Tooltip . tooltip Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Box Ġ= Ġposition ed Tooltip . tooltip Box ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstem Coord Ġ= Ġposition ed Tooltip . stem Coord ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtooltip Coord Ġ= Ġnew Tooltip Coord ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġmove To ( new Tooltip Coord : ĠDouble Vector ): ĠPosition ed Tooltip Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPosition ed Tooltip ( this , Ġnew Tooltip Coord ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġrect (): ĠDouble Rectangle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDouble Rectangle ( tooltip Coord , Ġtooltip Size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMe as ured Tooltip ( ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġtooltip Spec : ĠTooltip Spec , ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġsize : ĠDouble Vector , ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġtooltip Box : ĠTooltip Box ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconstructor ( tooltip Spec : ĠTooltip Spec , Ġtooltip Box : ĠTooltip Box ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġthis ( tooltip Spec , Ġtooltip Box . content Rect . dimension , Ġtooltip Box ) ĊĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġhint Coord Ġget () Ġ= Ġtooltip Spec . layout Hint . coord !! ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġhint Kind Ġget () Ġ= Ġtooltip Spec . layout Hint . kind ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġhint Radius Ġget () Ġ= Ġtooltip Spec . layout Hint . object Radius ĊĠĠĠĠĠĠĠ Ġinternal Ġval Ġstem Length Ġget () Ġ= Ġtooltip Spec . layout Hint . stem Length . value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCUR SOR _ DIMENSION Ġ= ĠDouble Vector ( 1 0 . 0 , Ġ 1 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠEMPTY _ DOUBLE _ RANGE Ġ= ĠDouble Range . with Start And Length ( 0 . 0 , Ġ 0 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġmove Into Limit ( range : ĠDouble Range , Ġlimit : ĠDouble Range ): ĠDouble Range Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range . inside ( limit )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrange ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range . start () Ġ< Ġlimit . start ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrange . move ( limit . start () Ġ- Ġrange . start ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( range . end () Ġ> Ġlimit . end ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange . move ( limit . end () Ġ- Ġrange . end ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġrange ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcentered ( start : ĠDouble , Ġlength : ĠDouble ): ĠDouble Range Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDouble Range . with Start And Length ( start Ġ- Ġlength Ġ/ Ġ 2 , Ġlength ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġleft Aligned ( start : ĠDouble , Ġlength : ĠDouble , Ġmargin : ĠDouble ): ĠDouble Range Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDouble Range . with Start And Length ( start Ġ- Ġlength Ġ- Ġmargin , Ġlength ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġright Aligned ( start : ĠDouble , Ġlength : ĠDouble , Ġmargin : ĠDouble ): ĠDouble Range Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDouble Range . with Start And Length ( start Ġ+ Ġmargin , Ġlength ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcenter Inside Range ( position : ĠDouble , Ġsize : ĠDouble , Ġrange : ĠDouble Range ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmove Into Limit ( centered ( position , Ġsize ), Ġrange ). start () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠList < Position ed Tooltip >. select ( var arg Ġkinds : ĠKind ): ĠList < Position ed Tooltip > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . filter Ġ{ Ġkinds . contains ( it . hint Kind ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠList < Position ed Tooltip >. is Over l apped ( tooltip : ĠPosition ed Tooltip ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . find Ġ{ Ġit Ġ!= Ġtooltip Ġ&& Ġit . rect (). intersect s ( tooltip . rect ()) Ġ} Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠList < Position ed Tooltip >. with Over l apped ( tooltip s : ĠList < Position ed Tooltip >): ĠList < Position ed Tooltip > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġval Ġover l apped Ġ= Ġtooltip s . filter Ġ{ Ġtooltip Ġ-> Ġthis . is Over l apped ( tooltip ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis Ġ- Ġtooltip s Ġ+ Ġover l apped ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ