/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . idea . actions . internal Ċ Ċ import Ġcom . intellij . icons . All Icons Ċ import Ġcom . intellij . ide . project View . Presentation Data Ċ import Ġcom . intellij . ide . util . tree View . Index Comparator Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġcom . intellij . openapi . application . run In Ed t Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . editor . markup .* Ċ import Ġcom . intellij . openapi . file Editor .* Ċ import Ġcom . intellij . openapi . progress . Empty Progress Indicator Ċ import Ġcom . intellij . openapi . progress . Progress Indicator Ċ import Ġcom . intellij . openapi . progress . Progress Manager Ċ import Ġcom . intellij . openapi . progress . Task Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . wm . Tool Window Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . ui . JB Color Ċ import Ġcom . intellij . ui . Simple Text Attributes Ċ import Ġcom . intellij . ui . tree Structure . Simple Node Ċ import Ġcom . intellij . ui . tree Structure . Simple Tree Builder Ċ import Ġcom . intellij . ui . tree Structure . Simple Tree Structure Ċ import Ġcom . intellij . ui . tree Structure . Tree Ċ import Ġorg . jetbrains . kotlin . fir . F ir Element Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Base Ċ import Ġorg . jetbrains . kotlin . fir . builder . Raw F ir Builder Ċ import Ġorg . jetbrains . kotlin . idea . util . application . run Read Action Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . end Offset Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . start Offset Ċ import Ġjava . awt . Border Layout Ċ import Ġjavax . swing . JPanel Ċ import Ġjavax . swing . tree . Default Mutable TreeNode Ċ import Ġjavax . swing . tree . Default Tree Model Ċ import Ġkotlin . math . min Ċ import Ġkotlin . reflect .* Ċ import Ġkotlin . reflect . full .* Ċ import Ġkotlin . reflect . jvm . is Accessible Ċ Ċ class ĠF ir Explorer Tool Window ( private Ġval Ġproject : ĠProject , Ġprivate Ġval Ġtool Window : ĠTool Window ) Ġ: ĠJPanel ( Border Layout ()), ĠDis posable Ġ{ ĊĊĊĠĠĠ Ġprivate Ġval Ġtree Ġ= ĠTree () ĊĠĠĠ Ġprivate Ġval Ġtree Structure Ġ= ĠF ir Explorer Tree Structure () ĊĠĠĠ Ġprivate Ġval Ġbuilder Ġ= ĠSimple Tree Builder ( tree , ĠDefault Tree Model ( Default Mutable TreeNode ()), Ġtree Structure , ĠIndex Comparator . INSTANCE ) ĊĊĠĠĠ Ġprivate Ġval Ġlevel Ġ= ĠHighlight er Layer . SELECTION Ġ- Ġ 1 0 0 ĊĠĠĠ Ġprivate Ġval Ġhighlighting Attributes Ġ= ĠText Attributes (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġeffect Type Ġ= ĠEffect Type . RO UN DED _ BOX ĊĠĠĠĠĠĠĠ Ġeffect Color Ġ= ĠJ B Color . RED ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġrange Highlight Markers Ġ= Ġmutable ListOf < Range Highlight er >() ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Editor : ĠEditor ? Ġ= ĠFile Editor Manager . getInstance ( project ). selected Text Editor ĊĊĠĠĠ Ġfun Ġclear Highlighting ( editor : ĠEditor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrange Highlight Markers . forEach Ġ{ Ġeditor . markup Model . remove Highlight er ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġrange Highlight Markers . clear () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpost p one Tree Rebuild ( editor : ĠEditor , Ġinit : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ ĠProgress Manager . getInstance (). run Process With Progress As ynchronously ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠTask . Background able ( project , Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun ( indicator : ĠProgress Indicator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi Document Manager Ġ= ĠPsi Document Manager . getInstance ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġrun Read Action Ġ{ Ġpsi Document Manager . get Psi File ( editor . document ) Ġas ? ĠK t File Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir File Ġ= Ġrun Read Action Ġ{ ĠRaw F ir Builder ( object Ġ: ĠF ir Session Base () Ġ{}, Ġstub Mode Ġ= Ġfalse ). build F ir File ( file ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun In Ed t Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree Structure . root Ġ= ĠF ir Explorer TreeNode (" root Ġ= Ġ", Ġfir File , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . update From Root (! init ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEmpty Progress Indicator () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġproject . message Bus . connect ( this ). subscribe ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Editor Manager Listener . FILE _ EDITOR _ MANAGER , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠFile Editor Manager Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġselection Changed ( event : ĠFile Editor Manager Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun In Ed t Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Editor Ġ= Ġ( event . old Editor Ġas ? ĠText Editor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Editor Ġ= Ġ( event . new Editor Ġas ? ĠText Editor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Editor Ġ!= Ġnull Ġ&& Ġold Editor . editor Ġ== Ġcurrent Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Highlighting ( current Editor !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Editor Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Editor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Editor Ġ= Ġtext Editor . editor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpost p one Tree Rebuild ( current Editor !! , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtree . add Tree Selection Listener Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Editor Ġ= ĠFile Editor Manager . getInstance ( project ). selected Text Editor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Editor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Highlighting ( current Editor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . paths . filter Ġ{ Ġevent . is Added Path ( it ) Ġ}. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree Node Ġ= Ġit . last Path Component ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tree Node Ġis ĠDefault Mutable TreeNode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Object Ġ= Ġtree Node . user Object ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( user Object Ġis ĠF ir Explorer TreeNode ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġuser Object . data ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġ( data Ġas ? ĠF ir Element )?. psi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġis ĠF ir Element Ġ&& Ġpsi Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( File Document Manager . getInstance (). getFile ( current Editor . document ) Ġ== Ġpsi . containing File . virtual File ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange Highlight Markers Ġ+= Ġcurrent Editor . markup Model . add Range Highlight er ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpsi . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin ( current Editor . document . text Length , Ġpsi . end Offset ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlevel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhighlighting Attributes , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHighlight er Target Area . EX ACT _ RANGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĊ ĊĊĊĠĠĠĠĠĠĠ Ġadd ( tree ) ĊĠĠĠĠĠĠĠ Ġbuilder . init Root () ĊĠĠĠĠĠĠĠ Ġpost p one Tree Rebuild ( current Editor !! , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġclass ĠAbstract F ir Explorer TreeNode ( val ĠpropertyName : ĠString , Ġparent : ĠSimple Node ?) Ġ: ĠSimple Node ( parent ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Presentation . add Text ( propertyName , ĠSimple Text Attributes . REG ULAR _ ATTRIBUTES ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠF ir Explorer TreeNode ( propertyName : ĠString , Ġval Ġdata : ĠAny ?, Ġparent : ĠSimple Node ?) Ġ: ĊĠĠĠĠĠĠĠ ĠAbstract F ir Explorer TreeNode ( propertyName , Ġparent ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Presentation . setIcon ( All Icons . Nodes . Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Presentation . add Text ( data :: class . java . simple Name , ĠSimple Text Attributes . REG ULAR _ ATTRIBUTES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Presentation . add Text ("( toString Ġ= Ġ$ data )", ĠSimple Text Attributes . REG ULAR _ ATTRIBUTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Presentation . add Text (" null ", ĠSimple Text Attributes . GRAY _ ATTRIBUTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK Class <* >. get Member Properties (): ĠCollection < K Property <* >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmember Properties ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclared Member Properties ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Children (): ĠArray < Simple Node > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSimple Node . NO _ CHILD REN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Of Data Ġ= Ġdata :: class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmembers Ġ= Ġclass Of Data . get Member Properties () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmembers . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . visibility Ġ== Ġnull Ġ|| Ġit . visibility !! Ġ<= ĠK Visibility . PROTECT ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . instance Parameter Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . getter . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġit . getter . call ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnot Null ValueType Ġ= Ġit . returnType . with Null ability ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Prefix Ġ= Ġ"${ it . name }: Ġ${ it . returnType . render Simple ()} Ġ= Ġ" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null ValueType . is Subtype Of ( fir ElementType ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Explorer TreeNode ( name Prefix , Ġvalue Ġas ĠF ir Element ?, Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnot Null ValueType . is Subtype Of ( list ElementType ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Explorer Tree ListNode ( name Prefix , Ġvalue Ġas ĠList < *> ?, Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Explorer TreeNode ( name Prefix , Ġvalue , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Element K lass Ġ= ĠF ir Element :: class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir ElementType Ġ= Ġfir Element K lass . star Project ed Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist ElementType Ġ= ĠList :: class . star Project ed Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġclass ĠF ir Explorer Tree ListNode ( propertyName : ĠString , Ġval Ġdata : ĠList < Any ?> ?, Ġparent : ĠSimple Node ?) Ġ: ĊĠĠĠĠĠĠĠ ĠAbstract F ir Explorer TreeNode ( propertyName , Ġparent ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Presentation . add Text ( data :: class . simple Name , ĠSimple Text Attributes . REG ULAR _ ATTRIBUTES ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Presentation . add Text ("( size Ġ= Ġ${ data . size })", ĠSimple Text Attributes . REG ULAR _ ATTRIBUTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemplate Presentation . add Text (" null ", ĠSimple Text Attributes . REG ULAR _ ATTRIBUTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġupdate ( presentation : ĠPresentation Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . update ( presentation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresentation . setIcon ( All Icons . General . Recursive ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Children (): ĠArray < Simple Node > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data Ġ== Ġnull ) Ġreturn ĠSimple Node . NO _ CHILD REN ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdata . map Indexed Ġ{ Ġindex , Ġany Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprop Name Ġ= Ġ" [$ index ] Ġ= Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( any Ġis ĠList <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Explorer Tree ListNode ( prop Name , Ġany , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Explorer TreeNode ( prop Name , Ġany , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinner Ġclass ĠF ir Explorer Tree Structure Ġ: ĠSimple Tree Structure () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġroot : ĠSimple Node Ġ= ĠF ir Explorer Tree ListNode (" root Ġ= Ġ", Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Root Element (): ĠAny Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdispose () Ġ{ ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġfun ĠK Type . render Simple (): ĠString Ġ{ ĊĠĠĠ Ġfun ĠK Variance ?. render (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK Variance . IN Ġ-> Ġ" in Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠK Variance . OUT Ġ-> Ġ" out Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= Ġclassifier ĊĠĠĠĠĠĠĠ Ġwhen Ġ( classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK Class < *> Ġ-> Ġappend ( classifier . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK Type Parameter Ġ-> Ġappend ( classifier . name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( arguments . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("< ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . join To ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . variance . render () Ġ+ Ġit . type ?. render Simple () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend ("> ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( is Marked Nullable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" ?") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }