package Ġtriple k lay . ui Ċ Ċ import Ġe uk lid . f .* Ċ import Ġk lay . core . Event Ċ import Ġk lay . scene . Group Layer Ċ import Ġk lay . scene . Layer Ċ import Ġk lay . scene . Layer Util Ċ import Ġk lay . scene . Pointer Ċ import Ġreact . Closeable Ċ import Ġreact . Unit Slot Ċ import Ġtriple k lay . platform . TP Platform Ċ import Ġtriple k lay . ui . Log . log Ċ import Ġtriple k lay . ui . util . Box Point Ċ Ċ /** Ċ Ġ* ĠProvides Ġa Ġcontext Ġfor Ġpop ping Ġup Ġa Ġmenu . Ċ Ġ*/ Ċ class ĠMenu Host Ċ /** Ċ Ġ* ĠCreates Ġa Ġnew Ġmenu Ġhost Ġusing Ġthe Ġgiven Ġvalues . ĠThe Ġstylesheet Ġis Ġset Ġto Ġan Ġempty Ċ Ġ* Ġone Ġand Ġcan Ġbe Ġchanged Ġvia Ġthe Ġ[. setStyle sheet ] Ġmethod . Ċ Ġ*/ Ċ ( ĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġinterface Ġwe Ġuse Ġto Ġcreate Ġthe Ġmenu 's Ġroot Ġand Ġdo Ġanimation . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġiface : ĠInterface , ĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġroot Ġlayer Ġthat Ġwill Ġcontain Ġall Ġmenus Ġthat Ġpop Ġup . ĠIt Ġshould Ġnormally Ġbe Ġclose Ġto Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġtop Ġof Ġthe Ġhierarchy Ġso Ġthat Ġit Ġdraw s Ġon Ġtop Ġof Ġeverything . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġroot Layer : ĠGroup Layer ) Ġ{ ĊĠĠĠ Ġ/** ĠDefines Ġhow Ġto Ġobtain Ġthe Ġpoint Ġon Ġa Ġtrigger Ġwhere Ġa Ġmenu Ġpopup Ġorig inates . Ġ Ġ*/ ĊĠĠĠ Ġinterface ĠTrigger Point Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠFor Ġthe Ġgiven Ġtrigger Ġand Ġpointer Ġposition , Ġgets Ġthe Ġscreen Ġcoordinates Ġwhere Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġmenu Ġpopup Ġshould Ġorig inate . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġget Location ( trigger : ĠElement <* >, Ġpointer : ĠI Point ?): ĠPoint ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAn Ġevent Ġtype Ġfor Ġtriggering Ġa Ġmenu Ġpopup . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠPop ĊĠĠĠ Ġ/** ĠCreates Ġa Ġnew Ġevent Ġand Ġinitializes Ġ[. trigger ] Ġand Ġ[. menu ]. Ġ Ġ*/ ĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠThe Ġelement Ġthat Ġtriggered Ġthe Ġpopup . Ġ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtrigger : ĠElement <* >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠThe Ġmenu Ġto Ġshow . Ġ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmenu : ĠMenu , Ġpointer : ĠEvent . XY ? Ġ= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġposition Ġof Ġthe Ġpointer , Ġif Ġgiven Ġduring Ġconstruction , Ġotherwise Ġnull . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġpointer : ĠI Point ? ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġbounds Ġto Ġconf ine Ġthe Ġmenu , Ġin Ġscreen Ġcoordinates ; Ġusually Ġthe Ġwhole Ġscreen . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġbounds : ĠI Rectangle ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . pointer Ġ= Ġif Ġ( pointer Ġ== Ġnull ) Ġnull Ġelse ĠPoint ( pointer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCause s Ġthe Ġmenu Ġto Ġhandle Ġfurther Ġevents Ġon Ġthe Ġgiven Ġlayer . ĠThis Ġis Ġusually Ġthe Ġlayer ĊĠĠĠĠĠĠĠĠ Ġ* Ġhandling Ġa Ġpointer Ġstart Ġthat Ġcaused Ġthe Ġpopup . ĠA Ġlistener Ġwill Ġbe Ġadded Ġto Ġthe Ġlayer ĊĠĠĠĠĠĠĠĠ Ġ* Ġand Ġthe Ġmenu Ġnotified Ġof Ġpointer Ġdrag Ġand Ġend Ġevents . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġrelay Events ( layer : ĠLayer ): ĠPop Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ relay Target Ġ= Ġlayer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠFlags Ġthis Ġ` Pop ` Ġevent Ġso Ġthat Ġthe Ġmenu Ġwill Ġnot Ġbe Ġdestroyed Ġautomatically Ġwhen ĊĠĠĠĠĠĠĠĠ Ġ* Ġit Ġis Ġde activated . ĠReturns Ġthis Ġinstance Ġfor Ġchaining . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġretain Menu (): ĠPop Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ retain Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠOptionally Ġconf ines Ġthe Ġmenu Ġarea Ġto Ġthe Ġgiven Ġscreen Ġarea . ĠBy Ġdefault Ġthe Ġmenu Ġis ĊĠĠĠĠĠĠĠĠ Ġ* Ġconf ined Ġby Ġthe Ġhost 's Ġscreen Ġarea Ġ( see Ġ[ Menu Host . get Screen Area ]). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġin Screen Area ( area : ĠI Rectangle ): ĠPop Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds Ġ= ĠRectangle ( area ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠOptionally Ġconf ines Ġthe Ġmenu Ġarea Ġto Ġthe Ġgiven Ġelement . ĠBy Ġdefault Ġthe Ġmenu Ġis Ġconf ined ĊĠĠĠĠĠĠĠĠ Ġ* Ġby Ġthe Ġhost 's Ġscreen Ġarea Ġ( see Ġ[ Menu Host . get Screen Area ]). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġin Element ( elem : ĠElement < *> ): ĠPop Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtl Ġ= ĠLayer Util . layer To Screen ( elem . layer , Ġ 0 f , Ġ 0 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbr Ġ= ĠLayer Util . layer To Screen ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelem . layer , Ġelem . size (). width , Ġelem . size (). height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds Ġ= ĠRectangle ( tl . x , Ġtl . y , Ġbr . x Ġ- Ġtl . x , Ġbr . y Ġ- Ġtl . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠP ops Ġup Ġthis Ġinstance Ġon Ġthe Ġtrigger 's Ġroot 's Ġmenu Ġhost . ĠSee Ġ[ Menu Host . popup ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĠFor Ġconvenience , Ġreturns Ġthe Ġhost Ġthat Ġwas Ġused Ġto Ġperform Ġthe Ġpopup . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġpopup (): ĠMenu Host ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġtrigger . root () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( root Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . log . warning (" Menu Ġtrigger Ġnot Ġon Ġa Ġroot ?", Ġ" trigger ", Ġtrigger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . menu Host . popup ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġroot . menu Host ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠWhether Ġwe Ġshould Ġkeep Ġthe Ġmenu Ġaround Ġ( i . e . Ġnot Ġdestroy Ġit ). Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġ_ retain : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġlayer Ġthat Ġwill Ġbe Ġsending Ġpointer Ġdrag Ġand Ġend Ġevents Ġto Ġus . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġ_ relay Target : ĠLayer ? Ġ= Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĠCreates Ġa Ġnew Ġevent Ġand Ġinitializes Ġ[. trigger ] Ġand Ġ[. menu ]. Ġ Ġ*/ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġmenu Ġhost Ġusing Ġthe Ġgiven Ġvalues . ĠThe Ġroot Ġlayer Ġis Ġset Ġto Ġthe Ġlayer Ġof Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġroot Ġand Ġthe Ġstylesheet Ġto Ġits Ġstylesheet . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( iface : ĠInterface , Ġroot : ĠElements <* >) Ġ: Ġthis ( iface , Ġroot . layer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ stylesheet Ġ= Ġroot . stylesheet () !! ĊĠĠĠĠĠĠĠ Ġ_ screen Area . setSize ( iface . plat . graphics . view Size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġstylesheet Ġfor Ġmenus Ġpop ped Ġby Ġthis Ġhost . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Style sheet ( sheet : ĠStyles heet ): ĠMenu Host Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ stylesheet Ġ= Ġsheet ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDe activ ates Ġthe Ġcurrent Ġmenu , Ġif Ġany Ġis Ġshowing . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdeactivate () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(_ active Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ active !!. pop . menu !!. deactivate () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġarea Ġto Ġwhich Ġmenus Ġshould Ġbe Ġconf ined Ġwhen Ġthere Ġisn 't Ġany Ġother Ġassociated ĊĠĠĠĠ Ġ* Ġbounds . ĠBy Ġdefault , Ġthe Ġentire Ġavailable Ġarea Ġis Ġused , Ġas Ġgiven Ġby ĊĠĠĠĠ Ġ* Ġ[ play n . core . Graphics ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġarea Ġto Ġwhich Ġmenus Ġshould Ġbe Ġconf ined Ġwhen Ġthere Ġisn 't Ġany Ġother Ġassociated ĊĠĠĠĠ Ġ* Ġbounds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġscreen Area : ĠI Rectangle ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ screen Area ĊĠĠĠĠĠĠĠ Ġset ( screen Area ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ screen Area . setBounds ( screen Area ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDisplays Ġthe Ġmenu Ġspecified Ġby Ġthe Ġgiven Ġpop , Ġincorpor ating Ġall Ġthe Ġconfigured Ġattributes ĊĠĠĠĠ Ġ* Ġthere in . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġpopup ( pop : ĠPop ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġif Ġthere Ġis Ġno Ġexplicit Ġconstraint Ġarea Ġrequested , Ġuse Ġthe Ġgraphics ĊĠĠĠĠĠĠĠ Ġif Ġ( pop . bounds Ġ== Ġnull ) Ġpop . in Screen Area (_ screen Area ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġup Ġthe Ġmenu Ġroot , Ġthe ĠRoot Layout Ġwill Ġdo Ġthe Ġcomplicated Ġbounds Ġj ock ey ing ĊĠĠĠĠĠĠĠ Ġval Ġmenu Root Ġ= Ġiface . add Root ( Menu Root ( iface , Ġ_ stylesheet , Ġpop )) ĊĠĠĠĠĠĠĠ Ġroot Layer . add ( menu Root . layer ) ĊĠĠĠĠĠĠĠ Ġmenu Root . pack () ĊĊĠĠĠĠĠĠĠ Ġ// Ġset Ġup Ġthe Ġactivation ĊĠĠĠĠĠĠĠ Ġval Ġactivation Ġ= ĠActivation ( pop ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġcleanup ĊĠĠĠĠĠĠĠ Ġval Ġcleanup : ĠUnit Slot Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġparent age , Ġit 's Ġpossible Ġthe Ġmenu Ġhas Ġbeen Ġre pop ped Ġalready ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pop . menu !!. parent () Ġ=== Ġmenu Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfree Ġthe Ġconstraint Ġto Ġgc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpop . menu . set Constraint ( null ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġor Ġdestroy Ġit , Ġdepending Ġon Ġthe Ġcaller 's Ġpreference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pop ._ retain ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Root . remove ( pop . menu ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmenu Root . destroy ( pop . menu ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġremove Ġthe Ġhidden Ġarea Ġwe Ġadded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTP Platform . instance (). hide Native Overlay s ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclear Ġall Ġconnections ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivation . clear () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġalways Ġkill Ġoff Ġthe Ġtransient Ġroot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiface . dispose Root ( menu Root ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthis Ġwas Ġour Ġactive Ġmenu , Ġclear Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(_ active Ġ!= Ġnull Ġ&& Ġ_ active !!. pop Ġ=== Ġpop ) Ġ_ active Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġconnect Ġto Ġde activation Ġsignal Ġand Ġdo Ġour Ġcleanup ĊĠĠĠĠĠĠĠ Ġactivation . de activated Ġ= Ġpop . menu . de activated (). connect ({ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdue Ġto Ġanimations , Ġde activation Ġcan Ġhappen Ġduring Ġlayout , Ġso Ġdo Ġit Ġnext Ġframe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiface . frame . connect ( cleanup ). once () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Ġclose Ġthe Ġmenu Ġany Ġtime Ġthe Ġtrigger Ġis Ġremoved Ġfrom Ġthe Ġhierarchy ĊĠĠĠĠĠĠĠ Ġactivation . trigger Removed Ġ= Ġpop . trigger . hierarchy Changed (). connect ({ Ġevent : ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! event ) Ġpop . menu . deactivate () ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ// Ġdeactivate Ġthe Ġold Ġmenu ĊĠĠĠĠĠĠĠ Ġif Ġ(_ active Ġ!= Ġnull ) Ġ_ active !!. pop . menu . deactivate () ĊĊĠĠĠĠĠĠĠ Ġ// Ġpass Ġalong Ġthe Ġanim ator ĊĠĠĠĠĠĠĠ Ġpop . menu . init ( iface . anim ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġactivate ĊĠĠĠĠĠĠĠ Ġ_ active Ġ= Ġactivation ĊĠĠĠĠĠĠĠ Ġpop . menu . activate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġactive Pop (): ĠPop ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(_ active Ġ!= Ġnull ) Ġ_ active !!. pop Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġactive (): ĠMenu ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(_ active Ġ!= Ġnull ) Ġ_ active !!. pop . menu Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġclass ĠMenu Root ( iface : ĠInterface , Ġsheet : ĠStyles heet , Ġval Ġpop : ĠPop ) Ġ: ĠRoot ( iface , ĠRoot Layout ( iface . plat . input . has Touch ), Ġsheet ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayer . set Depth ( 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayer . set Hit Tester ( null ) Ġ// Ġget Ġhits Ġfrom Ġout Ġof Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( pop . menu ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠSimple Ġlayout Ġfor Ġposition ing Ġthe Ġmenu Ġwithin Ġthe Ġtransient Ġ` Root `. Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġclass ĠRoot Layout ( private Ġval Ġ_ has Touch : ĠBoolean ) Ġ: ĠLayout () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcompute Size ( elems : ĠContainer <* >, Ġhint X : ĠFloat , Ġhint Y : ĠFloat ): ĠDimension Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDimension ( preferred Size ( elems . child At ( 0 ), Ġhint X , Ġhint Y )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlayout ( elems : ĠContainer <* >, Ġleft : ĠFloat , Ġtop : ĠFloat , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth : ĠFloat , Ġheight : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elems . child Count () Ġ== Ġ 0 ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmenu Root Ġ= Ġelems Ġas ĠMenu Root ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpop Ġ= Ġmenu Root . pop ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġtrigger Ġpoint Ġfrom Ġthe Ġtrigger ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġresolve Style ( pop . trigger , ĠTR IG GER _ POINT ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġorigin Ġpoint Ġfrom Ġthe Ġmenu ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġresolve Style ( pop . trigger , ĠPOP UP _ ORIGIN ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġthe Ġdesired Ġposition , Ġmay Ġbe Ġrelative Ġto Ġtrigger Ġor Ġpointer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt pos Ġ= Ġposition . getLocation ( pop . trigger , Ġpop . pointer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmp os Ġ= Ġorigin . resolve ( 0 f , Ġ 0 f , Ġwidth , Ġheight , ĠPoint ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfigure Ġout Ġthe Ġbest Ġplace Ġto Ġput Ġthe Ġmenu , Ġin Ġscreen Ġcoordinates ; Ġstarting Ġwith ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġrequested Ġpopup Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbounds Ġ= ĠRectangle ( tp os . x Ġ- Ġmp os . x , Ġt pos . y Ġ- Ġmp os . y , Ġwidth , Ġheight ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmake Ġsure Ġthe Ġmenu Ġlies Ġinside Ġthe Ġrequested Ġbounds Ġif Ġthe Ġmenu Ġdoesn 't Ġdo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthat Ġitself ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pop . menu . autom atically Conf ine ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconf ine ( pop . bounds , Ġbounds ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġf udge Ġis Ġthe Ġnumber Ġof Ġpixels Ġaround Ġthe Ġmenu Ġthat Ġwe Ġdon 't Ġneed Ġto Ġavoid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġcan Ġwe Ġget Ġthe Ġmenu 's ĠBackground 's Ġin sets ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf udge Ġ= Ġ 2 f ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġdo Ġwe Ġneed Ġany Ġof Ġthis Ġfinger Ġavoid ance Ġstuff Ġif Ġthe Ġpopup Ġis Ġnot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrelative Ġto Ġthe Ġpointer ? ĠE . g . Ġa Ġcombo Ġbox Ġwith Ġits Ġmenu Ġoff Ġto Ġthe Ġright ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġkeep Ġthe Ġbounds Ġfrom Ġoverlapping Ġthe Ġposition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bounds . width Ġ> Ġf udge Ġ* Ġ 2 Ġ&& Ġbounds . height Ġ> Ġf udge Ġ* Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi bounds Ġ= ĠRectangle ( bounds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi bounds . grow (- f udge , Ġ- f udge ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġup Ġthe Ġfingerprint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinger Radius Ġ= Ġ( if Ġ(_ has Touch ) Ġ 1 0 Ġelse Ġ 3 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinger Pos Ġ= Ġpop . pointer Ġ?: Ġt pos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinger Box Ġ= ĠRectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinger Pos . x Ġ- Ġfinger Radius , Ġfinger Pos . y Ġ- Ġfinger Radius , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinger Radius Ġ* Ġ 2 , Ġfinger Radius Ġ* Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtry Ġand Ġplace Ġthe Ġmenu Ġso Ġit Ġisn 't Ġunder Ġthe Ġfinger ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! avoid Point ( pop . bounds , Ġi bounds , Ġfinger Box )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warning (" Oh Ġgod , Ġmenu Ġdoesn 't Ġfit ", Ġ" menu ", Ġpop . menu ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . setLocation ( i bounds . x Ġ- Ġf udge , Ġi bounds . y Ġ- Ġf udge ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsave Ġa Ġcopy Ġof Ġbounds Ġin Ġscreen Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscreen Bounds Ġ= ĠRectangle ( bounds ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġre locate Ġto Ġlayer Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbounds . setLocation ( Layer Util . screen To Layer ( elems . layer , Ġbounds . x , Ġbounds . y )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġthe Ġmenu Ġbounds ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Bounds ( elems . child At ( 0 ), Ġbounds . x , Ġbounds . y , Ġbounds . width , Ġbounds . height ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġmenu Ġis Ġclosed Ġ( layout Ġcan Ġstill Ġoccur Ġin Ġthis Ġstate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! pop . menu ._ def unct ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtell Ġthe ĠUI Ġoverlay Ġto Ġlet Ġthe Ġreal Ġdimensions Ġof Ġthe Ġmenu Ġthrough ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġthis Ġlooks Ġwrong Ġif Ġthe Ġmenu Ġhas Ġany Ġtransparent Ġborder Ġ- Ġfix ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġby Ġusing Ġan Ġimage Ġoverlay Ġinstead , Ġwith Ġthe Ġroot Ġcaptured Ġonto Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTP Platform . instance (). hide Native Overlay s ( screen Bounds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠHold s Ġa Ġfew Ġvariables Ġrelated Ġto Ġthe Ġmenu 's Ġactivation . Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġclass ĠActivation ĊĠĠĠ Ġ/** ĠCreates Ġa Ġnew Ġactivation . Ġ Ġ*/ ĊĠĠĠ Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ/** ĠThe Ġconfiguration Ġof Ġthe Ġmenu . Ġ Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpop : ĠPop ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠConnect s Ġto Ġthe Ġpointer Ġevents Ġfrom Ġthe Ġrelay . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġpointer Relay Ġ= ĠClose able . Util . NO OP ĊĊĠĠĠĠĠĠĠ Ġ/** ĠConnection Ġto Ġthe Ġtrigger 's Ġhierarchy Ġchange . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġtrigger Removed : ĠClose able ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** ĠConnection Ġto Ġthe Ġmenu 's Ġde activation . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġvar Ġde activated : ĠClose able ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhandle Ġpointer Ġevents Ġfrom Ġthe Ġrelay ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġpop ._ relay Target ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Ġ!= Ġnull ) Ġpointer Relay Ġ= Ġrelay Events ( target , Ġpop . menu ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠClear s Ġout Ġthe Ġconnections . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( trigger Removed Ġ!= Ġnull ) Ġtrigger Removed !!. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( de activated Ġ!= Ġnull ) Ġde activated !!. close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Relay Ġ= ĠClose able . Util . close ( pointer Relay ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrigger Removed Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġde activated Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġclass ĠAbsolute ( x : ĠFloat , Ġy : ĠFloat ) Ġ: ĠTrigger Point Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpos : ĠPoint ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ= ĠPoint ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Location ( trigger : ĠElement <* >, Ġpointer : ĠI Point ?): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPoint ( pos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThe Ġstylesheet Ġused Ġfor Ġpop ped Ġmenus . Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġ_ stylesheet Ġ= ĠStyles heet . builder (). create () ĊĊĠĠĠ Ġ/** ĠCurrently Ġactive . Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġvar Ġ_ active : ĠActivation ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠWhen Ġcon fin ing Ġthe Ġmenu Ġto Ġthe Ġgraphics ' Ġbounds , Ġuse Ġthis . Ġ Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġ_ screen Area Ġ= ĠRectangle () ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ/** ĠGets Ġa Ġtrigger Ġpoint Ġrelative Ġto Ġan Ġelement Ġusing Ġthe Ġgiven Ġbox Ġpoint . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġrelative ( location : ĠBox Point ): ĠTrigger Point Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠTrigger Point Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Location ( trigger : ĠElement <* >, Ġpointer : ĠI Point ?): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlocation . resolve ( trigger , ĠPoint ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠGets Ġa Ġfixed Ġtrigger Ġpoint Ġfor Ġthe Ġgiven Ġscreen Ġcoordinates . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġabsolute ( x : ĠFloat , Ġy : ĠFloat ): ĠTrigger Point Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAbsolute ( x , Ġy ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠGets Ġa Ġtrigger Ġpoint Ġexactly Ġunder Ġthe Ġpointer Ġposition . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġpointer (): ĠTrigger Point Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠTrigger Point Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Location ( trigger : ĠElement <* >, Ġpointer : ĠI Point ?): ĠPoint Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPoint ( pointer !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġpoint Ġon Ġan Ġelement Ġwhere Ġmenus Ġshould Ġbe Ġplaced , Ġsubject Ġto Ġboundary Ġconstraints . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġonly Ġused Ġif Ġthe Ġelement Ġis Ġset Ġto Ġa Ġ[ Pop . trigger ]. ĠBy Ġdefault , Ġuses Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġtop Ġleft Ġcorner Ġof Ġthe Ġtrigger . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠTR IG GER _ POINT Ġ= ĠStyle . new Style ( true , Ġrelative ( Box Point . TL )) ĊĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġpoint Ġon Ġthe Ġmenu Ġthat Ġshould Ġbe Ġplaced Ġdirectly Ġon Ġtop Ġof Ġthe Ġtrigger Ġpoint , Ġsubject ĊĠĠĠĠĠĠĠĠ Ġ* Ġto Ġbounding Ġconstraints . ĠThis Ġis Ġonly Ġused Ġif Ġthe Ġelement Ġis Ġset Ġto Ġa Ġ[ Pop . trigger ]. ĊĠĠĠĠĠĠĠĠ Ġ* ĠBy Ġdefault , Ġthe Ġtop , Ġleft Ġcorner Ġis Ġthe Ġorigin . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġval ĠPOP UP _ ORIGIN Ġ= ĠStyle . new Style ( true , ĠBox Point . TL ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġrelay Events ( from : ĠLayer , Ġto : ĠMenu ): ĠClose able Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfrom . events (). connect ( object Ġ: ĠPointer . Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Drag ( pi : ĠPointer . Interaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto . on Pointer Drag ( pi . event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon End ( pi : ĠPointer . Interaction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto . on Pointer End ( pi . event ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠT ries Ġto Ġplace Ġthe Ġinner Ġbounds Ġwithin Ġthe Ġouter Ġbounds , Ġsuch Ġthat Ġthe Ġinner Ġbounds Ġdoes ĊĠĠĠĠĠĠĠĠ Ġ* Ġnot Ġcontain Ġthe Ġposition . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġavoid Point ( outer : ĠI Rectangle ?, Ġinner : ĠRectangle , Ġfingerprint : ĠI Rectangle ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcheck Bounds Ġ= ĠRectangle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbest Ġ= ĠRectangle ( inner ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbest Dist Ġ= ĠFloat . MAX _ VALUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġedge : ĠFloat ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconf ine Ġto Ġthe Ġleft ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedge Ġ= Ġfingerprint . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds . setBounds ( outer !!. x , Ġouter . y , Ġedge Ġ- Ġouter . x , Ġouter . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbest Dist Ġ= Ġcompare And Conf ine ( check Bounds , Ġinner , Ġbest , Ġbest Dist ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġright ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedge Ġ= Ġfingerprint . max X ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds . setBounds ( edge , Ġouter . y , Ġouter . width Ġ- Ġedge , Ġouter . height ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbest Dist Ġ= Ġcompare And Conf ine ( check Bounds , Ġinner , Ġbest , Ġbest Dist ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedge Ġ= Ġfingerprint . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds . setBounds ( outer . x , Ġouter . y , Ġouter . width , Ġedge Ġ- Ġouter . y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbest Dist Ġ= Ġcompare And Conf ine ( check Bounds , Ġinner , Ġbest , Ġbest Dist ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbottom ĊĠĠĠĠĠĠĠĠĠĠĠ Ġedge Ġ= Ġfingerprint . max Y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Bounds . setBounds ( outer . x , Ġedge , Ġouter . width , Ġouter . height Ġ- Ġedge ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbest Dist Ġ= Ġcompare And Conf ine ( check Bounds , Ġinner , Ġbest , Ġbest Dist ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner . setBounds ( best ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbest Dist Ġ< ĠFloat . MAX _ VALUE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠConf ines Ġa Ġrectangle Ġand Ġupdates Ġthe Ġcurrent Ġbest Ġfit Ġbased Ġon Ġthe Ġmoved Ġdistance . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġcompare And Conf ine ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġouter : ĠI Rectangle , Ġinner : ĠI Rectangle , Ġbest : ĠRectangle , Ġbest Dist : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbest Dist Ġ= Ġbest Dist ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdon 't Ġbother Ġif Ġthere Ġisn 't Ġeven Ġenough Ġspace ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( outer . width Ġ<= Ġinner . width Ġ|| Ġouter . height Ġ< Ġinner . height ) Ġreturn Ġbest Dist ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġconf ine ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconf ined Ġ= Ġconf ine ( outer , ĠRectangle ( inner )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġdistance Ġand Ġoverwrite Ġthe Ġbest Ġfit Ġif Ġwe Ġhave Ġa Ġnew Ġwinner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdx Ġ= Ġconf ined . x Ġ- Ġinner . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdy Ġ= Ġconf ined . y Ġ- Ġinner . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Ġ= Ġdx Ġ* Ġdx Ġ+ Ġdy Ġ* Ġdy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dist Ġ< Ġbest Dist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbest . setBounds ( conf ined ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbest Dist Ġ= Ġdist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbest Dist ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠMov es Ġth s Ġgiven Ġinner Ġrectangle Ġsuch Ġthat Ġit Ġlies Ġwithin Ġthe Ġgiven Ġouter Ġrectangle . ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġresults Ġare Ġundefined Ġif Ġeither Ġthe Ġinner Ġwidth Ġor Ġheight Ġis Ġgreater Ġthat Ġthe Ġouter 's ĊĠĠĠĠĠĠĠĠ Ġ* Ġwidth Ġor Ġheight , Ġrespectively . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprotected Ġfun Ġconf ine ( outer : ĠI Rectangle ?, Ġinner : ĠRectangle ): ĠRectangle Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdx Ġ= Ġouter !!. x Ġ- Ġinner . x ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdy Ġ= Ġouter . y Ġ- Ġinner . y ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dx Ġ<= Ġ 0 ) Ġdx Ġ= Ġmin Of ( 0 f , Ġouter . max X Ġ- Ġinner . max X ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dy Ġ<= Ġ 0 ) Ġdy Ġ= Ġmin Of ( 0 f , Ġouter . max Y Ġ- Ġinner . max Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinner . translate ( dx , Ġdy ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinner ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ