package fr.lteconsulting.hexa.client.ui.tools;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.CheckBox;
import fr.lteconsulting.hexa.client.interfaces.IHasIntegerId;
import fr.lteconsulting.hexa.client.tools.DoubleMap;
import fr.lteconsulting.hexa.client.ui.miracle.Printer;
public abstract class SelectionColumnMng<T extends IHasIntegerId> extends ROColumnMng<T>
{
final DoubleMap<Integer, CheckBox> checkBoxes = new DoubleMap<>();
final Set<Integer> selected = new HashSet<>();
protected abstract boolean isDisplayed( int recordId );
public SelectionColumnMng( String title )
{
super( title );
}
public List<Integer> getSelectedRecords()
{
List<Integer> set = new ArrayList<>();
for( int recordId : selected )
if( isDisplayed( recordId ) )
set.add( recordId );
return set;
}
@Override
public void fillCell( Printer printer, T record )
{
CheckBox cb = getCheckBoxForRecord( record );
cb.setValue( selected.contains( record.getId() ), false );
printer.setWidget( cb );
}
private CheckBox getCheckBoxForRecord( T record )
{
CheckBox cb = checkBoxes.get( record.getId() );
if( cb == null )
{
cb = new CheckBox();
checkBoxes.put( record.getId(), cb );
cb.addValueChangeHandler( valueChangeHandler );
}
return cb;
}
private ValueChangeHandler<Boolean> valueChangeHandler = new ValueChangeHandler<Boolean>()
{
@Override
public void onValueChange( ValueChangeEvent<Boolean> event )
{
int recordId = checkBoxes.getReverse( (CheckBox) event.getSource() );
boolean isSelected = ((CheckBox) event.getSource()).getValue();
if( isSelected )
selected.add( recordId );
else
selected.remove( recordId );
}
};
}