/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 0 ĠPat rick ĠGold inger Ċ Ġ* Ċ Ġ* Ġ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 Ġdev . pat rick gold . fl or is board . ime . core Ċ Ċ import Ġandroid . content . Clip Data Ċ import Ġandroid . content . Clip Description Ċ import Ġandroid . content . Clipboard Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . input method service . Input Method Service Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . text . InputType Ċ import Ġandroid . view . KeyEvent Ċ import Ġandroid . view . input method . Editor Info Ċ import Ġandroid . view . input method . Extract ed Text Request Ċ import Ġandroid . view . input method . Input Content Info Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġdev . pat rick gold . fl or is board . ime . text . key . KeyCode Ċ Ċ // ĠConstants Ġfor Ġdetect Last Unicode Character Length Before Cursor Ġmethod Ċ private Ġconst Ġval ĠLIGHT _ SK IN _ T ONE ĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ 0 x 1 F 3 FB Ċ private Ġconst Ġval ĠMED IUM _ LIGHT _ SK IN _ T ONE ĠĠĠ Ġ= Ġ 0 x 1 F 3 FC Ċ private Ġconst Ġval ĠMED IUM _ SK IN _ T ONE ĠĠĠĠĠĠĠĠĠ Ġ= Ġ 0 x 1 F 3 FD Ċ private Ġconst Ġval ĠMED IUM _ DARK _ SK IN _ T ONE ĠĠĠĠ Ġ= Ġ 0 x 1 F 3 FE Ċ private Ġconst Ġval ĠD ARK _ SK IN _ T ONE ĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ 0 x 1 F 3 FF Ċ private Ġconst Ġval ĠRED _ HA IR ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ 0 x 1 F 9 B 0 Ċ private Ġconst Ġval ĠCURL Y _ HA IR ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ 0 x 1 F 9 B 1 Ċ private Ġconst Ġval ĠWH ITE _ HA IR ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ 0 x 1 F 9 B 2 Ċ private Ġconst Ġval ĠB AL D ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġ 0 x 1 F 9 B 3 Ċ private Ġconst Ġval ĠZERO _ WIDTH _ JOIN ER ĠĠĠĠĠĠĠĠ Ġ= ĠĠ 0 x 2 0 0 D Ċ private Ġconst Ġval ĠVARI ATION _ SELECT OR ĠĠĠĠĠĠĠ Ġ= ĠĠ 0 xFE 0 F Ċ Ċ // ĠArray Ġwhich Ġholds Ġall Ġvariations Ġfor Ġeasier Ġchecking Ġ( con venience Ġonly ) Ċ private Ġval Ġemoji Variation Array : ĠArray < Int > Ġ= ĠarrayOf ( ĊĠĠĠ ĠLIGHT _ SK IN _ T ONE , ĊĠĠĠ ĠMED IUM _ LIGHT _ SK IN _ T ONE , ĊĠĠĠ ĠMED IUM _ SK IN _ T ONE , ĊĠĠĠ ĠMED IUM _ DARK _ SK IN _ T ONE , ĊĠĠĠ ĠD ARK _ SK IN _ T ONE , ĊĠĠĠ ĠRED _ HA IR , ĊĠĠĠ ĠCURL Y _ HA IR , ĊĠĠĠ ĠWH ITE _ HA IR , ĊĠĠĠ ĠB AL D Ċ ) Ċ Ċ /** Ċ Ġ* ĠClass Ġwhich Ġholds Ġinformation Ġrelevant Ġto Ġan Ġeditor Ġinstance Ġlike Ġthe Ġinput Ġ[ cached Text ], Ġ[ selection ], Ċ Ġ* Ġ[ input Attributes ], Ġ[ ime Options ], Ġetc . ĠThis Ġclass Ġis Ġthought Ġto Ġbe Ġan Ġimproved Ġ[ Editor Info ] Ċ Ġ* Ġobject Ġwhich Ġalso Ġholds Ġthe Ġstate Ġof Ġthe Ġcurrently Ġfocused Ġinput Ġeditor . Ċ Ġ*/ Ċ class ĠEditor Instance Ġprivate Ġconstructor ( private Ġval Ġim s : ĠInput Method Service ?) Ġ{ ĊĠĠĠ Ġvar Ġcontent Mime Types : ĠArray < out ĠString ?> ? Ġ= Ġnull ĊĠĠĠ Ġval Ġcursor Caps Mode : ĠInput Attributes . Caps Mode ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn ĠInput Attributes . Caps Mode . NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInput Attributes . Caps Mode . from Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic . get Cursor Caps Mode ( input Attributes . caps Mode . to Flags ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġcurrent Word : ĠRegion Ġ= ĠRegion ( this ) ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġ ime Options : ĠI me Options Ġ= ĠI me Options . from I me Options Int ( Editor Info . IME _ NULL ) ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġinput Attributes : ĠInput Attributes Ġ= ĠInput Attributes . from InputType Int ( InputType . TYPE _ NULL ) ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġis Comp osing Enabled : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġset ( v ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre evaluate Current Word () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġ&& Ġ! is Raw Input Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( current Word ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġvar Ġis New Selection In Bounds Of Old : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġis Raw Input Editor : ĠBoolean Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar ĠpackageName : ĠString Ġ= Ġ" undefined " ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġselection : ĠSelection Ġ= ĠSelection ( this ) ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġcached Text : ĠString Ġ= Ġ"" ĊĊĠĠĠ Ġprivate Ġvar Ġclipboard Manager : ĠClip board Manager ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtmp Clipboard Manager Ġ= Ġim s ?. getSystem Service ( Context . CLIP BOARD _ SERVICE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( tmp Clipboard Manager Ġ!= Ġnull Ġ&& Ġtmp Clipboard Manager Ġis ĠClip board Manager ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclipboard Manager Ġ= Ġtmp Clipboard Manager ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdefault (): ĠEditor Instance Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEditor Instance ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom ( editor Info : ĠEditor Info ?, Ġim s : ĠInput Method Service ?): ĠEditor Instance Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( editor Info Ġ== Ġnull ) Ġ{ Ġdefault () Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Instance ( ims ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N _ MR 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Mime Types Ġ= Ġeditor Info . content Mime Types ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ ime Options Ġ= ĠI me Options . from I me Options Int ( editor Info . ime Options ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput Attributes Ġ= ĠInput Attributes . from InputType Int ( editor Info . input Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpackageName Ġ= Ġeditor Info . packageName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* selection Ġ= ĠSelection ( this ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġeditor Info . initial Sel Start ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġeditor Info . initial Sel End ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Editor State () ĊĠĠĠĠĠĠĠ Ġre evaluate Current Word () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvent Ġhandler Ġwhich Ġreact s Ġto Ġselection Ġupdates Ġcoming Ġfrom Ġthe Ġtarget Ġapp 's Ġeditor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠonUpdate Selection ( ĊĠĠĠĠĠĠĠ Ġold Sel Start : ĠInt , Ġold Sel End : ĠInt , ĊĠĠĠĠĠĠĠ Ġnew Sel Start : ĠInt , Ġnew Sel End : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Editor State () ĊĠĠĠĠĠĠĠ Ġis New Selection In Bounds Of Old Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Sel Start Ġ>= Ġ( old Sel Start Ġ- Ġ 1 ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Sel Start Ġ<= Ġ( old Sel Start Ġ+ Ġ 1 ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Sel End Ġ>= Ġ( old Sel End Ġ- Ġ 1 ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Sel End Ġ<= Ġ( old Sel End Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġselection . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġnew Sel Start ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġnew Sel End ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġre evaluate Current Word () ĊĠĠĠĠĠĠĠ Ġif Ġ( selection . is Cursor Mode Ġ&& Ġis Comp osing Enabled Ġ&& Ġ! is Raw Input Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( current Word ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( null ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp letes Ġthe Ġgiven Ġ[ text ] Ġin Ġthe Ġcurrent Ġcomp osing Ġregion . ĠDoes Ġnothing Ġif Ġthe Ġcurrent ĊĠĠĠĠ Ġ* Ġcomp osing Ġregion Ġis Ġof Ġzero Ġlength Ġor Ġnull . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtext ĠThe Ġtext Ġto Ġcomplete Ġin Ġthis Ġeditor 's Ġcomp osing Ġregion . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcommit Completion ( text : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Raw Input Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . begin Batch Edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . set Comp osing Text ( text , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Editor State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre evaluate Current Word () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . end Batch Edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCommit s Ġthe Ġgiven Ġ[ content ] Ġto Ġthis Ġeditor Ġinstance Ġand Ġadjust s Ġboth Ġthe Ġcursor Ġposition Ġand ĊĠĠĠĠ Ġ* Ġcomp osing Ġregion , Ġif Ġany . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontent ĠThe Ġcontent Ġto Ġcommit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcommit Content ( content : ĠUri , Ġdescription : ĠClip Description ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġcontent Mime Types Ġ= Ġcontent Mime Types ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . N _ MR 1 Ġ|| Ġcontent Mime Types Ġ== Ġnull Ġ|| Ġcontent Mime Types . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Text ( content . toString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmime Types Do Match Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( content MimeType Ġin Ġcontent Mime Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( description . has MimeType ( content MimeType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmime Types Do Match Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mime Types Do Match ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic . begin Batch Edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġic . commit Content ( Input Content Info ( content , Ġdescription ), Ġ 0 , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic . end Batch Edit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Text ( content . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCommit s Ġthe Ġgiven Ġ[ text ] Ġto Ġthis Ġeditor Ġinstance Ġand Ġadjust s Ġboth Ġthe Ġcursor Ġposition Ġand ĊĠĠĠĠ Ġ* Ġcomp osing Ġregion , Ġif Ġany . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġover writes Ġany Ġselected Ġtext Ġand Ġreplaces Ġit Ġwith Ġgiven Ġ[ text ]. ĠIf Ġthere Ġis Ġno ĊĠĠĠĠ Ġ* Ġtext Ġselected Ġ( selection Ġis Ġin Ġcursor Ġmode ), Ġthen Ġthis Ġmethod Ġwill Ġinsert Ġthe Ġ[ text ] Ġafter ĊĠĠĠĠ Ġ* Ġthe Ġcursor , Ġthen Ġset Ġthe Ġcursor Ġposition Ġto Ġthe Ġfirst Ġcharacter Ġafter Ġthe Ġinserted Ġtext . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġtext ĠThe Ġtext Ġto Ġcommit . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcommit Text ( text : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Raw Input Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . commit Text ( text , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . begin Batch Edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . commit Text ( text , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Editor State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre evaluate Current Word () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Comp osing Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( current Word ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . end Batch Edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExec utes Ġa Ġbackward Ġdelete Ġon Ġthis Ġeditor 's Ġtext . ĠIf Ġa Ġtext Ġselection Ġis Ġactive , Ġall ĊĠĠĠĠ Ġ* Ġcharacters Ġinside Ġthis Ġselection Ġwill Ġbe Ġremoved , Ġelse Ġonly Ġthe Ġleft - most Ġcharacter Ġfrom ĊĠĠĠĠ Ġ* Ġthe Ġcursor 's Ġposition . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete Back wards (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( is Raw Input Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsend System KeyEvent ( KeyEvent . KEYCODE _ DEL ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . begin Batch Edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection . is Cursor Mode Ġ&& Ġselection . start Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġdetect Last Unicode Character Length Before Cursor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic . delete Sur rounding Text ( length , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( selection . is Selection Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic . commit Text ("", Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Editor State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre evaluate Current Word () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Comp osing Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( current Word ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . end Batch Edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDeletes Ġ[ n ] Ġwords Ġbefore Ġthe Ġcurrent Ġcursor 's Ġposition . ĊĠĠĠĠ Ġ* ĠNOTE : Ġthis Ġimplementation Ġdoes Ġcurrently Ġonly Ġdelete Ġcurrent Word . ĠThis Ġis Ġdue Ġto Ġchange Ġin ĊĠĠĠĠ Ġ* Ġfuture Ġversions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġn ĠThe Ġnumber Ġof Ġwords Ġto Ġdelete Ġbefore Ġthe Ġcursor . ĠMust Ġbe Ġgreater Ġthan Ġ 0 Ġor Ġthis ĊĠĠĠĠ Ġ* Ġ Ġmethod Ġwill Ġfail . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete Words Before Cursor ( n : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( n Ġ< Ġ 1 Ġ|| Ġis Raw Input Editor Ġ|| Ġ! selection . isValid Ġ|| Ġ! selection . is Cursor Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . begin Batch Edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark Comp osing Region ( null ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Words In String ( cached Text . substring ( 0 , Ġselection . start )). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ( size - n . coerce At Least ( 0 )). range ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic . setSelection ( first , Ġselection . start ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . commit Text ("", Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Editor State () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġre evaluate Current Word () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . end Batch Edit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġall Ġwords Ġin Ġthe Ġgiven Ġstring Ġwith Ġthe Ġcorrect Ġregex Ġfor Ġcurrent Ġsubtype . ĊĠĠĠĠ Ġ* ĠTODO : Ġcurrently Ġonly Ġsupports Ġen - US ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġstring ĠString Ġto Ġselect Ġwords Ġfrom ĊĠĠĠĠ Ġ* Ġ@ return ĠWord s Ġin Ġ[ string ] Ġas Ġa ĠList Ġof Ġ[ Match Result ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Words In String ( string : ĠString ): List < Match Result >{ ĊĠĠĠĠĠĠĠ Ġval Ġword Regex Pattern Ġ= Ġ"[ \\ p { L } ]+ ". to Regex () ĊĠĠĠĠĠĠĠ Ġreturn Ġword Regex Pattern . findAll ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring ĊĠĠĠĠĠĠĠ Ġ). toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġ[ n ] Ġcharacters Ġafter Ġthe Ġcursor 's Ġcurrent Ġposition . ĠThe Ġresulting Ġstring Ġmay Ġbe Ġany ĊĠĠĠĠ Ġ* Ġlength Ġr anging Ġfrom Ġ 0 Ġto Ġn . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġn ĠThe Ġnumber Ġof Ġcharacters Ġto Ġget Ġafter Ġthe Ġcursor . ĠMust Ġbe Ġgreater Ġthan Ġ 0 Ġor Ġthis ĊĠĠĠĠ Ġ* Ġ Ġmethod Ġwill Ġfail . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ n ] Ġor Ġless Ġcharacters Ġafter Ġthe Ġcursor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetText After Cursor ( n : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! selection . isValid Ġ|| Ġn Ġ< Ġ 1 Ġ|| Ġis Raw Input Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġselection . end . coerce In ( 0 , Ġcached Text . length ) ĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġ( selection . end Ġ+ Ġn ). coerce In ( 0 , Ġcached Text . length ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcached Text . substring ( from , Ġto ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġ[ n ] Ġcharacters Ġbefore Ġthe Ġcursor 's Ġcurrent Ġposition . ĠThe Ġresulting Ġstring Ġmay Ġbe Ġany ĊĠĠĠĠ Ġ* Ġlength Ġr anging Ġfrom Ġ 0 Ġto Ġn . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġn ĠThe Ġnumber Ġof Ġcharacters Ġto Ġget Ġbefore Ġthe Ġcursor . ĠMust Ġbe Ġgreater Ġthan Ġ 0 Ġor Ġthis ĊĠĠĠĠ Ġ* Ġ Ġmethod Ġwill Ġfail . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ n ] Ġor Ġless Ġcharacters Ġafter Ġthe Ġcursor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetText Before Cursor ( n : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! selection . isValid Ġ|| Ġn Ġ< Ġ 1 Ġ|| Ġis Raw Input Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfrom Ġ= Ġ( selection . start Ġ- Ġn ). coerce In ( 0 , Ġcached Text . length ) ĊĠĠĠĠĠĠĠ Ġval Ġto Ġ= Ġselection . start . coerce In ( 0 , Ġcached Text . length ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcached Text . substring ( from , Ġto ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġa Ġcut Ġcommand Ġon Ġthis Ġeditor Ġinstance Ġand Ġadjust s Ġboth Ġthe Ġcursor Ġposition Ġand ĊĠĠĠĠ Ġ* Ġcomp osing Ġregion , Ġif Ġany . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġperform Clipboard Cut (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( selection . is Selection Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclip Data : ĠClip Data Ġ= ĠClip Data . new Plain Text ( selection . text , Ġselection . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclipboard Manager ?. set Primary Clip ( clip Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete Back wards () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġa Ġcopy Ġcommand Ġon Ġthis Ġeditor Ġinstance Ġand Ġadjust s Ġboth Ġthe Ġcursor Ġposition Ġand ĊĠĠĠĠ Ġ* Ġcomp osing Ġregion , Ġif Ġany . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġperform Clipboard Copy (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( selection . is Selection Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclip Data : ĠClip Data Ġ= ĠClip Data . new Plain Text ( selection . text , Ġselection . text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclipboard Manager ?. set Primary Clip ( clip Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Selection ( selection . end , Ġselection . end ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġa Ġpaste Ġcommand Ġon Ġthis Ġeditor Ġinstance Ġand Ġadjust s Ġboth Ġthe Ġcursor Ġposition Ġand ĊĠĠĠĠ Ġ* Ġcomp osing Ġregion , Ġif Ġany . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġperform Clipboard Paste (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclip Data : ĠClip Data ? Ġ= Ġclipboard Manager ?. primary Clip ĊĠĠĠĠĠĠĠ Ġval Ġitem : ĠClip Data . Item ? Ġ= Ġclip Data ?. getItem At ( 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem ?. text Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Text ( item . text . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitem ?. uri Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Content ( item . uri , Ġclip Data . description ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġan Ġenter Ġkey Ġpress Ġon Ġthe Ġcurrent Ġinput Ġeditor . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġperform Enter (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Raw Input Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsend System KeyEvent ( KeyEvent . KEYCODE _ ENTER ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcommit Text ("\ n ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġa Ġgiven Ġ[ action ] Ġon Ġthe Ġcurrent Ġinput Ġeditor . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġaction ĠThe Ġaction Ġto Ġbe Ġperformed Ġon Ġthis Ġeditor Ġinstance . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġperform Enter Action ( action : ĠI me Options . Action ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġic . perform Editor Action ( action . toInt ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġa Ġgiven Ġ[ keyCode ] Ġas Ġa Ġ[ KeyEvent . ACTION _ DOWN ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠkeyCode ĠThe Ġkey Ġcode Ġto Ġsend , Ġuse Ġa Ġkey Ġcode Ġdefined Ġin ĠAndroid 's Ġ[ KeyEvent ], Ġnot Ġin ĊĠĠĠĠ Ġ* Ġ Ġ[ KeyCode ] Ġor Ġthis Ġcall Ġmay Ġsend Ġa Ġweird Ġcharacter , Ġas Ġthis Ġkey Ġcodes Ġdo Ġnot Ġmatch !! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsend System KeyEvent ( keyCode : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġic . send KeyEvent ( KeyEvent ( KeyEvent . ACTION _ DOWN , ĠkeyCode )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSends Ġa Ġgiven Ġ[ keyCode ] Ġas Ġa Ġ[ KeyEvent . ACTION _ DOWN ] Ġwith ĠALT Ġpressed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param ĠkeyCode ĠThe Ġkey Ġcode Ġto Ġsend , Ġuse Ġa Ġkey Ġcode Ġdefined Ġin ĠAndroid 's Ġ[ KeyEvent ], Ġnot Ġin ĊĠĠĠĠ Ġ* Ġ Ġ[ KeyCode ] Ġor Ġthis Ġcall Ġmay Ġsend Ġa Ġweird Ġcharacter , Ġas Ġthis Ġkey Ġcodes Ġdo Ġnot Ġmatch !! ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsend System KeyEvent Alt ( keyCode : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġic . send KeyEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . ACTION _ DOWN , ĠkeyCode , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKeyEvent . META _ ALT _ LEFT _ ON ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġselection Ġregion Ġof Ġthis Ġinstance Ġand Ġnot ifies Ġthe Ġinput Ġconnection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfrom ĠThe Ġstart Ġindex Ġof Ġthe Ġselection Ġin Ġcharacters Ġ( inclusive ). ĊĠĠĠĠ Ġ* Ġ@ param Ġto ĠThe Ġend Ġindex Ġof Ġthe Ġselection Ġin Ġcharacters Ġ( exclusive ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Selection ( from : ĠInt , Ġto : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Raw Input Editor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġto ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġic . setSelection ( from , Ġto ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Adds Ġone Ġword Ġon Ġthe Ġleft Ġof Ġselection Ġto Ġit ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġno Ġnew Ġwords Ġare Ġselected ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġleft Append Word To Selection (): ĠBoolean { ĊĠĠĠĠĠĠĠ Ġ// Ġno Ġwords Ġleft Ġto Ġselect ĊĠĠĠĠĠĠĠ Ġif Ġ( selection . start Ġ<= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġstring Before Selection Ġ= Ġcached Text . substring ( ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection . start ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġget Words In String ( string Before Selection ). last (). range . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Selection ( first , Ġselection . end ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Remov es Ġone Ġword Ġon Ġthe Ġleft Ġfrom Ġthe Ġselection ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġno Ġnew Ġwords Ġare Ġde selected ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġleft Pop Word From Selection (): ĠBoolean { ĊĠĠĠĠĠĠĠ Ġ// Ġno Ġwords Ġleft Ġto Ġpop ĊĠĠĠĠĠĠĠ Ġif Ġ( selection . start Ġ>= Ġselection . end ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġstring Inside Selection Ġ= Ġcached Text . substring ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection . start , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection . end ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġget Words In String ( string Inside Selection ). first (). range . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Selection ( selection . start Ġ+ Ġlast Ġ+ Ġ 1 , Ġselection . end ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetect s Ġthe Ġlength Ġof Ġthe Ġcharacter Ġbefore Ġthe Ġcursor , Ġas Ġmany ĠUnicode Ġcharacters Ġnow ad ays ĊĠĠĠĠ Ġ* Ġare Ġlonger Ġthan Ġ 1 ĠJava Ġchar Ġand Ġthus Ġthe Ġlength Ġhas Ġto Ġbe Ġcalculated Ġin Ġorder Ġto Ġavoid ĊĠĠĠĠ Ġ* Ġdeleting Ġonly Ġhalf Ġof Ġan Ġemoji ... ĊĠĠĠĠ Ġ* ĠIs Ġused Ġprimarily Ġin Ġ[ delete Back wards ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġlength Ġof Ġthe Ġlast ĠUnicode Ġcharacter , Ġin ĠJava Ġcharacters Ġor Ġ 0 Ġif Ġthe Ġcurrent ĊĠĠĠĠ Ġ* Ġ Ġselection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdetect Last Unicode Character Length Before Cursor (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! selection . isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġchar Index Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġchar Length Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġchar Should Gl ue Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġtext To Search Ġ= Ġcached Text . substring ( 0 , Ġselection . start . coerce At Most ( cached Text . length )) ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġtext To Search . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcp Ġ= Ġtext To Search . code Point At ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcp Length Ġ= ĠCharacter . char Count ( cp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Should Gl ue Ġ|| Ġcp Ġ== ĠVARI ATION _ SELECT OR Ġ|| Ġemoji Variation Array . contains ( cp ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Length Ġ+= Ġcp Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Should Gl ue Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcp Ġ== ĠZERO _ WIDTH _ JOIN ER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Length Ġ+= Ġcp Length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Should Gl ue Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Index Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Length Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Should Gl ue Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi Ġ+= Ġcp Length ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtext To Search . length Ġ- Ġchar Index ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMark s Ġa Ġgiven Ġ[ region ] Ġas Ġcomp osing Ġand Ġnot ifies Ġthe Ġinput Ġconnection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġregion ĠThe Ġregion Ġwhich Ġshould Ġbe Ġmarked Ġas Ġcomp osing . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġan Ġerror Ġoccurred Ġor Ġthe Ġinput Ġconnection Ġis Ġinvalid . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġmark Comp osing Region ( region : ĠRegion ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( region ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġic . finish Comp osing Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( region . isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic . set Comp osing Region ( region . start , Ġregion . end ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġic . finish Comp osing Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvalu ates Ġthe Ġcurrent Ġword Ġin Ġthis Ġeditor Ġinstance Ġbased Ġon Ġthe Ġcurrent Ġcursor Ġposition Ġand ĊĠĠĠĠ Ġ* Ġgiven Ġdelimiter Ġ[ regex ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġregex ĠThe Ġdelimiter Ġregex Ġwhich Ġshould Ġbe Ġused Ġto Ġsplit Ġup Ġthe Ġcontent Ġtext Ġand Ġfind ĊĠĠĠĠ Ġ* Ġ Ġwords . ĠMay Ġdiffer Ġfrom Ġlocale Ġto Ġlocale . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠTrue Ġon Ġsuccess , Ġfalse Ġif Ġno Ġcurrent Ġword Ġcould Ġbe Ġfound . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġre evaluate Current Word ( regex : ĠRegex ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġfound Valid Word Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( selection . isValid Ġ&& Ġselection . is Cursor Mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwords Ġ= Ġcached Text . split (" (( ?< =$ regex )| (? =$ regex )) ". to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpos Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( word Ġin Ġwords ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection . start Ġ>= Ġpos Ġ&& Ġselection . start Ġ<= Ġpos Ġ+ Ġword . length Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġword . isNotEmpty () Ġ&& Ġ! word . matches ( regex )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Word . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġpos ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġpos Ġ+ Ġword . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfound Valid Word Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ+= Ġword . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! found Valid Word ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Word . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfound Valid Word ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEvalu ates Ġthe Ġcurrent Ġword Ġwith Ġthe Ġcorrect Ġdelimiter Ġregex Ġfor Ġcurrent Ġsubtype . ĊĠĠĠĠ Ġ* ĠTODO : Ġcurrently Ġonly Ġsupports Ġen - US ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġre evaluate Current Word () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġregex Ġ= Ġ"[ ^ \\ p { L }] ". to Regex () ĊĠĠĠĠĠĠĠ Ġre evaluate Current Word ( regex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġcurrent Ġtext Ġfrom Ġthe Ġapp 's Ġeditor Ġview . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġtarget Ġeditor 's Ġcontent Ġstring . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġupdate Editor State () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġic Ġ= Ġim s ?. current Input Connection ĊĠĠĠĠĠĠĠ Ġval Ġet Ġ= Ġic ?. get Extract ed Text ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExtract ed Text Request (), Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġet ?. text ĊĠĠĠĠĠĠĠ Ġif Ġ( ic Ġ== Ġnull Ġ|| Ġet Ġ== Ġnull Ġ|| Ġtext Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Raw Input Editor Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Text Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Raw Input Editor Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcached Text Ġ= Ġtext . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġet . selection Start . coerce At Most ( cached Text . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġet . selection End . coerce At Most ( cached Text . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġre evaluate Current Word () ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠClass Ġwhich Ġholds Ġthe Ġsame Ġinformation Ġas Ġan Ġ[ Editor Info . ime Options ] Ġint Ġbut Ġmore Ġaccessible Ġand Ċ Ġ* Ġreadable . Ċ Ġ*/ Ċ class ĠI me Options Ġprivate Ġconstructor ( ime Options : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġaction : ĠAction Ġ= ĠAction . from Int ( ime Options ) ĊĠĠĠ Ġval Ġflag Force Ascii : ĠBoolean Ġ= Ġ ime Options Ġand ĠEditor Info . IME _ FLAG _ FORCE _ ASCII Ġ> Ġ 0 ĊĠĠĠ Ġval Ġflag Navigate Next : ĠBoolean Ġ= Ġ ime Options Ġand ĠEditor Info . IME _ FLAG _ NAV IG ATE _ NEXT Ġ> Ġ 0 ĊĠĠĠ Ġval Ġflag Navigate Previous : ĠBoolean Ġ= Ġ ime Options Ġand ĠEditor Info . IME _ FLAG _ NAV IG ATE _ PREVIOUS Ġ> Ġ 0 ĊĠĠĠ Ġval Ġflag No Access ory Action : ĠBoolean Ġ= Ġ ime Options Ġand ĠEditor Info . IME _ FLAG _ NO _ ACCESS ORY _ ACTION Ġ> Ġ 0 ĊĠĠĠ Ġval Ġflag No Enter Action : ĠBoolean Ġ= Ġ ime Options Ġand ĠEditor Info . IME _ FLAG _ NO _ ENTER _ ACTION Ġ> Ġ 0 ĊĠĠĠ Ġval Ġflag No Extract Ui : ĠBoolean Ġ= Ġ ime Options Ġand ĠEditor Info . IME _ FLAG _ NO _ EXTRACT _ UI Ġ> Ġ 0 ĊĠĠĠ Ġval Ġflag No Fullscreen : ĠBoolean Ġ= Ġ ime Options Ġand ĠEditor Info . IME _ FLAG _ NO _ FULL SCREEN Ġ> Ġ 0 ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . O ) ĊĠĠĠ Ġval Ġflag No Personal ized Learning : ĠBoolean Ġ= Ġ ime Options Ġand ĠEditor Info . IME _ FLAG _ NO _ PERSON AL IZED _ LEAR NING Ġ> Ġ 0 ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdefault (): ĠI me Options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfrom I me Options Int ( Editor Info . IME _ NULL ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġfrom I me Options Int ( ime Options : ĠInt ): ĠI me Options Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠI me Options ( ime Options ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠAction Ġ{ ĊĠĠĠĠĠĠĠ ĠDONE , ĊĠĠĠĠĠĠĠ ĠGO , ĊĠĠĠĠĠĠĠ ĠNEXT , ĊĠĠĠĠĠĠĠ ĠNONE , ĊĠĠĠĠĠĠĠ ĠPRE V IOUS , ĊĠĠĠĠĠĠĠ ĠSEARCH , ĊĠĠĠĠĠĠĠ ĠS END , ĊĠĠĠĠĠĠĠ ĠUNS PE CI FIED ; ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom Int ( raw : ĠInt ): ĠAction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( raw Ġand ĠEditor Info . IME _ MASK _ ACTION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Info . IME _ ACTION _ DONE Ġ-> ĠDONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Info . IME _ ACTION _ GO Ġ-> ĠGO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Info . IME _ ACTION _ NEXT Ġ-> ĠNEXT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Info . IME _ ACTION _ NONE Ġ-> ĠNONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Info . IME _ ACTION _ PREVIOUS Ġ-> ĠPRE V IOUS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Info . IME _ ACTION _ SEARCH Ġ-> ĠSEARCH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Info . IME _ ACTION _ SEND Ġ-> ĠS END ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEditor Info . IME _ ACTION _ UNSPECIFIED Ġ-> ĠUNS PE CI FIED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠNONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Int (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDONE Ġ-> ĠEditor Info . IME _ ACTION _ DONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGO Ġ-> ĠEditor Info . IME _ ACTION _ GO ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNEXT Ġ-> ĠEditor Info . IME _ ACTION _ NEXT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNONE Ġ-> ĠEditor Info . IME _ ACTION _ NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPRE V IOUS Ġ-> ĠEditor Info . IME _ ACTION _ PREVIOUS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSEARCH Ġ-> ĠEditor Info . IME _ ACTION _ SEARCH ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS END Ġ-> ĠEditor Info . IME _ ACTION _ SEND ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUNS PE CI FIED -> ĠEditor Info . IME _ ACTION _ UNSPECIFIED ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠClass Ġwhich Ġholds Ġthe Ġsame Ġinformation Ġas Ġan Ġ[ Editor Info . input Type ] Ġint Ġbut Ġmore Ġaccessible Ġand Ċ Ġ* Ġreadable . Ċ Ġ*/ Ċ class ĠInput Attributes Ġprivate Ġconstructor ( input Type : ĠInt ) Ġ{ ĊĠĠĠ Ġval Ġtype : ĠType ĊĠĠĠ Ġval Ġvariation : ĠVari ation ĊĠĠĠ Ġval Ġcaps Mode : ĠC aps Mode ĊĠĠĠ Ġvar Ġflag Number Decimal : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġflag Number Signed : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġflag Text Auto Complete : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġflag Text Auto Correct : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġflag Text I me Multi Line : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġflag Text Multi Line : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĠĠĠ Ġvar Ġflag Text No Suggestions : ĠBoolean Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( input Type Ġand ĠInput Type . TYPE _ MASK _ CLASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ CLASS _ DATETIME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . DATETIME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariation Ġ= Ġwhen Ġ( input Type Ġand ĠInput Type . TYPE _ MASK _ VARI ATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ DATETIME _ VARI ATION _ DATE Ġ-> ĠVari ation . DATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ DATETIME _ VARI ATION _ NORMAL Ġ-> ĠVari ation . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ DATETIME _ VARI ATION _ TIME Ġ-> ĠVari ation . TIME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠVari ation . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaps Mode Ġ= ĠC aps Mode . NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ CLASS _ NUMBER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . NUMBER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariation Ġ= Ġwhen Ġ( input Type Ġand ĠInput Type . TYPE _ MASK _ VARI ATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ NUMBER _ VARI ATION _ NORMAL Ġ-> ĠVari ation . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ NUMBER _ VARI ATION _ PASSWORD Ġ-> ĠVari ation . PASSWORD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠVari ation . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaps Mode Ġ= ĠC aps Mode . NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Number Decimal Ġ= Ġinput Type Ġand ĠInput Type . TYPE _ NUMBER _ FLAG _ DECIMAL Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Number Signed Ġ= Ġinput Type Ġand ĠInput Type . TYPE _ NUMBER _ FLAG _ SIGNED Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ CLASS _ PHONE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . PHONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariation Ġ= ĠVari ation . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaps Mode Ġ= ĠC aps Mode . NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ CLASS _ TEXT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . TEXT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariation Ġ= Ġwhen Ġ( input Type Ġand ĠInput Type . TYPE _ MASK _ VARI ATION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ EMAIL _ ADDRESS Ġ-> ĠVari ation . EMAIL _ ADDRESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ EMAIL _ SUBJECT Ġ-> ĠVari ation . EMAIL _ SUBJECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ FILTER Ġ-> ĠVari ation . FILTER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ LONG _ MESSAGE Ġ-> ĠVari ation . LONG _ MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ NORMAL Ġ-> ĠVari ation . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ PASSWORD Ġ-> ĠVari ation . PASSWORD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ PERSON _ NAME Ġ-> ĠVari ation . PERSON _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ PH ON ET IC Ġ-> ĠVari ation . PH ON ET IC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ POST AL _ ADDRESS Ġ-> ĠVari ation . POST AL _ ADDRESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ SHORT _ MESSAGE Ġ-> ĠVari ation . SHORT _ MESSAGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ URI Ġ-> ĠVari ation . URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ VISIBLE _ PASSWORD Ġ-> ĠVari ation . VISIBLE _ PASSWORD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ WEB _ EDIT _ TEXT Ġ-> ĠVari ation . WEB _ EDIT _ TEXT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ WEB _ EMAIL _ ADDRESS Ġ-> ĠVari ation . WEB _ EMAIL _ ADDRESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInput Type . TYPE _ TEXT _ VARI ATION _ WEB _ PASSWORD Ġ-> ĠVari ation . WEB _ PASSWORD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠVari ation . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaps Mode Ġ= ĠC aps Mode . from Flags ( input Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Text Auto Complete Ġ= Ġinput Type Ġand ĠInput Type . TYPE _ TEXT _ FLAG _ AUTO _ COMPLETE Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Text Auto Correct Ġ= Ġinput Type Ġand ĠInput Type . TYPE _ TEXT _ FLAG _ AUTO _ CORRECT Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Text I me Multi Line Ġ= Ġinput Type Ġand ĠInput Type . TYPE _ TEXT _ FLAG _ IME _ MULTI _ LINE Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Text Multi Line Ġ= Ġinput Type Ġand ĠInput Type . TYPE _ TEXT _ FLAG _ MULTI _ LINE Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Text No Suggestions Ġ= Ġinput Type Ġand ĠInput Type . TYPE _ TEXT _ FLAG _ NO _ SU G GEST IONS Ġ> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= ĠType . TEXT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariation Ġ= ĠVari ation . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaps Mode Ġ= ĠC aps Mode . NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġfrom InputType Int ( input Type : ĠInt ): ĠInput Attributes Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠInput Attributes ( input Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠType Ġ{ ĊĠĠĠĠĠĠĠ ĠDAT ETIME , ĊĠĠĠĠĠĠĠ ĠNUMBER , ĊĠĠĠĠĠĠĠ ĠPH ONE , ĊĠĠĠĠĠĠĠ ĠTEXT ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠVari ation Ġ{ ĊĠĠĠĠĠĠĠ ĠDATE , ĊĠĠĠĠĠĠĠ ĠE MAIL _ ADDRESS , ĊĠĠĠĠĠĠĠ ĠE MAIL _ SUBJECT , ĊĠĠĠĠĠĠĠ ĠFILTER , ĊĠĠĠĠĠĠĠ ĠLONG _ MESSAGE , ĊĠĠĠĠĠĠĠ ĠNORMAL , ĊĠĠĠĠĠĠĠ ĠPASSWORD , ĊĠĠĠĠĠĠĠ ĠPER SON _ NAME , ĊĠĠĠĠĠĠĠ ĠPH ON ET IC , ĊĠĠĠĠĠĠĠ ĠPOST AL _ ADDRESS , ĊĠĠĠĠĠĠĠ ĠSH ORT _ MESSAGE , ĊĠĠĠĠĠĠĠ ĠTIME , ĊĠĠĠĠĠĠĠ ĠURI , ĊĠĠĠĠĠĠĠ ĠVIS IBLE _ PASSWORD , ĊĠĠĠĠĠĠĠ ĠWEB _ EDIT _ TEXT , ĊĠĠĠĠĠĠĠ ĠWEB _ EMAIL _ ADDRESS , ĊĠĠĠĠĠĠĠ ĠWEB _ PASSWORD ; ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠC aps Mode Ġ{ ĊĠĠĠĠĠĠĠ ĠALL , ĊĠĠĠĠĠĠĠ ĠNONE , ĊĠĠĠĠĠĠĠ ĠS ENT ENCES , ĊĠĠĠĠĠĠĠ ĠWORD S ; ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġfrom Flags ( flags : ĠInt ): ĠC aps Mode Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġand ĠInput Type . TYPE _ TEXT _ FLAG _ CAP _ CHAR ACT ERS Ġ> Ġ 0 Ġ-> ĠALL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġand ĠInput Type . TYPE _ TEXT _ FLAG _ CAP _ SENT ENCES Ġ> Ġ 0 Ġ-> ĠS ENT ENCES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġand ĠInput Type . TYPE _ TEXT _ FLAG _ CAP _ WORDS Ġ> Ġ 0 Ġ-> ĠWORD S ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠNONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġto Flags (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠALL Ġ-> ĠInput Type . TYPE _ TEXT _ FLAG _ CAP _ CHAR ACT ERS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ENT ENCES Ġ-> ĠInput Type . TYPE _ TEXT _ FLAG _ CAP _ SENT ENCES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWORD S Ġ-> ĠInput Type . TYPE _ TEXT _ FLAG _ CAP _ WORDS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠClass Ġwhich Ġmarks Ġa Ġregion Ġof Ġthe Ġ[ text ] Ġin Ġ[ editor Instance ]. Ċ Ġ*/ Ċ open Ġclass ĠRegion ( private Ġval Ġeditor Instance : ĠEditor Instance ) Ġ{ ĊĠĠĠ Ġvar Ġstart : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġvar Ġend : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġval ĠisValid : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġstart Ġ>= Ġ 0 Ġ&& Ġend Ġ>= Ġ 0 Ġ&& Ġlength Ġ>= Ġ 0 ĊĠĠĠ Ġval Ġlength : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġend Ġ- Ġstart ĊĠĠĠ Ġval Ġtext : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġei Text Ġ= Ġeditor Instance . cached Text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! isValid Ġ|| Ġstart Ġ>= Ġei Text . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġif Ġ( end Ġ>= Ġei Text . length ) Ġ{ Ġei Text . length Ġ} Ġelse Ġ{ Ġend Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeditor Instance . cached Text . substring ( start , Ġend ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġoperator Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( other Ġis ĠRegion ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ== Ġother . start Ġ&& Ġend Ġ== Ġother . end ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . equals ( other ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġstart ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġend ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠClass Ġwhich Ġholds Ġselection Ġattributes Ġand Ġreturns Ġthe Ġcorrect Ġtext Ġfor Ġset Ġselection Ġbased Ġon Ċ Ġ* Ġthe Ġtext Ġin Ġ[ editor Instance ]. Ċ Ġ*/ Ċ class ĠSelection ( private Ġval Ġeditor Instance : ĠEditor Instance ) Ġ: ĠRegion ( editor Instance ) Ġ{ ĊĠĠĠ Ġval Ġis Cursor Mode : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlength Ġ== Ġ 0 Ġ&& ĠisValid ĊĠĠĠ Ġval Ġis Selection Mode : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġlength Ġ!= Ġ 0 Ġ&& ĠisValid Ċ } Ċ