package Ġpw . bin om . scene Editor . animate Ċ Ċ import Ġcom . intellij . icons . All Icons Ċ import Ġcom . intellij . ide . util . Tree FileChooser Factory Ċ import Ġcom . intellij . internal . performance . current Latency Record Key Ċ import Ġcom . intellij . openapi . action System . Action Group Ċ import Ġcom . intellij . openapi . action System . An Action Ċ import Ġcom . intellij . openapi . action System . An ActionEvent Ċ import Ġcom . intellij . openapi . action System . impl . Action Toolbar Impl Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . ui . ComboBox Ċ import Ġcom . intellij . openapi . vfs . V fs Util Core Ċ import Ġcom . intellij . ui . One Pixel Splitter Ċ import Ġcom . intellij . ui . components . JB ScrollPane Ċ import Ġm og ot . Field Ċ import Ġm og ot . math . Vector 2 f Ċ import Ġm og ot . math . Vector 2 fc Ċ import Ġm og ot . math . Vector 3 f Ċ import Ġm og ot . math . Vector 3 fc Ċ import Ġpw . bin om . Mouse Listener Impl Ċ import Ġpw . bin om . scene Editor . Animation FileType Ċ import Ġpw . bin om . scene Editor . Node Service Ċ import Ġpw . bin om . scene Editor . Scene Editor Ċ import Ġpw . bin om . scene Editor . node Controller . Animate File Ċ import Ġpw . bin om . scene Editor . node Controller . Edit Animate Node Ċ import Ġpw . bin om . scene Editor . node Controller . getField Ċ import Ġpw . bin om . scene Editor . node Controller . getNode Ċ import Ġpw . bin om . scene Editor . properties . Panel Ċ import Ġpw . bin om . ui . Animate Frame View Ċ import Ġpw . bin om . ui . Animate Property View Ċ import Ġpw . bin om . ui . Inline Integer Editor Ċ import Ġpw . bin om . ui . Node Field Data Flavor Ċ import Ġpw . bin om . utils . relative Path Ċ import Ġjava . awt . Border Layout Ċ import Ġjava . awt . d nd .* Ċ import Ġjava . awt . event . MouseEvent Ċ import Ġjava . io . Closeable Ċ import Ġjavax . swing . ComboBox Model Ċ import Ġjavax . swing . event . List Data Event Ċ import Ġjavax . swing . event . List Data Listener Ċ Ċ private Ġfun Ġ< T > Ġempty Model 2 () Ġ= Ġobject Ġ: ĠCombo Box Model < T > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġset SelectedItem ( an Item : ĠAny ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ElementAt ( index : ĠInt ): ĠT ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġget SelectedItem (): ĠAny ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġget Size (): ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġadd List Data Listener ( l : ĠList Data Listener ?) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove List Data Listener ( l : ĠList Data Listener ?) Ġ{ ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġval Ġempty Model Ġ= Ġobject Ġ: ĠAn imate Property View . Model , ĠAn imate Frame View . Model Ġ{ ĊĠĠĠ Ġoverride Ġval Ġnodes : ĠList < Animate Property View . Node > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġempty List () ĊĊĠĠĠ Ġoverride Ġfun Ġremove ( node : ĠAn imate Property View . Node ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġframe Count : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 1 0 0 ĊĠĠĠ Ġoverride Ġval Ġframe InSeconds : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 6 0 ĊĠĠĠ Ġoverride Ġval Ġline Count : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ 0 ĊĊĠĠĠ Ġoverride Ġfun Ġline ( index : ĠInt ): ĠAn imate Frame View . Frame Line Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException () ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġclass ĠAdd Frame Line Drop Listener ( val Ġtab : ĠAn imate Tab ) Ġ: ĠDrop Target Listener Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġdrop Action Changed ( dt de : ĠDrop Target Drag Event ) Ġ{ ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdrop ( dt de : ĠDrop Target Drop Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġtab . animate Model Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġdt de . transfer able . get Transfer Data ( Node Field Data Flavor ) Ġas ĠList < Node Service . Field > ĊĠĠĠĠĠĠĠ Ġval Ġanim Node Ġ= Ġtab . editor . viewer . view . animate Node !! ĊĠĠĠĠĠĠĠ Ġfields . forEach Ġ{ Ġfield Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelative Path Ġ= Ġanim Node . relative Path ( field . node ) Ġ?: Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġmodel . nodes . find Ġ{ Ġit . node Path Ġ== Ġrelative Path Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠAn imate File . Animate Node ( relative Path ). also Ġ{ Ġmodel . nodes . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġline . properties . find Ġ{ Ġit . name Ġ== Ġfield . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠAn imate File . Animate Property ( text Ġ= Ġfield . displayName , Ġname Ġ= Ġfield . name , Ġtype Ġ= Ġfield . fieldType , Ġnode Ġ= Ġline ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġline . properties . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtab . rep aint () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdrag Over ( dt de : ĠDrop Target Drag Event ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdrag Exit ( d te : ĠDrop Target Event ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdrag Enter ( dt de : ĠDrop Target Drag Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( dt de . transfer able . is Data Flavor Supported ( Node Field Data Flavor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdt de . accept Drag ( Dn D Constants . ACTION _ COPY ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdt de . reject Drag () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠAnimation ComboBox Model ( val Ġeditor : ĠScene Editor , Ġval Ġnode : ĠEdit Animate Node ) Ġ: ĠCombo Box Model < String >, ĠClose able Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġlistener . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlistener Ġ= Ġnode . file Changed Event . on Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh () Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . contents Changed ( List Data Event ( this , Ġ 0 , Ġ 0 , Ġsize Ġ- Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġselected : ĠAny ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġset SelectedItem ( an Item : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġselected Ġ= Ġan Item ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget ElementAt ( index : ĠInt ): ĠString Ġ= Ġnode . files [ index ] ĊĊĠĠĠ Ġoverride Ġfun Ġget SelectedItem (): ĠAny ? Ġ= Ġselected ĊĊĠĠĠ Ġoverride Ġfun Ġget Size (): ĠInt Ġ= Ġnode . files . size ĊĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= ĠArrayList < List Data Listener >() ĊĊĠĠĠ Ġoverride Ġfun Ġadd List Data Listener ( l : ĠList Data Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners Ġ+= Ġl ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove List Data Listener ( l : ĠList Data Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners Ġ-= Ġl ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠAn imate Tab ( val Ġeditor : ĠScene Editor , Ġval Ġnode : ĠEdit Animate Node ) Ġ: ĠPanel (), ĠClose able Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsplit ter Ġ= ĠOne Pixel Splitter ( false , Ġ 0 . 3 f ) ĊĊĠĠĠ Ġval Ġproperty View Ġ= ĠAn imate Property View () ĊĠĠĠ Ġval Ġframe View Ġ= ĠAn imate Frame View () ĊĠĠĠ Ġprivate Ġval Ġscroll Ġ= ĠJ B ScrollPane ( frame View ) ĊĠĠĠ Ġprivate Ġval Ġdrop Listener Ġ= ĠAdd Frame Line Drop Listener ( this ) ĊĠĠĠ Ġprivate Ġval Ġconfig Panel Ġ= ĠPanel () ĊĠĠĠ Ġprivate Ġval Ġanimation Selector Ġ= ĠCombo Box < String >( 1 0 0 ) ĊĊĠĠĠ Ġ// ĠĠĠ Ġprivate Ġval Ġframe Count Ġ= ĠJ B Int Spinner ( 0 , Ġ 0 , ĠInt . MAX _ VALUE , Ġ 1 ) ĊĠĠĠ Ġprivate Ġval Ġframe In Second Ġ= ĠInline Integer Editor ( init Value Ġ= Ġ 1 , Ġmin Value Ġ= Ġ 1 , Ġsuffix Ġ= Ġ" Frame Ġin ĠSecond ") ĊĠĠĠ Ġprivate Ġval Ġframe Count Ġ= ĠInline Integer Editor ( init Value Ġ= Ġ 0 , Ġmin Value Ġ= Ġ 0 , Ġsuffix Ġ= Ġ" Frame ĠCount ") Ċ // ĠĠĠ Ġprivate Ġval Ġnode : ĠEdit Animate Node ? Ċ // ĠĠĠĠĠĠĠ Ġget () Ġ= Ġeditor . viewer . view . animate Node ĊĊĠĠĠ Ġprivate Ġval ĠonChange Frame Ġ= Ġframe View . current Frame ChangeEvent . on Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Frame Animation () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġchange Selected Ġ= Ġframe View . selected Frame ChangeEvent . on Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġanimate Model Ġ?: Ġreturn @ on ĊĠĠĠĠĠĠĠ Ġproperty View . clear Select () ĊĠĠĠĠĠĠĠ Ġframe View . selected Lines (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty View . add Select ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrep aint () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġchange Selected 2 Ġ= Ġproperty View . selected Property ChangeEvent . on Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġanimate Model Ġ?: Ġreturn @ on ĊĠĠĠĠĠĠĠ Ġframe View . clear Select () ĊĠĠĠĠĠĠĠ Ġproperty View . selected . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe View . selectAll Frame Line ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrep aint () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinterpolation Between ( current Frame : ĠInt , Ġframe A : ĠAn imate File . Animate Property . Animate Frame , Ġframe B : ĠAn imate File . Animate Property . Animate Frame ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( frame A . property . type Ġ=== Ġframe B . property . type ) ĊĠĠĠĠĠĠĠ Ġrequire ( frame A . property Ġ=== Ġframe B . property ) ĊĠĠĠĠĠĠĠ Ġrequire ( frame A . time Ġ< Ġframe B . time ) Ġ{ Ġ" frame A . time =${ frame A . time } Ġframe B . time =${ frame B . time }" Ġ} ĊĠĠĠĠĠĠĠ Ġrequire ( current Frame Ġ>= Ġframe A . time Ġ&& Ġcurrent Frame Ġ<= Ġframe B . time ) ĊĠĠĠĠĠĠĠ Ġval Ġc of Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Frame Ġ== Ġframe A . time Ġ-> Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Frame Ġ== Ġframe B . time Ġ-> Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ( current Frame Ġ- Ġframe A . time ). toFloat () Ġ/ Ġ( frame B . time Ġ- Ġframe A . time ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( frame A . property . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠField . Type . VEC 2 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( frame A . data Ġas ĠVector 2 fc ). lerp ( frame B . data Ġas ĠVector 2 fc , Ġc of , ĠVector 2 f ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠField . Type . VEC 3 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( frame A . data Ġas ĠVector 3 fc ). lerp ( frame B . data Ġas ĠVector 3 fc , Ġc of , ĠVector 3 f ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠField . Type . FLOAT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġframe A . data Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġframe B . data Ġas ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa Ġ+ Ġ( b Ġ- Ġa ) Ġ* Ġc of ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Frame Animation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġanimate Model Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġnode ĊĠĠĠĠĠĠĠ Ġmodel . nodes . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . properties . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbefore Ġ= Ġit . get Frame For ( frame View . current Frame ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġafter Ġ= Ġit . getNext Frame For ( frame View . current Frame Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġit . getField ( editor . viewer . view , Ġnode ) Ġas ĠNode Service . Field ? Ġ?: Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġ== Ġnull Ġ&& Ġafter Ġ!= Ġnull Ġ-> Ġfield . set Temp Value ( after . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġ!= Ġnull Ġ&& Ġafter Ġ== Ġnull Ġ-> Ġfield . set Temp Value ( before . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Ġ!= Ġnull Ġ&& Ġafter Ġ!= Ġnull Ġ-> Ġfield . set Temp Value ( interpolation Between ( frame View . current Frame , Ġbefore , Ġafter )) // field . set Temp Value ( before . data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġremove Animation Action Ġ= Ġobject Ġ: ĠAn Action ( null , Ġnull , ĠAll Icons . General . Remove ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Transparent Update (): ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . presentation . isEnabled Ġ= Ġanimation Selector . selected Item Ġ!= Ġnull Ġ&& Ġnode Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode !!. remove File ( animation Selector . selected Item Ġas ĠString ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġadd Animation Action Ġ= Ġobject Ġ: ĠAn Action ( null , Ġnull , ĠAll Icons . General . Add ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġis Transparent Update (): ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . presentation . isEnabled Ġ= Ġnode Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠactionPerformed ( e : ĠAn ActionEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcho oser Ġ= ĠTree FileChooser Factory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getInstance ( editor . project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. create FileChooser ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Select ĠAnimation ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . virtual File . extension ?. toLowerCase () Ġ== ĠAnimation FileType . default Extension ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcho oser . show Dialog () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcho oser . selected File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġeditor . get RelativePath ( file . virtual File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . add ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġgroup Ġ= Ġobject Ġ: ĠAction Group () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Children ( e : ĠAn ActionEvent ?): ĠArray < An Action > Ġ= ĠarrayOf ( add Animation Action , Ġremove Animation Action ) ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġactions Ġ= ĠAction Toolbar Impl ("", Ġgroup , Ġtrue ) ĊĊĊĠĠĠ Ġ// private Ġval Ġadd Animation Button Ġ= ĠAction Button ( add Animation Action , ĠPresentation (""), ĠAction Places . UNKNOWN , ĠAction Toolbar . DEFAULT _ MIN IMUM _ BUTTON _ SIZE ) ĊĊĠĠĠ Ġvar Ġanimate Model : ĠAn imate File ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġprivate Ġfun Ġleave Animation () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġframe Count . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġframe In Second . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġframe Count . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġframe In Second . invalid Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġframe Count . invalid Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). run Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Model ?. save () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġanimate Model Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġframe View . model Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġproperty View . model Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġrefresh Selected Nodes () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġproperty View . add Mouse Listener ( object Ġ: ĠMouse Listener Impl Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmouse Released ( e : ĠMouseEvent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e . is Popup Trigger ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmenu Ġ= ĠAn imate PopupMenu . create ( animate Model !! , Ġproperty View . selected Lines ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu . show ( e . component , Ġe . x , Ġe . y ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġnode . files . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeditor . find File By RelativePath ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġanimation Selector . model Ġ= ĠAnimation ComboBox Model ( editor , Ġnode ) ĊĠĠĠĠĠĠĠ Ġanimation Selector . addActionListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanimation File Ġ= Ġ( animation Selector . selected Item Ġas ĠString ?) ?. take If Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animation File Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( animate Model Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleave Animation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ addActionListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġeditor . find File By RelativePath ( animation File ) Ġ?: Ġreturn @ addActionListener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate Model Ġ= ĠAn imate File ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe View . model Ġ= Ġanimate Model ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty View . model Ġ= Ġanimate Model ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe In Second . value Ġ= Ġanimate Model !!. frame InSeconds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Count . value Ġ= Ġanimate Model !!. frame Count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Count . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe In Second . isEnabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe Count . invalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġframe In Second . invalid Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Selected Nodes () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġframe In Second . change Event . on Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġanimate Model Ġ?: Ġreturn @ on ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . frame InSeconds Ġ= Ġframe In Second . value ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġframe Count . change Event . on Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġanimate Model Ġ?: Ġreturn @ on ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . frame Count Ġ= Ġframe Count . value ĊĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġframe Count . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġframe In Second . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġframe Count . isEnabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġframe Count . invalid Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġframe In Second . invalid Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġconfig Panel . add ( animation Selector ) ĊĠĠĠĠĠĠĠ Ġconfig Panel . add ( actions ) ĊĠĠĠĠĠĠĠ Ġconfig Panel . add ( frame In Second ) ĊĠĠĠĠĠĠĠ Ġconfig Panel . add ( frame Count ) ĊĠĠĠĠĠĠĠ Ġlayout Ġ= ĠBorderLayout () ĊĠĠĠĠĠĠĠ Ġadd ( config Panel , ĠBorderLayout . NORTH ) ĊĠĠĠĠĠĠĠ Ġsplit ter . first Component Ġ= Ġproperty View ĊĠĠĠĠĠĠĠ Ġsplit ter . second Component Ġ= Ġscroll ĊĠĠĠĠĠĠĠ Ġadd ( splitter , ĠBorderLayout . CENTER ) ĊĊĠĠĠĠĠĠĠ Ġproperty View . model Ġ= Ġempty Model ĊĠĠĠĠĠĠĠ Ġframe View . model Ġ= Ġempty Model ĊĊĠĠĠĠĠĠĠ Ġdrop Target Ġ= ĠDrop Target ( this , ĠD n D Constants . ACTION _ MOVE , Ġdrop Listener , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġscroll . vertical ScrollBar . add Adjustment Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty View . scroll Y Ġ= Ġmax Of ( 0 , Ġscroll . vertical ScrollBar . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( node . current Animation Ġ>= Ġ 0 Ġ&& Ġnode . current Animation Ġ< Ġnode . files . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimation Selector . selectedIndex Ġ= Ġnode . current Animation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġevent Select Changed Event Ġ= Ġeditor . viewer . view . event Select Changed . on Ġ{ ĊĠĠĠĠĠĠĠ Ġrefresh Selected Nodes () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrefresh Selected Nodes () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġanimate Model Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġmodel . nodes . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġit . getNode ( node ) Ġ?: Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġto Ġnode ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second Ġin Ġeditor . viewer . view . selected Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . first Ġ} ĊĊĠĠĠĠĠĠĠ Ġproperty View . back light Nodes . clear () ĊĠĠĠĠĠĠĠ Ġframe View . back light Nodes . clear () ĊĠĠĠĠĠĠĠ Ġproperty View . back light Nodes . addAll ( selected ) ĊĠĠĠĠĠĠĠ Ġframe View . back light Nodes . addAll ( selected ) ĊĠĠĠĠĠĠĠ Ġrep aint () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Select Changed Event . close () ĊĠĠĠĠĠĠĠ Ġif Ġ( animate Model Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleave Animation () ĊĠĠĠ Ġ} Ċ }