// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . util . animation . components Ċ Ċ import Ġcom . intellij . ui . JB Color Ċ import Ġcom . intellij . util . animation . E asing Ċ import Ġjava . awt .* Ċ import Ġjava . awt . event . Mouse Adapter Ċ import Ġjava . awt . event . MouseEvent Ċ import Ġjava . awt . geom . Cubic Curve 2 D Ċ import Ġjava . awt . geom . Point 2 D Ċ import Ġjavax . swing . J Component Ċ import Ġkotlin . properties . Deleg ates Ċ import Ġkotlin . reflect . K Property Ċ Ċ class ĠBe zier Painter ( x 1 : ĠDouble , Ġy 1 : ĠDouble , Ġx 2 : ĠDouble , Ġy 2 : ĠDouble ) Ġ: ĠJ Component () Ġ{ ĊĊĠ Ġprivate Ġval Ġcontrol Size Ġ= Ġ 1 0 ĊĠ Ġprivate Ġval Ġgrid Color Ġ= ĠJ B Color ( Color ( 0 xF 0 F 0 F 0 ), ĠColor ( 0 x 3 1 3 3 3 5 )) ĊĠ Ġvar Ġfirst ControlPoint : ĠPoint 2 D Ġby ĠDeleg ates . observable ( Point 2 D . Double ( x 1 , Ġy 1 ), Ġthis :: fire Events ) ĊĠ Ġvar Ġsecond ControlPoint : ĠPoint 2 D Ġby ĠDeleg ates . observable ( Point 2 D . Double ( x 2 , Ġy 2 ), Ġthis :: fire Events ) ĊĊĠ Ġprivate Ġfun Ġfire Events ( prop : ĠK Property <* >, ĠoldValue : ĠAny ?, ĠnewValue : ĠAny ?) Ġ{ ĊĠĠĠ Ġif Ġ( oldValue Ġ!= ĠnewValue ) Ġ{ ĊĠĠĠĠĠ Ġfire Property Change ( prop . name , ĠoldValue , ĠnewValue ) ĊĠĠĠĠĠ Ġrep aint () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġval Ġvalue Ġ= Ġobject Ġ: ĠMouse Adapter () Ġ{ ĊĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġmouse Drag ged ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpoint Ġ= Ġe . point ĊĠĠĠĠĠĠĠ Ġwhen Ġ( i ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġfirst ControlPoint Ġ= Ġfrom Screen XY ( point ) ĊĠĠĠĠĠĠĠĠĠĠ 2 Ġ-> Ġsecond ControlPoint Ġ= Ġfrom Screen XY ( point ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrep aint () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġoverride Ġfun Ġmouse Moved ( e : ĠMouseEvent ) Ġ= Ġwith Ġ( e . point Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġi Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis Ġintersect s Ġfirst ControlPoint Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġthis Ġintersect s Ġsecond ControlPoint Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= ĠCursor . get Pre defined Cursor ( Cursor . HAND _ CURSOR ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= ĠCursor . getDefault Cursor () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġprivate Ġin fix Ġfun ĠPoint . intersect s ( point : ĠPoint 2 D ) Ġ: ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġxy Ġ= Ġto Screen XY ( point ) ĊĠĠĠĠĠĠĠ Ġreturn Ġxy . x Ġ- Ġcontrol Size Ġ/ Ġ 2 Ġ<= Ġx Ġ&& Ġx Ġ<= Ġxy . x Ġ+ Ġcontrol Size Ġ/ Ġ 2 Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġxy . y Ġ- Ġcontrol Size Ġ/ Ġ 2 Ġ<= Ġy Ġ&& Ġy Ġ<= Ġxy . y Ġ+ Ġcontrol Size Ġ/ Ġ 2 ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġadd Mouse Motion Listener ( value ) ĊĠĠĠ Ġadd Mouse Listener ( value ) ĊĠĠĠ Ġminimum Size Ġ= ĠDimension ( 3 0 0 , Ġ 3 0 0 ) ĊĠ Ġ} ĊĊĠ Ġfun Ġget E asing () Ġ: ĠE asing Ġ= ĠE asing . bezier ( first ControlPoint . x , Ġfirst ControlPoint . y , Ġsecond ControlPoint . x , Ġsecond ControlPoint . y ) ĊĊĠ Ġprivate Ġfun Ġto Screen XY ( point : ĠPoint 2 D ) Ġ: ĠPoint Ġ= Ġvisible Rect . let Ġ{ Ġb Ġ-> ĊĠĠĠ Ġval Ġin sets Ġ= Ġin sets ĊĠĠĠ Ġval Ġwidth Ġ= Ġb . width Ġ- Ġ( in sets . left Ġ+ Ġin sets . right ) ĊĠĠĠ Ġval Ġheight Ġ= Ġb . height Ġ- Ġ( in sets . top Ġ+ Ġin sets . bottom ) ĊĠĠĠ Ġreturn ĠPoint (( point . x Ġ* Ġwidth Ġ+ Ġin sets . left Ġ+ Ġb . x ). toInt (), Ġheight Ġ- Ġ( point . y Ġ* Ġheight ). toInt () Ġ+ Ġin sets . top Ġ+ Ġb . y ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfrom Screen XY ( point : ĠPoint ) Ġ: ĠPoint 2 D . Double Ġ= Ġvisible Rect . let Ġ{ Ġb Ġ-> ĊĠĠĠ Ġval Ġin sets Ġ= Ġin sets ĊĠĠĠ Ġval Ġleft Ġ= Ġin sets . left Ġ+ Ġb . x ĊĠĠĠ Ġval Ġtop Ġ= Ġin sets . top Ġ+ Ġb . y ĊĠĠĠ Ġval Ġwidth Ġ= Ġb . width Ġ- Ġ( in sets . left Ġ+ Ġin sets . right ) ĊĠĠĠ Ġval Ġheight Ġ= Ġb . height Ġ- Ġ( in sets . top Ġ+ Ġin sets . bottom ) ĊĠĠĠ Ġval Ġx Ġ= Ġ( min Of ( max Of (- left , Ġpoint . x Ġ- Ġleft ), Ġb . width Ġ- Ġleft ). toDouble ()) Ġ/ Ġwidth ĊĠĠĠ Ġval Ġy Ġ= Ġ( min Of ( max Of (- top , Ġpoint . y Ġ- Ġtop ), Ġb . height Ġ- Ġtop ). toDouble ()) Ġ/ Ġheight ĊĠĠĠ Ġreturn ĠPoint 2 D . Double ( x , Ġ 1 . 0 Ġ- Ġy ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġpaint Component ( g : ĠGraphics ) Ġ{ ĊĠĠĠ Ġval Ġbounds Ġ= Ġvisible Rect ĊĠĠĠ Ġval Ġin sets Ġ= Ġin sets ĊĠĠĠ Ġval Ġx Ġ= Ġbounds . x Ġ+ Ġin sets . left ĊĠĠĠ Ġval Ġy Ġ= Ġbounds . y Ġ+ Ġin sets . top ĊĠĠĠ Ġval Ġwidth Ġ= Ġbounds . width Ġ- Ġ( in sets . left Ġ+ Ġin sets . right ) ĊĠĠĠ Ġval Ġheight Ġ= Ġbounds . height Ġ- Ġ( in sets . top Ġ+ Ġin sets . bottom ) ĊĠĠĠ Ġval Ġg 2 d Ġ= Ġg . create () Ġas ĠGraphics 2 D ĊĊĠĠĠ Ġg 2 d . set Rendering Hint ( Rendering Hints . KEY _ ANTI ALIAS ING , ĠRendering Hints . VALUE _ ANTI ALIAS _ ON ) ĊĠĠĠ Ġg 2 d . set Rendering Hint ( Rendering Hints . KEY _ RENDER ING , ĠRendering Hints . VALUE _ RENDER _ SPEED ) ĊĠĠĠ Ġg 2 d . set Rendering Hint ( Rendering Hints . KEY _ ST RO KE _ CONTROL , ĠRendering Hints . VALUE _ ST RO KE _ PURE ) ĊĊĠĠĠ Ġg 2 d . color Ġ= ĠJ B Color . background () ĊĠĠĠ Ġg 2 d . fillRect ( 0 , Ġ 0 , Ġbounds . width , Ġbounds . height ) ĊĊĠĠĠ Ġg 2 d . color Ġ= Ġgrid Color ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 4 ) Ġ{ ĊĠĠĠĠĠ Ġg 2 d . draw Line ( x Ġ+ Ġwidth Ġ* Ġi Ġ/ Ġ 4 , Ġy , Ġx Ġ+ Ġwidth Ġ* Ġi Ġ/ Ġ 4 , Ġy Ġ+ Ġheight ) ĊĠĠĠĠĠ Ġg 2 d . draw Line ( x , y Ġ+ Ġheight Ġ* Ġi Ġ/ Ġ 4 , Ġx Ġ+ Ġwidth , Ġy Ġ+ Ġheight Ġ* Ġi Ġ/ Ġ 4 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġ( x 0 , Ġy 0 ) Ġ= Ġto Screen XY ( Point 2 D . Double ( 0 . 0 , Ġ 0 . 0 )) ĊĠĠĠ Ġval Ġ( x 1 , Ġy 1 ) Ġ= Ġto Screen XY ( first ControlPoint ) ĊĠĠĠ Ġval Ġ( x 2 , Ġy 2 ) Ġ= Ġto Screen XY ( second ControlPoint ) ĊĠĠĠ Ġval Ġ( x 3 , Ġy 3 ) Ġ= Ġto Screen XY ( Point 2 D . Double ( 1 . 0 , Ġ 1 . 0 )) ĊĊĠĠĠ Ġval Ġbez Ġ= ĠC ubic Curve 2 D . Double ( x 0 , Ġy 0 , Ġx 1 , Ġy 1 , Ġx 2 , Ġy 2 , Ġx 3 , Ġy 3 ) ĊĊĠĠĠ Ġg 2 d . color Ġ= ĠJ B Color . foreground () ĊĠĠĠ Ġg 2 d . stroke Ġ= ĠBasic Stroke ( 2 f ) ĊĠĠĠ Ġg 2 d . draw ( be z ) ĊĠĠĠ Ġg 2 d . stroke Ġ= ĠBasic Stroke ( 1 f ) ĊĠĠĠ Ġg 2 d . color Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġis Enabled Ġ-> ĠColor ( 1 5 1 , Ġ 1 1 8 , Ġ 1 6 9 ) ĊĠĠĠĠĠ ĠJ B Color . is B right () Ġ-> ĠJ B Color . LIGHT _ GRAY ĊĠĠĠĠĠ Ġelse Ġ-> ĠJ B Color . GRAY ĊĠĠĠ Ġ} ĊĠĠĠ Ġg 2 d . fill O val ( x 1 . toInt () Ġ- Ġcontrol Size Ġ/ Ġ 2 , Ġy 1 . toInt () Ġ- Ġcontrol Size Ġ/ Ġ 2 , Ġcontrol Size , Ġcontrol Size ) ĊĠĠĠ Ġg 2 d . draw Line ( x 0 . toInt (), Ġy 0 . toInt (), Ġx 1 . toInt (), Ġy 1 . toInt ()) ĊĠĠĠ Ġg 2 d . color Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġis Enabled Ġ-> ĠColor ( 2 0 8 , Ġ 1 6 7 , Ġ 8 ) ĊĠĠĠĠĠ ĠJ B Color . is B right () Ġ-> ĠJ B Color . LIGHT _ GRAY ĊĠĠĠĠĠ Ġelse Ġ-> ĠJ B Color . GRAY ĊĠĠĠ Ġ} ĊĠĠĠ Ġg 2 d . fill O val ( x 2 . toInt () Ġ- Ġcontrol Size Ġ/ Ġ 2 , Ġy 2 . toInt () Ġ- Ġcontrol Size Ġ/ Ġ 2 , Ġcontrol Size , Ġcontrol Size ) ĊĠĠĠ Ġg 2 d . draw Line ( x 2 . toInt (), Ġy 2 . toInt (), Ġx 3 . toInt (), Ġy 3 . toInt ()) ĊĠĠĠ Ġg 2 d . dispose () ĊĠ Ġ} ĊĊĠ Ġprivate Ġoperator Ġfun ĠPoint 2 D . component 1 () Ġ= Ġx ĊĠ Ġprivate Ġoperator Ġfun ĠPoint 2 D . component 2 () Ġ= Ġy Ċ }