/* Ċ Ġ* Ġ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 . base . values . Pair Ċ import Ġjet brains . datal ore . plot . base . interact . Tip Layout Hint Ċ import Ġjet brains . datal ore . plot . builder . tooltip . layout . LayoutManager . Position ed Tooltip Ċ import Ġkotlin . math . PI Ċ import Ġkotlin . math . cos Ċ import Ġkotlin . math . sin Ċ Ċ internal Ġclass ĠVertical Tooltip Rot ating Expand er ( private Ġval Ġvertical Space : Ġjet brains . datal ore . plot . builder . interact . Math Util . Double Range , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġhorizontal Space : Ġjet brains . datal ore . plot . builder . interact . Math Util . Double Range ) Ġ{ ĊĊĠĠĠ Ġfun Ġfix Over lapping ( tooltip s : ĠList < Position ed Tooltip >, Ġrestrictions : ĠList < Double Rectangle >): ĠList < Position ed Tooltip > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ< tooltip Ġindex , Ġtooltip Ġcoord > ĊĠĠĠĠĠĠĠ Ġval Ġexpanded Positions Ġ= ĠArrayList < Pair < Int , ĠDouble Vector >>() ĊĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġtooltip s . size ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtooltip Ġ= Ġtooltip s [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intersect s Any ( tooltip . rect (), Ġrestrictions )) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrestrictions With St ems Ġ= ĠArrayList ( re strictions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestrictions With St ems . add ( Double Rectangle ( tooltip . stem Coord , ĠPOINT _ RE STRI CTION _ SIZE )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Placement Ġ= Ġfind Valid Candidate ( getC andidates ( tooltip ), Ġrestrictions With St ems ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Placement Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Positions . add ( Pair ( i , Ġtooltip . tooltip Coord )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Positions . add ( Pair ( i , Ġnew Placement . origin )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded Positions . add ( Pair ( i , Ġtooltip . tooltip Coord )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġseparated Tooltip s Ġ= ĠArrayList < Position ed Tooltip >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( expanded Position Ġin Ġexpanded Positions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition ed Tooltip Ġ= Ġtooltip s [ expanded Position . first ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseparated Tooltip s . add ( position ed Tooltip . moveTo ( expanded Position . second )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġseparated Tooltip s ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetC andidates ( position ed Tooltip : ĠPosition ed Tooltip ): ĠList < Double Rectangle > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtooltip Rotation Helper Ġ= ĠTooltip Rotation Helper ( position ed Tooltip ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcandidates Ġ= ĠArrayList < Double Rectangle >() ĊĊĠĠĠĠĠĠĠ Ġ// ĠInit Ġbetter Ġpositions Ġfirst ĊĠĠĠĠĠĠĠ Ġcandidates . add ( tooltip Rotation Helper . rotate ( 1 . 0 Ġ/ Ġ 2 . 0 Ġ* ĠPI )) ĊĠĠĠĠĠĠĠ Ġcandidates . add ( tooltip Rotation Helper . rotate ( 3 . 0 Ġ/ Ġ 2 . 0 Ġ* ĠPI )) ĊĠĠĠĠĠĠĠ Ġcandidates . add ( tooltip Rotation Helper . rotate ( 0 . 0 )) ĊĠĠĠĠĠĠĠ Ġcandidates . add ( tooltip Rotation Helper . rotate ( PI )) ĊĊĠĠĠĠĠĠĠ Ġvar Ġalpha Ġ= ĠPI Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< ĠS ECT OR _ COUNT ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alpha Ġ> ĠPI ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ-= ĠPI ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcandidates . add ( tooltip Rotation Helper . rotate ( alpha )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ+= ĠS ECT OR _ ANGLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcandidates ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġintersect s Any ( rect : ĠDouble Rectangle , Ġrestrictions : ĠList < Double Rectangle >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( restriction Ġin Ġrestrictions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rect . intersect s ( restriction )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Valid Candidate ( candidates : ĠList < Double Rectangle >, Ġrestrictions : ĠList < Double Rectangle >): ĠDouble Rectangle ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( candidate Ġin Ġcandidates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( intersect s Any ( candidate , Ġrestrictions )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! jetbrains . datal ore . plot . builder . interact . Math Util . Double Range . with Start And Length ( candidate . origin . y , Ġcandidate . dimension . y ). inside ( vertical Space )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! jetbrains . datal ore . plot . builder . interact . Math Util . Double Range . with Start And Length ( candidate . origin . x , Ġcandidate . dimension . x ). inside ( horizontal Space )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcandidate ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠTooltip Rotation Helper ( position ed Tooltip : ĠPosition ed Tooltip ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Attach To Tooltip s Top Offset : ĠDouble Vector ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Attach To Tooltip s Bottom Offset : ĠDouble Vector ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Attach To Tooltip s Left Offset : ĠDouble Vector ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Attach To Tooltip s Right Offset : ĠDouble Vector ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Tooltip Size : ĠDouble Vector Ġ= Ġposition ed Tooltip . tooltip Size ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Target Coord : ĠDouble Vector Ġ= Ġposition ed Tooltip . stem Coord ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmiddle X Ġ= Ġmy Tooltip Size . x Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmiddle Y Ġ= Ġmy Tooltip Size . y Ġ/ Ġ 2 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Attach To Tooltip s Top Offset Ġ= ĠDouble Vector (- middle X , Ġ 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Attach To Tooltip s Bottom Offset Ġ= ĠDouble Vector (- middle X , Ġ- my Tooltip Size . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Attach To Tooltip s Left Offset Ġ= ĠDouble Vector ( 0 . 0 , Ġmiddle Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Attach To Tooltip s Right Offset Ġ= ĠDouble Vector (- my Tooltip Size . x , Ġmiddle Y ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġrotate ( alpha : ĠDouble ): ĠDouble Rectangle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġr Ġ= ĠTip Layout Hint . Stem Length . NORMAL . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Attachment Coord Ġ= ĠDouble Vector ( r Ġ* Ġcos ( alpha ), Ġr Ġ* Ġsin ( alpha )). add ( my Target Coord ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Tooltip Coord Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTE M _ TO _ BOTTOM _ SIDE _ ANGLE _ RANGE . contains ( alpha ) Ġ-> Ġnew Attachment Coord . add ( my Attach To Tooltip s Bottom Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTE M _ TO _ TOP _ SIDE _ ANGLE _ RANGE . contains ( alpha ) Ġ-> Ġnew Attachment Coord . add ( my Attach To Tooltip s Top Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTE M _ TO _ LEFT _ SIDE _ ANGLE _ RANGE . contains ( alpha ) Ġ-> Ġnew Attachment Coord . add ( my Attach To Tooltip s Left Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTE M _ TO _ RIGHT _ SIDE _ ANGLE _ RANGE . contains ( alpha ) Ġ-> Ġnew Attachment Coord . add ( my Attach To Tooltip s Right Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDouble Rectangle ( new Tooltip Coord , Ġmy Tooltip Size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTE M _ TO _ LEFT _ SIDE _ ANGLE _ RANGE Ġ= Ġjet brains . datal ore . plot . builder . interact . Math Util . Double Range . with Start And End (- 1 . 0 Ġ/ Ġ 4 . 0 Ġ* ĠPI , Ġ 1 . 0 Ġ/ Ġ 4 . 0 Ġ* ĠPI ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTE M _ TO _ BOTTOM _ SIDE _ ANGLE _ RANGE Ġ= Ġjet brains . datal ore . plot . builder . interact . Math Util . Double Range . with Start And End ( 1 . 0 Ġ/ Ġ 4 . 0 Ġ* ĠPI , Ġ 3 . 0 Ġ/ Ġ 4 . 0 Ġ* ĠPI ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTE M _ TO _ RIGHT _ SIDE _ ANGLE _ RANGE Ġ= Ġjet brains . datal ore . plot . builder . interact . Math Util . Double Range . with Start And End ( 3 . 0 Ġ/ Ġ 4 . 0 Ġ* ĠPI , Ġ 5 . 0 Ġ/ Ġ 4 . 0 Ġ* ĠPI ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTE M _ TO _ TOP _ SIDE _ ANGLE _ RANGE Ġ= Ġjet brains . datal ore . plot . builder . interact . Math Util . Double Range . with Start And End ( 5 . 0 Ġ/ Ġ 4 . 0 Ġ* ĠPI , Ġ 7 . 0 Ġ/ Ġ 4 . 0 Ġ* ĠPI ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠS ECT OR _ COUNT Ġ= Ġ 3 6 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠS ECT OR _ ANGLE Ġ= ĠPI Ġ* Ġ 2 Ġ/ ĠS ECT OR _ COUNT ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPOINT _ RE STRI CTION _ SIZE Ġ= ĠDouble Vector ( 1 . 0 , Ġ 1 . 0 ) ĊĠĠĠ Ġ} Ċ } Ċ