package Ġcom . unnamed . b . at v . view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . view . Context Theme Wrapper Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . view . animation . Animation Ċ import Ġandroid . view . animation . Transformation Ċ import Ġandroid . widget . LinearLayout Ċ import Ġandroid . widget . ScrollView Ċ import Ġcom . unnamed . b . at v . R Ċ import Ġcom . unnamed . b . at v . holder . Simple ViewHolder Ċ import Ġcom . unnamed . b . at v . model . TreeNode Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠB og dan ĠMel nych uk Ġon Ġ 2 / 1 0 / 1 5 . Ċ Ġ* ĠConvert ed Ġto ĠK olin Ġby ĠK umar ĠSh iv ang Ġon Ġ 1 6 / 0 7 / 1 7 Ċ Ġ*/ Ċ class ĠAndroid TreeView Ġ{ ĊĊĠĠĠ Ġprotected Ġvar Ġm Root : ĠTreeNode ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar ĠmContext : ĠContext ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġapply For Root : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcontainer Style Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdefault ViewHolder Class : ĠClass < out ĠTreeNode . Base Node ViewHolder <* >> Ġ= ĠSimple ViewHolder :: class . java ĊĠĠĠ Ġprivate Ġvar Ġnode ClickListener : ĠTreeNode . TreeNode ClickListener ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġnode Long ClickListener : ĠTreeNode . TreeNode Long ClickListener ? Ġ= Ġnull ĊĠĠĠ Ġ// ------------------------------------------------ ------------ ĊĠĠĠ Ġ// Ġ ĠSelection Ġmethods ĊĊĠĠĠ Ġ// ĠTODO Ġfix Ġdouble Ġiteration Ġover Ġtree ĊĠĠĠ Ġvar Ġis Selection Mode Enabled : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( selection Mode Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! selection Mode Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde selectAll () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġselection Mode Enabled ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Root Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġm Root !!. getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Selection Mode ( node , Ġselection Mode Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġvar Ġm Use Default Animation Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis 2 d Scroll Enabled Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġis Auto Toggle Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ{ ĊĠĠĠĠĠĠĠ ĠmContext Ġ= Ġcontext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Root ( m Root : ĠTreeNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Root Ġ= Ġm Root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġroot : ĠTreeNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġm Root Ġ= Ġroot ĊĠĠĠĠĠĠĠ ĠmContext Ġ= Ġcontext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetDefault Animation ( default Animation : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Use Default Animation Ġ= Ġdefault Animation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Over loads Ġfun ĠsetDefault Container Style ( style : ĠInt , Ġapply For Root : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcontainer Style Ġ= Ġstyle ĊĠĠĠĠĠĠĠ Ġthis . apply For Root Ġ= Ġapply For Root ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Use 2 d Scroll ( use 2 d Scroll : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is 2 d Scroll Enabled Ġ= Ġuse 2 d Scroll ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Use Auto Toggle ( enable Auto Toggle : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is Auto Toggle Enabled Ġ= Ġenable Auto Toggle ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetDefault ViewHolder ( view Holder : ĠClass < out ĠTreeNode . Base Node ViewHolder <* >>) Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault ViewHolder Class Ġ= ĠviewHolder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetDefault Node ClickListener ( listener : ĠTreeNode . TreeNode ClickListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode ClickListener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetDefault Node Long ClickListener ( listener : ĠTreeNode . TreeNode Long ClickListener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode Long ClickListener Ġ= Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpand All () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Root Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Node ( m Root !! , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcollapse All () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Root Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġm Root !!. getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollapse Node ( n , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġget View ( style : ĠInt ): ĠView Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview : ĠViewGroup ĊĠĠĠĠĠĠĠ Ġif Ġ( style Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Context Ġ= ĠContext Theme Wrapper ( mContext , Ġstyle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= Ġif Ġ( is 2 d Scroll Enabled ) ĠTwo D ScrollView ( new Context ) Ġelse ĠScroll View ( new Context ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview Ġ= Ġif Ġ( is 2 d Scroll Enabled ) ĠTwo D ScrollView ( mContext !! ) Ġelse ĠScroll View ( mContext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġcontainer Context : ĠContext ? Ġ= ĠmContext ĊĠĠĠĠĠĠĠ Ġif Ġ( container Style Ġ!= Ġ 0 Ġ&& Ġapply For Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer Context Ġ= ĠContext Theme Wrapper ( mContext , Ġcontainer Style ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġview Tree Items Ġ= ĠLinearLayout ( container Context , Ġnull , Ġcontainer Style ) ĊĊĠĠĠĠĠĠĠ Ġview Tree Items . id Ġ= ĠR . id . tree _ items ĊĠĠĠĠĠĠĠ Ġview Tree Items . orientation Ġ= ĠLinearLayout . VERTICAL ĊĠĠĠĠĠĠĠ Ġview . addView ( view Tree Items ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( m Root Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Root !!. set ViewHolder ( object Ġ: ĠTreeNode . Base Node ViewHolder < Any >( mContext !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Node View ( node : ĠTreeNode , Ġvalue : ĠAny ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġnode Items View : ĠViewGroup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġview Tree Items ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Node ( m Root !! , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġview ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġview : ĠView ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġget View (- 1 ) ĊĊĊĠĠĠ Ġfun Ġexpand Level ( level : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( m Root Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġm Root !!. getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Level ( n , Ġlevel ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand Level ( node : ĠTreeNode , Ġlevel : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node . level Ġ<= Ġlevel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Node ( node , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġnode . getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Level ( n , Ġlevel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġexpand Node ( node : ĠTreeNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexpand Node ( node , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcollapse Node ( node : ĠTreeNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcollapse Node ( node , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsave State : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Root Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Save State ( m Root !! , Ġbuilder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( builder . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . set Length ( builder . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuilder . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrestore State ( save State : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( save State )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollapse All () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopen Nodes Array Ġ= Ġsave State . split ( NODES _ PATH _ SEPARATOR . to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġopen Nodes Ġ= ĠHashSet ( Arrays . asList (* open Nodes Array )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( m Root Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Node State ( m Root !! , Ġopen Nodes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrestore Node State ( node : ĠTreeNode , Ġopen Nodes : ĠSet < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġnode . getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( open Nodes . contains ( n . path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Node ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrestore Node State ( n , Ġopen Nodes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Save State ( root : ĠTreeNode , Ġs Builder : ĠStringBuilder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġroot . getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . is Expanded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Builder . append ( node . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs Builder . append ( NODES _ PATH _ SEPARATOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Save State ( node , Ġs Builder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġtoggle Node ( node : ĠTreeNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node . is Expanded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollapse Node ( node , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Node ( node , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollapse Node ( node : ĠTreeNode , Ġinclude Sub nodes : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode . set Expanded ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġnode ViewHolder Ġ= Ġget ViewHolder For Node ( node ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( m Use Default Animation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġview Ġ= Ġnode ViewHolder ?. node Items View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( view Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollapse ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode ViewHolder ?. node Items View ?. visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnode ViewHolder ?. toggle ( false ) ĊĠĠĠĠĠĠĠ Ġif Ġ( include Sub nodes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġnode . getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcollapse Node ( n , Ġinclude Sub nodes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand Node ( node : ĠTreeNode , Ġinclude Sub nodes : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnode . set Expanded ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġparent ViewHolder Ġ= Ġget ViewHolder For Node ( node ) ĊĠĠĠĠĠĠĠ Ġparent ViewHolder ?. node Items View ?. removeAll Views () ĊĊĊĠĠĠĠĠĠĠ Ġparent ViewHolder ?. toggle ( true ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġnode . getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Node ( parent ViewHolder ?. node Items View , Ġn ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . is Expanded () Ġ|| Ġinclude Sub nodes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpand Node ( n , Ġinclude Sub nodes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( m Use Default Animation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent View Ġ= Ġparent ViewHolder ?. node Items View ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent View Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpand ( parent View ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent ViewHolder ?. node Items View ?. visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Node ( container : ĠViewGroup ?, Ġn : ĠTreeNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠviewHolder Ġ= Ġget ViewHolder For Node ( n ) ĊĠĠĠĠĠĠĠ Ġval Ġnode View Ġ= ĠviewHolder ?. view ĊĠĠĠĠĠĠĠ Ġcontainer ?. addView ( node View ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Selection Mode Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder ?. toggle Selection Mode ( is Selection Mode Enabled ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnode View ?. setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . get ClickListener () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn . get ClickListener () !!. onClick ( n , Ġn . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( node ClickListener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode ClickListener !!. onClick ( n , Ġn . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Auto Toggle Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Node ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnode View ?. setOn Long ClickListener ( View . On Long ClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . getLong ClickListener () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Long ClickListener Ġn . getLong ClickListener () !!. on Long Click ( n , Ġn . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( node Long ClickListener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Long ClickListener Ġnode Long ClickListener !!. on Long Click ( n , Ġn . value !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Auto Toggle Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Node ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġ< E > Ġget Selected Values ( clazz : ĠClass < E >): ĠList < E > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġselected ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġselected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit Ġ!= Ġnull Ġ&& Ġit . java Class Ġ== Ġclazz Ġ&& Ġit Ġas ? ĠE Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit Ġas ĠE Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtoggle Selection Mode ( parent : ĠTreeNode , Ġm Selection Mode Enabled : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġto og le Selection For Node ( parent , Ġm Selection Mode Enabled ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parent . is Expanded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġparent . getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoggle Selection Mode ( node , Ġm Selection Mode Enabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġselected : ĠList < TreeNode > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Selection Mode Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Selected ( m Root !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTODO ĠDo Ġwe Ġneed Ġto Ġgo Ġthrough Ġwhole Ġtree ? ĠSave Ġreferences Ġor Ġconsider Ġcollapsed Ġnodes Ġas Ġnot Ġselected ĊĠĠĠ Ġprivate Ġfun Ġget Selected ( parent : ĠTreeNode ): ĠList < TreeNode > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < TreeNode >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġparent . getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n . isSelected ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( n ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . addAll ( getSelected ( n )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġselect All ( skip Collapsed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmake All Selection ( true , Ġskip Collapsed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġde selectAll () Ġ{ ĊĠĠĠĠĠĠĠ Ġmake All Selection ( false , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake All Selection ( selected : ĠBoolean , Ġskip Collapsed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Selection Mode Enabled Ġ&& Ġm Root Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġm Root !!. getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Node ( node , Ġselected , Ġskip Collapsed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġselect Node ( node : ĠTreeNode , Ġselected : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Selection Mode Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . isSelected Ġ= Ġselected ĊĠĠĠĠĠĠĠĠĠĠĠ Ġto og le Selection For Node ( node , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Node ( parent : ĠTreeNode , Ġselected : ĠBoolean , Ġskip Collapsed : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparent . isSelected Ġ= Ġselected ĊĠĠĠĠĠĠĠ Ġto og le Selection For Node ( parent , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġval Ġto Continue Ġ= Ġif Ġ( skip Collapsed ) Ġparent . is Expanded () Ġelse Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( to Continue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( node Ġin Ġparent . getChildren ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselect Node ( node , Ġselected , Ġskip Collapsed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġto og le Selection For Node ( node : ĠTreeNode , Ġmake Selectable : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġholder Ġ= Ġget ViewHolder For Node ( node ) ĊĠĠĠĠĠĠĠ Ġif Ġ( holder ?. isInitialized Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ViewHolder For Node ( node )?. toggle Selection Mode ( make Selectable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget ViewHolder For Node ( node : ĠTreeNode ): ĠTreeNode . Base Node ViewHolder < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠviewHolder : ĠTreeNode . Base Node ViewHolder < *> ? Ġ= Ġnode . get ViewHolder () ĊĠĠĠĠĠĠĠ Ġif Ġ( view Holder Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ` object ` Ġ= Ġdefault ViewHolder Class . get Constructor ( Context :: class . java ). newInstance ( mContext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder Ġ= Ġ` object ` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . set ViewHolder ( view Holder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Could Ġnot Ġinstantiate Ġclass Ġ" Ġ+ Ġdefault ViewHolder Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view Holder ?. tree View Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder ?. set Tree V ie v ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( view Holder Ġ!= Ġnull Ġ&& ĠviewHolder . container Style Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewHolder . container Style Ġ= Ġcontainer Style ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠviewHolder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ---------------------------------------------------------------- - ĊĠĠĠ Ġ// Add Ġ/ ĠRemove ĊĊĠĠĠ Ġfun Ġadd Node ( parent : ĠTreeNode , Ġnode ToAdd : ĠTreeNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġparent . addChild ( node ToAdd ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parent . is Expanded ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent ViewHolder Ġ= Ġget ViewHolder For Node ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Node ( parent ViewHolder ?. node Items View , Ġnode ToAdd ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Node ( node : ĠTreeNode ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( node . parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġnode . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġparent !!. delete Child ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent . is Expanded () Ġ&& Ġindex Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent ViewHolder Ġ= Ġget ViewHolder For Node ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent ViewHolder ?. node Items View ?. remove View At ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠNODE S _ PATH _ SEPARATOR Ġ= Ġ";" ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġexpand ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . measure ( LinearLayout . LayoutParams . MATCH _ PARENT , ĠLinearLayout . LayoutParams . WRAP _ CONTENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Height Ġ= Ġv . meas ured Height ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . layout Params . height Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . visibility Ġ= ĠView . VISIBLE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġobject Ġ: ĠAnimation () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply Transformation ( interpol ated Time : ĠFloat , Ġt : ĠTransformation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . layout Params . height Ġ= Ġif Ġ( interpol ated Time Ġ== Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLinearLayout . LayoutParams . WRAP _ CONTENT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( target Height Ġ* Ġinterpolated Time ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . request Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwill Change Bounds (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 dp / ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa . duration Ġ= Ġ( target Height Ġ/ Ġv . context . resources . display Metrics . density ). toInt (). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . start Animation ( a ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcollapse ( v : ĠView ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Height Ġ= Ġv . meas ured Height ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġobject Ġ: ĠAnimation () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply Transformation ( interpol ated Time : ĠFloat , Ġt : ĠTransformation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( interpol ated Time Ġ== Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . visibility Ġ= ĠView . GONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . layout Params ?. height Ġ= Ġinitial Height Ġ- Ġ( initial Height Ġ* Ġinterpolated Time ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv . request Layout () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwill Change Bounds (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 1 dp / ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdensity Ġ= Ġv . context ?. resources ?. display Metrics ?. density ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( density Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . duration Ġ= Ġ( initial Height Ġ/ Ġdensity ). toInt (). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġv . start Animation ( a ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ