package Ġd mit ry . mys enko . text around content . library Ċ Ċ import Ġandroid . graphics . Paint Ċ import Ġandroid . graphics . Type face Ċ import Ġandroid . text . Text Paint Ċ import Ġandroid . util . Log Ċ import Ġandroidx . compose . foundation . Canvas Ċ import Ġandroidx . compose . foundation . layout . Box Ċ import Ġandroidx . compose . foundation . layout . fill Max Width Ċ import Ġandroidx . compose . foundation . layout . height Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . draw scope . draw Into Canvas Ċ import Ġandroidx . compose . ui . graphics . native Canvas Ċ import Ġandroidx . compose . ui . graphics . to Argb Ċ import Ġandroidx . compose . ui . layout . Layout Ċ import Ġandroidx . compose . ui . platform . Local Density Ċ import Ġandroidx . compose . ui . text . font . FontStyle Ċ import Ġandroidx . compose . ui . unit . Text Unit Ċ import Ġandroidx . compose . ui . unit . sp Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠD mit ry ĠM ys enko Ġon Ġ 0 9 . 1 2 . 2 0 2 1 Ċ Ġ*/ Ċ Ċ /** Ċ Ġ* ĠA Ġhigh - level Ġelement Ġthat Ġdraw s Ġtext Ġto Ġflow Ġaround Ġother Ġcontent . Ċ Ġ* Ċ Ġ* Ġ@ param Ġtext ĠThe Ġtext Ġto Ġbe Ġdisplayed . Ċ Ġ* Ġ@ param Ġmodifier Ġ[ Modifier ] Ġto Ġapply Ġto Ġthis Ġlayout Ġnode . Ċ Ġ* Ġ@ param Ġcolor Ġ[ Color ] Ġto Ġapply Ġto Ġthe Ġtext . Ċ Ġ* Ġ@ param Ġparagraph Size ĠInd ent Ġafter Ġline Ġbreak . ĠApplies Ġonly Ġif Ġthe Ġtext Ġis Ġ[ Text Align . Left ]. Ċ Ġ* Ġ@ param ĠfontSize ĠThe Ġsize Ġof Ġglyph s Ġto Ġuse Ġwhen Ġpaint ing Ġthe Ġtext . Ċ Ġ* Ġ@ param Ġfont Style ĠThe Ġtype face Ġvariant Ġto Ġuse Ġwhen Ġdrawing Ġthe Ġletters . Ċ Ġ* Ġ@ param Ġtype face Ġ[ Type face ] Ġto Ġapply Ġto Ġthe Ġtext . Ċ Ġ* Ġ@ param Ġletter Spacing ĠThe Ġamount Ġof Ġspace Ġto Ġadd Ġbetween Ġeach Ġletter . Ċ Ġ* Ġ@ param ĠtextAlign ĠThe Ġalignment Ġof Ġthe Ġtext Ġwithin Ġthe Ġlines Ġof Ġthe Ġparagraph . Ċ Ġ* Ġ@ param Ġline Height ĠDistance Ġbetween Ġbase lines . Ċ Ġ* Ġ@ param Ġoverflow ĠHow Ġvisual Ġoverflow Ġshould Ġbe Ġhandled . Ċ Ġ* Ġ@ param Ġmax Lines ĠAn Ġoptional Ġmaximum Ġnumber Ġof Ġlines Ġfor Ġthe Ġtext Ġto Ġspan , Ġwrapping Ġif Ġnecessary . Ċ Ġ* Ġ@ param Ġalign Content ĠAlign Ġcontent Ġto Ġthe Ġleft Ġor Ġright Ġside . Ċ Ġ* Ġ@ param Ġcontent ĠThe Ġcontent Ġaround Ġwhich Ġthe Ġtext Ġwill Ġbe Ġdrawn . Ċ Ġ* Ċ Ġ*/ Ċ @ Composable Ċ fun ĠText Around Content ( ĊĠĠĠ Ġtext : ĠString , ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġcolor : ĠColor Ġ= ĠColor . Black , ĊĠĠĠ Ġparagraph Size : ĠText Unit Ġ= Ġ 0 . sp , ĊĠĠĠ ĠfontSize : ĠText Unit Ġ= Ġ 1 4 . sp , ĊĠĠĠ Ġfont Style : ĠFont Style Ġ= ĠFont Style . Normal , ĊĠĠĠ Ġtype face : ĠType face Ġ= ĠType face . DEFAULT , ĊĠĠĠ Ġletter Spacing : ĠText Unit Ġ= ĠText Unit . Unspecified , ĊĠĠĠ ĠtextAlign : ĠText Align Ġ= ĠText Align . Left , ĊĠĠĠ Ġline Height : ĠText Unit Ġ= ĠText Unit . Unspecified , ĊĠĠĠ Ġoverflow : ĠText Overflow Ġ= ĠText Overflow . Clip , ĊĠĠĠ Ġmax Lines : ĠInt Ġ= ĠInt . MAX _ VALUE , ĊĠĠĠ Ġalign Content : ĠAlign Content Ġ= ĠAlign Content . Left , ĊĠĠĠ Ġcontent : Ġ@ Composable Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcontent Sizes Ġ= Ġremember Ġ{ Ġmutable State Of ( listOf < Size >()) Ġ} ĊĠĠĠ Ġval Ġview Size Ġ= Ġremember Ġ{ Ġmutable State Of ( Size ( 0 f , Ġ 0 f )) Ġ} ĊĠĠĠ Ġval Ġbox Height Ġ= Ġremember Ġ{ Ġmutable State Of ( 0 f ) Ġ} ĊĊĠĠĠ ĠBox ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġif Ġ( box Height . value Ġ!= Ġ 0 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier . height ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( Local Density . current ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox Height . value . to Dp () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠDraw Content ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalign Content Ġ= Ġalign Content , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Changed Ġ= Ġ{ Ġsizes , Ġsize Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Sizes . value Ġ= Ġsizes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġview Size . value Ġ= Ġsize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠCanvas ( modifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill Max Width (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Draw Ġ= Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Apply ing Ġparams Ġto Ġa Ġbrush ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaint Ġ= ĠText Paint () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . text Size Ġ= ĠfontSize . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . color Ġ= Ġcolor . to Argb () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . textAlign Ġ= Ġwhen Ġ( textAlign ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Align . Left Ġ-> ĠPaint . Align . LEFT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Align . Right Ġ-> ĠPaint . Align . RIGHT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Align . Center Ġ-> ĠPaint . Align . CENTER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . type face Ġ= ĠType face . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype face , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( font Style Ġ== ĠFont Style . Italic ) ĠType face . ITAL IC Ġelse ĠType face . NORMAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( letter Spacing Ġ!= ĠText Unit . Unspecified ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaint . letter Spacing Ġ= Ġletter Spacing . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Calculation Ġof Ġstarting Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmaxHeight Ġ= Ġview Size . value . height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparagraph Ġ= Ġparagraph Size . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Line Y : ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent Width : ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstart Line X : ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠmaxWidth : ĠFloat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmy Line Height Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Height Ġ!= ĠText Unit . Unspecified Ġ&& Ġline Height Ġ>= ĠfontSize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġline Height . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontSize . to Px () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurrent Line Text : ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġchunk Size : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠlineNumber Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġheight Limit Reached Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Line Ġ= ĠmaxHeight Ġ< Ġmy Line Height Ġ* Ġ 2 Ġ|| Ġmax Lines Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġneed Paragraph : ĠBoolean ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Break Ġinto Ġparagraphs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Blocks Ġ= Ġtext . split ("\ n ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Blocks . forEach Ġ{ Ġs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtext Block Ġ= Ġs ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneed Paragraph Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( text Block . isNotEmpty () Ġ&& Ġ! height Limit Reached Ġ&& Ġ! last Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( line Number Ġ+ Ġ 1 ) Ġ* Ġmy Line Height Ġ> ĠmaxHeight Ġ|| ĠlineNumber Ġ== Ġmax Lines ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Line Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Line Y Ġ= ĠlineNumber Ġ* Ġmy Line Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Width Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcalculate Content Width ( content Sizes . value , Ġstart Line Y Ġ- Ġmy Line Height ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxWidth Ġ= Ġsize . width Ġ- Ġcontent Width ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Line X Ġ= Ġif Ġ( align Content Ġ== ĠAlign Content . Right ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( textAlign ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Align . Left Ġ-> Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Align . Right Ġ-> Ġsize . width Ġ- Ġcontent Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Align . Center Ġ-> Ġ( size . width Ġ- Ġcontent Width ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( textAlign ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Align . Left Ġ-> Ġcontent Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Align . Right Ġ-> Ġsize . width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText Align . Center Ġ-> Ġcontent Width Ġ+ Ġ( size . width Ġ- Ġcontent Width ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( need Paragraph Ġ&& ĠtextAlign Ġ== ĠText Align . Left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Line X Ġ+= Ġparagraph ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxWidth Ġ-= Ġparagraph ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line Text Ġ= ĠgetLast Chunk ( text Block , ĠmaxWidth , Ġpaint , Ġoverflow ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchunk Size Ġ= Ġget Chunk Size ( text Block , ĠmaxWidth , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Line Text Ġ= Ġtext Block . substring ( 0 , Ġchunk Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Block Ġ= Ġtext Block . substring ( chunk Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdraw Into Canvas Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . native Canvas . draw Text ( current Line Text , Ġstart Line X , Ġstart Line Y , Ġpaint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlineNumber ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line Number Ġ* Ġmy Line Height Ġ> ĠmaxHeight ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Limit Reached Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġneed Paragraph Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! height Limit Reached ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox Height . value Ġ= Ġ( line Number Ġ- Ġ 1 ) Ġ* Ġmy Line Height ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠPosition ing Ġand ĠS izing ĠContent Ċ Ġ*/ Ċ @ Composable Ċ private Ġfun ĠDraw Content ( ĊĠĠĠ Ġmodifier : ĠModifier Ġ= ĠModifier , ĊĠĠĠ Ġalign Content : ĠAlign Content Ġ= ĠAlign Content . Left , ĊĠĠĠ Ġsize Changed : Ġ( List < Size >, ĠSize ) Ġ-> ĠUnit , ĊĠĠĠ Ġcontent : Ġ@ Composable Ġ() Ġ-> ĠUnit Ċ ) Ġ{ ĊĠĠĠ ĠLayout ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier , ĊĠĠĠĠĠĠĠ Ġcontent Ġ= Ġcontent ĊĠĠĠ Ġ) Ġ{ Ġmeas ur ables , Ġconstraints Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġplace ables Ġ= Ġmeas ur ables . map Ġ{ Ġit . measure ( constraints ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsizes Ġ= Ġmutable ListOf < Size >() ĊĠĠĠĠĠĠĠ Ġplace ables . forEach Ġ{ Ġplace able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsizes . add ( Size ( place able . width . toFloat (), Ġplace able . height . toFloat ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsize Changed . invoke ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsizes , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSize ( constraints . maxWidth . toFloat (), Ġconstraints . max Height . toFloat ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġlayout ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġconstraints . maxWidth , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġconstraints . max Height ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplace ables . forEach Ġ{ Ġplace able Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplace able . place Relative ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġif Ġ( align Content Ġ== ĠAlign Content . Left ) Ġ 0 Ġelse Ġconstraints . maxWidth Ġ- Ġplace able . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* ĠA Ġfunction Ġthat Ġcalculates Ġthe Ġlength Ġof Ġa Ġline Ġbased Ġon Ġavailable Ġspace Ġand Ġbrush Ġproperties . Ċ Ġ*/ Ċ private Ġfun Ġget Chunk Size ( text : ĠString , ĠmaxWidth : ĠFloat , Ġpaint : ĠPaint ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġlength Ġ= Ġpaint . break Text ( text , Ġtrue , ĠmaxWidth , Ġnull ) ĊĊĠĠĠ Ġif Ġ( length Ġ<= Ġ 0 Ġ|| Ġlength Ġ>= Ġtext . length Ġ|| Ġtext . get OrNull ( length Ġ- Ġ 1 ) Ġ== Ġ' Ġ') Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlength ĊĠĠĠ Ġ} Ġelse Ġif Ġ( text . length Ġ> Ġlength Ġ&& Ġtext . get OrNull ( length ) Ġ== Ġ' Ġ') Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlength Ġ+ Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġtemp Ġ= Ġlength Ġ- Ġ 1 ĊĠĠĠ Ġwhile Ġ( text . get OrNull ( temp ) Ġ!= Ġ' Ġ') Ġ{ ĊĠĠĠĠĠĠĠ Ġtemp -- ĊĠĠĠĠĠĠĠ Ġif Ġ( temp Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlength ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtemp Ġ+ Ġ 1 Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġfunction Ġthat Ġcalculates Ġthe Ġlast Ġline Ġgiven Ġthe Ġoverflow Ġparameters Ċ Ġ*/ Ċ private Ġfun ĠgetLast Chunk ( ĊĠĠĠ Ġtext : ĠString , ĊĠĠĠ ĠmaxWidth : ĠFloat , ĊĠĠĠ Ġpaint : ĠPaint , ĊĠĠĠ Ġoverflow : ĠText Overflow Ċ ): ĠString Ġ{ ĊĠĠĠ Ġval Ġlength Ġ= Ġpaint . break Text ( text , Ġtrue , ĠmaxWidth , Ġnull ) ĊĊĠĠĠ Ġreturn Ġif Ġ( length Ġ<= Ġ 0 Ġ|| Ġlength Ġ>= Ġtext . length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtext ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( overflow Ġ== ĠText Overflow . El lipsis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . substring ( 0 , Ġlength Ġ- Ġ 3 ). plus (" ...") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext . substring ( 0 , Ġlength ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġfunction Ġthat Ġcalculates Ġthe Ġmaximum Ġavailable Ġline Ġwidth Ġfor Ġa Ġgiven ĠY Ġcoordinate . Ċ Ġ*/ Ċ private Ġfun Ġcalculate Content Width ( sizes : ĠList < Size >, Ġy : ĠFloat ): ĠFloat Ġ{ ĊĠĠĠ Ġreturn Ġsizes . filter Ġ{ Ġit . height Ġ> Ġy Ġ}. max Of OrNull Ġ{ Ġit . width Ġ} Ġ?: Ġ 0 f Ċ } Ċ Ċ /** Ċ Ġ* ĠAlign Ġcontent Ġto Ġthe Ġleft Ġor Ġright Ġside . Ċ Ġ*/ Ċ enum Ġclass ĠAlign Content Ġ{ ĊĠĠĠ ĠLeft , ĠRight Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġalignment Ġof Ġthe Ġtext Ġwithin Ġthe Ġlines Ġof Ġthe Ġparagraph . Ċ Ġ*/ Ċ enum Ġclass ĠText Align Ġ{ ĊĠĠĠ ĠLeft , ĠRight , ĠCenter Ċ } Ċ Ċ /** Ċ Ġ* ĠHow Ġvisual Ġoverflow Ġshould Ġbe Ġhandled . Ċ Ġ*/ Ċ enum Ġclass ĠText Overflow Ġ{ ĊĠĠĠ ĠClip , ĠEl lipsis Ċ } Ċ Ċ private Ġdata Ġclass ĠSize ( ĊĠĠĠ Ġval Ġwidth : ĠFloat , ĊĠĠĠ Ġval Ġheight : ĠFloat Ċ )