All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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