/* Ċ Ġ* ĠCopyright Ġ 2 0 2 0 Ġ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 . platform Ċ Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . text . input . Back space Key Edit Op Ċ import Ġandroidx . compose . ui . text . input . Commit Text Edit Op Ċ import Ġandroidx . compose . ui . text . input . Delete Sur rounding Text In Code Points Edit Op Ċ import Ġandroidx . compose . ui . text . input . Edit Operation Ċ import Ġandroidx . compose . ui . text . input . I me Action Ċ import Ġandroidx . compose . ui . text . input . Keyboard Type Ċ import Ġandroidx . compose . ui . text . input . Move Cursor Edit Op Ċ import Ġandroidx . compose . ui . text . input . Platform TextInput Service Ċ import Ġandroidx . compose . ui . text . input . Set Comp osing Text Edit Op Ċ import Ġandroidx . compose . ui . text . input . TextField Value Ċ import Ġandroidx . compose . ui . text . substring Ċ import Ġjava . awt . Component Ċ import Ġjava . awt . Rectangle Ċ import Ġjava . awt . event . Focus Event Ċ import Ġjava . awt . event . Input Method Event Ċ import Ġjava . awt . event . KeyEvent Ċ import Ġjava . awt . font . Text Hit Info Ċ import Ġjava . awt . im . Input Method Requests Ċ import Ġjava . text . Attribut ed Character Iterator Ċ import Ġjava . text . Attribut edString Ċ import Ġjava . text . Character Iterator Ċ import Ġjava . util . Locale Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ internal Ġclass ĠDesktop Platform Input ( val Ġcomponent : ĠComponent ) Ġ: ĠPlatform TextInput Service Ġ{ ĊĠĠĠ Ġdata Ġclass ĠCurrent Input ( ĊĠĠĠĠĠĠĠ Ġvar Ġvalue : ĠText FieldValue , ĊĠĠĠĠĠĠĠ Ġval Ġon Edit Command : Ġ(( List < Edit Operation >) Ġ-> ĠUnit ), ĊĠĠĠĠĠĠĠ Ġval Ġon I me ActionPerformed : Ġ(( I me Action ) Ġ-> ĠUnit ), ĊĠĠĠĠĠĠĠ Ġval Ġ ime Action : ĠI me Action , ĊĠĠĠĠĠĠĠ Ġvar Ġfocused Rect : ĠRect ? Ġ= Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġvar Ġcurrent Input : ĠCurrent Input ? Ġ= Ġnull ĊĊĠĠĠ Ġvar Ġchar Key Pressed : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġvar Ġneed ToDelete Previous Char : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġstart Input ( ĊĠĠĠĠĠĠĠ Ġvalue : ĠText FieldValue , ĊĠĠĠĠĠĠĠ Ġkeyboard Type : ĠKeyboard Type , ĊĠĠĠĠĠĠĠ Ġ ime Action : ĠI me Action , ĊĠĠĠĠĠĠĠ Ġon Edit Command : Ġ( List < Edit Operation >) Ġ-> ĠUnit , ĊĠĠĠĠĠĠĠ Ġon I me ActionPerformed : Ġ( I me Action ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Input Ġ= ĠCurrent Input ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue , Ġon Edit Command , Ġon I me ActionPerformed , Ġ ime Action ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtrigger Focus () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtrigger Focus () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfocus G ained Event Ġ= ĠFocus Event ( component , ĠFocus Event . FOCUS _ GAIN ED ) ĊĠĠĠĠĠĠĠ Ġcomponent . input Context . dispatchEvent ( focus G ained Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstop Input () Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Input Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshow Software Keyboard () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Desktop Platform Input . show Software Keyboard ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhide Software Keyboard () Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Desktop Platform Input . hide Software Keyboard ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon State Updated ( value : ĠText FieldValue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Input ?. let Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . value Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġnotify Focused Rect ( rect : ĠRect ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Input ?. let Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . focused Rect Ġ= Ġrect ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġon Key Pressed ( keyCode : ĠInt , Ġchar : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( keyCode Ġ>= ĠKeyEvent . VK _ A Ġ&& ĠkeyCode Ġ<= ĠKeyEvent . VK _ Z ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchar Key Pressed Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent Input ?. let Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommand Ġ= Ġinput . on Edit Command ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( keyCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . VK _ LEFT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . invoke ( listOf ( Move Cursor Edit Op (- 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . VK _ RIGHT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . invoke ( listOf ( Move Cursor Edit Op ( 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . VK _ BACK _ SPACE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . invoke ( listOf ( Back space Key Edit Op ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . VK _ ENTER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( input . ime Action Ġ== ĠI me Action . Unspecified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . invoke ( listOf ( Commit Text Edit Op ("\ n ", Ġ 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . on I me ActionPerformed . invoke ( input . ime Action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UNUSED _ PARAMETER ") ĊĠĠĠ Ġfun Ġon Key Released ( keyCode : ĠInt , Ġchar : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġchar Key Pressed Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠChar . is Print able (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġblock Ġ= ĠCharacter . Unicode Block . of ( this ) ĊĠĠĠĠĠĠĠ Ġreturn Ġ(! Character . is ISO Control ( this )) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ!= ĠKeyEvent . CHAR _ UNDEFINED Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Ġ!= ĠCharacter . Unicode Block . SPECIAL S ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Key Typed ( char : ĠChar ) Ġ{ ĊĠĠĠĠĠĠĠ Ġneed ToDelete Previous Char Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġcurrent Input ?. on Edit Command ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char . is Print able ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . invoke ( listOf ( Commit Text Edit Op ( char . toString (), Ġ 1 ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġon Input Method TextChanged ( event : ĠInput Method Event ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent Input ?. let Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . caret Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommitted Ġ= Ġevent . text . toString Until ( event . committed Character Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomp osing Ġ= Ġevent . text . toString From ( event . committed Character Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġops Ġ= Ġmutable ListOf < Edit Operation >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( need ToDelete Previous Char Ġ&& Ġis Mac ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġrequired Ġto Ġsupport Ġinput Ġof Ġaccent ed Ġcharacters Ġusing Ġpress - and - hold Ġmethod Ġ( http :// support . apple . com / kb / PH 1 1 2 6 4 ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠJDK Ġcurrently Ġproperly Ġsupports Ġthis Ġfunctionality Ġonly Ġfor ĠText Component / J Text Component Ġdesc endants . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġour Ġeditor Ġcomponent Ġwe Ġneed Ġthis Ġworkaround . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAfter Ġhttps :// bugs . openjdk . java . net / browse / JDK - 8 0 7 4 8 8 2 Ġis Ġfixed , Ġthis Ġworkaround Ġshould Ġbe Ġreplaced Ġwith Ġa Ġproper Ġsolution . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneed ToDelete Previous Char Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġops . add ( Delete Sur rounding Text In Code Points Edit Op ( 1 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( committed . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġops . add ( Commit Text Edit Op ( committed , Ġcommitted . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comp osing . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġops . add ( Set Comp osing Text Edit Op ( comp osing , Ġcomp osing . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinput . on Edit Command . invoke ( ops ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Input Method Requests (): ĠInput Method Requests ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcurrent Input ?. let Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠInput Method Requests Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Location Offset ( x : ĠInt , Ġy : ĠInt ): ĠText Hit Info ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Input Method Requests . getLocation Offset ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcancel Latest Commit ted Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes : ĠArray < Attribut ed Character Iterator . Attribute >? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠAt tribut ed Character Iterator ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Input Method Requests . cancel Latest Commit ted Text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Insert Position Offset (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed StartIndex Ġ= Ġinput . value . composition ?. start Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed End Index Ġ= Ġinput . value . composition ?. end Ġ?: Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcaret Index Ġ= Ġinput . value . selection . start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( caret Index Ġ< Ġcomposed StartIndex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcaret Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( caret Index Ġ< Ġcomposed End Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomposed StartIndex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcaret Index Ġ- Ġ( composed End Index Ġ- Ġcomposed StartIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Commit ted Text Length () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . value . text . length Ġ- Ġ( input . value . composition ?. length Ġ?: Ġ 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Selected Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes : ĠArray < Attribut ed Character Iterator . Attribute >? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠAt tribut ed Character Iterator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Key Pressed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneed ToDelete Previous Char Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstr Ġ= Ġinput . value . text . substring ( input . value . selection ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAt tribut edString ( str ). iterator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetText Location ( offset : ĠText Hit Info ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . focused Rect ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRectangle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . right . toInt () Ġ+ Ġcomponent . location On Screen . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . bottom . toInt () Ġ+ Ġcomponent . location On Screen . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Commit ted Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbegin Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Index : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes : ĠArray < Attribut ed Character Iterator . Attribute >? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠAt tribut ed Character Iterator Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomp Ġ= Ġinput . value . composition ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġinput . value . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( comp Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres Ġ= Ġtext . substring ( begin Index , Ġend Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAt tribut edString ( res ). iterator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed StartIndex Ġ= Ġcomp . start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomposed End Index Ġ= Ġcomp . end ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcommitted : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( begin Index Ġ< Ġcomposed StartIndex ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġmin ( end Index , Ġcomposed StartIndex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommitted Ġ= Ġtext . substring ( begin Index , Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( composed End Index Ġ<= Ġend Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbegin Ġ= Ġmax ( composed End Index , Ġbegin Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommitted Ġ= Ġtext . substring ( begin , Ġend Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommitted Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠAt tribut edString ( committed ). iterator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠAt tribut ed Character Iterator . toString Until ( index : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġval Ġstr Buf Ġ= ĠStringBuffer () ĊĠĠĠ Ġvar Ġi Ġ= Ġindex ĊĠĠĠ Ġif Ġ( i Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġc : ĠChar Ġ= Ġset Index ( 0 ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstr Buf . append ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġc Ġ= Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi -- ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠString ( str Buf ) Ċ } Ċ Ċ private Ġfun ĠAt tribut ed Character Iterator . toString From ( index : ĠInt ): ĠString Ġ{ ĊĠĠĠ Ġval Ġstr Buf Ġ= ĠStringBuffer () ĊĠĠĠ Ġvar Ġc : ĠChar Ġ= Ġset Index ( index ) ĊĠĠĠ Ġwhile Ġ( c Ġ!= ĠCharacter Iterator . DONE ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstr Buf . append ( c ) ĊĠĠĠĠĠĠĠ Ġc Ġ= Ġnext () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠString ( str Buf ) Ċ } Ċ Ċ private Ġval Ġis Mac Ġ= ĊĠĠĠ ĠSystem . getProperty (" os . name "). toLowerCase ( Locale . EN GL ISH ). startsWith (" mac ") Ċ