package fr.lteconsulting.hexa.client.form.fieldtypes;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map.Entry;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.json.client.JSONNumber;
import com.google.gwt.json.client.JSONValue;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.Widget;
import fr.lteconsulting.hexa.client.tools.HTMLStream;
public class ChoiceFieldType extends FieldTypeBase
{
static class Pair
{
int id;
String text;
Pair( int id, String text )
{
this.id = id;
this.text = text;
}
}
ArrayList<Pair> items = new ArrayList<Pair>();
boolean fSelectFirstByDefault;
public ChoiceFieldType()
{
this( true );
}
public ChoiceFieldType( boolean fSelectFirstByDefault )
{
this.fSelectFirstByDefault = fSelectFirstByDefault;
}
public void addItem( int id, String text )
{
items.add( new Pair( id, text ) );
}
@Override
protected void installRealHandler( Widget widget )
{
((NestWidget) widget).installRealHandler();
}
class NestWidget extends Composite
{
String groupName = "RBGRP_" + DOM.createUniqueId();
HTMLStream stream = new HTMLStream();
HashMap<Integer, RadioButton> radios = new HashMap<Integer, RadioButton>();
NestWidget()
{
boolean fFirst = true;
for( Pair item : items )
{
RadioButton radio = new RadioButton( groupName, item.text );
stream.addDown( radio );
radios.put( item.id, radio );
if( fFirst && fSelectFirstByDefault )
{
fFirst = false;
radio.setValue( true );
}
}
initWidget( stream );
}
void installRealHandler()
{
ValueChangeHandler<Boolean> changeHandler = new ValueChangeHandler<Boolean>()
{
@Override
public void onValueChange( ValueChangeEvent<Boolean> event )
{
if( event.getValue() )
signalChange( NestWidget.this );
}
};
for( RadioButton radio : radios.values() )
radio.addValueChangeHandler( changeHandler );
}
void setSelected( int id )
{
RadioButton radio = radios.get( id );
if( radio == null )
return;
radio.setValue( true );
}
int getSelected()
{
for( Entry<Integer, RadioButton> e : radios.entrySet() )
{
if( e.getValue().getValue() )
return e.getKey();
}
return -1;
}
}
@Override
public Widget getWidget()
{
return new NestWidget();
}
@Override
public void setValue( Widget widget, JSONValue value )
{
((NestWidget) widget).setSelected( (int) value.isNumber().doubleValue() );
}
@Override
public JSONValue getValue( Widget widget )
{
int selected = ((NestWidget) widget).getSelected();
if( selected == -1 )
return null;
return new JSONNumber( selected );
}
}