package Ġshape . path . view . mark Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . graphics . Canvas Ċ import Ġandroid . graphics . PointF Ċ import Ġandroid . graphics . drawable . Drawable Ċ import Ġorg . json . JSONObject Ċ import Ġshape . path . view . Text Configurator Ċ import Ġshape . path . view . point . converter . Point Converter Ċ import Ġshape . path . view . utils . Drawable Utils Ċ import Ġshape . path . view . utils . JSON Utils Ċ Ċ /** Ċ Ġ* ĠCreated Ġby Ġroot Ġon Ġ 1 / 2 5 / 1 8 . Ċ Ġ*/ Ċ class ĠMark Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġid : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtouch Width Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġtouch Height Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġitems : ĠArrayList < Mark Item > Ġ= Ġarray ListOf () ĊĠĠĠ Ġprivate Ġvar Ġwidth : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġheight : ĠFloat Ġ= Ġ 0 f ĊĠĠĠ Ġprivate Ġvar Ġtext Configurator : ĠText Configurator ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdrawable : ĠDrawable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdrawable Res Id : ĠInt Ġ= Ġ- 1 ĊĠĠĠ Ġprivate Ġvar Ġselected Drawable : ĠDrawable ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġselected Drawable Res Id : ĠInt Ġ= Ġ- 1 ĊĊĠĠĠ Ġprivate Ġvar Ġmulti Selection Mode Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġis Check able Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġvar Ġitems Changed Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġdrawable Changed Ġ= Ġfalse ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġfrom Json ( context : ĠContext , Ġjson : ĠJSONObject ?): ĠMark ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( json Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmark Ġ= ĠMark () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark . setId ( json . opt Int (" id ", Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdrawable Ġ= Ġjson . opt JSONObject (" drawable ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġdrawable . opt Double (" width ", Ġ 0 . 0 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġdrawable . opt Double (" height ", Ġ 0 . 0 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark . set Drawable ( JSON Utils . string To Drawable Res Id ( context , Ġdrawable . opt String (" resource "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark . setSelected Drawable ( JSON Utils . string To Drawable Res Id ( context , Ġdrawable . opt String (" selected Resource "))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark . fit Drawable To Size ( w , Ġh ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtouch Bounds Ġ= Ġjson . opt JSONObject (" touch Bounds ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtouch Bounds ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġtouch Bounds . opt Double (" width ", Ġ 0 . 0 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġtouch Bounds . opt Double (" height ", Ġ 0 . 0 ). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark . set Touch Bounds ( w , Ġh ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark . set Check able ( json . opt Boolean (" check able ", Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark . set Multi Selection Mode Enabled ( json . opt Boolean (" multi Selection Mode ", Ġfalse )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark . setText Configurator ( Text Configurator . fromJson ( context , Ġjson . opt JSONObject (" text Configurator "))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġjson . opt JSONArray (" items ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġit . length ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġit . opt JSONObject ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠJSON Utils . json To Point ( item , ĠPoint F ( 0 f , Ġ 0 f )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= Ġitem . opt String (" label ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmark . add Position ( p !! , Ġlabel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmark ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Position ( point : ĠPoint F ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . add Position ( point , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Position ( point : ĠPoint F , Ġlabel : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġitem Ġ= ĠMark Item () ĊĠĠĠĠĠĠĠ Ġitem . position Ġ= Ġpoint ĊĠĠĠĠĠĠĠ Ġitem . label Ġ= Ġlabel ĊĠĠĠĠĠĠĠ Ġitem . index Ġ= Ġitems . size ĊĠĠĠĠĠĠĠ Ġitems . add ( item ) ĊĠĠĠĠĠĠĠ Ġitems Changed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Positions ( points : ĠList < PointF >) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . add Positions ( points , Ġarray ListOf ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Positions ( points : ĠList < PointF >, Ġlabels : ĠList < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġpoints . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ< Ġlabels . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Position ( points [ i ], Ġlabels [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Position ( points [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset Items () Ġ{ ĊĠĠĠĠĠĠĠ Ġitems . clear () ĊĠĠĠĠĠĠĠ Ġitems Changed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Text Configurator ( configur ator : ĠText Configurator ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . text Configurator Ġ= Ġconfigur ator ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Drawable ( res Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrawable Res Id Ġ= Ġres Id ĊĠĠĠĠĠĠĠ Ġdrawable Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġdrawable Changed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetSelected Drawable ( drawable : ĠDrawable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . selected Drawable Ġ= Ġdrawable ĊĠĠĠĠĠĠĠ Ġdrawable Changed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetSelected Drawable ( res Id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġselected Drawable Res Id Ġ= Ġres Id ĊĠĠĠĠĠĠĠ Ġselected Drawable Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġdrawable Changed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Drawable ( drawable : ĠDrawable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . drawable Ġ= Ġdrawable ĊĠĠĠĠĠĠĠ Ġdrawable Changed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Multi Selection Mode Enabled ( enabled : ĠBoolean ){ ĊĠĠĠĠĠĠĠ Ġmulti Selection Mode Enabled Ġ= Ġenabled ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Check able ( is Check able : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . is Check able Ġ= Ġis Check able ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfit Drawable To Size ( width : ĠFloat , Ġheight : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġthis . height Ġ= Ġheight ĊĠĠĠĠĠĠĠ Ġdrawable Changed Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠsetId ( id : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . id Ġ= Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetId (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Touch Bounds ( width : ĠFloat , Ġheight : ĠFloat ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . touch Width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġthis . touch Height Ġ= Ġheight ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġbuild ( context : ĠContext , Ġpoint Converter : ĠPoint Converter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( items Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems . forEach Ġ{ Ġit . build ( point Converter , Ġtouch Width , Ġtouch Height ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġitems Changed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( drawable Changed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Ġ= ĠDrawable Utils . getS ca led Drawable ( context , Ġdrawable , Ġdrawable Res Id , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Drawable Ġ= ĠDrawable Utils . getS ca led Drawable ( context , Ġselected Drawable , Ġselected Drawable Res Id , Ġwidth , Ġheight ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrawable Changed Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġdraw ( canvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitems . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Position Drawable And Draw ( it , Ġcanvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate L able And Draw ( it , Ġcanvas ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate Position Drawable And Draw ( mark Item : ĠMark Item , Ġcanvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdrawable ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw Ġ= Ġit . bounds . width () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh Ġ= Ġit . bounds . height () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġ( mark Item . position . x Ġ- Ġw Ġ/ Ġ 2 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġ( mark Item . position . y Ġ- Ġh Ġ/ Ġ 2 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġ( mark Item . position . x Ġ+ Ġw Ġ/ Ġ 2 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbottom Ġ= Ġ( mark Item . position . y Ġ+ Ġh Ġ/ Ġ 2 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mark Item . isSelected Ġ&& Ġselected Drawable Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Drawable !!. setBounds ( left , Ġtop , Ġright , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Drawable !!. draw ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . setBounds ( left , Ġtop , Ġright , Ġbottom ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . draw ( canvas ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġupdate L able And Draw ( mark Item : ĠMark Item , Ġcanvas : ĠCanvas ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( mark Item . label Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Configurator ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġmark Item . position . x Ġ+ Ġit . text Offset . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġy Ġ= Ġmark Item . position . y Ġ+ Ġit . text Offset . y ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcanvas . draw Text ( mark Item . label , Ġx , Ġy , Ġit . paint ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġon Item Click ( x : ĠFloat , Ġy : ĠFloat ): ĠMark Item ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( touch Width Ġ> Ġ 0 f Ġ&& Ġtouch Height Ġ> Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġitems . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġit Ġ= Ġitems [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . isIn Bounds ( x , Ġy )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! multi Selection Mode Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun selectAll Except Item ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Check able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isSelected Ġ= Ġ! it . isSelected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isSelected Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun selectAll Except Item ( item Index : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor ( i Ġin Ġ 0 Ġuntil Ġitems . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ!= Ġitem Index ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems [ i ]. isSelected Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġhas Selected Drawable (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġselected Drawable Ġ!= Ġnull ĊĠĠĠ Ġ} Ċ }