/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠK Ã¡ ro ly ĠKi rip ols z ky Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// 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 . e ke zet . tree view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . recyclerview . widget . Diff Util Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġcom . e ke zet . tree view . TreeView Adapter . ViewHolder Ċ Ċ /** Ċ Ġ* Ġ@ author Ġk iri Ċ Ġ*/ Ċ open Ġclass ĠTree View Adapter ( ĊĠĠĠ Ġprivate Ġval ĠviewHolder Factory : ĠViewHolder Factory , ĊĠĠĠ Ġitems : ĠMutable List < Any TreeItem > Ġ= ĠArrayList () Ċ ) Ġ: ĠRecyclerView . Adapter < ViewHolder < Any TreeItem View >> (), ĊĠĠĠ ĠMutable List < Any TreeItem > Ġby Ġitems , ĊĠĠĠ ĠI TreeView Adapter Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ViewHolder ( parent : ĠViewGroup , Ġview Type : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ ĠviewHolder Factory . create ViewHolder ( parent . context , Ġview Type ) ĊĊĠĠĠ Ġoverride Ġfun Ġon Bind ViewHolder ( holder : ĠViewHolder < Any TreeItem View >, Ġposition : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġwith ( get ( position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . tree Item View . bind ( this @ with , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġholder . item View . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Item Clicked ( holder . tree Item View , Ġholder . adapter Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMethod Ġthat Ġhandles Ġexpansion / collapse . ĠCall Ġthis Ġmanually Ġif Ġyou Ġwant Ġto Ġoverride Ġthe ĠonClick Listener Ġon Ġthe Ġlist Ġitems . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġprotected Ġfun Ġon Item Clicked ( view : ĠAny TreeItem View , Ġposition : ĠInt ) Ġ= Ġwith ( get ( position )) Ġ{ ĊĠĠĠĠĠĠĠ Ġis Expanded Ġ= Ġ! is Expanded ĊĠĠĠĠĠĠĠ Ġif Ġ( is Expanded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . on Expand Children ( get ( position ), Ġposition , Ġthis @ TreeView Adapter ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . on Collapse Children ( get ( position ), Ġposition , Ġthis @ TreeView Adapter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Children ( position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem Count (): ĠInt Ġ= Ġsize ĊĊĠĠĠ Ġoverride Ġfun ĠgetItem ViewType ( position : ĠInt ): ĠInt Ġ= Ġget ( position ). view Type ĊĊĠĠĠ Ġoverride Ġfun Ġinsert Children ( position : ĠInt , Ġchildren : ĠList < Any TreeItem >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelem Ġ= Ġget ( position ) ĊĠĠĠĠĠĠĠ Ġelem . is Expanded Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġnew List : ĠMutable List < Any TreeItem > Ġ= ĠArrayList < Any TreeItem >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( this @ TreeView Adapter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( position Ġ+ Ġ 1 , Ġchildren . map Ġ{ Ġit . depth Ġ= Ġelem . depth Ġ+ Ġ 1 ; Ġit Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠDiff Util . calculate Diff ( List Diff Callback ( this , Ġnew List )) ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġadd All ( new List ) ĊĠĠĠĠĠĠĠ Ġresult . dispatch Updates To ( this ) ĊĠĠĠĠĠĠĠ Ġnotify Item Changed ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġreplace Children ( position : ĠInt , Ġchildren : ĠList < Any TreeItem >) Ġ{ ĊĠĠĠĠĠĠĠ Ġremove Children ( position ) ĊĠĠĠĠĠĠĠ Ġinsert Children ( position , Ġchildren ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġremove Children ( position : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelem Ġ= Ġget ( position ) ĊĠĠĠĠĠĠĠ Ġelem . is Expanded Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġfrom Index Ġ= Ġposition Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġto Index Ġ= Ġfind Last Child Position ( from Index , Ġelem . depth ) ĊĠĠĠĠĠĠĠ Ġif Ġ( to Index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġno Ġchildren ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew List : ĠMutable List < Any TreeItem > Ġ= ĠArrayList < Any TreeItem >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( this @ TreeView Adapter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsub List ( from Index , Ġto Index Ġ+ Ġ 1 ). clear () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠDiff Util . calculate Diff ( List Diff Callback ( this , Ġnew List )) ĊĠĠĠĠĠĠĠ Ġclear () ĊĠĠĠĠĠĠĠ Ġadd All ( new List ) ĊĠĠĠĠĠĠĠ Ġresult . dispatch Updates To ( this ) ĊĠĠĠĠĠĠĠ Ġnotify Item Changed ( position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġposition Ġof Ġthe Ġlast Ġchild Ġor Ġ- 1 Ġif Ġthere Ġare Ġno Ġchildren ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Last Child Position ( from Index : ĠInt , Ġdepth : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlast Item Position Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġfrom Index Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġget ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depth Ġ< Ġitem . depth ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Item Position Ġ= Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlast Item Position ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠViewHolder Factory Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcreate ViewHolder ( context : ĠContext , Ġview Type : ĠInt ): ĠViewHolder < Any TreeItem View > ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠTree Item View < in ĠT > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġbind ( item : ĠTree Item < T >, Ġposition : ĠInt ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCallback Ġmethod Ġinvoked Ġwhen Ġthe Ġitem Ġhas Ġto Ġload / display Ġit 's Ġchildren Ġ( if Ġany ). ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġitem Ġmust Ġmanually Ġcall Ġthe Ġappropriate Ġadapter Ġmethod Ġto Ġadd Ġits Ġchildren . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Expand Children ( item : ĠTree Item < T >, Ġposition : ĠInt , Ġadapter : ĠI TreeView Adapter ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCallback Ġmethod Ġinvoked Ġwhen Ġthe Ġitem Ġhas Ġto Ġcollapse Ġit 's Ġchildren Ġ( if Ġany ). ĊĠĠĠĠĠĠĠĠ Ġ* ĠChild Ġelements Ġare Ġremoved Ġautomatically Ġby Ġthe Ġadapter . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġon Collapse Children ( item : ĠTree Item < T >, Ġposition : ĠInt , Ġadapter : ĠI TreeView Adapter ) Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġopen Ġclass ĠViewHolder < T >( item View : ĠView ) Ġ: ĠRecyclerView . ViewHolder ( item View ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtree Item View : ĠT Ġget () Ġ= ĠitemView Ġas ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠList Diff Callback ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġold List : ĠList < Any TreeItem >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnew List : ĠList < Any TreeItem > ĊĠĠĠ Ġ) Ġ: ĠDiff Util . Callback () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Items The Same ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold List . get OrNull ( old Item Position )?. data Ġ== Ġnew List . get OrNull ( new Item Position )?. data ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Old List Size (): ĠInt Ġ= Ġold List . size ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget New List Size (): ĠInt Ġ= Ġnew List . size ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġare Contents The Same ( old Item Position : ĠInt , Ġnew Item Position : ĠInt ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold List . get OrNull ( old Item Position )?. data Ġ== Ġnew List . get OrNull ( new Item Position )?. data ĊĠĠĠ Ġ} Ċ } Ċ