/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠGoogle ĠLLC Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . google . idea . perf . vf str acer Ċ Ċ import Ġcom . intellij . ui . components . JB Tree Table Ċ import Ġcom . intellij . ui . tree Structure . tre et able . Tree TableModel Ċ import Ġjava . util .* Ċ import Ġjavax . swing . J Tree Ċ import Ġjavax . swing . event . EventListener List Ċ import Ġjavax . swing . event . Tree Model Event Ċ import Ġjavax . swing . event . Tree Model Listener Ċ import Ġjavax . swing . tree . Tree Path Ċ Ċ private Ġconst Ġval ĠCOLUMN _ COUNT Ġ= Ġ 2 Ċ private Ġconst Ġval ĠST UB _ INDEX _ ACC ES SES Ġ= Ġ 0 Ċ private Ġconst Ġval ĠP SI _ ELEMENT _ WRAP S Ġ= Ġ 1 Ċ Ċ private Ġval Ġchildren Cache Ġ= ĠWeak HashMap < Virtual File Tree , ĠArray < Virtual File Tree >>() Ċ Ċ private Ġoperator Ġfun ĠVirtual File Tree . get ( index : ĠInt ): ĠVirtual File Tree Ġ{ ĊĠĠĠ Ġval Ġcached Children Ġ= Ġchildren Cache . get Or Put ( this ) Ġ{ Ġchildren . values . to Typed Array () Ġ} ĊĠĠĠ Ġreturn Ġcached Children [ index ] Ċ } Ċ Ċ private Ġfun ĠVirtual File Tree . indexOf ( child : ĠVirtual File Tree ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġcached Children Ġ= Ġchildren Cache . get Or Put ( this ) Ġ{ Ġchildren . values . to Typed Array () Ġ} ĊĠĠĠ Ġreturn Ġcached Children . indexOf ( child ) Ċ } Ċ Ċ class ĠV fs Stat Tree TableModel : ĠTree TableModel Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtree Ġ= ĠMutable Virtual File Tree . create Root () ĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= ĠEvent Listener List () ĊĊĠĠĠ Ġfun Ġset Stats ( new Stats : ĠVirtual File Tree ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtree Diff Ġ= ĠVirtual File Tree Diff . create ( tree , Ġnew Stats ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener List Ġ= Ġlisteners . listener List ĊĊĠĠĠĠĠĠĠ Ġtree Diff . apply Patch ( object : ĠTree Patch EventListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tree Insert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath : ĠVirtual File Tree Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠMutable Virtual File Tree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild : ĠMutable Virtual File Tree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . children [ child . name ] Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Cache . remove ( parent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree Path Ġ= ĠTree Path ( path . parts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠTree Model Event ( this , Ġtree Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Listener Ġ{ Ġit . tree Structure Changed ( event ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tree Modify ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath : ĠVirtual File Tree Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠMutable Virtual File Tree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild : ĠMutable Virtual File Tree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Child : ĠVirtual File Tree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . stub Index Ac cesses Ġ= Ġnew Child . stub Index Ac cesses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . psi Element Wrap s Ġ= Ġnew Child . psi Element Wrap s ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Cache . remove ( parent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree Path Ġ= ĠTree Path ( path . parts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindexes Ġ= Ġint ArrayOf ( parent . indexOf ( child )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠarrayOf ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠTree Model Event ( this , Ġtree Path , Ġindexes , Ġchildren ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Listener Ġ{ Ġit . tree Nodes Changed ( event ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Tree Remove ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath : ĠVirtual File Tree Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠMutable Virtual File Tree , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild : ĠMutable Virtual File Tree ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree Path Ġ= ĠTree Path ( path . parts ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindexes Ġ= Ġint ArrayOf ( parent . indexOf ( child )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= ĠarrayOf ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevent Ġ= ĠTree Model Event ( this , Ġtree Path , Ġindexes , Ġchildren ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . children . remove ( child . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Cache . remove ( parent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠforEach Listener Ġ{ Ġit . tree Nodes Removed ( event ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun ĠforEach Listener ( action : Ġ( Tree Model Listener ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlistener List . size Ġ- Ġ 2 Ġdown To Ġ 0 Ġstep Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( listener List [ i ] Ġ== ĠTree Model Listener :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( listener List [ i Ġ+ Ġ 1 ] Ġas ĠTree Model Listener ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Column Count (): ĠInt Ġ= ĠCOLUMN _ COUNT ĊĊĠĠĠ Ġoverride Ġfun Ġget ColumnName ( column : ĠInt ): ĠString Ġ= Ġwhen Ġ( column ) Ġ{ ĊĠĠĠĠĠĠĠ ĠST UB _ INDEX _ ACC ES SES Ġ-> Ġ" stub Ġindex Ġaccesses " ĊĠĠĠĠĠĠĠ ĠP SI _ ELEMENT _ WRAP S Ġ-> Ġ" psi Ġparses " ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( column ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Column Class ( column : ĠInt ): ĠClass < *> Ġ= Ġwhen Ġ( column ) Ġ{ ĊĠĠĠĠĠĠĠ ĠST UB _ INDEX _ ACC ES SES , ĠP SI _ ELEMENT _ WRAP S Ġ-> Ġjava . lang . Integer :: class . java ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( column ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetValue At ( node : ĠAny ?, Ġcolumn : ĠInt ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( node Ġis ĠVirtual File Tree ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( column ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠST UB _ INDEX _ ACC ES SES Ġ-> Ġnode . stub Index Ac cesses ĊĠĠĠĠĠĠĠĠĠĠĠ ĠP SI _ ELEMENT _ WRAP S Ġ-> Ġnode . psi Element Wrap s ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( column ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Cell Editable ( node : ĠAny ?, Ġcolumn : ĠInt ): ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġoverride Ġfun ĠsetValue At ( a Value : ĠAny ?, Ġnode : ĠAny ?, Ġcolumn : ĠInt ) Ġ= Ġerror (" Model Ġis Ġnot Ġeditable ") ĊĠĠĠ Ġoverride Ġfun Ġset Tree ( tree : ĠJ Tree ?) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġget Root (): ĠAny Ġ= Ġtree ĊĊĠĠĠ Ġoverride Ġfun Ġget Child ( parent : ĠAny ?, Ġindex : ĠInt ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( parent Ġis ĠVirtual File Tree ) ĊĠĠĠĠĠĠĠ Ġreturn Ġparent [ index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Child Count ( parent : ĠAny ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( parent Ġis ĠVirtual File Tree ) ĊĠĠĠĠĠĠĠ Ġreturn Ġparent . children . size ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Leaf ( node : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( node Ġis ĠVirtual File Tree ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnode . isFile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvalue For Path Changed ( path : ĠTree Path ?, ĠnewValue : ĠAny ?) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġget IndexOf Child ( parent : ĠAny ?, Ġchild : ĠAny ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ== Ġnull Ġ|| Ġchild Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcheck ( parent Ġis ĠVirtual File Tree ) ĊĠĠĠĠĠĠĠ Ġcheck ( child Ġis ĠVirtual File Tree ) ĊĠĠĠĠĠĠĠ Ġreturn Ġparent . indexOf ( child ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Tree Model Listener ( l : ĠTree Model Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . add ( Tree Model Listener :: class . java , Ġl ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Tree Model Listener ( l : ĠTree Model Listener ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . remove ( Tree Model Listener :: class . java , Ġl ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠV fs Stat Tree Table ( private Ġval Ġmodel : ĠV fs Stat Tree TableModel ): ĠJ B Tree Table ( model ) Ġ{ ĊĠĠĠ Ġfun Ġset Stats ( new Stats : ĠVirtual File Tree ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodel . set Stats ( new Stats ) ĊĠĠĠ Ġ} Ċ } Ċ