package Ġpw . bin om . ui Ċ Ċ import Ġm og ot . EventDispatcher Ċ import Ġpw . bin om . Mouse Listener Impl Ċ import Ġjava . awt .* Ċ import Ġjava . awt . event . MouseEvent Ċ import Ġjavax . swing . Icon Ċ import Ġjavax . swing . J Component Ċ import Ġkotlin . math . floor Ċ import Ġkotlin . math . round ToInt Ċ Ċ class ĠAn imate Property View Ġ: ĠJ Component () Ġ{ ĊĊĠĠĠ Ġprivate Ġval ĠbackgroundColor Ġ= ĠColor ( 8 3 , Ġ 8 3 , Ġ 8 3 ) ĊĠĠĠ Ġprivate Ġval Ġtime Lines Separator Color Ġ= ĠColor ( 6 2 , Ġ 6 2 , Ġ 6 2 ) ĊĠĠĠ Ġprivate Ġval Ġframe Line Color Ġ= ĠColor ( 9 5 , Ġ 9 5 , Ġ 9 5 ) ĊĠĠĠ Ġprivate Ġval Ġback light Node Color Ġ= ĠColor ( 2 1 2 , Ġ 5 6 , Ġ 0 , Ġ 1 2 7 ) ĊĠĠĠ Ġprivate Ġval Ġselected Color Ġ= ĠColor ( 3 8 , Ġ 1 3 0 , Ġ 2 3 5 ) ĊĊĠĠĠ Ġinterface ĠLine Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext : ĠString ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠNode Ġ: ĠLine Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġicon : ĠIcon ? ĊĠĠĠĠĠĠĠ Ġvar Ġvisible : ĠBoolean ĊĠĠĠĠĠĠĠ Ġvar Ġlock : ĠBoolean ĊĠĠĠĠĠĠĠ Ġval Ġproperties : ĠList < Property > ĊĠĠĠĠĠĠĠ Ġfun Ġremove ( property : ĠProperty ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠProperty Ġ: ĠLine Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlock : ĠBoolean ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġback light Nodes Ġ= ĠHashSet < Node >() ĊĊĠĠĠ Ġinterface ĠModel Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnodes : ĠList < Node > ĊĠĠĠĠĠĠĠ Ġfun Ġremove ( node : ĠNode ) ĊĠĠĠĠĠĠĠ Ġfun Ġproperty ( index : ĠInt ): ĠLine ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnodes . forEach Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . properties . forEach Ġ{ Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġproperty ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġmodel : ĠModel ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrep aint () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġ_ selected Lines Ġ= ĠHashSet < Line >() ĊĠĠĠ Ġval Ġselected Lines : ĠSet < Line > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ selected Lines ĊĊĠĠĠ Ġprivate Ġval Ġ_ selected Ġ= ĠHashSet < Int >() ĊĠĠĠ Ġval Ġselected : ĠSet < Int > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ selected ĊĊĠĠĠ Ġfun Ġadd Select ( index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġmodel Ġ?: Ġthrow ĠIllegalStateException (" Model Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġval Ġprop Ġ= Ġmodel . property ( index ) Ġ?: Ġthrow ĠIllegalStateException (" Can 't Ġfind Ġproperty Ġ#$ index ") ĊĠĠĠĠĠĠĠ Ġ_ selected Lines Ġ+= Ġprop ĊĠĠĠĠĠĠĠ Ġ_ selected Ġ+= Ġindex ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Select () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ selected Lines . clear () ĊĠĠĠĠĠĠĠ Ġ_ selected . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġframe Line Height : ĠFloat Ġ= Ġ 2 0 f ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ<= Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrep aint () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġscroll Y Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" scroll X Ġmust Ġbe Ġmore Ġor Ġequal Ġthan Ġ 0 . ĠCurrent Ġvalue Ġis Ġ$ value ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrep aint () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġzero Dimension Ġ= ĠDimension ( 0 , Ġ 0 ) ĊĠĠĠ Ġprivate Ġval Ġpreferred Dimension Ġ= ĠDimension ( 0 , Ġ 0 ) ĊĊĠĠĠ Ġoverride Ġfun Ġget PreferredSize (): ĠDimension Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġmodel Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzero Dimension . setSize ( 1 0 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġzero Dimension ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġline Count Ġ= Ġmodel . nodes . sum By Ġ{ Ġit . properties . size Ġ+ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġpreferred Dimension . setSize ( 1 0 0 , Ġ( time Height Ġ+ Ġline Count Ġ* Ġframe Line Height Ġ+ Ġframe Line Height Ġ* Ġ 0 . 5 f ). round ToInt ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġpreferred Dimension ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġtime Height Ġ= Ġ 3 0 ĊĠĠĠ Ġprivate Ġval Ġfont 2 Ġ= ĠFont (" Arial ", ĠFont . BOLD , Ġ 9 ) ĊĠĠĠ Ġval Ġselected Property ChangeEvent Ġ= ĠEvent Dispatcher () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Mouse Listener ( object Ġ: ĠMouse Listener Impl Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmouse Released ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġmodel Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġfloor (( e . y Ġ- Ġtime Height Ġ+ Ġscroll Y ). toFloat () Ġ/ Ġframe Line Height ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprop Ġ= Ġmodel . property ( index ) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! e . is Shift Down ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Select () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prop Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Select ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Property ChangeEvent . dispatch () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpaint ( g : ĠGraphics ) Ġ{ ĊĠĠĠĠĠĠĠ Ġg Ġas ĠGraphics 2 D ĊĠĠĠĠĠĠĠ Ġval Ġfont Height Ġ= Ġg . getFont Metrics ( font 2 ). height ĊĠĠĠĠĠĠĠ Ġfun Ġline Y ( line : ĠInt ) Ġ= Ġtime Height Ġ+ Ġ( line Ġ* Ġframe Line Height ). round ToInt () Ġ- Ġscroll Y ĊĠĠĠĠĠĠĠ Ġg . color Ġ= ĠbackgroundColor ĊĠĠĠĠĠĠĠ Ġg . fillRect ( 0 , Ġ 0 , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġmodel Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġline Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġg . font Ġ= Ġfont 2 ĊĊĠĠĠĠĠĠĠ Ġval Ġo val Size Ġ= Ġ 4 ĊĊĠĠĠĠĠĠĠ Ġmodel . nodes . forEach Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġin Ġselected Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= Ġselected Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . fillRect ( 0 , Ġline Y ( line ), Ġwidth , Ġframe Line Height . round ToInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġin Ġback light Nodes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= Ġback light Node Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . fillRect ( 0 , Ġline Y ( line ), Ġwidth , Ġframe Line Height . round ToInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . draw String ( node . text , Ġ 5 , Ġline Y ( line ) Ġ+ Ġfont Height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= Ġframe Line Color ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . draw Line ( 0 , Ġline Y ( line Ġ+ Ġ 1 ), Ġwidth , Ġline Y ( line Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġg . fill O val ( width Ġ- Ġo val Size Ġ- Ġ 1 0 , Ġ( 0 f Ġ+ Ġline Y ( line ) Ġ+ Ġframe Line Height Ġ* Ġ 0 . 5 Ġ- Ġo val Size Ġ* Ġ 0 . 5 f ). round ToInt (), Ġo val Size , Ġo val Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . properties . forEach Ġ{ Ġproperty Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property Ġin Ġselected Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= Ġselected Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . fillRect ( 0 , Ġline Y ( line ), Ġwidth , Ġframe Line Height . round ToInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= ĠColor . WHITE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . draw String ( property . text , Ġ 2 0 , Ġline Y ( line ) Ġ+ Ġfont Height ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= Ġframe Line Color ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . draw Line ( 0 , Ġline Y ( line Ġ+ Ġ 1 ), Ġwidth , Ġline Y ( line Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . color Ġ= ĠColor . BLACK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg . fill O val ( width Ġ- Ġo val Size Ġ- Ġ 1 0 , Ġ( 0 f Ġ+ Ġline Y ( line ) Ġ+ Ġframe Line Height Ġ* Ġ 0 . 5 Ġ- Ġo val Size Ġ* Ġ 0 . 5 f ). round ToInt (), Ġo val Size , Ġo val Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġg . color Ġ= ĠbackgroundColor ĊĠĠĠĠĠĠĠ Ġg . fillRect ( 0 , Ġ 0 , Ġwidth , Ġtime Height ) ĊĠĠĠĠĠĠĠ Ġg . color Ġ= Ġtime Lines Separator Color ĊĠĠĠĠĠĠĠ Ġg . draw Line ( 0 , Ġtime Height , Ġwidth , Ġtime Height ) ĊĠĠĠ Ġ} Ċ }