package Ġcom . jak ew h art on . pic nic Ċ Ċ data Ġclass ĠTable ( ĊĠ Ġval Ġheader : ĠHeader ? Ġ= Ġnull , ĊĠ Ġval Ġbody : ĠBody , ĊĠ Ġval Ġfooter : ĠFooter ? Ġ= Ġ Ġnull , ĊĠ Ġval Ġcell Style : ĠCell Style ? Ġ= Ġnull , ĊĠ Ġval Ġtable Style : ĠTable Style ? Ġ= Ġnull Ċ ) Ġ{ ĊĠ Ġval Ġrow Count : ĠInt Ġ= Ġ( header ?. rows ?. size Ġ?: Ġ 0 ) Ġ+ Ġbody . rows . size Ġ+ Ġ( footer ?. rows ?. size Ġ?: Ġ 0 ) ĊĠ Ġval Ġcolumn Count : ĠInt ĊĠ Ġval Ġposition ed Cells : ĠList < Position ed Cell > ĊĊĠ Ġprivate Ġval Ġcell Table : ĠList < List < Position ed Cell ? >> ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġval Ġrow Span Car ries Ġ= ĠInt Counts () ĊĠĠĠ Ġval Ġposition ed Cells Ġ= Ġmutable ListOf < Position ed Cell >() ĊĠĠĠ Ġval Ġcell Table Ġ= Ġmutable ListOf < Mutable List < Position ed Cell ? >>() ĊĠĠĠ Ġvar ĠrowIndex Ġ= Ġ 0 ĊĠĠĠ ĠlistOf NotNull ( header , Ġbody , Ġfooter ). forEach Ġ{ Ġsection Ġ-> ĊĠĠĠĠĠ Ġval Ġsection Style Ġ= Ġcell Style Ġ+ Ġsection . cell Style ĊĊĠĠĠĠĠ Ġsection . rows . forEach Ġ{ Ġrow Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġrow Style Ġ= Ġsection Style Ġ+ Ġrow . cell Style ĊĊĠĠĠĠĠĠĠ Ġval Ġcell Row Ġ= Ġmutable ListOf < Position ed Cell ?> () ĊĠĠĠĠĠĠĠ Ġcell Table Ġ+= Ġcell Row ĊĊĠĠĠĠĠĠĠ Ġvar ĠcolumnIndex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġrow . cells . forEach Indexed Ġ{ Ġraw Column Index , Ġcell Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġany Ġprevious Ġrows ' Ġcells Ġwhose Ġ> 1 Ġrow Span Ġcar ries Ġthem Ġinto Ġthis Ġrow . ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġfound , Ġadd Ġthem Ġto Ġthe Ġcurrent Ġrow , Ġpushing Ġremaining Ġcells Ġto Ġthe Ġright . ĊĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( column Index Ġ< Ġrow Span Car ries . size Ġ&& Ġrow Span Car ries [ column Index ] Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell Row Ġ+= Ġcell Table [ rowIndex Ġ- Ġ 1 ][ column Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow Span Car ries [ column Index ] -- ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcolumnIndex ++ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġcanonical Style Ġ= Ġrow Style Ġ+ Ġcell . style ĊĠĠĠĠĠĠĠĠĠ Ġval Ġposition ed Cell Ġ= ĠPosition ed Cell ( rowIndex , ĠcolumnIndex , Ġcell , Ġcanonical Style ) ĊĠĠĠĠĠĠĠĠĠ Ġposition ed Cells Ġ+= Ġposition ed Cell ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġrow Span Ġ= Ġcell . row Span ĊĠĠĠĠĠĠĠĠĠ Ġrequire ( rowIndex Ġ+ Ġrow Span Ġ<= Ġrow Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cell Ġ$ raw Column Index Ġin Ġrow Ġ$ rowIndex Ġhas Ġrow Span =$ row Span Ġbut Ġtable Ġrow Count =$ rowCount " ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġrow Span C arry Ġ= Ġrow Span Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġrepeat ( cell . column Span ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell Row Ġ+= Ġposition ed Cell ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow Span Car ries [ column Index ] Ġ= Ġrow Span C arry ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcolumnIndex ++ ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġfor Ġany Ġprevious Ġrows ' Ġcells Ġwhose Ġ> 1 Ġrow Span Ġcar ries Ġthem Ġinto Ġthis Ġrow . ĊĠĠĠĠĠĠĠ Ġ// ĠWhen Ġfound , Ġadd Ġthem Ġto Ġthe Ġcurrent Ġrow , Ġfilling Ġany Ġg aps Ġwith Ġnull . ĊĠĠĠĠĠĠĠ Ġwhile Ġ( column Index Ġ< Ġrow Span Car ries . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( row Span Car ries [ column Index ] Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell Row Ġ+= Ġcell Table [ rowIndex Ġ- Ġ 1 ][ column Index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrow Span Car ries [ column Index ] -- ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcell Row . add ( null ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠcolumnIndex ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠrowIndex ++ ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcolumn Count Ġ= Ġrow Span Car ries . size ĊĠĠĠ Ġthis . position ed Cells Ġ= Ġposition ed Cells ĊĠĠĠ Ġthis . cell Table Ġ= Ġcell Table ĊĠ Ġ} ĊĊĠ Ġfun Ġget OrNull ( row : ĠInt , Ġcolumn : ĠInt ) Ġ= Ġcell Table . get OrNull ( row )?. get OrNull ( column ) ĊĊĠ Ġoperator Ġfun Ġget ( row : ĠInt , Ġcolumn : ĠInt ) Ġ= Ġrequire NotNull ( cell Table [ row ][ column ]) Ġ{ ĊĠĠĠ Ġ" Cell Ġwas Ġnull " ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠtoString () Ġ= Ġrender Text () ĊĊĠ Ġdata Ġclass ĠPosition ed Cell ( ĊĠĠĠ Ġval ĠrowIndex : ĠInt , ĊĠĠĠ Ġval ĠcolumnIndex : ĠInt , ĊĠĠĠ Ġval Ġcell : ĠCell , ĊĠĠĠ Ġval Ġcanonical Style : ĠCell Style ? ĊĠ Ġ) Ċ } Ċ Ċ data Ġclass ĠTable Style ( ĊĠ Ġval Ġborder Style : ĠBorder Style ? Ġ= Ġnull Ċ ) Ċ Ċ enum Ġclass ĠBorder Style Ġ{ ĊĠ ĠHidden , ĠSolid Ċ } Ċ Ċ interface ĠTable Section Ġ{ ĊĠ Ġval Ġrows : ĠList < Row > ĊĠ Ġval Ġcell Style : ĠCell Style ? Ċ } Ċ Ċ data Ġclass ĠHeader ( ĊĠ Ġoverride Ġval Ġrows : ĠList < Row >, ĊĠ Ġoverride Ġval Ġcell Style : ĠCell Style ? Ġ= Ġnull Ċ ) Ġ: ĠTable Section Ċ Ċ data Ġclass ĠBody ( ĊĠ Ġoverride Ġval Ġrows : ĠList < Row >, ĊĠ Ġoverride Ġval Ġcell Style : ĠCell Style ? Ġ= Ġnull Ċ ): ĠTable Section Ċ Ċ data Ġclass ĠFooter ( ĊĠ Ġoverride Ġval Ġrows : ĠList < Row >, ĊĠ Ġoverride Ġval Ġcell Style : ĠCell Style ? Ġ= Ġnull Ċ ): ĠTable Section Ċ Ċ data Ġclass ĠRow ( val Ġcells : ĠList < Cell >, Ġval Ġcell Style : ĠCell Style ? Ġ= Ġnull ) Ċ Ċ data Ġclass ĠCell ( ĊĠ Ġval Ġcontent : ĠString , ĊĠ Ġval Ġcolumn Span : ĠInt Ġ= Ġ 1 , ĊĠ Ġval Ġrow Span : ĠInt Ġ= Ġ 1 , ĊĠ Ġval Ġstyle : ĠCell Style ? Ġ= Ġnull Ċ ) Ċ Ċ data Ġclass ĠCell Style ( ĊĠ Ġval Ġpadding Left : ĠInt ? Ġ= Ġnull , ĊĠ Ġval Ġpadding Right : ĠInt ? Ġ= Ġnull , ĊĠ Ġval Ġpadding Top : ĠInt ? Ġ= Ġnull , ĊĠ Ġval Ġpadding Bottom : ĠInt ? Ġ= Ġnull , ĊĠ Ġval Ġborder Left : ĠBoolean ? Ġ= Ġnull , ĊĠ Ġval Ġborder Right : ĠBoolean ? Ġ= Ġnull , ĊĠ Ġval Ġborder Top : ĠBoolean ? Ġ= Ġnull , ĊĠ Ġval Ġborder Bottom : ĠBoolean ? Ġ= Ġnull , ĊĠ Ġval Ġalignment : ĠText Alignment ? Ġ= Ġnull Ċ ) Ċ Ċ private Ġoperator Ġfun ĠCell Style ?. plus ( override : ĠCell Style ?): ĠCell Style ? Ġ{ ĊĠ Ġif Ġ( this Ġ== Ġnull ) Ġ{ ĊĠĠĠ Ġreturn Ġoverride ĊĠ Ġ} ĊĠ Ġif Ġ( override Ġ== Ġnull ) Ġ{ ĊĠĠĠ Ġreturn Ġthis ĊĠ Ġ} ĊĠ Ġreturn ĠCell Style ( ĊĠĠĠĠĠ Ġpadding Left Ġ= Ġoverride . padding Left Ġ?: Ġpadding Left , ĊĠĠĠĠĠ Ġpadding Right Ġ= Ġoverride . padding Right Ġ?: Ġpadding Right , ĊĠĠĠĠĠ Ġpadding Top Ġ= Ġoverride . padding Top Ġ?: Ġpadding Top , ĊĠĠĠĠĠ Ġpadding Bottom Ġ= Ġoverride . padding Bottom Ġ?: Ġpadding Bottom , ĊĠĠĠĠĠ Ġborder Left Ġ= Ġoverride . border Left Ġ?: Ġborder Left , ĊĠĠĠĠĠ Ġborder Right Ġ= Ġoverride . border Right Ġ?: Ġborder Right , ĊĠĠĠĠĠ Ġborder Top Ġ= Ġoverride . border Top Ġ?: Ġborder Top , ĊĠĠĠĠĠ Ġborder Bottom Ġ= Ġoverride . border Bottom Ġ?: Ġborder Bottom , ĊĠĠĠĠĠ Ġalignment Ġ= Ġoverride . alignment Ġ?: Ġalignment ĊĠ Ġ) Ċ } Ċ Ċ enum Ġclass ĠText Alignment Ġ{ ĊĠ ĠTop Left , ĠTop Center , ĠTop Right , ĊĠ ĠMiddle Left , ĠMiddle Center , ĠMiddle Right , ĊĠ ĠBottom Left , ĠBottom Center , ĠBottom Right Ċ } Ċ