package Ġio . nac ular . do od le . drawing . impl Ċ Ċ import Ġio . nac ular . do od le . controls . buttons . Button Ċ import Ġio . nac ular . do od le . controls . buttons . Button Model Ċ import Ġio . nac ular . do od le . controls . buttons . CheckBox Ċ import Ġio . nac ular . do od le . core . View Ċ import Ġio . nac ular . do od le . dom . Element R uler Ċ import Ġio . nac ular . do od le . dom . Event Ċ import Ġio . nac ular . do od le . dom . Html Factory Ċ import Ġio . nac ular . do od le . dom . Inline Ċ import Ġio . nac ular . do od le . dom . Static Ċ import Ġio . nac ular . do od le . dom . add Ċ import Ġio . nac ular . do od le . dom . insert Ċ import Ġio . nac ular . do od le . dom . remove Ċ import Ġio . nac ular . do od le . dom . set Display Ċ import Ġio . nac ular . do od le . dom . set Height Percent Ċ import Ġio . nac ular . do od le . dom . set Left Ċ import Ġio . nac ular . do od le . dom . set Margin Ċ import Ġio . nac ular . do od le . dom . setPosition Ċ import Ġio . nac ular . do od le . dom . set Top Ċ import Ġio . nac ular . do od le . dom . setWidth Percent Ċ import Ġio . nac ular . do od le . drawing . Canvas Ċ import Ġio . nac ular . do od le . drawing . Text Factory Ċ import Ġio . nac ular . do od le . drawing . Text Metrics Ċ import Ġio . nac ular . do od le . focus . Focus Manager Ċ import Ġio . nac ular . do od le . geometry . Point Ċ import Ġio . nac ular . do od le . geometry . Size Ċ import Ġio . nac ular . do od le . geometry . Size . Companion . Empty Ċ import Ġio . nac ular . do od le . utils . Anchor Ċ import Ġorg . w 3 c . dom . HTMLElement Ċ import Ġorg . w 3 c . dom . HTML InputElement Ċ import Ġkotlin . math . max Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠN ich olas ĠE ddy Ġon Ġ 4 / 2 5 / 1 9 . Ċ Ġ*/ Ċ internal Ġenum Ġclass ĠType ( internal Ġval Ġvalue : ĠString ) Ġ{ ĠCheck (" checkbox "), ĠRadio (" radio ") Ġ} Ċ Ċ internal Ġinterface ĠNative CheckBox RadioButton Factory Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( button : ĠButton , Ġtype : ĠType ): ĠNative CheckBox RadioButton Ċ } Ċ Ċ internal Ġclass ĠNative CheckBox RadioButton Factory Impl Ġinternal Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Factory ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠText Factory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Metrics ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠText Metrics , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhtml Factory ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠHtml Factory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġelement R uler ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠElement R uler , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnative EventHandler Factory : ĠNative EventHandler Factory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfocus Manager ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠFocus Manager ? Ċ ): ĠNative CheckBox RadioButton Factory Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġinvoke ( button : ĠButton , Ġtype : ĠType ) Ġ= ĠNative CheckBox RadioButton ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Factory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Metrics , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement R uler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnative EventHandler Factory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Manager , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhtml Factory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĊĠĠĠ Ġ) Ċ } Ċ Ċ internal Ġclass ĠNative CheckBox RadioButton ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbutton ĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠButton , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Factory ĠĠĠĠĠĠ Ġ: ĠText Factory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Metrics ĠĠĠĠĠĠ Ġ: ĠText Metrics , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġelement R uler ĠĠĠĠĠ Ġ: ĠElement R uler , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġhandler Factory ĠĠĠ Ġ: ĠNative EventHandler Factory , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfocus Manager ĠĠĠĠĠ Ġ: ĠFocus Manager ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhtml Factory ĠĠĠĠĠĠ Ġ: ĠHtml Factory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ: ĠType Ċ ): ĠNative EventListener Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġtext Size Ġ Ġ= ĠEmpty ĊĠĠĠ Ġprivate Ġvar Ġinput Size Ġ= ĠEmpty ĊĊĠĠĠ Ġval Ġideal Size : ĠSize Ġget () Ġ= ĠSize ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Size . width Ġ+ Ġif Ġ( text Size . width Ġ> Ġ 0 ) Ġbutton . icon Text Spacing Ġ+ Ġtext Size . width Ġelse Ġ 0 . 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax ( input Size . height , Ġtext Size . height ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġroot EventHandler Ġ: ĠNative EventHandler ĊĠĠĠ Ġprivate Ġval Ġinput EventHandler : ĠNative EventHandler ĊĊĠĠĠ Ġprivate Ġval Ġinput Element Ġ= Ġhtml Factory . create Input (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . type Ġ= Ġtype . value ĊĠĠĠĠĠĠĠ Ġchecked ĠĠ Ġ= Ġbutton . selected ĊĠĠĠĠĠĠĠ Ġtab Index Ġ Ġ= Ġif Ġ( button . selected ) Ġ 0 Ġelse Ġ- 1 ĊĠĠĠĠĠĠĠ Ġdisabled Ġ Ġ= Ġ! button . enabled ĊĊĠĠĠĠĠĠĠ Ġif Ġ( button Ġis ĠCheckBox ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġin determinate Ġ= Ġbutton . in determinate ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġstyle . setPosition ( Static ()) Ġ// Ġremove Ġabsolute Ġposition ing Ġdue Ġto Ġglobal Ġstyle ĊĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= Ġhtml Factory . create < HTMLElement >(). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . style . setPosition ( Static ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . style . fontFamily Ġ= Ġ" initial " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . style . fontSize ĠĠ Ġ= Ġ" initial " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . style . font Weight Ġ= Ġ" initial " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . add ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinput Size Ġ= Ġelement R uler . size ( block ) ĊĊĠĠĠĠĠĠĠ Ġstyle . setPosition () Ġ// Ġrestore Ġabsolute ĊĊĠĠĠĠĠĠĠ Ġinput EventHandler Ġ= Ġhandler Factory ( this , Ġthis @ Native CheckBox RadioButton ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Focus Listener ĠĠĠĠĠĠĠĠĠĠ Ġ() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Consum ing Pointer Press Events () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġroot Element Ġ= Ġhtml Factory . create < HTMLElement >(" LABEL "). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġstyle . setWidth Percent Ġ( 1 0 0 . 0 ) ĊĠĠĠĠĠĠĠ Ġstyle . set Height Percent ( 1 0 0 . 0 ) ĊĊĠĠĠĠĠĠĠ Ġroot EventHandler Ġ= Ġhandler Factory ( this , Ġthis @ Native CheckBox RadioButton ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister Focus Listener ĠĠĠĠĠĠĠĠĠĠ Ġ() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregister ClickListener ĠĠĠĠĠĠĠĠĠĠ Ġ() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Consum ing Pointer Press Events () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd ( input Element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġtext Element : ĠHTMLElement ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġval Ġfocus Changed : Ġ( View , ĠBoolean , ĠBoolean ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, _, new Ġ-> ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ġ Ġ-> Ġinput Element . focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġinput Element . blur Ġ() ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġstyle Changed : Ġ( View ) Ġ-> ĠUnit Ġ= Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( button Ġis ĠCheckBox ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput Element . in determinate Ġ= Ġbutton . in determinate ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit . rer ender () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġselection Changed : Ġ( Button Model , ĠBoolean , ĠBoolean ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, _, new Ġ-> ĊĠĠĠĠĠĠĠ Ġinput Element . checked Ġ= Ġnew ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġenabled Changed : Ġ( View , ĠBoolean , ĠBoolean ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, _, new Ġ-> ĊĠĠĠĠĠĠĠ Ġinput Element . disabled Ġ= Ġ! new ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfocus ability Changed : Ġ( View , ĠBoolean , ĠBoolean ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, _, new Ġ-> ĊĠĠĠĠĠĠĠ Ġinput Element . tab Index Ġ= Ġif Ġ( new ) Ġ 0 Ġelse Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġbutton . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Changed ĠĠĠĠĠĠĠĠĠ Ġ+= Ġthis @ Native CheckBox RadioButton . focus Changed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Changed ĠĠĠĠĠĠĠĠĠ Ġ+= Ġthis @ Native CheckBox RadioButton . style Changed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Changed ĠĠĠĠĠĠĠ Ġ+= Ġthis @ Native CheckBox RadioButton . enabled Changed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus ability Changed ĠĠ Ġ+= Ġthis @ Native CheckBox RadioButton . focus ability Changed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . selected Changed Ġ+= Ġthis @ Native CheckBox RadioButton . selection Changed ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġset Text () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdiscard () Ġ{ ĊĠĠĠĠĠĠĠ Ġbutton . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Changed ĠĠĠĠĠĠĠĠĠ Ġ-= Ġthis @ Native CheckBox RadioButton . focus Changed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Changed ĠĠĠĠĠĠĠĠĠ Ġ-= Ġthis @ Native CheckBox RadioButton . style Changed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenabled Changed ĠĠĠĠĠĠĠ Ġ-= Ġthis @ Native CheckBox RadioButton . enabled Changed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus ability Changed ĠĠ Ġ-= Ġthis @ Native CheckBox RadioButton . focus ability Changed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodel . selected Changed Ġ-= Ġthis @ Native CheckBox RadioButton . selection Changed ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġroot EventHandler . unregister Focus Listener ĠĠĠĠĠĠĠĠ Ġ() ĊĠĠĠĠĠĠĠ Ġroot EventHandler . stop Consum ing Pointer Press Events Ġ() ĊĠĠĠĠĠĠĠ Ġinput EventHandler . unregister Focus Listener ĠĠĠĠĠĠĠ Ġ() ĊĠĠĠĠĠĠĠ Ġinput EventHandler . unregister ClickListener ĠĠĠĠĠĠĠ Ġ() ĊĠĠĠĠĠĠĠ Ġinput EventHandler . stop Consum ing Pointer Press Events () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrender ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( canvas Ġis ĠNative Canvas ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . addData ( listOf ( root Element ), ĠPoint . Origin ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Elements () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( button . has Focus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Element . focus () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonClick ( event : ĠEvent ) Ġ= Ġtrue . also Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Keyboard Click ( event ) Ġ|| Ġevent . target Ġis ĠHTML InputElement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbutton . click () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Focus G ained ( event : ĠEvent ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġbutton . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . focus able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Manager ?. request Focus ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Focus Lost ( event : ĠEvent ) Ġ= Ġtrue . also Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( button Ġ=== Ġfocus Manager ?. focus Owner ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfocus Manager . clear Focus () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġtext Ġ= Ġbutton . text ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Element ?. let Ġ{ Ġroot Element . remove ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Element Ġ= Ġfield . take If Ġ{ Ġit . isNotBlank () Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Factory . create ( it , Ġbutton . font ). also Ġ{ Ġtext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Element . insert ( text , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . style . set Margin Ġ( 0 . 0 ĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . style . set Display ( Inline ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Size Ġ= Ġtext Metrics . size ( button . text , Ġbutton . font ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Text () Ġ{ ĊĠĠĠĠĠĠĠ Ġtext Ġ= Ġbutton . text ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġposition Elements () Ġ{ ĊĠĠĠĠĠĠĠ Ġinput Element . style . set Top Ġ(( button . height Ġ- Ġinput Size . height ) Ġ/ Ġ 2 ) ĊĊĠĠĠĠĠĠĠ Ġtext Element ?. let Ġ{ Ġtext Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Element . style . set Top (( button . height Ġ- Ġtext Size . height Ġ) Ġ/ Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( button . icon Anchor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAnchor . Right , ĠAnchor . Trailing Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Element . insert ( text Element , Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Element . style . set Left ( text Size . width Ġ+ Ġbutton . icon Text Spacing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Element . style . set Left ( 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Element . add ( text Element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Element . style . set Left ( 0 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Element . style . set Left ( input Size . width Ġ+ Ġbutton . icon Text Spacing ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }