package Ġcom . and res _ k . lib . library . core . component . element Ċ Ċ import Ġcom . and res _ k . lib . builder . converter . utils . Regex Util Ċ import Ġcom . and res _ k . lib . library . core . component . Component TypeCode Ċ import Ġcom . and res _ k . lib . library . core . component . Pdf Component Ċ import Ġcom . and res _ k . lib . library . core . component . custom . Pdf Text Line Ċ import Ġcom . and res _ k . lib . library . core . component . custom . add Text Ċ import Ġcom . and res _ k . lib . library . core . property .* Ċ import Ġcom . and res _ k . lib . library . utils .* Ċ import Ġcom . and res _ k . lib . library . utils . config . Pdf Context Ċ import Ġcom . and res _ k . lib . library . utils . config . Pdf Properties Ċ import Ġcom . and res _ k . lib . library . utils . data . Pdf Draw n Element Ċ import Ġcom . and res _ k . lib . library . utils . data . Pdf Over draw Result Ċ import Ġjava . awt . Color Ċ Ċ /** Ċ Ġ* ĠCreated Ġon Ġ 2 0 2 0 / 1 0 / 2 7 . Ċ Ġ* Ċ Ġ* Ġ@ author ĠKevin ĠAnd res Ċ Ġ*/ Ċ @ Suppress (" Data Class Private Constructor ") Ċ data Ġclass ĠPdf Paragraph Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġlines : ĠList < Pdf Text Line >, ĊĠĠĠ Ġval Ġinter Line : ĠFloat ?, ĊĠĠĠ Ġval Ġsplit On Over draw : ĠBoolean , ĊĠĠĠ Ġoverride Ġval Ġidentifier : ĠString ?, ĊĠĠĠ Ġoverride Ġval Ġsize : ĠSize , ĊĠĠĠ Ġoverride Ġval Ġposition : ĠPosition , ĊĠĠĠ Ġoverride Ġval Ġbody Align : ĠBody Align ?, ĊĠĠĠ Ġoverride Ġval Ġpadding : ĠSp acing , ĊĠĠĠ Ġoverride Ġval Ġmargin : ĠSp acing , ĊĠĠĠ Ġoverride Ġval Ġcolor : ĠColor ?, ĊĠĠĠ Ġoverride Ġval Ġbackground : ĠBackground , ĊĠĠĠ Ġoverride Ġval Ġborders : ĠB orders , ĊĠĠĠ Ġoverride Ġval Ġis Built : ĠBoolean , Ċ ) Ġ: ĠPdf Component ( identifier , Ġposition , Ġsize , Ġbody Align , Ġpadding , Ġmargin , Ġcolor , Ġbackground , Ġborders , Ġis Built , ĠComponent TypeCode . PAR AG R APH . type ) Ġ{ ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġlines : ĠList < Pdf Text Line >, ĊĠĠĠĠĠĠĠ ĠmaxWidth : ĠSize Attr ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġinter Line : ĠFloat ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġidentifier : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġposition : ĠPosition Ġ= ĠPosition . ORIGIN , ĊĠĠĠĠĠĠĠ Ġbody Align : ĠBody Align ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġpadding : ĠSp acing Ġ= ĠSp acing . NONE , ĊĠĠĠĠĠĠĠ Ġmargin : ĠSp acing Ġ= ĠSp acing . NONE , ĊĠĠĠĠĠĠĠ Ġsplit On Over draw : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġcolor : ĠColor ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġbackground : ĠBackground Ġ= ĠBackground . NONE , ĊĠĠĠĠĠĠĠ Ġborders : ĠB orders Ġ= ĠB orders . NONE , ĊĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġlines Ġ= Ġlines , ĊĠĠĠĠĠĠĠ Ġinter Line Ġ= Ġinter Line , ĊĠĠĠĠĠĠĠ Ġsplit On Over draw Ġ= Ġsplit On Over draw , ĊĠĠĠĠĠĠĠ Ġidentifier Ġ= Ġidentifier , ĊĠĠĠĠĠĠĠ Ġsize Ġ= ĠSize ( maxWidth Ġ?: ĠSize Attr . percent ( 1 0 0 f ), ĠSize Attr . percent ( 1 0 0 f )), ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġposition , ĊĠĠĠĠĠĠĠ Ġbody Align Ġ= Ġbody Align , ĊĠĠĠĠĠĠĠ Ġpadding Ġ= Ġpadding , ĊĠĠĠĠĠĠĠ Ġmargin Ġ= Ġmargin , ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġcolor , ĊĠĠĠĠĠĠĠ Ġbackground Ġ= Ġbackground , ĊĠĠĠĠĠĠĠ Ġborders Ġ= Ġborders , ĊĠĠĠĠĠĠĠ Ġis Built Ġ= Ġfalse ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġtext : ĠString , ĊĠĠĠĠĠĠĠ ĠtextAlign : ĠBody Align ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġtext Font : ĠFont Code ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġtext FontSize : ĠFloat ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠmaxWidth : ĠSize Attr ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġinter Line : ĠFloat ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġidentifier : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġposition : ĠPosition Ġ= ĠPosition . ORIGIN , ĊĠĠĠĠĠĠĠ Ġbody Align : ĠBody Align ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġpadding : ĠSp acing Ġ= ĠSp acing . NONE , ĊĠĠĠĠĠĠĠ Ġmargin : ĠSp acing Ġ= ĠSp acing . NONE , ĊĠĠĠĠĠĠĠ Ġsplit On Over draw : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠ Ġcolor : ĠColor ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġbackground : ĠBackground Ġ= ĠBackground . NONE , ĊĠĠĠĠĠĠĠ Ġborders : ĠB orders Ġ= ĠB orders . NONE , ĊĠĠĠ Ġ) Ġ: Ġthis ( ĊĠĠĠĠĠĠĠ Ġlines Ġ= Ġtext . lines (). map Ġ{ ĠPdf Text Line ( text Ġ= Ġit , Ġbody Align Ġ= ĠtextAlign , Ġtext Font Ġ= Ġtext Font , Ġtext FontSize Ġ= Ġtext FontSize ) Ġ}, ĊĠĠĠĠĠĠĠ Ġinter Line Ġ= Ġinter Line , ĊĠĠĠĠĠĠĠ Ġsplit On Over draw Ġ= Ġsplit On Over draw , ĊĠĠĠĠĠĠĠ Ġidentifier Ġ= Ġidentifier , ĊĠĠĠĠĠĠĠ Ġsize Ġ= ĠSize ( maxWidth Ġ?: ĠSize Attr . percent ( 1 0 0 f ), ĠSize Attr . percent ( 1 0 0 f )), ĊĠĠĠĠĠĠĠ Ġposition Ġ= Ġposition , ĊĠĠĠĠĠĠĠ Ġbody Align Ġ= Ġbody Align , ĊĠĠĠĠĠĠĠ Ġpadding Ġ= Ġpadding , ĊĠĠĠĠĠĠĠ Ġmargin Ġ= Ġmargin , ĊĠĠĠĠĠĠĠ Ġcolor Ġ= Ġcolor , ĊĠĠĠĠĠĠĠ Ġbackground Ġ= Ġbackground , ĊĠĠĠĠĠĠĠ Ġborders Ġ= Ġborders , ĊĠĠĠĠĠĠĠ Ġis Built Ġ= Ġfalse ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġbuild Content ( context : ĠPdf Context , Ġrequest : ĠBox 2 d Request , Ġparent : ĠBox Size ): ĠPdf Component Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcalc Pos Ġ= ĠPosition ( calc X ( request , Ġparent ), Ġcalc Y ( request , Ġparent ), ĠPos Property . FIXED ) ĊĠĠĠĠĠĠĠ Ġval Ġcalc Width : ĠFloat Ġ= Ġcalc Width ( request , Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException ("[ Build Content ] ĠPdf TextArea Ġrequires Ġa Ġwidth Ġat Ġbuild Ġstep ") ĊĠĠĠĠĠĠĠ Ġval Ġcalc Height : ĠFloat ? Ġ= Ġcalc Height ( request , Ġparent ) ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Width : ĠFloat Ġ= Ġcalc Width Ġ- Ġpadding . spacing X () ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Height : ĠFloat ? Ġ= Ġif Ġ( calc Height Ġ!= Ġnull ) Ġcalc Height Ġ- Ġpadding . spacing Y () Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġ/** ĠSPL IT Ġlines Ġwith Ġover - width Ġ**/ ĊĠĠĠĠĠĠĠ Ġval Ġfinal Lines : ĠMutable List < Pdf Text Line > Ġ= Ġmutable ListOf () ĊĊĠĠĠĠĠĠĠ Ġlines . forEach Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . getText Width ( context ). big ger ( container Width )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Lines Ġ= Ġsplit Word In Lines ( line , Ġcontainer Width , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Lines . addAll ( new Lines ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinal Lines . add ( line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCAL C UL ATE Ġposition Ġfor Ġeach Ġline Ġ**/ ĊĠĠĠĠĠĠĠ Ġval Ġcalc Elements : ĠMutable List < Pdf Text Line > Ġ= Ġarray ListOf () ĊĠĠĠĠĠĠĠ Ġvar Ġcursor Y Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġfinal Lines . forEach Indexed Ġ{ Ġindex , Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinter line Ġ= Ġget Inter Line ( line , Ġindex Ġ== Ġfinal Lines . size Ġ- Ġ 1 , Ġcontext . properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcursor X Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitems Ġ= Ġline . items . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġitem Ġ= Ġit . build ( context , ĠBox 2 d Request ( x Ġ= Ġcursor X , Ġy Ġ= Ġcursor Y ), ĠBox Size ( container Width , Ġcontainer Height , Ġtype )) Ġas ĠPdf Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor X Ġ+= Ġitem . width () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Line Ġ= ĠPdf Text Line . of ( items ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcalc Elements . add ( new Line ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Y Ġ+= Ġnew Line . height () Ġ+ Ġinter line ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠmaxHeight Ġ= Ġcalc Height Ġ?: Ġcursor Y Ġ+ Ġpadding . spacing Y () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( lines Ġ= Ġcalc Elements , Ġposition Ġ= Ġcalc Pos , Ġsize Ġ= ĠSize ( calc Width , ĠmaxHeight ), Ġis Built Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcalc MaxSize ( context : ĠPdf Context , Ġparent : ĠBox Size ): ĠSize Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcalc Width : ĠFloat Ġ= Ġcalc Width ( null , Ġparent ) !! ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Width Ġ= Ġcalc Width Ġ- Ġpadding . spacing X () ĊĊĠĠĠĠĠĠĠ Ġvar ĠmaxHeight Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠ Ġlines . forEach Indexed Ġ{ Ġindex , Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . getText Width ( context ). big ger ( container Width )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Lines Ġ= Ġsplit Word In Lines ( line , Ġcontainer Width , Ġcontext ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Lines . forEach Indexed Ġ{ Ġnew Index , Ġnew Line Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxHeight Ġ+= Ġnew Line . getText Height ( context ) Ġ+ Ġget Inter Line ( new Line , Ġindex Ġ== Ġlines . size Ġ- Ġ 1 Ġ&& Ġnew Index Ġ== Ġnew Lines . size Ġ- Ġ 1 , Ġcontext . properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmaxHeight Ġ+= Ġline . getText Height ( context ) Ġ+ Ġget Inter Line ( line , Ġindex Ġ== Ġlines . size Ġ- Ġ 1 , Ġcontext . properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠSize Result ( container Width Ġ+ Ġpadding . spacing X () Ġ+ Ġmargin . spacing X (), ĠmaxHeight Ġ+ Ġpadding . spacing Y () Ġ+ Ġmargin . spacing Y ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsplit Character From Word In Lines ( word : ĠString , Ġfont : ĠFont , ĠfontSize : ĠFloat , Ġinitial Cursor : ĠFloat , Ġcontainer Width : ĠFloat ): ĠList < Pdf Text > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnew Lines : ĠMutable List < String > Ġ= Ġmutable ListOf ("") ĊĠĠĠĠĠĠĠ Ġval Ġcharacters Ġ= Ġword . chunk ed ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcursor Ġ= Ġinitial Cursor ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġcharacters . forEach Ġ{ Ġcharacter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= ĠFont Utils . getText Width ( character , Ġfont . font , ĠfontSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( cursor Ġ+ Ġwidth ). big ger ( container Width )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Lines . add ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Lines [ index ] Ġ+= Ġcharacter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ+= Ġwidth ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew Lines . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPdf Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġit , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfont Ġ= Ġfont . code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontSize Ġ= ĠfontSize ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsplit Word In Lines ( line : ĠPdf Text Line , Ġcontainer Width : ĠFloat , Ġcontext : ĠPdf Context ): ĠList < Pdf Text Line > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Lines : ĠMutable List < Pdf Text Line > Ġ= Ġmutable ListOf ( Pdf Text Line . EMPTY ) ĊĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġcursor Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠ Ġline . items . forEach Ġ{ Ġtext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Width Ġ= Ġtext . getText Width ( context ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( cursor Ġ+ Ġtext Width ). smaller ( container Width )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Lines . add Text ( index , Ġtext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ+= Ġtext Width ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfont Ġ= Ġtext . getFont ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfontSize Ġ= Ġtext . get FontSize ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwords Ġ= Ġtext . text . split ( Regex Util . build Split With Delim (" Ġ", Ġ",", Ġ"; ", Ġ".", Ġ" :", Ġ" )", Ġ" ]", Ġ" }", Ġ"\" ", Ġ"' ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwords . forEach Ġ{ Ġword Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġword Width Ġ= ĠFont Utils . getText Width ( word , Ġfont . font , ĠfontSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( word Width . big ger ( container Width ) Ġ|| Ġword . has C JK ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsplit Character From Word In Lines ( word , Ġfont , ĠfontSize , Ġcursor , Ġcontainer Width ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Ġ= Ġresult . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġresult . last () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Lines . add Text ( index , Ġfirst ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines ToAdd Ġ= Ġresult . sub List ( 1 , Ġresult . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lines ToAdd . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Lines . addAll ( lines ToAdd . map Ġ{ ĠPdf Text Line ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= Ġlines ToAdd . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= ĠFont Utils . getText Width ( last . text , Ġfont . font , ĠfontSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ+= ĠFont Utils . getText Width ( first . text , Ġfont . font , ĠfontSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( cursor Ġ+ Ġword Width ). eq Or Big ger ( container Width )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Lines . add ( Pdf Text Line . EMPTY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Lines . add Text ( index , ĠPdf Text ( text Ġ= Ġword , Ġfont Ġ= Ġfont . code , ĠfontSize Ġ= ĠfontSize )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ+= Ġword Width ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( new Lines . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Lines [ new Lines . size Ġ- Ġ 1 ] Ġ= Ġnew Lines [ new Lines . size Ġ- Ġ 1 ]. copy ( inter Line Ġ= Ġline . inter Line ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnew Lines ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġpre Render Content ( context : ĠPdf Context , Ġbody : ĠBox 2 d ): ĠPdf Over draw Result Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠTry Ġrender Ġelements Ġ**/ ĊĠĠĠĠĠĠĠ Ġvar Ġover draw Index : ĠInt ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġdraw Row @ Ġfor Ġ( i Ġin Ġlines . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lines [ i ]. has Over draw Y ( body , Ġcontext . view Body )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġover draw Index Ġ= Ġif Ġ( split On Over draw ) Ġi Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak @ draw Row ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠBuild ĠList Ġof Ġover draw Ġelements Ġ**/ ĊĠĠĠĠĠĠĠ Ġif Ġ( over draw Index Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġover draw Text Ġ= Ġlines . sub List ( over draw Index , Ġlines . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcursor Y Ġ= Ġ 0 f ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalc Over draw Elements Ġ= Ġover draw Text . map Indexed Ġ{ Ġindex , Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinter line Ġ= Ġget Inter Line ( line , Ġindex Ġ== Ġover draw Text . size Ġ- Ġ 1 , Ġcontext . properties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġline . items . map Ġ{ Ġtext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext . copy Abs ( Position ( text . position . x , Ġcursor Y ), Ġis Built Ġ= Ġtrue ) Ġas ĠPdf Text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Y Ġ+= Ġline . height () Ġ+ Ġinter line ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPdf Text Line . of ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Paragraph Ġ= Ġif Ġ( over draw Index Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . copy ( lines Ġ= Ġlines . sub List ( 0 , Ġover draw Index ), Ġsize Ġ= ĠSize ( size . width ?. v , Ġcontent Height () Ġ- Ġcursor Y )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPdf Over draw Result ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmain Ġ= Ġmain Paragraph , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġover draw Ġ= Ġthis . copy ( lines Ġ= Ġcalc Over draw Elements , Ġsize Ġ= ĠSize ( size . width ?. v , Ġcursor Y Ġ+ Ġpadding . spacing Y ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠPdf Over draw Result ( main Ġ= Ġthis ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdraw Content ( context : ĠPdf Context , Ġbody : ĠBox 2 d ): ĠList < Pdf Draw n Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdraw Lines Ġ= Ġlines . map Ġ{ Ġline Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline . items . map Ġ{ Ġit . draw ( context Ġ= Ġcontext , Ġparent Ġ= Ġbody ) Ġ}. flatten () ĊĠĠĠĠĠĠĠ Ġ}. flatten () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPdf Draw n Element ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Ġ= Ġbody . x , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Ġ= Ġbody . y , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx Abs Ġ= Ġbody . x Ġ- Ġpadding . left , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġy Abs Ġ= Ġbody . y Ġ- Ġpadding . top , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidth Ġ= Ġbody . width , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Ġ= Ġbody . height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġidentifier Ġ= Ġidentifier , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġcolor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ+ Ġdraw Lines ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Inter Line ( line : ĠPdf Text Line , Ġis Last Line : ĠBoolean , Ġproperties : ĠPdf Properties ): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinter line Ġ= Ġline . inter Line Ġ?: Ġinter Line Ġ?: Ġproperties . default Inter line ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Last Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( line . force Inter Line ) Ġinter line Ġelse Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġinter line ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Children (): ĠList < Pdf Component > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġlines . map Ġ{ Ġit . items Ġ}. flatten () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠPdf Component > Ġcopy Abs ( ĊĠĠĠĠĠĠĠ Ġposition : ĠPosition ?, ĊĠĠĠĠĠĠĠ Ġsize : ĠSize ?, ĊĠĠĠĠĠĠĠ Ġbody Align : ĠBody Align ?, ĊĠĠĠĠĠĠĠ Ġpadding : ĠSp acing ?, ĊĠĠĠĠĠĠĠ Ġmargin : ĠSp acing ?, ĊĠĠĠĠĠĠĠ Ġcolor : ĠColor ?, ĊĠĠĠĠĠĠĠ Ġfont : ĠFont Code ?, ĊĠĠĠĠĠĠĠ Ġbackground : ĠBackground ?, ĊĠĠĠĠĠĠĠ Ġborders : ĠB orders ?, ĊĠĠĠĠĠĠĠ Ġis Built : ĠBoolean , ĊĠĠĠ Ġ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition Ġ= Ġposition Ġ?: Ġthis . position , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Align Ġ= Ġbody Align Ġ?: Ġthis . body Align , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpadding Ġ= Ġpadding Ġ?: Ġthis . padding , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmargin Ġ= Ġmargin Ġ?: Ġthis . margin , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= Ġcolor Ġ?: Ġthis . color , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackground Ġ= Ġbackground Ġ?: Ġthis . background , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġborders Ġ= Ġborders Ġ?: Ġthis . b orders , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Built Ġ= Ġis Built ĊĠĠĠĠĠĠĠ Ġ) Ġas ĠT ĊĠĠĠ Ġ} Ċ } Ċ