@ file : Suppress (" unused ") Ċ Ċ package Ġcom . ac orn ui . component Ċ Ċ import Ġcom . ac orn ui . collection . Concurrent List Impl Ċ import Ġcom . ac orn ui . collection . add Or Re order Ċ import Ġcom . ac orn ui . collection . iterate Ċ import Ġcom . ac orn ui . core . di . Owned Ċ import Ġcom . ac orn ui . math . Bounds Ċ Ċ interface ĠElement Parent Ro < out ĠT > Ġ{ ĊĊ ĉ /** Ċĉ Ġ* ĠA Ġlist Ġof Ġextern ally Ġadded Ġobjects . Ċĉ Ġ*/ Ċ ĉ val Ġelements : ĠList < T > Ċ Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġelement Ġparent Ġis Ġan Ġinterface Ġthat Ġextern ally Ġexposes Ġthe Ġability Ġto Ġadd Ġand Ġremove Ġelements . Ċ Ġ*/ Ċ interface ĠElement Parent < T > Ġ: ĠElement Parent Ro < T > Ġ{ ĊĊ ĉ /** Ċĉ Ġ* ĠSyntax Ġs ugar Ġfor Ġadd Element . Ċĉ Ġ*/ Ċ ĉ operator Ġfun Ġ< P Ġ: ĠT > ĠP . unary Plus (): ĠP Ġ{ Ċĉ ĉ this @ Element Parent . addElement ( this @ Element Parent . elements . size , Ġthis ) Ċĉ ĉ return Ġthis Ċ ĉ } ĊĊ ĉ operator Ġfun Ġ< P Ġ: ĠT > ĠP . unary Minus (): ĠP Ġ{ Ċĉ ĉ this @ Element Parent . remove Element ( this ) Ċĉ ĉ return Ġthis Ċ ĉ } ĊĊ ĉ fun Ġ< S Ġ: ĠT > Ġadd Element ( child : ĠS ): ĠS Ġ= Ġadd Element ( elements . size , Ġchild ) Ċ ĉ fun Ġ< S Ġ: ĠT > Ġadd Optional Element ( child : ĠS ?): ĠS ? Ġ{ Ċĉ ĉ if Ġ( child Ġ== Ġnull ) Ġreturn Ġnull Ċĉ ĉ return Ġadd Element ( child ) Ċ ĉ } ĊĊ ĉ fun Ġ< S Ġ: ĠT > Ġadd Optional Element ( index : ĠInt , Ġchild : ĠS ?): ĠS ? Ġ{ Ċĉ ĉ if Ġ( child Ġ== Ġnull ) Ġreturn Ġnull Ċĉ ĉ return Ġadd Element ( index , Ġchild ) Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠAdds Ġan Ġexternal Ġelement Ġto Ġthis Ġcontainer Ġat Ġthe Ġgiven Ġindex . Ċĉ Ġ* ĠUn like Ġchildren , Ġadding Ġelement Ġto Ġan Ġ[ Element Container ] Ġwhere Ġthe Ġelement Ċĉ Ġ* Ġhas Ġalready Ġbeen Ġadded , Ġthe Ġelement Ġwill Ġbe Ġremoved . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġindex ĠThe Ġindex Ġat Ġwhich Ġto Ġadd Ġthe Ġelement . ĠThis Ġmust Ġbe Ġbetween Ġ 0 Ġand Ġ` elements . size ` Ċĉ Ġ* Ġ@ throws ĠIndex OutOfBoundsException Ċĉ Ġ*/ Ċ ĉ fun Ġ< S Ġ: ĠT > Ġadd Element ( index : ĠInt , Ġelement : ĠS ): ĠS ĊĊ ĉ /** Ċĉ Ġ* ĠRemoves Ġthe Ġgiven Ġelement . Ċĉ Ġ* Ċĉ Ġ* Ġ@ param Ġelement ĠThe Ġelement Ġto Ġremove . Ċĉ Ġ* Ġ@ return ĠReturns Ġtrue Ġif Ġthe Ġelement Ġexisted Ġin Ġthe Ġelements Ġlist Ġand Ġwas Ġremoved . Ċĉ Ġ*/ Ċ ĉ fun Ġremove Element ( element : ĠT ?): ĠBoolean Ġ{ Ċĉ ĉ if Ġ( element Ġ== Ġnull ) Ġreturn Ġfalse Ċĉ ĉ val Ġindex Ġ= Ġelements . indexOf ( element ) Ċĉ ĉ if Ġ( index Ġ== Ġ- 1 ) Ġreturn Ġfalse Ċĉ ĉ remove Element ( index ) Ċĉ ĉ return Ġtrue Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠRemoves Ġthe Ġexternal Ġelement Ġat Ġthe Ġgiven Ġindex . Ċĉ Ġ* Ġ@ param Ġindex ĠMust Ġbe Ġbetween Ġ 0 Ġand Ġ` elements . last Index ` Ċĉ Ġ* Ġ@ return ĠReturns Ġthe Ġremoved Ġelement . Ċĉ Ġ*/ Ċ ĉ fun Ġremove Element ( index : ĠInt ): ĠT ĊĊ ĉ fun Ġclear Elements ( dispose : ĠBoolean Ġ= Ġtrue ) ĊĊ ĉ /** Ċĉ Ġ* ĠAdds Ġan Ġelement Ġafter Ġthe Ġprovided Ġelement . Ċĉ Ġ*/ Ċ ĉ fun Ġadd Element After ( element : ĠT , Ġafter : ĠT ): ĠInt Ġ{ Ċĉ ĉ val Ġindex Ġ= Ġelements . indexOf ( after ) Ċĉ ĉ if Ġ( index Ġ== Ġ- 1 ) Ġreturn Ġ- 1 Ċĉ ĉ addElement ( index Ġ+ Ġ 1 , Ġelement ) Ċĉ ĉ return Ġindex Ġ+ Ġ 1 Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠAdds Ġan Ġelement Ġbefore Ġthe Ġprovided Ġelement . Ċĉ Ġ*/ Ċ ĉ fun Ġadd Element Before ( element : ĠT , Ġbefore : ĠT ): ĠInt Ġ{ Ċĉ ĉ val Ġindex Ġ= Ġelements . indexOf ( before ) Ċĉ ĉ if Ġ( index Ġ== Ġ- 1 ) Ġreturn Ġ- 1 Ċĉ ĉ addElement ( index , Ġelement ) Ċĉ ĉ return Ġindex Ċ ĉ } Ċ } Ċ Ċ interface ĠElement Container Ro < out ĠT Ġ: ĠUi Component Ro > Ġ: ĠContainer Ro , ĠElement Parent Ro < T > ĊĊ Ċ /** Ċ Ġ* ĠAn ĠElement Container Ġis Ġa Ġcomponent Ġthat Ġcan Ġbe Ġprovided Ġa Ġlist Ġof Ġcomponents Ġas Ġpart Ġof Ġits Ġexternal ĠAPI . Ċ Ġ* ĠIt Ġis Ġup Ġto Ġthis Ġelement Ġcontainer Ġhow Ġto Ġtreat Ġadded Ġelements . ĠIt Ġmay Ġadd Ġthem Ġas Ġchildren Ġto Ġthe Ġdisplay Ġgraph , Ċ Ġ* Ġor Ġit Ġmay Ġprovide Ġthe Ġelement Ġto Ġa Ġchild Ġelement Ġcontainer . Ċ Ġ*/ Ċ interface ĠElement Container < T Ġ: ĠUi Component > Ġ: ĠElement Container Ro < T >, ĠElement Parent < T >, ĠContainer Ċ Ċ /** Ċ Ġ* Ġ@ author Ġnb ily k Ċ Ġ*/ Ċ open Ġclass ĠElement Container Impl < T Ġ: ĠUi Component >( Ċĉ ĉ owner : ĠOwn ed Ċ ) Ġ: ĠContainer Impl ( owner ), ĠElement Container < T >, ĠContainer Ġ{ ĊĊ ĉ //---------------------------------------------------------------- -------------------------------- - Ċ ĉ // ĠElement Ġmethods . Ċ ĉ //---------------------------------------------------------------- -------------------------------- - ĊĊ ĉ protected Ġval Ġ_ elements Ġ= ĠConcurrent List Impl < T >() ĊĊ ĉ /** Ċĉ Ġ* ĠA Ġlist Ġof Ġextern ally Ġadded Ġcomponents . Ċĉ Ġ*/ Ċ ĉ final Ġoverride Ġval Ġelements : ĠList < T > Ċĉ ĉ get () Ġ= Ġ_ elements ĊĊ ĉ override Ġfun Ġ< S Ġ: ĠT > Ġadd Element ( index : ĠInt , Ġelement : ĠS ): ĠS Ġ{ Ċĉ ĉ _ elements . add Or Re order ( index , Ġelement ) Ġ{ Ġold Index , Ġnew Index Ġ-> Ċĉĉ ĉ if Ġ( old Index Ġ== Ġ- 1 ) Ġelement . dis posed . add (:: element Disposed Handler ) Ċĉĉ ĉ on Element Added ( old Index , Ġnew Index , Ġelement ) Ċĉ ĉ } Ċĉ ĉ return Ġelement Ċ ĉ } ĊĊ ĉ private Ġfun Ġelement Disposed Handler ( element : ĠUi Component ) Ġ{ Ċĉ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċĉ ĉ remove Element ( element Ġas ĠT ) Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠInv oked Ġwhen Ġan Ġexternal Ġelement Ġhas Ġbeen Ġadded Ġor Ġreordered . ĠIf Ġthis Ġis Ġover rid en Ġand Ġthe Ġ[ addChild ] Ġis Ċĉ Ġ* Ġdeleg ated , Ġthe Ġ[ on Element Removed ] Ġshould Ġmirror Ġthe Ġdeleg ation . Ċĉ Ġ* Ċĉ Ġ* ĠExample : Ċĉ Ġ* ``` Ċĉ Ġ* Ġprivate Ġval Ġother Container Ġ= Ġadd Child ( container ()) Ċĉ Ġ* Ċĉ Ġ* Ġoverride Ġfun Ġon Element Added ( old Index : ĠInt , Ġnew Index : ĠInt , Ġchild : ĠT ) Ġ{ Ċĉ Ġ* ĠĠĠĠ Ġother Container . addElement ( new Index , Ġchild ) Ċĉ Ġ* Ġ} Ċĉ Ġ* Ġoverride Ġfun Ġon Element Removed ( index : ĠInt , Ġchild : ĠT ) Ġ{ Ċĉ Ġ* ĠĠĠĠ Ġother Container . remove Element ( index ) Ċĉ Ġ* Ġ} Ċĉ Ġ* Ġ``` Ċĉ Ġ*/ Ċ ĉ protected Ġopen Ġfun Ġon Element Added ( old Index : ĠInt , Ġnew Index : ĠInt , Ġelement : ĠT ) Ġ{ Ċĉ ĉ if Ġ( new Index Ġ== Ġelements . size Ġ- Ġ 1 ) Ġ{ Ċĉĉ ĉ addChild ( element ) Ċĉ ĉ } Ġelse Ġif Ġ( new Index Ġ== Ġ 0 ) Ġ{ Ċĉĉ ĉ val Ġnext Element Ġ= Ġ_ elements [ new Index Ġ+ Ġ 1 ] Ċĉĉ ĉ addChild Before ( element , Ġnext Element ) Ċĉ ĉ } Ġelse Ġ{ Ċĉĉ ĉ val Ġprevious Element Ġ= Ġ_ elements [ new Index Ġ- Ġ 1 ] Ċĉĉ ĉ addChild After ( element , Ġprevious Element ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun Ġremove Element ( index : ĠInt ): ĠT Ġ{ Ċĉ ĉ val Ġelement Ġ= Ġ_ elements . remove At ( index ) Ċĉ ĉ element . dis posed . remove (:: element Disposed Handler ) Ċĉ ĉ on Element Removed ( index , Ġelement ) Ċĉ ĉ if Ġ( element . parent Ġ!= Ġnull ) Ġthrow ĠException (" Removing Ġan Ġelement Ġshould Ġremove Ġfrom Ġthe Ġdisplay .") Ċĉ ĉ return Ġelement Ċ ĉ } ĊĊ ĉ protected Ġopen Ġfun Ġon Element Removed ( index : ĠInt , Ġelement : ĠT ) Ġ{ Ċĉ ĉ removeChild ( element ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġclear Elements ( dispose : ĠBoolean ) Ġ{ Ċĉ ĉ val Ġc Ġ= Ġelements Ċĉ ĉ while Ġ( c . isNotEmpty ()) Ġ{ Ċĉĉ ĉ val Ġelement Ġ= Ġremove Element ( c . last Index ) Ċĉĉ ĉ if Ġ( dispose ) Ġelement . dispose () Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ //---------------------------------------------------------------- -------------------------------- - ĊĊ ĉ private Ġval Ġelements Update It Ġ= Ġ_ elements . concurrent Iterator () ĊĊ ĉ /** Ċĉ Ġ* ĠA ĠContainer Ġimplementation Ġwill Ġby Ġdefault Ġmeasure Ġits Ġchildren Ġfor Ġdimensions Ġthat Ġwere Ġnot Ġexplicit . Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġupdate Layout ( explicit Width : ĠFloat ?, Ġexplicit Height : ĠFloat ?, Ġout : ĠBounds ) Ġ{ Ċĉ ĉ if Ġ( explicit Width Ġ!= Ġnull Ġ&& Ġexplicit Height Ġ!= Ġnull ) Ġreturn Ġ// ĠUse Ġexplicit Ġdimensions . Ċĉ ĉ elements Update It . iterate Ġ{ Ġelement Ġ-> Ċĉĉ ĉ if Ġ( element . should Layout ) Ġ{ Ċĉĉĉ ĉ if Ġ( explicit Width Ġ== Ġnull ) Ġ{ Ċĉĉĉĉ ĉ if Ġ( element . right Ġ> Ġout . width ) Ċĉĉĉĉĉ ĉ out . width Ġ= Ġelement . right Ċĉĉĉ ĉ } Ċĉĉĉ ĉ if Ġ( explicit Height Ġ== Ġnull ) Ġ{ Ċĉĉĉĉ ĉ if Ġ( element . bottom Ġ> Ġout . height ) Ċĉĉĉĉĉ ĉ out . height Ġ= Ġelement . bottom Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċĉĉ ĉ true Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠDis poses Ġthis Ġcontainer Ġand Ġall Ġits Ġchildren . Ċĉ Ġ*/ Ċ ĉ override Ġfun Ġdispose () Ġ{ Ċĉ ĉ clear Elements ( dispose Ġ= Ġfalse ) Ġ// ĠThe Ġelements Ġthis Ġcontainer Ġowns Ġwill Ġbe Ġdisposed Ġin Ġthe Ġdisposed Ġsignal . Ċĉ ĉ super . dispose () Ċ ĉ } Ċ } Ċ Ċ /** Ċ Ġ* ĠGiven Ġa Ġfactory Ġmethod Ġthat Ġproduces Ġa Ġnew Ġelement Ġ[ T ], Ġif Ġthis Ġsingle Ġelement Ġcontainer Ġalready Ċ Ġ* Ġuses Ġan Ġelement Ġof Ġthat Ġtype , Ġit Ġwill Ġbe Ġreused . ĠOtherwise , Ġthe Ġprevious Ġcontents Ġwill Ġbe Ġdisposed Ġand Ċ Ġ* Ġthe Ġfactory Ġwill Ġgenerate Ġnew Ġcontents . Ċ Ġ*/ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠUi Component > ĠSingle Element Container < Ui Component >. create Or Re use Element ( factory : ĠOwn ed . () Ġ-> ĠT ): ĠT Ġ{ Ċ ĉ val Ġexisting : ĠT Ċ ĉ val Ġcontents Ġ= Ġelement Ċ ĉ if Ġ( contents Ġ! is ĠT ) Ġ{ Ċĉ ĉ contents ?. dispose () Ċĉ ĉ existing Ġ= Ġfactory () Ċĉ ĉ element Ġ= Ġexisting Ċ ĉ } Ġelse Ġ{ Ċĉ ĉ existing Ġ= Ġcontents Ċ ĉ } Ċ ĉ return Ġexisting Ċ }