package Ġio . github . k sh ash ov . vaadin compose . widget . components Ċ Ċ import Ġcom . vaadin . flow . component . Component Ċ import Ġcom . vaadin . flow . component . grid . Grid Ċ import Ġcom . vaadin . flow . shared . Registration Ċ import Ġio . github . k sh ash ov . vaadin compose . widget .* Ċ import Ġjava . util .* Ċ import Ġjava . util . stream . Collectors Ċ Ċ open Ġclass ĠDataTable < T >( ĊĠĠĠ Ġitems : ĠCollection < T >, ĊĠĠĠ Ġcolumns : ĠCollection < TableColumn < T >>, ĊĠĠĠ Ġon Selection : Ġ(( Set < T >) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ Ġkey : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġheight : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġwidth : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġid : ĠString Ġ= Ġ"", ĊĠĠĠ Ġclasses : ĠCollection < String > Ġ= ĠlistOf (), ĊĠĠĠ ĠalignItems : ĠString ? Ġ= Ġnull , ĊĠĠĠ ĠjustifyContent : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġpost Process : Ġ( Grid < T >. () Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ: ĠBase DataTable < T , ĠGrid < T >>( ĊĠĠĠ Ġitems , ĊĠĠĠ Ġcolumns , ĊĠĠĠ Ġon Selection , ĊĠĠĠ Ġkey , ĊĠĠĠ Ġheight , ĊĠĠĠ Ġwidth , ĊĠĠĠ Ġid , ĊĠĠĠ Ġclasses , ĊĠĠĠ ĠalignItems , ĊĠĠĠ ĠjustifyContent , ĊĠĠĠ Ġpost Process Ċ ) Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠcreateElement (): ĠElement < DataTable < T >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGrid Render Element ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠGrid Render Element < T >( widget : ĠDataTable < T >) Ġ: ĊĠĠĠĠĠĠĠ ĠBase Grid Render Element < T , ĠGrid < T >, ĠDataTable < T >>( widget ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Component (): ĠGrid < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠGrid () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ abstract Ġclass ĠBase DataTable < T , ĠCOMPONENT Ġ: ĠGrid < T >>( ĊĠĠĠ Ġval Ġitems : ĠCollection < T >, ĊĠĠĠ Ġval Ġcolumns : ĠCollection < TableColumn < T >>, ĊĠĠĠ Ġval Ġon Selection : Ġ(( Set < T >) Ġ-> ĠUnit )? Ġ= Ġnull , ĊĠĠĠ Ġkey : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġheight : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġwidth : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġid : ĠString Ġ= Ġ"", ĊĠĠĠ Ġclasses : ĠCollection < String > Ġ= ĠlistOf (), ĊĠĠĠ ĠalignItems : ĠString ? Ġ= Ġnull , ĊĠĠĠ ĠjustifyContent : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġpost Process : Ġ( COMPONENT . () Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ: ĠRender Widget < COMPONENT >( key , Ġheight , Ġwidth , Ġid , Ġclasses , ĠalignItems , ĠjustifyContent , Ġpost Process ) Ġ{ ĊĠĠĠ Ġinternal Ġabstract Ġclass ĠBase Grid Render Element < T , ĠCOMPONENT Ġ: ĠGrid < T >, ĠW ID GET Ġ: ĠBase DataTable < T , ĠCOMPONENT >>( widget : ĠW ID GET ) Ġ: ĊĠĠĠĠĠĠĠ ĠRender Element < WIDGET , ĠCOMPONENT >( widget ), ĠHas Child s Element Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcache : ĠMutable Map < String , ĠElement <* >> Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġactual Keys : ĠMutable Map < T , ĠString > Ġ= ĠHashMap () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġreg : ĠRegistration ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Elements Cache () Ġ= Ġcache ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrefresh Component () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . refresh Component () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPrepare Ġcache Ġand Ġactual Ġcase Ġaccording Ġto Ġnew Ġitems ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( widget Property Is Changed Ġ{ Ġit . items Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Keys . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Keys . put All ( create Actual Keys ( widget . items )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Obsolete Cache ( actual Keys . values . to HashSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRefresh Ġcolumns ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( widget Property Is Changed Ġ{ Ġit . columns Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent . removeAll Columns () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwidget . columns . forEach Ġ{ Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn : ĠGrid . Column < T > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . renderer Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Ġ= Ġadd Column ( info ) Ġ{ Ġinfo . renderer . invoke ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( info . builder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuilder Index Ġ= Ġindex ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Ġ= Ġadd Component Column ( info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġactual Keys [ it ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcell Element Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Context Child ( context , Ġ" v - compose - grid $ builder Index $ key ", Ġinfo . builder . invoke ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcell Element . rendered Component . element . remove From Parent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ addComponent Column Ġcell Element . rendered Component ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . header Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn . setHeader ( info . header ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn . is Sortable Ġ= Ġinfo . sortable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn . is Resizable Ġ= Ġinfo . resizable ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . post Process ?. invoke ( column ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreg ?. remove () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( widget Property Is Changed Ġ{ Ġit . items Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRefresh Ġitems ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Ġ= Ġcomponent . selected Items ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Grid Items ( widget . items ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRestore Ġselection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected . forEach Ġ{ Ġcomponent . select ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRefresh Ġselection Ġlistener ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġon Selection Ġ= Ġwidget . on Selection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( on Selection Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreg Ġ= Ġcomponent . add Selection Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Selection . invoke ( it . all Selected Items ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġopen Ġfun Ġadd Column ( info : ĠTable Column < T >, Ġprovider : Ġ( row : ĠT ) Ġ-> ĠString ): ĠGrid . Column < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomponent . addColumn ( provider ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġopen Ġfun Ġadd Component Column ( info : ĠTable Column < T >, Ġprovider : Ġ( row : ĠT ) Ġ-> ĠComponent ): ĠGrid . Column < T > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcomponent . addComponent Column ( provider ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġopen Ġfun Ġcreate Actual Keys ( items : ĠCollection < T >): ĠMap < T , ĠString > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġitems . stream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. collect ( Collectors . toMap ({ Ġit Ġ}, Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actual Keys . containsKey ( it )) Ġactual Keys [ it ] !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ" v - compose - grid -" Ġ+ ĠUUID . randomUUID (). toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ})) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprotected Ġopen Ġfun Ġset Grid Items ( items : ĠCollection < T >) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent . set Items ( items ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ open Ġclass ĠColumn Info < T >( ĊĠĠĠ Ġval Ġheader : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġsortable : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġval Ġres izable : ĠBoolean Ġ= Ġtrue Ċ ) Ċ Ċ open Ġclass ĠTable Column < T >( ĊĠĠĠ Ġheader : ĠString ? Ġ= Ġnull , ĊĠĠĠ Ġsortable : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġres izable : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġval Ġrenderer : Ġ(( T ) Ġ-> ĠString )? Ġ= Ġnull , ĊĠĠĠ Ġval Ġbuilder : Ġ(( T ) Ġ-> ĠWidget )? Ġ= Ġnull , ĊĠĠĠ Ġval Ġpost Process : Ġ(( Grid . Column < T >) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ: ĠColumn Info < T >( header , Ġsortable , Ġres izable ) Ċ