package Ġio . github . k bi ak ov . code view Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġandroid . graphics . drawable . Gradient Drawable Ċ import Ġandroid . support . v 7 . widget . Linear LayoutManager Ċ import Ġandroid . support . v 7 . widget . RecyclerView Ċ import Ġandroid . util . Attribute Set Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . Relative Layout Ċ import Ġio . github . k bi ak ov . code view . Thread . delayed Ċ import Ġio . github . k bi ak ov . code view . adapters . Abstract Code Adapter Ċ import Ġio . github . k bi ak ov . code view . adapters . Code With Notes Adapter Ċ import Ġio . github . k bi ak ov . code view . adapters . Options Ċ import Ġio . github . k bi ak ov . code view . highlight . Color Theme Data Ċ import Ġio . github . k bi ak ov . code view . highlight . color Ċ Ċ /** Ċ Ġ* Ġ@ class ĠCode View Ċ Ġ* Ċ Ġ* ĠView Ġfor Ġshowing Ġcode Ġcontent Ġwith Ġsyntax Ġhighlighting . Ċ Ġ* Ċ Ġ* Ġ@ author ĠK ir ill ĠBi ak ov Ċ Ġ*/ Ċ class ĠCode View Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġattrs : ĠAttributeSet ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġdef Style Attr : ĠInt Ġ= Ġ 0 Ċ ) Ġ: ĠRelative Layout ( context , Ġattrs , Ġdef Style Attr ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġv Code List : ĠRecyclerView ĊĠĠĠ Ġprivate Ġval Ġv Shadow s : ĠMap < Shadow Position , ĠView > ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPrimary Ġconstructor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinf late ( context , ĠR . layout . layout _ code _ view , Ġthis ) ĊĠĠĠĠĠĠĠ Ġattrs ?. let (:: check Start Animation ) ĊĊĠĠĠĠĠĠĠ Ġv Code List Ġ= ĠfindViewById < RecyclerView >( R . id . rv _ code _ content ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Manager Ġ= ĠLinearLayoutManager ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Nested Scrolling Enabled Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġv Shadow s Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShadow Position . Right Border Ġto ĠR . id . shadow _ right _ border , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShadow Position . Num Bottom Ġto ĠR . id . shadow _ num _ bottom , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShadow Position . Content Bottom Ġto ĠR . id . shadow _ content _ bottom ĊĠĠĠĠĠĠĠ Ġ). map Values Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfindViewById < View >( it . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Start Animation ( attrs : ĠAttributeSet ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( visibility Ġ== ĠVIS IBLE Ġ&& Ġattrs . is Animate On Start ( context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ= ĠConst . Alpha . In visible ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( Const . Default Delay Ġ* Ġ 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. alpha ( Const . Alpha . Initial ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalpha Ġ= ĠConst . Alpha . Initial ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠAbstract Code Adapter <* >. check Highlight Animation ( action : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( options . animate On Highlight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġanimate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Duration ( Const . Default Delay Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. alpha ( Const . Alpha . Almost In visible ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelayed Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanimate (). alpha ( Const . Alpha . Visible ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHighlight Ġcode Ġwith Ġdefined Ġprogramming Ġlanguage . ĊĠĠĠĠ Ġ* ĠIt Ġholds Ġthe Ġplaceholder Ġon Ġview Ġuntil Ġcode Ġis Ġnot Ġhighlighted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġhighlight () Ġ{ ĊĠĠĠĠĠĠĠ Ġget Adapter ()?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhighlight Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Highlight Animation (:: notify DataSet Changed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBorder Ġshadow s Ġwill Ġshown Ġif Ġfull Ġlisting Ġpresented . ĊĠĠĠĠ Ġ* ĠIt Ġhelps Ġto Ġsee Ġwhat Ġpart Ġof Ġcode Ġis Ġsc rolled Ġ& Ġhidden . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġis Visible ĠIs Ġshadow s Ġvisible ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsetup Shadow s ( isVisible : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvisibility Ġ= Ġif Ġ( isVisible ) ĠVIS IBLE Ġelse ĠG ONE ĊĠĠĠĠĠĠĠ Ġval Ġtheme Ġ= Ġget Options OrDefault (). theme ĊĠĠĠĠĠĠĠ Ġv Shadow s . forEach Ġ{ Ġ( pos , Ġview ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . visibility Ġ= Ġvisibility ĊĠĠĠĠĠĠĠĠĠĠĠ Ġview . set Safe Background ( pos . create Shadow ( theme )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ- ĠInitialization ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPrepare Ġview Ġwith Ġdefault Ġadapter Ġ& Ġoptions . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġprepare () Ġ= Ġset Adapter ( Code With Notes Adapter ( context )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġwith Ġoptions . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoptions ĠOptions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Options ( options : ĠOptions ) Ġ= Ġset Adapter ( Code With Notes Adapter ( context , Ġoptions )) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInitialize Ġwith Ġadapter . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġadapter ĠAdapter ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Adapter ( adapter : ĠAbstract Code Adapter <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġv Code List . adapter Ġ= Ġadapter ĊĠĠĠĠĠĠĠ Ġhighlight () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ- ĠOptions ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠView Ġoptions Ġaccessor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Options () Ġ= Ġget Adapter ()?. options ĊĠĠĠ Ġfun Ġget Options OrDefault () Ġ= Ġget Options () Ġ?: ĠOptions ( context ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġoptions Ġor Ġinitialize Ġif Ġneeded . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoptions ĠOptions ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Options ( options : ĠOptions ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Adapter () Ġ?: Ġset Options ( options ) ĊĠĠĠĠĠĠĠ Ġget Adapter ()?. options Ġ= Ġoptions ĊĠĠĠĠĠĠĠ Ġsetup Shadow s ( options . shadow s ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġupdate Options ( body : ĠOptions . () Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġget Options () Ġ?: Ġget Options OrDefault () ĊĠĠĠĠĠĠĠ Ġupdate Options ( options . apply ( body )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ- ĠAdapter ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCode Ġadapter Ġaccessor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Adapter () Ġ= Ġv Code List . adapter Ġas ? ĠAbstract Code Adapter < *> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpdate Ġadapter Ġor Ġinitialize Ġif Ġneeded . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġadapter ĠAdapter ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġupdate Adapter ( adapter : ĠAbstract Code Adapter <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġadapter . options Ġ= Ġget Options OrDefault () ĊĠĠĠĠĠĠĠ Ġset Adapter ( adapter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ- ĠSet Ġcode ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġcode Ġcontent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThere Ġare Ġtwo Ġways Ġbefore Ġcode Ġwill Ġbe Ġhighlighted : ĊĠĠĠĠ Ġ* Ġ 1 ) Ġview Ġis Ġnot Ġinitialized Ġ( adapter Ġor Ġoptions Ġare Ġnot Ġset ), ĊĠĠĠĠ Ġ* ĠĠĠ Ġprepare Ġwith Ġdefault Ġparams Ġ& Ġtry Ġto Ġclassify Ġlanguage ĊĠĠĠĠ Ġ* Ġ 2 ) Ġview Ġinitialized Ġwith Ġsome Ġparams , Ġlanguage : ĊĠĠĠĠ Ġ* ĠĠĠ Ġa ) Ġis Ġset : Ġused Ġdefined Ġprogramming Ġlanguage ĊĠĠĠĠ Ġ* ĠĠĠ Ġb ) Ġnot Ġset : Ġtry Ġto Ġclassify ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcode ĠCode Ġcontent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Code ( code : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Adapter () Ġ?: Ġprepare () ĊĠĠĠĠĠĠĠ Ġget Adapter ()?. update Code ( code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSet Ġcode Ġcontent . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThere Ġare Ġtwo Ġways Ġbefore Ġcode Ġwill Ġbe Ġhighlighted : ĊĠĠĠĠ Ġ* Ġ 1 ) Ġview Ġis Ġnot Ġinitialized , Ġprepare Ġwith Ġdefault Ġparams ĊĠĠĠĠ Ġ* Ġ 2 ) Ġview Ġinitialized Ġwith Ġsome Ġparams , Ġset Ġnew Ġlanguage ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcode ĠCode Ġcontent ĊĠĠĠĠ Ġ* Ġ@ param Ġlanguage ĠProgramming Ġlanguage ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġset Code ( code : ĠString , Ġlanguage : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġget Options OrDefault () ĊĠĠĠĠĠĠĠ Ġupdate Options ( options . with Language ( language )) ĊĠĠĠĠĠĠĠ Ġget Adapter ()?. update Code ( code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠAttributeSet . is Animate On Start ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . theme . obtain Styled Attributes ( this , ĠR . style able . Code View , Ġ 0 , Ġ 0 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflag Ġ= Ġget Boolean ( R . style able . Code View _ animate On Start , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre cycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ is Animate On Start Ġflag ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠView . set Safe Background ( new Background : ĠDrawable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( android . os . Build . VERSION . SDK _ INT Ġ>= Ġandroid . os . Build . VERSION _ CODES . J EL LY _ BE AN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= Ġnew Background ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠShadow Position Ġ{ ĊĠĠĠĠĠĠĠ ĠRight Border , ĊĠĠĠĠĠĠĠ ĠNum Bottom , ĊĠĠĠĠĠĠĠ ĠContent Bottom ; ĊĊĠĠĠĠĠĠĠ Ġfun Ġcreate Shadow ( theme : ĠColor Theme Data ) Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRight Border Ġ-> ĠGradient Drawable . Orientation . LEFT _ RIGHT Ġto Ġtheme . bg Content ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNum Bottom Ġ-> ĠGradient Drawable . Orientation . TOP _ BOTTOM Ġto Ġtheme . bg Num ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContent Bottom Ġ-> ĠGradient Drawable . Orientation . TOP _ BOTTOM Ġto Ġtheme . bg Content ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ Ġ( orientation , Ġcolor ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolors Ġ= ĠarrayOf ( android . R . color . transparent , Ġcolor ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠGradient Drawable ( orientation , Ġcolors . map ( Int :: color ). to IntArray ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠProvide Ġlistener Ġto Ġcode Ġline Ġclicks . Ċ Ġ*/ Ċ interface ĠOn Code Line ClickListener Ġ{ ĊĠĠĠ Ġfun Ġon Code Line Clicked ( n : ĠInt , Ġline : ĠString ) Ċ } Ċ