/* Ċ Ġ* ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠJ ann is ĠWe is Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ* Ċ Ġ*/ Ċ package Ġcom . github . weis j . swing dsl . components Ċ Ċ import Ġjava . awt . Component Ċ import Ġjavax . swing . J Tree Ċ import Ġjavax . swing . event . Tree Expansion Event Ċ import Ġjavax . swing . event . Tree Will Expand Listener Ċ import Ġjavax . swing . tree . Default Mutable TreeNode Ċ import Ġjavax . swing . tree . Default Tree Model Ċ import Ġjavax . swing . tree . Default Tree Selection Model Ċ import Ġjavax . swing . tree . Expand Veto Exception Ċ import Ġjavax . swing . tree . Tree Cell Renderer Ċ import Ġjavax . swing . tree . TreeNode Ċ import Ġjavax . swing . tree . Tree Path Ċ import Ġjavax . swing . tree . Tree Selection Model Ċ Ċ private Ġval ĠTree Path ?. enabled : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġ( this ?. last Path Component Ġas ? ĠHide able )?. isEnabled Ġ!= Ġfalse Ċ Ċ @ Suppress (" Le aking This ") Ċ open Ġclass ĠHide able Tree ( ĊĠĠĠ Ġmodel : ĠHide able Tree Model Ċ ) Ġ: ĠJ Tree ( model ) Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġset Selection Model ( Hide able Tree Selection Model ( this )) ĊĠĠĠĠĠĠĠ Ġadd Tree Will Expand Listener ( object Ġ: ĠTree Will Expand Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtree Will Expand ( event : ĠTree Expansion Event ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . path . enabled ) Ġthrow ĠExpand Veto Exception ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtree Will Collapse ( event : ĠTree Expansion Event ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* Ġnothing Ġhappens Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġselection Model . selection Mode Ġ= ĠTree Selection Model . SINGLE _ TREE _ SELECTION ĊĠĠĠĠĠĠĠ Ġis Root Visible Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġset Cell Renderer ( x : ĠTree Cell Renderer ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . set Cell Renderer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġis ĠHide able Tree Cell Renderer Wrapper Ġ-> Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ!= Ġnull Ġ-> ĠHide able Tree Cell Renderer Wrapper ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġx ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Node Visible ( node : ĠHide able TreeNode <* >, Ġvisible : ĠBoolean , Ġset For ced Value : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpanded Ġ= Ġget Expanded Desc endants ( Tree Path (( node . parent !!. path ))) ?. as Sequence () ĊĠĠĠĠĠĠĠ Ġval Ġselected Paths Ġ= Ġselection Paths ĊĠĠĠĠĠĠĠ Ġif Ġ(! set For ced Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . isVisible Base Ġ== Ġvisible ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . isVisible Base Ġ= Ġvisible ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . force Hide Ġ== Ġ! visible ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . force Hide Ġ= Ġ! visible ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ( model Ġas ĠHide able Tree Model ). node Structure Changed ( node . parent ) ĊĠĠĠĠĠĠĠ Ġexpanded ?. forEach Ġ{ Ġexpand Path ( Tree Path ( it . path )) Ġ} ĊĠĠĠĠĠĠĠ Ġselection Paths Ġ= Ġselected Paths ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Node Enabled ( node : ĠHide able TreeNode <* >, Ġenabled : ĠBoolean , Ġset For ced Value : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! set For ced Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . isEnabled Base Ġ== Ġenabled ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . isEnabled Base Ġ= Ġenabled ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node . force Disable Ġ== Ġ! enabled ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnode . force Disable Ġ= Ġ! enabled ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! enabled ) Ġcollapse Path ( Tree Path ( node . path )) ĊĠĠĠĠĠĠĠ Ġ( model Ġas ĠHide able Tree Model ). node Changed ( node ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠHide able Tree Selection Model ( ĊĠĠĠ Ġprivate Ġval Ġtree : ĠJ Tree , ĊĠĠĠ Ġprivate Ġval Ġdelegate : ĠTree Selection Model Ġ= ĠDefault Tree Selection Model () Ċ ) Ġ: ĠTree Selection Model Ġby Ġdelegate Ġ{ ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate Over Disabled ( path : ĠTree Path ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Selection Row Ġ= Ġlead Selection Row ĊĠĠĠĠĠĠĠ Ġval Ġnew Row Ġ= Ġtree . getRow For Path ( path ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ( current Selection Row ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Row Ġ- Ġ 1 Ġ-> Ġnavigate Up ( current Selection Row ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Row Ġ+ Ġ 1 Ġ-> Ġnavigate Down ( current Selection Row ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate Up ( current Selection Row : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax Ġ= Ġtree . rowCount ĊĠĠĠĠĠĠĠ Ġif Ġ( current Selection Row Ġ> Ġmax Ġ- Ġ 3 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġcurrent Selection Row Ġ+ Ġ 2 ĊĠĠĠĠĠĠĠ Ġvar Ġp Ġ= Ġtree . getPath For Row ( i ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġmax Ġ&& Ġ! p . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġmax ) Ġp Ġ= Ġtree . getPath For Row ( i ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( p . enabled ) Ġtree . selection Path Ġ= Ġp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnavigate Down ( current Selection Row : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current Selection Row Ġ< Ġ 2 ) Ġreturn ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġcurrent Selection Row Ġ- Ġ 2 ĊĠĠĠĠĠĠĠ Ġvar Ġp Ġ= Ġtree . getPath For Row ( i ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ>= Ġ 0 Ġ&& Ġ! p . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ>= Ġ 0 ) Ġp Ġ= Ġtree . getPath For Row ( i ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( p . enabled ) Ġtree . selection Path Ġ= Ġp ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Selection Path ( path : ĠTree Path ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! path . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate Over Disabled ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdelegate . selection Path Ġ= Ġpath ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Selection Paths ( p Paths : ĠArray < out ĠTree Path > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( p Paths Ġ!= Ġnull Ġ&& Ġp Paths . size Ġ== Ġ 1 Ġ&& Ġ! p Paths . first (). enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnavigate Over Disabled ( p Paths . first ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Paths Ġ= Ġp Paths ?. filter Ġ{ Ġit . enabled Ġ} ?. to Typed Array () ĊĠĠĠĠĠĠĠ Ġif Ġ( new Paths ?. isEmpty () Ġ== Ġtrue ) Ġreturn ĊĠĠĠĠĠĠĠ Ġdelegate . selection Paths Ġ= Ġnew Paths ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Selection Path ( path : ĠTree Path ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! path . enabled ) Ġreturn ĊĠĠĠĠĠĠĠ Ġdelegate . add Selection Path ( path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Selection Paths ( paths : ĠArray < out ĠTree Path > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Paths Ġ= Ġpaths ?. filter Ġ{ Ġit . enabled Ġ} ?. to Typed Array () ĊĠĠĠĠĠĠĠ Ġif Ġ( new Paths ?. isEmpty () Ġ== Ġtrue ) Ġreturn ĊĠĠĠĠĠĠĠ Ġdelegate . add Selection Paths ( new Paths ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠHide able Tree Model ( ĊĠĠĠ Ġroot : ĠTreeNode ?, ĊĠĠĠ Ġasks Allow s Children : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġvar Ġis Activated Filter : ĠBoolean Ġ= Ġtrue Ċ ) Ġ: ĠDefault Tree Model ( root , Ġasks Allow s Children ) Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Child ( parent : ĠAny , Ġindex : ĠInt ): ĠAny Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Activated Filter Ġ&& Ġparent Ġis ĠHide able TreeNode <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparent . getChild At ( index , Ġis Activated Filter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( parent Ġas ĠTreeNode ). getChild At ( index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Child Count ( parent : ĠAny ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Activated Filter Ġ&& Ġparent Ġis ĠHide able TreeNode <* >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparent . getChild Count ( is Activated Filter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( parent Ġas ĠTreeNode ). child Count ĊĠĠĠ Ġ} Ċ } Ċ Ċ interface ĠHide able Ġ{ ĊĠĠĠ Ġval Ġis Visible : ĠBoolean ĊĠĠĠ Ġval Ġis Enabled : ĠBoolean Ċ } Ċ Ċ open Ġclass ĠHide able TreeNode < T >( ĊĠĠĠ Ġval Ġvalue : ĠT , ĊĠĠĠ Ġallows Children : ĠBoolean Ġ= Ġtrue , Ċ ) Ġ: ĠDefault Mutable TreeNode ( value , Ġallows Children ), ĠHide able Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠgetParent (): ĠDefault Mutable TreeNode ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . getParent () Ġas ĠDefault Mutable TreeNode ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġis Visible : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġis Visible Base Ġ&& Ġ! force Hide ĊĠĠĠ Ġoverride Ġval Ġis Enabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġis Enabled Base Ġ&& Ġ! force Disable ĊĊĠĠĠ Ġvar Ġis Visible Base : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġinternal Ġvar Ġforce Hide : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġvar Ġis Enabled Base : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġinternal Ġvar Ġforce Disable : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġfun Ġget Child At ( index : ĠInt , Ġfilter IsActive : ĠBoolean ): ĠTreeNode Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! filter IsActive ) Ġreturn Ġsuper . getChild At ( index ) ĊĠĠĠĠĠĠĠ Ġif Ġ( children Ġ== Ġnull ) Ġerror (" node Ġhas Ġno Ġchildren ") ĊĠĠĠĠĠĠĠ Ġvar Ġreal Index Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġvar Ġvisible Index Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠ Ġfor Ġ( it Ġin Ġchildren . elements (). as Iterator ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠHide able TreeNode < *> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isVisible ) Ġvisible Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreal Index ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( visible Index Ġ== Ġindex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchildren . elementAt ( real Index ) Ġas ĠTreeNode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠArray Index OutOfBoundsException (" index Ġun matched ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Child Count ( filter IsActive : ĠBoolean ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! filter IsActive ) Ġreturn Ġsuper . getChild Count () ĊĠĠĠĠĠĠĠ Ġif Ġ( children Ġ== Ġnull ) Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġchildren . elements (). as Sequence (). count Ġ{ Ġ( it Ġas ? ĠHide able )?. isVisible Ġ!= Ġfalse Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠHide able Tree Cell Renderer Wrapper ( var Ġdelegate : ĠTree Cell Renderer ) Ġ: ĠTree Cell Renderer Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Tree Cell Renderer Component ( ĊĠĠĠĠĠĠĠ Ġtree : ĠJ Tree ?, ĊĠĠĠĠĠĠĠ Ġvalue : ĠAny ?, ĊĠĠĠĠĠĠĠ Ġselected : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġexpanded : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġleaf : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġrow : ĠInt , ĊĠĠĠĠĠĠĠ Ġhas Focus : ĠBoolean ĊĠĠĠ Ġ): ĠComponent Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcomp Ġ= Ġdelegate . get Tree Cell Renderer Component ( tree , Ġvalue , Ġselected , Ġexpanded , Ġleaf , Ġrow , Ġhas Focus ) ĊĠĠĠĠĠĠĠ Ġcomp . isEnabled Ġ= Ġ( value Ġas ? ĠHide able )?. isEnabled Ġ?: Ġtrue ĊĠĠĠĠĠĠĠ Ġreturn Ġcomp ĊĠĠĠ Ġ} Ċ } Ċ