package org.ovirt.engine.ui.common.widget.uicommon.popup.console;
import org.ovirt.engine.ui.common.widget.editor.BaseEntityModelCheckbox;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
/**
* A checkbox connected to the model which renders it's value using a renderer (similar to the ValueLabel)
*
* @param <T>
* the model type to edit
*/
public class EntityModelValueCheckbox<T> extends BaseEntityModelCheckbox<T> {
private final ValueCheckboxRenderer<T> renderer;
private T value;
public EntityModelValueCheckbox(ValueCheckboxRenderer<T> renderer) {
this.renderer = renderer;
}
@Override
public void setValue(T value) {
this.value = value;
asCheckBox().setValue(renderer.render(value));
}
@Override
public T getValue() {
return renderer.read(asCheckBox().getValue(), value);
}
public interface ValueCheckboxRenderer<T> {
boolean render(T value);
T read(boolean value, T model);
}
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public HandlerRegistration addValueChangeHandler(ValueChangeHandler handler) {
return asCheckBox().addValueChangeHandler(new ValueChangeHandlerDecorator(handler));
}
/**
* Intercept the onValueChange on the checkbox and fire an event which's value will not be a boolean but a type T
* calculated using the renderer.
*/
class ValueChangeHandlerDecorator implements ValueChangeHandler<Boolean> {
private ValueChangeHandler<T> originalHandler;
public ValueChangeHandlerDecorator(ValueChangeHandler<T> originalHandler) {
this.originalHandler = originalHandler;
}
@Override
public void onValueChange(ValueChangeEvent<Boolean> event) {
originalHandler.onValueChange(new AccessibleValueChangeEvent(renderer.read(event.getValue(), value)));
}
class AccessibleValueChangeEvent extends ValueChangeEvent<T> {
protected AccessibleValueChangeEvent(T value) {
super(value);
}
}
}
}