package fr.lteconsulting.hexa.client.ui.tools;
import static fr.lteconsulting.hexa.classinfo.ClassInfo.Clazz;
import com.google.gwt.event.logical.shared.HasValueChangeHandlers;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.event.shared.GwtEvent;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.event.shared.SimpleEventBus;
import fr.lteconsulting.hexa.classinfo.Clazz;
import fr.lteconsulting.hexa.client.ui.miracle.Printer;
import fr.lteconsulting.hexa.client.ui.widget.TextEditor;
import fr.lteconsulting.hexa.databinding.TypedConverter;
import fr.lteconsulting.hexa.databinding.properties.Properties;
public class AutoTextColumn<T> implements IColumn<T>, HasValueChangeHandlers<T>
{
TypedConverter<Object, String> displayConverter;
String title;
Clazz<T> dtoClazz;
String fieldName;
SimpleEventBus eventBus;
public AutoTextColumn( Class<T> dtoClass, String fieldName )
{
this( dtoClass, fieldName, fieldName, null );
}
public AutoTextColumn( Class<T> dtoClass, String fieldName, TypedConverter<Object, String> displayConverter )
{
this( dtoClass, fieldName, fieldName, displayConverter );
}
public AutoTextColumn( Class<T> dtoClass, String fieldName, String title, TypedConverter<Object, String> displayConverter )
{
this.title = title;
this.fieldName = fieldName;
dtoClazz = Clazz( dtoClass );
if( ! Properties.hasSomethingToGetField( dtoClazz, fieldName ) )
throw new RuntimeException( "Cannot handle property " + fieldName + " of class " + dtoClass.getSimpleName() );
if( displayConverter != null )
this.displayConverter = displayConverter;
else
this.displayConverter = createDefaultDisplayConverter();
}
private TypedConverter<Object, String> createDefaultDisplayConverter()
{
Class<?> propertyType = Properties.getPropertyType( dtoClazz, fieldName );
if( propertyType == String.class )
{
return new TypedConverter<Object, String>()
{
@Override
public Object convertBack( String value )
{
return value;
}
@Override
public String convert( Object value )
{
return value == null ? "" : value.toString();
}
};
}
else if( propertyType == Integer.class || propertyType == int.class )
{
return new TypedConverter<Object, String>()
{
@Override
public Object convertBack( String value )
{
return Integer.parseInt( value );
}
@Override
public String convert( Object value )
{
return value == null ? "" : value.toString();
}
};
}
else
{
return new TypedConverter<Object, String>()
{
@Override
public Object convertBack( String value )
{
return value;
}
@Override
public String convert( Object value )
{
return value != null ? value.toString() : "";
}
};
}
}
@Override
public String getTitle()
{
return title;
}
@Override
public void fillCell( Printer printer, T record )
{
printer.setText( getValue( record ) );
}
private String getValue( T record )
{
Object value = Properties.getValue( record, fieldName );
String display = displayConverter.convert( value );
return display;
}
@Override
public IEditor editCell( final T record )
{
TextEditor editor = new TextEditor( getValue( record ), true, false )
{
@Override
protected void onValidate( String newValue )
{
Object realValue = displayConverter.convertBack( newValue );
Properties.setValue( record, fieldName, realValue );
getEditorHost().finishedEdition();
ValueChangeEvent.fire( AutoTextColumn.this, record );
}
};
return editor;
}
private EventBus getEventBus()
{
if( eventBus == null )
eventBus = new SimpleEventBus();
return eventBus;
}
@Override
public void fireEvent( GwtEvent<?> event )
{
getEventBus().fireEvent( event );
}
@Override
public HandlerRegistration addValueChangeHandler( ValueChangeHandler<T> handler )
{
return getEventBus().addHandler( ValueChangeEvent.getType(), handler );
}
}