package Ġme . v icky ch ij w ani . kot link o ans . features . common Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . res . Typed Array Ċ import Ġandroid . graphics .* Ċ import Ġandroid . text .* Ċ import Ġandroid . util .* Ċ import Ġandroid . view .* Ċ import Ġandroid . widget . EditText Ċ import Ġcom . ts eng vn . type kit . Type kit Ċ import Ġme . v icky ch ij w ani . kot link o ans . R Ċ import Ġme . v icky ch ij w ani . kot link o ans . util .* Ċ import Ġorg . w 3 c . dom . Document Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ Ċ /** Ċ Ġ* ĠCustom ĠEditText Ġfor Ġsyntax Ġhighlighting , Ġauto - indent , Ġetc . Ċ Ġ* Ċ Ġ* ĠCred its : Ġhttps :// github . com / Cal sign / AP DE / blob / 8 c 1 1 7 f 0 7 2 9 f 4 7 4 5 3 7 fcc d 8 0 6 4 1 6 3 e 2 cce e 1 c 4 3 4 0 / AP DE / src / main / java / com / cal sign labs / ap de / Code EditText . java Ċ Ġ* ĠSign ificant ly Ġadapted Ġby Ġ@ v icky ch ij w ani Ċ Ġ*/ Ċ class ĠCode EditText Ġ: ĠEditText Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġmy Text Size Ġ= Ġ 1 3 f . sp ( context ) ĊĊĠĠĠ Ġ// ĠSyntax Ġhighlighter Ġinformation ĊĠĠĠ Ġprivate Ġvar Ġtokens Ġ= ĠlistOf < Token >() ĊĠĠĠ Ġprivate Ġvar Ġmatching Bracket Ġ= Ġ- 1 ĊĊĠĠĠ Ġ// ĠHighlight ĊĠĠĠ Ġvar Ġhighlight s Ġ= Ġmutable ListOf < Highlight >() ĊĊĠĠĠ Ġ// ĠWhether Ġor Ġnot Ġthe Ġsyntax Ġhighlighter Ġis Ġcurrently Ġrunning ĊĠĠĠ Ġprivate Ġvar Ġupdating Tokens Ġ= ĠAtomic Boolean () ĊĠĠĠ Ġ// ĠWhether Ġor Ġnot Ġwe Ġneed Ġto Ġupdate Ġthe Ġtokens ĠAG AIN ĊĠĠĠ Ġprivate Ġvar Ġflag Refresh Tokens Ġ= ĠAtomic Boolean () ĊĊĠĠĠ Ġprivate Ġvar Ġauto Pair Br ackets Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġauto Indent Ġ= Ġtrue ĊĠĠĠ Ġprivate Ġvar Ġindent Ġ= Ġ" ĠĠĠ Ġ" ĊĊĠĠĠ Ġinner Ġclass ĠHighlight ( val Ġpos : ĠInt , Ġval Ġlen : ĠInt , Ġval Ġpaint : ĠPaint ) ĊĊĠĠĠ Ġprivate Ġvar Ġflag Enter Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġflag Tab Ġ= Ġfalse ĊĊĠĠĠ Ġ// Used Ġto Ġindicate Ġthat Ġthe Ġcode Ġarea Ġis Ġcurrently Ġbeing Ġupdated Ġin Ġsuch Ġa Ġway Ġthat Ġwe Ġshould Ġnot Ġsave Ġthe Ġchange Ġin Ġthe Ġundo Ġhistory ĊĠĠĠ Ġprivate Ġvar ĠFLAG _ NO _ UN DO _ SNAPSHOT Ġ= Ġfalse ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠPaint s Ġthat Ġwill Ġalways Ġbe Ġused ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġline Highlight Ġby Ġlazy Ġ{ ĠPaint () Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġbracket Match Ġby Ġlazy Ġ{ ĠPaint () Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġblack Paint Ġby Ġlazy Ġ{ ĠPaint () Ġ} ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġwhite Paint Ġby Ġlazy Ġ{ ĠPaint () Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠLists Ġof Ġstyles ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġstyles Ġ= ĠHashMap < String , ĠText Paint >() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsyntax Ġ= ĠlistOf < Keyword >() ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġsyntax Loaded Ġ= ĠAtomic Boolean ( false ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDefault Ġtokens ĊĠĠĠĠĠĠĠ Ġval Ġpunctuation Ġ= Ġ" () [] {} \" ' ?: ; ,. @ ". toCharArray () ĊĠĠĠĠĠĠĠ Ġval Ġoperators Ġ= Ġ"= +- /* % & | <> ". toCharArray () ĊĠĠĠĠĠĠĠ Ġval Ġde limiters Ġ= Ġpunctuation Ġ+ Ġoperators Ġ+ Ġ' Ġ' ĊĠĠĠĠĠĠĠ Ġval Ġdelimiter Pair Map Ġ= Ġmap Of (' (' Ġto Ġ' )', Ġ'{ ' Ġto Ġ' }', Ġ'[' Ġto Ġ' ]') ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext ) Ġ: Ġsuper ( context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet ) Ġ: Ġsuper ( context , Ġattrs ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs , Ġdef Style Attr ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( context : ĠContext , Ġattrs : ĠAttributeSet , Ġdef Style Attr : ĠInt , Ġdef Style Res : ĠInt ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ: Ġsuper ( context , Ġattrs , Ġdef Style Attr , Ġdef Style Res ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit ( attrs , Ġdef Style Attr , Ġdef Style Res ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup For Editing () Ġ{ ĊĠĠĠĠĠĠĠ Ġcommon Setup () ĊĠĠĠĠĠĠĠ Ġenable Editing () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup For View ing () Ġ{ ĊĠĠĠĠĠĠĠ Ġcommon Setup () ĊĠĠĠĠĠĠĠ Ġdisable Editing () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġenable Editing () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Text Is Selectable ( false ) ĊĠĠĠĠĠĠĠ Ġis Cursor Visible Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdisable Editing () Ġ{ ĊĠĠĠĠĠĠĠ Ġset Text Is Selectable ( true ) ĊĠĠĠĠĠĠĠ Ġis Cursor Visible Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcommon Setup () Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Text Listener () ĊĠĠĠĠĠĠĠ Ġrefresh Text Size () ĊĠĠĠĠĠĠĠ Ġflag Refresh Tokens () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit ( attrs : ĠAttributeSet ? Ġ= Ġnull , Ġdef Style Attr : ĠInt ? Ġ= Ġnull , Ġdef Style Res : ĠInt ? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠProcess ĠXML Ġattributes ĊĠĠĠĠĠĠĠ Ġattrs ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa : ĠTyped Array Ġ= Ġcontext . theme . obtain Styled Attributes ( attrs , Ġint ArrayOf ( android . R . attr . text Size ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Style Attr Ġ?: Ġ 0 , Ġdef Style Res Ġ?: Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Text Size Ġ= Ġa . get Dimension Pixel Size ( 0 , Ġmy Text Size . toInt ()). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa . recycle () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Read Ġpreferences ĊĠĠĠĠĠĠĠ Ġval Ġprefs Ġ= ĠP refs . with ( context ) ĊĠĠĠĠĠĠĠ Ġauto Pair Br ackets Ġ= Ġprefs . getBoolean ( context , ĠR . string . pref _ auto _ pair , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . bool . pref _ auto _ pair _ default ) ĊĠĠĠĠĠĠĠ Ġauto Indent Ġ= Ġprefs . getBoolean ( context , ĠR . string . pref _ auto _ indent , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . bool . pref _ auto _ indent _ default ) ĊĠĠĠĠĠĠĠ Ġval Ġindent Size Ġ= Ġprefs . getString As Int ( context , ĠR . string . pref _ indent _ size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠR . integer . pref _ indent _ size _ default ) ĊĠĠĠĠĠĠĠ Ġindent Ġ= Ġ" Ġ". repeat ( indent Size ) ĊĊĠĠĠĠĠĠĠ Ġ// Get Ġrid Ġof Ġextra Ġspacing Ġat Ġthe Ġtop Ġand Ġbottom ĊĠĠĠĠĠĠĠ Ġinclude Font Padding Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġload Ġthe Ġsyntax Ġagain Ġfor Ġeach Ġtab ĊĠĠĠĠĠĠĠ Ġif Ġ(! syntax Loaded . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Create Ġthe Ġline Ġhighlight ĠPaint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Highlight . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Highlight . color Ġ= Ġ 0 x 6 6 A ACC FF ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Create Ġthe Ġbracket Ġmatch ĠPaint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbracket Match . style Ġ= ĠPaint . Style . ST RO KE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbracket Match . color Ġ= Ġ 0 xFF 0 0 0 0 0 0 . toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Create Ġthe Ġblack Ġ( default Ġtext ) Ġpaint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblack Paint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblack Paint . color Ġ= Ġ 0 xFF 0 0 0 0 0 0 . toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Create Ġthe Ġwhite Ġ( cleared ) Ġpaint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhite Paint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhite Paint . color Ġ= Ġ 0 xFFFFFFFF . toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Load Ġthe Ġdefault Ġsyntax ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . assets . open (" default _ syntax _ colors . xml "). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Builder Ġ= ĠDocument BuilderFactory . newInstance (). new Document Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġdoc Builder . parse ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Syntax ( doc ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Non Fatal ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġtext Listener : ĠText Watcher ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġkey Listener : ĠOn Key Listener ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Text Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcheck Ġfor Ġnull Ġto Ġprevent Ġre - adding Ġthe Ġlisteners Ġwhen Ġthe Ġfragment Ġis Ġre - created ĊĊĠĠĠĠĠĠĠ Ġif Ġ( text Listener Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Listener Ġ= Ġobject Ġ: ĠText Watcher Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġold Text : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter TextChanged ( editable : ĠEdit able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( old Text Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUnfortunately , Ġthis Ġappears Ġto Ġbe Ġthe Ġonly Ġway Ġto Ġdetect Ġcharacter Ġp resses Ġin Ġall Ġsituations : Ġreading Ġthe Ġtext Ġdirectly ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġtext . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCompare Ġthe Ġold Ġtext Ġand Ġthe Ġnew Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠDoes Ġthis Ġcheck Ġfail Ġin Ġany Ġcorner Ġcases Ġ( like Ġmass - text Ġinsertion Ġ/ Ġdeletion )? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . length Ġ== Ġold Text !!. length Ġ+ Ġ 1 Ġ&& Ġselection Start Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpressed Char Ġ= Ġtext [ selection Start Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpress Keys ( pressed Char . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġbefore TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġcount : ĠInt , Ġafter : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġold Text Ġ= Ġtext . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon TextChanged ( s : ĠCharSequence , Ġstart : ĠInt , Ġbefore : ĠInt , Ġcount : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Tokens () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd TextChanged Listener ( text Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( key Listener Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Detect Ġenter Ġkey Ġp resses ... Ġregardless Ġof Ġwhether Ġor Ġnot Ġthe Ġuser Ġis Ġusing Ġa Ġhardware Ġkeyboard ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Listener Ġ= ĠView . On Key Listener Ġ{ Ġ_, Ġ_, Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// We Ġonly Ġwant Ġto Ġcheck Ġkey Ġdown Ġevents ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ... otherwise Ġwe Ġget Ġtwo Ġevents Ġfor Ġevery Ġpress Ġbecause Ġwe Ġhave Ġdown Ġand Ġup ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . action Ġ!= ĠKeyEvent . ACTION _ DOWN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Key Listener Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Override Ġdefault ĠTAB Ġkey Ġbehavior Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( keyCode Ġ== ĠKeyEvent . KEYCODE _ TAB Ġ&& ĠPreference Manager . getDefault SharedPreferences ( context ). getBoolean (" override _ tab ", Ġtrue )) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! FLAG _ NO _ UN DO _ SNAPSHOT ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Tab Ġ= Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . insert ( selection Start , Ġ" Ġ Ġ") Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Tab Ġ= Ġfalse Ċ // Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Key Listener Ġtrue Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ On Key Listener Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset On Key Listener ( key Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġupdate Tokens () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Syntax ( doc : ĠDocument ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstyle Nodes Ġ= Ġdoc . getElementsByTagName (" style ") ĊĠĠĠĠĠĠĠ Ġval Ġkeyword Nodes Ġ= Ġdoc . getElementsByTagName (" keyword ") ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( style Node Ġin Ġstyle Nodes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Parse Ġthe Ġstyle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠText Paint ( paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġstyle Node . textContent . trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolor Ġ= Ġstyle Node . attributes . getName d Item (" color ") ?. node Value Ġ?: Ġ"# FF 0 0 0 0 0 0 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbold Ġ= Ġ( style Node . attributes . getName d Item (" bold ") ?. node Value Ġ== Ġ" true ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Build Ġthe ĠText Paint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . style Ġ= ĠPaint . Style . FILL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= ĠColor . parse Color ( color ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . type face Ġ= ĠType kit . getInstance (). get ( if Ġ( bold ) Ġ" mono space - bold " Ġelse Ġ" mono space ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Add Ġthe Ġstyle ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyles . put ( name , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Get Ġthe Ġlist Ġof Ġdefined Ġkeywords ĊĠĠĠĠĠĠĠ Ġval Ġtemp Syntax Ġ= Ġmutable ListOf < Keyword >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( keyword Ġin Ġkeyword Nodes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Parse Ġthe Ġkeyword ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstyle Name Ġ= Ġkeyword . nodeName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġkeyword . textContent . trim () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġthis Ġisn 't Ġa Ġvalid Ġstyle , Ġbail Ġout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyles [ style Name ]?. let Ġ{ Ġstyle Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Add Ġthe Ġkeyword ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Syntax . add ( Keyword ( name , Ġstyle )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsyntax Ġ= Ġtemp Syntax ĊĠĠĠĠĠĠĠ Ġsyntax Loaded . set ( true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpress Keys ( pressed : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDetect Ġthe ĠENTER Ġkey ĊĠĠĠĠĠĠĠ Ġif Ġ( pressed . length Ġ== Ġ 1 Ġ&& Ġpressed [ 0 ] Ġ== Ġ'\ n ' Ġ&& Ġauto Indent ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauto Indent () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAutomatically Ġadd Ġa Ġclosing Ġdelimiter Ġ( if Ġthe Ġuser Ġhas Ġenabled Ġauto - pair ing Ġde limiters ) ĊĠĠĠĠĠĠĠ Ġif Ġ( auto Pair Br ackets Ġ&& Ġdelimiter Pair Map . containsKey ( pressed [ 0 ])) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . insert ( selection Start , Ġdelimiter Pair Map [ pressed [ 0 ]]. toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Selection ( selection Start Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġauto Indent () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlast Line Num Ġ= Ġcurrent Line Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ// Get Ġthe Ġindentation Ġof Ġthe Ġprevious Ġline ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġtext . toString (). split ("\ n ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠ Ġvar Ġlast Line Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġlast Indent Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġ// Calculate Ġthe Ġindentation Ġof Ġthe Ġprevious Ġline ĊĠĠĠĠĠĠĠ Ġif Ġ( lines . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Line Ġ= Ġlines [ Math . min ( last Line Num , Ġlines . size Ġ- Ġ 1 )] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. last Line . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġlast Line [ it ] Ġ== Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġlast Indent Ġ+= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Det ermine Ġthe Ġlast Ġcharacter Ġof Ġthe Ġprevious Ġline Ġ( not Ġcounting Ġwhitespace ) ĊĠĠĠĠĠĠĠ Ġvar Ġlast Char Ġ= Ġ' Ġ' ĊĠĠĠĠĠĠĠ Ġval Ġtrimmed Last Line Ġ= Ġlast Line . trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( trimmed Last Line . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Char Ġ= Ġtrimmed Last Line [ trimmed Last Line . length Ġ- Ġ 1 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Autom atically Ġindent ĊĠĠĠĠĠĠĠ Ġif Ġ( last Char Ġ== Ġ'{ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! FLAG _ NO _ UN DO _ SNAPSHOT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Enter Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Autom atically Ġincrease Ġthe Ġindent Ġif Ġthis Ġis Ġa Ġnew Ġcode Ġblock ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . insert ( selection Start , Ġlast Indent Ġ+ Ġindent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Autom atically Ġpress Ġenter Ġagain Ġso Ġthat Ġeverything Ġlines Ġup Ġnicely .. ĠThis Ġis Ġinc red ibly Ġhack y ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Also Ġmake Ġsure Ġthat Ġthe Ġuser Ġhas Ġenabled Ġcur ly Ġbr ace Ġinsertion ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . length Ġ> Ġselection Start Ġ&& Ġtext [ selection Start ] Ġ== Ġ' }' Ġ&& Ġauto Pair Br ackets ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Add Ġa Ġnewline Ġ( the Ġextra Ġspace Ġis Ġso Ġthat Ġwe Ġdon 't Ġrecursively Ġdetect Ġa Ġnewline ; Ġadding Ġat Ġleast Ġtwo Ġcharacters Ġat Ġonce Ġside steps Ġthis Ġpossibility ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . insert ( selection Start , Ġ"\ n " Ġ+ Ġlast Indent Ġ+ Ġ" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Move Ġthe Ġcursor Ġback Ġ( hack y ...) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Selection ( selection Start Ġ- Ġ( last Indent . length Ġ+ Ġ 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Remove Ġthe Ġextra Ġspace Ġ( see Ġabove ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . replace ( selection Start Ġ+ Ġ 1 , Ġselection Start Ġ+ Ġ 2 , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġflag Enter Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Regular Ġindentation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . insert ( selection Start , Ġlast Indent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Selection Changed ( sel Start : ĠInt , Ġsel End : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Bracket Match () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Bracket Match () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// " {}", Ġ" ()", Ġ" []" Ġopen Ġ/ Ġclose Ġmatching ĊĠĠĠĠĠĠĠ Ġ// This Ġisn 't Ġnecessarily Ġoptimized , Ġbut Ġit Ġdoesn 't Ġseem Ġto Ġneed Ġit ... ĊĊĠĠĠĠĠĠĠ Ġvar Ġcaret Ġ= Ġselection Start Ġ- Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ// Make Ġsure Ġthere Ġis Ġno Ġtext Ġselection ... ĊĠĠĠĠĠĠĠ Ġif Ġ( caret Ġ== Ġselection End Ġ- Ġ 1 Ġ&& Ġcaret Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// The Ġcharacter Ġto Ġthe Ġleft Ġof Ġthe Ġcursor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġtext [ caret ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// The Ġcharacter Ġthat Ġwe 're Ġsearching Ġfor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġother : ĠChar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Up Ġor Ġdown ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir : ĠInt ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// This Ġisn 't Ġvery Ġeleg ant ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġdelimiter Pair Map ĠĠĠĠĠĠĠĠ Ġ-> Ġ{ Ġother Ġ= Ġdelimiter Pair Map [ left ] !! ; Ġdir Ġ= Ġ 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġdelimiter Pair Map . values Ġ Ġ-> Ġ{ Ġother Ġ= Ġdelimiter Pair Map . key For ( left ) !! ; Ġdir Ġ= Ġ- 1 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġ{ Ġmatching Bracket Ġ= Ġ- 1 ; Ġreturn Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Start Ġon Ġthe Ġright Ġside Ġ( p uns !) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaret ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Or Ġthe Ġleft ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dir Ġ== Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaret -- ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Bracket Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// The Ġtotal Ġopens Ġ/ Ġcloses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdif Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( caret Ġ< Ġtext . length Ġ&& Ġcaret Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġtext [ caret ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġother ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdif Ġ-= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġleft ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdif Ġ+= Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dif Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatching Bracket Ġ= Ġcaret ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaret Ġ+= Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Highlight ( pos : ĠInt , Ġlen : ĠInt , Ġpaint : ĠPaint ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhighlight s . add ( Highlight ( pos , Ġlen , Ġpaint )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear Highlight s () Ġ{ ĊĠĠĠĠĠĠĠ Ġhighlight s . clear () ĊĠĠĠ Ġ} Ċ Ċ // ĠĠĠ Ġfun Ġscroll To Char ( pos : ĠInt , Ġeditor : ĠEditor Activity ) Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġval Ġx Offset Ġ= Ġcompound Padding Left . toFloat () Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ// Calculate Ġcoordinates Ċ // ĠĠĠĠĠĠĠ Ġval Ġx Ġ= ĠMath . max ( x Offset Ġ+ Ġlayout . get Primary Horizontal ( pos ), Ġ 1 f ). toInt () Ċ // ĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġline Height Ġ* Ġlayout . getLine For Offset ( pos ) Ċ // Ċ // ĠĠĠĠĠĠĠ Ġ( editor . findViewById ( R . id . code _ sc roller _ x ) Ġas ĠHorizontal ScrollView ). smooth Scroll To ( x , Ġ 0 ) Ċ // ĠĠĠĠĠĠĠ Ġ( editor . findViewById ( R . id . code _ sc roller ) Ġas ĠScroll View ). smooth Scroll To ( 0 , Ġy ) Ċ // ĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġnumber Ġof Ġthe Ġcurrently Ġselected Ġline ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġcurrent Line : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selection Start Ġ> Ġ- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlayout . getLine For Offset ( selection Start ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcharacter Ġoffset Ġfor Ġthe Ġspecified Ġline . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġrelated Ġto Ġoffset For Line End ( int ) ĊĊĠĠĠĠ Ġ* Ġ@ param Ġline ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoffset For Line ( line : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Get Ġa Ġlist Ġof Ġlines ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġtext . toString (). split ("\ n ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġ// Count Ġup Ġto Ġthe Ġspecified Ġline ĊĠĠĠĠĠĠĠ Ġvar Ġoff Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. Math . min ( lines . size , Ġline ) Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ// Add Ġthe Ġlength Ġof Ġeach Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoff Ġ+= Ġlines [ i ]. length Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ// We Ġdon 't Ġwant Ġto Ġreturn Ġvalues Ġthat Ġare Ġtoo Ġbig ... ĊĠĠĠĠĠĠĠ Ġif Ġ( off Ġ> Ġtext . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoff Ġ= Ġtext . length ĊĠĠĠĠĠĠĠ Ġ// ... or Ġto Ġsmall ĊĠĠĠĠĠĠĠ Ġif Ġ( off Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoff Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġoff ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcharacter Ġoffset Ġfor Ġthe Ġend Ġof Ġthe Ġspecified Ġline . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġrelated Ġto Ġoffset For Line ( int ) ĊĊĠĠĠĠ Ġ* Ġ@ param Ġline ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġoffset For Line End ( line : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Get Ġa Ġlist Ġof Ġlines ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġtext . toString (). split ("\ n ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġ// Count Ġup Ġto Ġthe Ġspecified Ġline , Ġincluding Ġthe Ġspecified Ġline ĊĠĠĠĠĠĠĠ Ġvar Ġoff Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. Math . min ( lines . size , Ġline Ġ+ Ġ 1 ) Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ// Add Ġthe Ġlength Ġof Ġeach Ġline ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoff Ġ+= Ġlines [ i ]. length Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġ// We Ġdon 't Ġwant Ġto Ġreturn Ġvalues Ġthat Ġare Ġtoo Ġbig ĊĠĠĠĠĠĠĠ Ġif Ġ( off Ġ> Ġtext . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoff Ġ= Ġtext . length ĊĠĠĠĠĠĠĠ Ġ// ... or Ġto Ġsmall ĊĠĠĠĠĠĠĠ Ġif Ġ( off Ġ< Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoff Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġreturn Ġoff ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġline For Offset ( offset : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Get Ġa Ġlist Ġof Ġlines ĊĠĠĠĠĠĠĠ Ġval Ġlines Ġ= Ġtext . toString (). split ("\ n ". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĊĠĠĠĠĠĠĠ Ġvar Ġoff Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlines . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoff Ġ+= Ġlines [ i ]. length Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( off Ġ> Ġoffset ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlines . size Ġ- Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Draw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Height Ġ= Ġline Height . toFloat () ĊĊĠĠĠĠĠĠĠ Ġ// ĠDraw Ġbase Ġtext ĊĠĠĠĠĠĠĠ Ġsuper . on Draw ( canvas ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġsyntax Ġhighlighter Ġhasn 't Ġrun Ġyet ... ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthis Ġdoesn 't Ġbreak Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( tokens Ġ== Ġnull ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check Ġagain Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate () Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ( Preference Manager . getDefault SharedPreferences ( context ). getBoolean (" syntax _ highlight ", Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ScrollView Ġdoesn 't Ġlike Ġto Ġlet Ġus Ġknow Ġwhen Ġit Ġhas Ġsc rolled ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĉĉ ĉ ScrollView Ġsc roller Ġ= Ġ( ScrollView ) Ġ(( AP DE ) Ġcontext . getApplicationContext ()). get Editor (). findViewById ( R . id . code _ sc roller ); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Vis Ġ= Ġ 0 // ( int ) ĠMath . max ( sc roller . get Scroll Y () Ġ/ Ġget Line Height () Ġ- Ġ 1 , Ġ 0 ); Ġ// inclusive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Vis Ġ= Ġline Count // ( int ) ĠMath . floor ( Math . min (( sc roller . get Scroll Y () Ġ+ Ġsc roller . getHeight ()) Ġ/ Ġget Line Height () Ġ+ Ġ 1 , Ġget Line Count ())); Ġ// exclusive ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtokens . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Only Ġdraw Ġthis Ġif Ġwe Ġneed Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tokens [ i ]. lineNum Ġ>= Ġtop Vis Ġ&& Ġtokens [ i ]. is Custom Paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtokens [ i ]. display ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( tokens [ i ]. lineNum Ġ> Ġbottom Vis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// " {}", Ġ" ()", Ġ" []" Ġopen Ġ/ Ġclose Ġmatching ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Make Ġsure Ġwe Ġdon 't Ġcrash Ġif Ġthe Ġbracket Ġmatcher Ġhasn 't Ġupdated Ġyet Ġand Ġwe Ġare Ġdeleting Ġa Ġlot Ġof Ġtext ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matching Bracket Ġ!= Ġ- 1 Ġ&& Ġmatching Bracket Ġ< Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Offset Ġ= Ġcompound Padding Left . toFloat () Ġ// TODO Ġhopefully Ġno Ġone Ġuses ĠAr abic Ġ( right - aligned Ġlocal ities )... Ġbecause Ġget Compound Padding Start () Ġwas Ġintroduced Ġin Ġa Ġlater ĠAPI Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Width Ġ= Ġpaint . measure Text (" m ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Calculate Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= ĠMath . max ( x Offset Ġ+ Ġlayout . get Primary Horizontal ( matching Bracket ), Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġline Height Ġ* Ġlayout . getLine For Offset ( matching Bracket ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Rect ( x , Ġy , Ġx Ġ+ Ġchar Width , Ġy Ġ+ Ġline Height , Ġbracket Match ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Offset Ġ= Ġcompound Padding Left . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Width Ġ= Ġpaint . measure Text (" m ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġradius Ġ= Ġ 3 . dp ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Draw Ġthe Ġhighlight Ġboxes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( highlight Ġin Ġhighlight s ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( highlight . pos Ġ!= Ġ- 1 Ġ&& Ġhighlight . pos Ġ+ Ġhighlight . len Ġ<= Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Calculate Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= ĠMath . max ( x Offset Ġ+ Ġlayout . get Primary Horizontal ( highlight . pos ), Ġ 1 f ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġline Height Ġ* Ġlayout . getLine For Offset ( highlight . pos ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Round Rect ( Rect F ( x , Ġy , Ġx Ġ+ Ġchar Width Ġ* Ġhighlight . len , Ġy Ġ+ Ġline Height ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġradius . toFloat (), Ġradius . toFloat (), Ġhighlight . paint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Now Ġthat Ġwe 've Ġmulti - threaded Ġthe Ġnew Ġsyntax Ġhighlighter , Ġwe Ġdon 't Ġneed Ġthe Ġold Ġone ĊĠĠĠĠĠĠĠ Ġ// It 's Ġstill Ġhere Ġin Ġmemory ... ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCall Ġthis Ġfunction Ġto Ġforce Ġthe Ġtokens Ġto Ġupdate ĠAG AIN Ġafter Ġthe Ġcurrent Ġ/ Ġnext Ġupdate Ġcycle Ġhas Ġcompleted ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġflag Refresh Tokens () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( updating Tokens . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflag Refresh Tokens . set ( true ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Tokens () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Synchron ized Ġfun Ġupdate Tokens () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ(! Preference Manager . getDefault SharedPreferences ( context ). getBoolean (" syntax _ highlight ", Ġtrue )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// Get Ġthe Ġtext Ġnow Ġso Ġthat Ġwe Ġdon 't Ġexperience Ġany Ġsynchronization Ġissues ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġtext . toString () ĊĊĠĠĠĠĠĠĠ ĠThread ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdating Tokens . set ( true ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Tokens Ġ= Ġtokenize ( text , Ġ 0 , Ġde limiters ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtemp Tokens . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Non Space Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( j Ġin Ġi Ġ+ Ġ 1 .. temp Tokens . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġtemp Tokens [ j ]. text ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Ġ== Ġ" Ġ" Ġ|| Ġnext Ġ== Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Non Space Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtemp Tokens [ i ]. update Paint ( next Non Space ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmulti Line Comment Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsingle Line Comment Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstring Literal Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchar Literal Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Literal Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprev Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext : ĠString ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġtemp Tokens . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtemp Tokens [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Ġ= Ġif Ġ( i Ġ< Ġtemp Tokens . size Ġ- Ġ 1 ) Ġtemp Tokens [ i Ġ+ Ġ 1 ]. text Ġelse Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token . text Ġ== Ġ"\ n ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Line Comment Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Literal Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Literal Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( string Literal Ġ&& Ġprev Ġ== Ġ"\"" Ġ&& Ġi Ġ> Ġstart Literal Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Literal Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Literal Ġ&& Ġprev Ġ== Ġ"'" Ġ&& Ġi Ġ> Ġstart Literal Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Literal Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! multi Line Comment Ġ&& Ġ! single Line Comment Ġ&& Ġ! string Literal Ġ&& Ġ! char Literal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Test Ġfor Ġsingle - line Ġcomments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token . text Ġ== Ġ"/" Ġ&& Ġnext Ġ== Ġ"/") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsingle Line Comment Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( token . text Ġ== Ġ"/" Ġ&& Ġnext Ġ== Ġ"* ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmulti Line Comment Ġ= Ġtrue // Test Ġfor Ġmulti - line Ġcomments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO ĠImplement Ġincomplete Ġ/ Ġinvalid Ġliterals ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Test Ġfor ĠString Ġliterals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! string Literal Ġ&& Ġ! multi Line Comment Ġ&& Ġ! single Line Comment Ġ&& Ġ! char Literal Ġ&& Ġtoken . text Ġ== Ġ"\" ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring Literal Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Literal Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Test Ġfor Ġchar Ġliterals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! char Literal Ġ&& Ġ! multi Line Comment Ġ&& Ġ! single Line Comment Ġ&& Ġ! string Literal Ġ&& Ġtoken . text Ġ== Ġ"' ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchar Literal Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Literal Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Change Ġpaint Ġfor Ġcomments Ġand Ġliterals ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( single Line Comment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . paint Ġ= Ġstyles [" comment _ single "] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . is Custom Paint Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( multi Line Comment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . paint Ġ= Ġstyles [" comment _ multi "] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . is Custom Paint Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( string Literal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . paint Ġ= Ġstyles [" literal _ string "] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . is Custom Paint Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( char Literal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . paint Ġ= Ġstyles [" literal _ char "] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . is Custom Paint Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Test Ġfor Ġend Ġmulti - line Ġcomments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( multi Line Comment ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Ġ== Ġ"*" Ġ&& Ġtoken . text Ġ== Ġ"/") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmulti Line Comment Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprev Ġ= Ġtoken . text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Comp action Ġof Ġsame - colored Ġtokens Ġ- Ġlike Ġcomments , Ġfor Ġexample Ġ( they Ġwere Ġcausing Ġserious Ġlag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġwe 're Ġprobably Ġstill Ġpicking Ġup Ġspace Ġcharacters ... ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfinal Tokens Ġ= Ġmutable ListOf < Token >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġactive Token : ĠToken ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( token Ġin Ġtemp Tokens ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Token Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Token Ġ= Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Direct Ġreference Ġcomparison Ġof Ġpaint s , Ġshould Ġbe ĠOK ... ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( active Token . lineNum Ġ!= Ġtoken . lineNum Ġ|| Ġactive Token . paint Ġ!== Ġtoken . paint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Tokens . add ( active Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Token Ġ= Ġtoken ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Token . text Ġ+= Ġtoken . text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Add Ġthe Ġextra Ġtoken Ġat Ġthe Ġend ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactive Token ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Tokens . add ( active Token ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtokens Ġ= Ġfinal Tokens ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġthere Ġis Ġno Ġtext , Ġw ipe Ġthe Ġtokens ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġ... why Ġdo Ġwe Ġneed Ġthis ? ĠIt Ġseems Ġsomewhat Ġcounter product ive ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( getText (). isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclear Tokens () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġpost Invalidate () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdating Tokens . set ( false ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check Ġto Ġsee Ġif Ġwe Ġhave Ġupdated Ġthe Ġtext ĠAG AIN Ġsince Ġstarting Ġthis Ġupdate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// We Ġshouldn 't Ġget Ġtoo Ġmuch Ġrecursion ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( flag Refresh Tokens . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Tokens () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflag Refresh Tokens . set ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}). start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Called Ġinternally Ġto Ġget Ġa Ġlist Ġof Ġall Ġtokens Ġin Ġan Ġinput ĠString , Ġsuch Ġthat Ġeach Ġtoken Ġmay Ġbe Ġsyntax Ġhighlighted Ġwith Ġa Ġdifferent Ġcolor ĊĠĠĠ Ġprivate Ġfun Ġtokenize ( input : ĠString , Ġline Offset : ĠInt , Ġde limiters : ĠChar Array ): ĠList < Token > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Create Ġthe Ġoutput Ġlist ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġmutable ListOf < Token >() ĊĠĠĠĠĠĠĠ Ġoutput . add ( Token ("", Ġ 0 , Ġ 0 )) ĊĊĠĠĠĠĠĠĠ Ġvar Ġwas Delimiter Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġx Off Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Line Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġ// Read Ġeach Ġchar Ġin Ġthe Ġinput ĠString ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. input . length Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġinput [ i ] ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( c Ġ== Ġ'\ n ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Off Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( Token ("\ n ", Ġx Off , Ġline Offset Ġ+ Ġcurrent Line )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwas Delimiter Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// If Ġit Ġis Ġa Ġtoken , Ġsplit Ġinto Ġa Ġnew ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Delimiter ( c , Ġde limiters )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( Token ("", Ġx Off , Ġline Offset Ġ+ Ġcurrent Line )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwas Delimiter Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( was Delimiter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . add ( Token ("", Ġx Off , Ġline Offset Ġ+ Ġcurrent Line )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwas Delimiter Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Append Ġthe Ġchar ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput [ output . size Ġ- Ġ 1 ]. text Ġ+= Ġc ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Off ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġoutput ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Called Ġinternally Ġfrom Ġtokenize () ĊĠĠĠ Ġ// Determin es Ġwhether Ġor Ġnot Ġthe Ġspecified Ġchar Ġis Ġin Ġthe Ġarray Ġof Ġchars ĊĠĠĠ Ġprivate Ġfun Ġis Delimiter ( token : ĠChar , Ġde limiters : ĠChar Array ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġde limiters . contains ( token ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Used Ġinternally Ġfor Ġthe Ġsyntax Ġhighlighter ĊĠĠĠ Ġprivate Ġinner Ġclass ĠToken ( var Ġtext : ĠString , Ġvar Ġoffset : ĠInt , Ġvar Ġline Num : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpaint Ġ= Ġstyles [" base "] !! ĊĠĠĠĠĠĠĠ Ġ// Do Ġwe Ġactually Ġwe Ġneed Ġto Ġdraw Ġthis Ġover Ġthe Ġdefault Ġtext ? ĊĠĠĠĠĠĠĠ Ġvar Ġis Custom Paint Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval ĠBASE _ PA INT Ġ= Ġstyles [" base "] !! ĊĊĠĠĠĠĠĠĠ Ġfun Ġupdate Paint ( next Non Space : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkeyword Ġ= Ġget Keyword ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword Ġ!= Ġnull ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġkeyword . paint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . length Ġ== Ġ 1 Ġ&& Ġtext [ 0 ] Ġin Ġpunctuation Ġ Ġ-> Ġstyles [" p unctuation "] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . length Ġ== Ġ 1 Ġ&& Ġtext [ 0 ] Ġin Ġoperators ĠĠĠ Ġ-> Ġstyles [" operator "] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Non Space Ġ== Ġ"(" Ġ|| Ġnext Non Space Ġ== Ġ" {" Ġ Ġ-> Ġstyles [" function "] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> ĠBASE _ PA INT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Custom Paint Ġ= Ġ( paint Ġ!= ĠBASE _ PA INT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdisplay ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Height Ġ= Ġline Height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Offset Ġ= Ġ(- layout . getLine Des cent ( 0 )). toFloat () Ġ// AH - HA ! ĠThis Ġis Ġthe Ġmetric Ġthat Ġwe Ġneed ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Offset Ġ= Ġcompound Padding Left . toFloat () Ġ// TODO Ġhopefully Ġno Ġone Ġuses ĠAr abic Ġ( right - aligned Ġlocal ities )... Ġbecause Ġget Compound Padding Start () Ġwas Ġintroduced Ġin Ġa Ġlater ĠAPI Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Width Ġ= Ġget Paint (). measure Text (" m ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Calculate Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġx Offset Ġ+ Ġoffset Ġ* Ġchar Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġline Offset Ġ+ Ġline Height Ġ* Ġ( lineNum Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Draw Ġhighlighted Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( text , Ġx , Ġy , Ġpaint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdisplay ( canvas : ĠCanvas , Ġcustom Paint : ĠText Paint ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Height Ġ= Ġline Height . toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Offset Ġ= Ġ(- layout . getLine Des cent ( 0 )). toFloat () Ġ// AH - HA ! ĠThis Ġis Ġthe Ġmetric Ġthat Ġwe Ġneed ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Offset Ġ= Ġcompound Padding Left . toFloat () Ġ// TODO Ġhopefully Ġno Ġone Ġuses ĠAr abic Ġ( right - aligned Ġlocal ities )... Ġbecause Ġget Compound Padding Start () Ġwas Ġintroduced Ġin Ġa Ġlater ĠAPI Ġlevel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchar Width Ġ= Ġget Paint (). measure Text (" m ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Calculate Ġcoordinates ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġx Offset Ġ+ Ġoffset Ġ* Ġchar Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġline Offset Ġ+ Ġline Height Ġ* Ġ( lineNum Ġ+ Ġ 1 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Draw Ġhighlighted Ġtext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( text , Ġx , Ġy , Ġcustom Paint ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrefresh Text Size () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġmy Text Size Ġ= ĠInteger . parseInt ( Preference Manager . getDefault SharedPreferences ( context ). getString (" text size ", Ġ" 1 4 ")). toFloat () ĊĠĠĠĠĠĠĠ Ġval Ġscaled Text Size Ġ= Ġmy Text Size ĊĊĠĠĠĠĠĠĠ Ġset Text Size ( Typed Value . COMPLEX _ UNIT _ PX , Ġmy Text Size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstyle List Ġ= ĠArrayList < Text Paint >( styles . values ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( paint Ġin Ġstyle List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . text Size Ġ= Ġscaled Text Size ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( keyword Ġin Ġsyntax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkeyword . paint . text Size Ġ= Ġscaled Text Size ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Update Text ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setText ( text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset No Undo Text ( text : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠFLAG _ NO _ UN DO _ SNAPSHOT Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġsuper . setText ( text ) ĊĠĠĠĠĠĠĠ ĠFLAG _ NO _ UN DO _ SNAPSHOT Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠClear Ġthe Ġlist Ġof Ġtokens Ġfor Ġthe Ġsyntax Ġhighlighter . ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġis Ġused Ġwhen Ġtabs Ġare Ġswitched Ġso Ġthat Ġthe Ġold Ġsyntax Ġhighlighting Ġdoesn 't Ġbrief ly Ġshow Ġon Ġtop Ġof Ġthe Ġnew Ġcode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclear Tokens () Ġ{ ĊĠĠĠĠĠĠĠ Ġtokens Ġ= ĠlistOf < Token >() ĊĊĠĠĠĠĠĠĠ Ġ// Also Ġclear Ġthe Ġmatching Ġbracket ... ĊĠĠĠĠĠĠĠ Ġmatching Bracket Ġ= Ġ- 1 ĊĊĠĠĠĠĠĠĠ Ġ// ... and Ġalso Ġclear Ġthe Ġhighlight ĊĠĠĠĠĠĠĠ Ġclear Highlight s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Keyword ( text : ĠString ): ĠKeyword ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( syntax Loaded . get ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsyntax . first OrNull Ġ{ Ġit . name Ġ== Ġtext Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠKeyword ( val Ġname : ĠString , Ġval Ġpaint : ĠText Paint ) Ċ Ċ } Ċ