package fr.lteconsulting.hexa.databinding.gwt.propertyadapters;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
import com.google.gwt.view.client.SingleSelectionModel;
import fr.lteconsulting.hexa.client.tools.Action2;
import fr.lteconsulting.hexa.databinding.propertyadapters.PropertyAdapter;
/**
* A PropertAdapter to bind a {@link SingleSelectionModel}.<br/>
*
* - When receiving an object, the adapter will set it as the selected object.<br/>
* - When the selected item changes, the binding system gets triggered.
*
* @author Arnaud
*/
public class SelectionModelAdapter<T> implements PropertyAdapter
{
private SingleSelectionModel<T> model;
/**
* Uses the given {@link SingleSelectionModel} and acts as a binding property.
* Used to bind the model's selected value to another value.
*/
public SelectionModelAdapter(SingleSelectionModel<T> selectionModel) {
this.model = selectionModel;
}
@Override
@SuppressWarnings("unchecked")
public void setValue(Object object) {
model.clear();
model.setSelected((T)object, true);
}
@Override
public void removePropertyChangedHandler(Object handlerRegistration) {
((HandlerRegistration)handlerRegistration).removeHandler();
}
@Override
public Object registerPropertyChanged(final Action2<PropertyAdapter, Object> callback, final Object cookie) {
return model.addSelectionChangeHandler(new Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
callback.exec(SelectionModelAdapter.this, cookie);
}
});
}
@Override
public Object getValue() {
return model.getSelectedObject();
}
}