/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . compose . ui . semantics Ċ Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . layout . Alignment Line Ċ import Ġandroidx . compose . ui . layout . bounds In Root Ċ import Ġandroidx . compose . ui . layout . position In Root Ċ import Ġandroidx . compose . ui . layout . Layout Info Ċ import Ġandroidx . compose . ui . layout . bounds In Window Ċ import Ġandroidx . compose . ui . layout . position In Window Ċ import Ġandroidx . compose . ui . node . Layout Node Ċ import Ġandroidx . compose . ui . node . Layout Node Wrapper Ċ import Ġandroidx . compose . ui . node . Root For Test Ċ import Ġandroidx . compose . ui . unit . Int Size Ċ import Ġandroidx . compose . ui . util . fast ForEach Ċ Ċ /** Ċ Ġ* ĠSignature Ġfor Ġa Ġfunction Ġthat Ġis Ġcalled Ġfor Ġeach Ġ[ Semantics Node ]. Ċ Ġ* Ċ Ġ* ĠReturn Ġfalse Ġto Ġstop Ġvisit ing Ġnodes . Ċ Ġ* Ċ Ġ* ĠUsed Ġby Ġ[ Semantics Node . visit Children ]. Ċ Ġ*/ Ċ internal Ġtype alias ĠSem antics Node Visitor Ġ= Ġ( node : ĠSem antics Node ) Ġ-> ĠBoolean Ċ Ċ /** Ċ Ġ* ĠA Ġlist Ġof Ġkey / value Ġpairs Ġassociated Ġwith Ġa Ġlayout Ġnode Ġor Ġits Ġsubtree . Ċ Ġ* Ċ Ġ* ĠEach ĠSem antics Node Ġtakes Ġits Ġid Ġand Ġinitial Ġkey / value Ġlist Ġfrom Ġthe Ċ Ġ* Ġout erm ost Ġmodifier Ġon Ġone Ġlayout Ġnode . Ġ ĠIt Ġalso Ġcontains Ġthe Ġ" collapsed " Ġconfiguration Ċ Ġ* Ġof Ġany Ġother Ġsemantics Ġmodifiers Ġon Ġthe Ġsame Ġlayout Ġnode , Ġand Ġif Ġ" merge Desc endants " Ġis Ċ Ġ* Ġspecified Ġand Ġenabled , Ġalso Ġthe Ġ" merged " Ġconfiguration Ġof Ġits Ġsubtree . Ċ Ġ*/ Ċ class ĠSem antics Node Ġinternal Ġconstructor ( ĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġexpected Ġto Ġbe Ġthe Ġout erm ost Ġsemantics Ġmodifier Ġon Ġa Ġlayout Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġouter Semantics Node Wrapper : ĠSem antics Wrapper , ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġmerging Enabled Ġspecifies Ġwhether Ġmerge Desc endants Ġconfig Ġhas Ġany Ġeffect . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġtrue , Ġthen Ġmerge Desc endants Ġnodes Ġwill Ġmerge Ġup Ġall Ġproperties Ġfrom Ġchild ĊĠĠĠĠ Ġ* Ġsemantics Ġnodes Ġand Ġremove Ġthose Ġchildren Ġfrom Ġ" children ", Ġwith Ġthe Ġexception ĊĠĠĠĠ Ġ* Ġof Ġnodes Ġthat Ġthemselves Ġhave Ġmerge Desc endants . Ġ ĠIf Ġfalse , Ġthen Ġmerge Desc endants ĊĠĠĠĠ Ġ* Ġhas Ġno Ġeffect . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġmerging Enabled Ġis Ġtypically Ġtrue Ġor Ġfalse Ġconsistently Ġon Ġevery Ġnode Ġof Ġa ĠSem antics Node Ġtree . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġmerging Enabled : ĠBoolean Ċ ) Ġ{ ĊĠĠĠ Ġinternal Ġval Ġun merged Config Ġ= Ġouter Semantics Node Wrapper . collapsed Semantics Configuration () ĊĠĠĠ Ġval Ġid : ĠInt Ġ= Ġouter Semantics Node Wrapper . modifier . id ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Layout Info ] Ġthat Ġthis Ġis Ġassociated Ġwith . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġlayout Info : ĠLayout Info Ġget () Ġ= Ġlayout Node ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ root ][ Root For Test ] Ġthis Ġnode Ġis Ġattached Ġto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġroot : ĠRoot For Test ? Ġget () Ġ= Ġlayout Node . owner ?. root For Test ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Layout Node ] Ġthat Ġthis Ġis Ġassociated Ġwith . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġlayout Node : ĠLayout Node Ġ= Ġouter Semantics Node Wrapper . layout Node ĊĊĠĠĠ Ġ// ĠGEO METRY ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsize Ġof Ġthe Ġbounding Ġbox Ġfor Ġthis Ġnode , Ġwith Ġno Ġclipping Ġapplied ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġsize : ĠInt Size Ġget () Ġ= Ġfind Wrapper To Get Bounds (). size ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbounding Ġbox Ġfor Ġthis Ġnode Ġrelative Ġto Ġthe Ġroot Ġof Ġthis ĠCompose Ġhierarchy , Ġwith ĊĠĠĠĠ Ġ* Ġclipping Ġapplied . ĠTo Ġget Ġthe Ġbounds Ġwith Ġno Ġclipping Ġapplied , Ġuse ĊĠĠĠĠ Ġ* ĠRect ([ position In Root ], Ġ[ size ]. to Size ()) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbounds In Root : ĠRect Ġget () Ġ= Ġthis . find Wrapper To Get Bounds (). bounds In Root () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġposition Ġof Ġthis Ġnode Ġrelative Ġto Ġthe Ġroot Ġof Ġthis ĠCompose Ġhierarchy , Ġwith Ġno Ġclipping ĊĠĠĠĠ Ġ* Ġapplied ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġposition In Root : ĠOffset Ġget () Ġ= Ġfind Wrapper To Get Bounds (). position In Root () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbounding Ġbox Ġfor Ġthis Ġnode Ġrelative Ġto Ġthe Ġscreen , Ġwith Ġclipping Ġapplied . ĠTo Ġget Ġthe ĊĠĠĠĠ Ġ* Ġbounds Ġwith Ġno Ġclipping Ġapplied , Ġuse ĠPx Bounds ([ position In Window ], Ġ[ size ]. to Size ()) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġbounds In Window : ĠRect Ġget () Ġ= Ġfind Wrapper To Get Bounds (). bounds In Window () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġposition Ġof Ġthis Ġnode Ġrelative Ġto Ġthe Ġscreen , Ġwith Ġno Ġclipping Ġapplied ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġposition In Window : ĠOffset Ġget () Ġ= Ġfind Wrapper To Get Bounds (). position In Window () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġposition Ġof Ġan Ġ[ alignment Ġline ][ Alignment Line ], Ġor Ġ[ Alignment Line . Unspecified ] ĊĠĠĠĠ Ġ* Ġif Ġthe Ġline Ġis Ġnot Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Alignment Line Position ( alignment Line : ĠAlignment Line ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Wrapper To Get Bounds ()[ alignment Line ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCH ILD REN ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġlist Ġof Ġsemantics Ġproperties Ġof Ġthis Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġincludes Ġall Ġproperties Ġattached Ġas Ġmodifiers Ġto Ġthe Ġcurrent Ġlayout Ġnode . ĊĠĠĠĠ Ġ* ĠIn Ġaddition , Ġif Ġmerge Desc endants Ġand Ġmerging Enabled Ġare Ġboth Ġtrue , Ġthen Ġit ĊĠĠĠĠ Ġ* Ġalso Ġincludes Ġthe Ġsemantics Ġproperties Ġof Ġdesc endant Ġnodes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// ĠTODO ( ael ias ): ĠThis Ġis Ġtoo Ġexpensive Ġfor Ġa Ġval Ġ( full Ġsubtree Ġre creation Ġevery Ġcall ); ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptimize Ġthis Ġwhen Ġthe Ġmerging Ġalgorithm Ġis Ġimproved . ĊĠĠĠ Ġval Ġconfig : ĠSem antics Configuration ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mer ging Semantics Of Desc endants ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmerged Config Ġ= Ġun merged Config . copy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerge Config ( merged Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmerged Config ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġun merged Config ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmerge Config ( merged Config : ĠSem antics Configuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! un merged Config . is Clear ing Semantics ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun merged Children (). fast ForEach Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġmerge Ġchildren Ġthat Ġthemselves Ġmerge Ġall Ġtheir Ġdesc endants Ġ( because Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġindicates Ġthey 're Ġindependently Ġscreen - reader - focus able ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! child . is Mer ging Semantics Of Desc endants ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmerged Config . merge Child ( child . un merged Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . merge Config ( merged Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġis Mer ging Semantics Of Desc endants : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġmerging Enabled Ġ&& Ġun merged Config . is Mer ging Semantics Of Desc endants ĊĊĠĠĠ Ġinternal Ġfun Ġun merged Children (): ĠList < Semantics Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġun merged Children : ĠMutable List < Semantics Node > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġval Ġsemantics Children Ġ= Ġthis . layout Node . findOne Layer Of Semantics Wrappers () ĊĠĠĠĠĠĠĠ Ġsemantics Children . fast ForEach Ġ{ Ġsemantics Child Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun merged Children . add ( Semantics Node ( semantics Child , Ġmerging Enabled )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġun merged Children ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠContains Ġthe Ġchildren Ġin Ġinverse Ġhit Ġtest Ġorder Ġ( i . e . Ġpaint Ġorder ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġif Ġmerging Enabled Ġand Ġmerge Desc endants Ġare Ġboth Ġtrue , Ġthen Ġthere ĊĠĠĠĠ Ġ* Ġare Ġno Ġchildren Ġ( except Ġthose Ġthat Ġare Ġthemselves Ġmerge Desc endants ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ// ĠTODO ( ael ias ): ĠThis Ġis Ġtoo Ġexpensive Ġfor Ġa Ġval Ġ( full Ġsubtree Ġre creation Ġevery Ġcall ); ĊĠĠĠ Ġ// ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptimize Ġthis Ġwhen Ġthe Ġmerging Ġalgorithm Ġis Ġimproved . ĊĠĠĠ Ġval Ġchildren : ĠList < Semantics Node > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe pl acing Ġsemantics Ġnever Ġappear Ġto Ġhave Ġany Ġchildren Ġin Ġthe Ġmerged Ġtree . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mer ging Enabled Ġ&& Ġun merged Config . is Clear ing Semantics ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mer ging Semantics Of Desc endants ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġmost Ġcommon Ġmerging Ġscenarios Ġlike ĠButtons , Ġthis Ġwill Ġreturn Ġnothing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġcases Ġlike Ġa Ġclick able ĠRow Ġitself Ġcontaining Ġa ĠButton , Ġthis Ġwill ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġthe ĠButton Ġas Ġa Ġchild . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfind One Layer Of Mer ging Semantics Nodes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġun merged Children () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠVis its Ġthe Ġimmediate Ġchildren Ġof Ġthis Ġnode . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġcalls Ġvisitor Ġfor Ġeach Ġimmediate Ġchild Ġuntil Ġvisitor Ġreturns ĊĠĠĠĠ Ġ* Ġfalse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġvisit Children ( visitor : ĠSem antics Node Visitor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchildren . fast ForEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! visitor ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠVisit Ġall Ġthe Ġdesc endants Ġof Ġthis Ġnode . Ġ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġcalls Ġvisitor Ġfor Ġeach Ġdesc endant Ġin Ġa Ġpre - order Ġtraversal ĊĠĠĠĠ Ġ* Ġuntil Ġvisitor Ġreturns Ġfalse . ĠReturns Ġtrue Ġif Ġall Ġthe Ġvisitor Ġcalls ĊĠĠĠĠ Ġ* Ġreturned Ġtrue , Ġotherwise Ġreturns Ġfalse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġvisit Desc endants ( visitor : ĠSem antics Node Visitor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġchildren . fast ForEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! visitor ( it ) Ġ|| Ġ! it . visit Desc endants ( visitor )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthis ĠSemantic Node Ġis Ġthe Ġroot Ġof Ġa Ġtree Ġor Ġnot ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġis Root : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġparent Ġ== Ġnull ĊĊĠĠĠ Ġ/** ĠThe Ġparent Ġof Ġthis Ġnode Ġin Ġthe Ġtree . Ġ*/ ĊĠĠĠ Ġval Ġparent : ĠSem antics Node ? ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnode : ĠLayout Node ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mer ging Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġthis . layout Node . find Closest Parent Node Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . outer Semantics ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . collapsed Semantics Configuration () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . is Mer ging Semantics Of Desc endants Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode Ġ= Ġthis . layout Node . find Closest Parent Node Ġ{ Ġit . outer Semantics Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Semantics Ġ= Ġnode ?. outer Semantics ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outer Semantics Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSem antics Node ( outer Semantics , Ġmerging Enabled ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind One Layer Of Mer ging Semantics Nodes ( ĊĠĠĠĠĠĠĠ Ġlist : ĠMutable List < Semantics Node > Ġ= Ġmutable ListOf < Semantics Node >() ĊĠĠĠ Ġ): ĠList < Semantics Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġun merged Children (). fast ForEach Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . is Mer ging Semantics Of Desc endants Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . un merged Config . is Clear ing Semantics Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . findOne Layer Of Mer ging Semantics Nodes ( list ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġnode Ġis Ġmerging Ġthe Ġdesc endants , Ġwe 'll Ġuse Ġthe Ġout erm ost Ġsemantics Ġmodifier Ġthat Ġhas ĊĠĠĠĠ Ġ* Ġmerge Desc endants Ġ== Ġtrue Ġto Ġreport Ġthe Ġbounds , Ġsize Ġand Ġposition Ġof Ġthe Ġnode . ĠFor Ġmajority ĊĠĠĠĠ Ġ* Ġof Ġuse Ġcases Ġit Ġmeans Ġthat Ġaccessibility Ġbounds Ġwill Ġbe Ġequal Ġto Ġthe Ġclick able Ġarea . ĊĠĠĠĠ Ġ* ĠOtherwise Ġthe Ġout erm ost Ġsemantics Ġwill Ġbe Ġused Ġto Ġreport Ġbounds , Ġsize Ġand Ġposition . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Wrapper To Get Bounds (): ĠLayout Node Wrapper Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Mer ging Semantics Of Desc endants ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Node . outer Mer ging Semantics Ġ?: Ġouter Semantics Node Wrapper ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter Semantics Node Wrapper ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġout erm ost Ġsemantics Ġnode Ġon Ġa ĠLayout Node . Ċ Ġ*/ Ċ internal Ġval ĠLayout Node . outer Semantics : ĠSem antics Wrapper ? ĊĠĠĠ Ġget () Ġ= Ġouter Layout Node Wrapper . nearest Semantics Ġ{ Ġtrue Ġ} Ċ Ċ internal Ġval ĠLayout Node . outer Mer ging Semantics ĊĠĠĠ Ġget () Ġ= Ġouter Layout Node Wrapper . nearest Semantics Ġ{ ĊĠĠĠĠĠĠĠ Ġit . modifier . semantics Configuration . is Mer ging Semantics Of Desc endants ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġnearest Ġsemantics Ġwrapper Ġstarting Ġfrom Ġa ĠLayout Node Wrapper . Ċ Ġ*/ Ċ internal Ġinline Ġfun ĠLayout Node Wrapper . nearest Semantics ( ĊĠĠĠ Ġpredicate : Ġ( Semantics Wrapper ) Ġ-> ĠBoolean Ċ ): ĠSem antics Wrapper ? Ġ{ ĊĠĠĠ Ġvar Ġwrapper : ĠLayout Node Wrapper ? Ġ= Ġthis ĊĠĠĠ Ġwhile Ġ( wrapper Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( wrapper Ġis ĠSem antics Wrapper Ġ&& Ġpredicate ( wrapper )) Ġreturn Ġwrapper ĊĠĠĠĠĠĠĠ Ġwrapper Ġ= Ġwrapper . wrapped ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ internal Ġfun ĠSem antics Node . find Child ById ( id : ĠInt ): ĠSem antics Node ? Ġ{ ĊĠĠĠ Ġif Ġ( this . id Ġ== Ġid ) Ġreturn Ġthis ĊĠĠĠ Ġchildren . fast ForEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġit . find Child ById ( id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!= Ġnull ) Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ private Ġfun ĠLayout Node . findOne Layer Of Semantics Wrappers ( ĊĠĠĠ Ġlist : ĠMutable List < Semantics Wrapper > Ġ= Ġmutable ListOf < Semantics Wrapper >() Ċ ): ĠList < Semantics Wrapper > Ġ{ ĊĠĠĠ Ġz Sorted Children . forEach Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġouter Semantics Ġ= Ġchild . outer Semantics ĊĠĠĠĠĠĠĠ Ġif Ġ( outer Semantics Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( outer Semantics ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild . findOne Layer Of Semantics Wrappers ( list ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlist Ċ } Ċ Ċ /** Ċ Ġ* ĠExec utes Ġ[ selector ] Ġon Ġevery Ġparent Ġof Ġthis Ġ[ Layout Node ] Ġand Ġreturns Ġthe Ġclosest Ċ Ġ* Ġ[ Layout Node ] Ġto Ġreturn Ġ` true ` Ġfrom Ġ[ selector ] Ġor Ġnull Ġif Ġ[ selector ] Ġreturns Ġfalse Ċ Ġ* Ġfor Ġall Ġan cestors . Ċ Ġ*/ Ċ private Ġfun ĠLayout Node . find Closest Parent Node ( selector : Ġ( Layout Node ) Ġ-> ĠBoolean ): ĠLayout Node ? Ġ{ ĊĠĠĠ Ġvar Ġcurrent Parent Ġ= Ġthis . parent ĊĠĠĠ Ġwhile Ġ( current Parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( selector ( current Parent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent Parent ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Parent Ġ= Ġcurrent Parent . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnull Ċ } Ċ