
fr.lteconsulting.hexa.client.datatable.DynaTableCollectionManager Maven / Gradle / Ivy
The newest version!
package fr.lteconsulting.hexa.client.datatable;
import java.util.HashMap;
import java.util.HashSet;
import com.google.gwt.core.client.Scheduler;
import fr.lteconsulting.hexa.client.interfaces.IHasIntegerId;
import fr.lteconsulting.hexa.databinding.properties.Properties;
import fr.lteconsulting.hexa.databinding.properties.PropertyChangedEvent;
import fr.lteconsulting.hexa.databinding.properties.PropertyChangedHandler;
public class DynaTableCollectionManager extends TableCollectionManager
{
HashMap registrations = new HashMap<>();
public DynaTableCollectionManager( boolean withDeleteColumn )
{
super( withDeleteColumn );
}
protected void onStoredRow( T record, Row row )
{
}
protected void onForgetRow( int recordId )
{
}
protected void onForgotAllRows()
{
}
@Override
protected void storeRow( T record, Row row )
{
super.storeRow( record, row );
Object registration = Properties.register( record, "*", propertyChangeHandler );
registrations.put( record.getId(), registration );
onStoredRow( record, row );
}
@Override
protected void forgetRow( int recordId )
{
onForgetRow( recordId );
Object registration = registrations.remove( recordId );
Properties.removeHandler( registration );
super.forgetRow( recordId );
}
@Override
protected void forgetAllRows()
{
onForgotAllRows();
for( Object registration : registrations.values() )
Properties.removeHandler( registration );
registrations.clear();
super.forgetAllRows();
}
private PropertyChangedHandler propertyChangeHandler = new PropertyChangedHandler()
{
@Override
public void onPropertyChanged( PropertyChangedEvent event )
{
@SuppressWarnings( "unchecked" )
T record = (T) event.getSender();
scheduleChange( record );
}
};
private boolean scheduled = false;
private HashSet scheduledUpdates = new HashSet<>();
private void scheduleChange( T record )
{
boolean isNew = scheduledUpdates.add( record );
if( ! isNew )
return;
if( scheduled )
return;
scheduled = true;
Scheduler.get().scheduleDeferred( updateRecordsCommand );
}
private Scheduler.ScheduledCommand updateRecordsCommand = new Scheduler.ScheduledCommand()
{
@Override
public void execute()
{
for( T record : scheduledUpdates )
{
// do we really still listen to that element ? Or is it a late scheduled event ?
if( registrations.containsKey( record.getId() ) )
getDataPlug().updated( record );
}
scheduledUpdates.clear();
scheduled = false;
}
};
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy