package com.eas.bound;
import com.eas.client.converters.BooleanValueConverter;
import com.eas.core.Utils;
import com.eas.ui.events.ActionEvent;
import com.eas.ui.events.ActionHandler;
import com.eas.ui.events.HasActionHandlers;
import com.eas.widgets.boxes.NullableCheckBox;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.CheckBox;
public class ModelCheck extends ModelDecoratorBox<Boolean> implements HasActionHandlers {
public ModelCheck() {
super(new NullableCheckBox());
setStyleName("decorator-check");
}
protected int actionHandlers;
protected HandlerRegistration clickReg;
@Override
public HandlerRegistration addActionHandler(ActionHandler handler) {
final HandlerRegistration superReg = super.addHandler(handler, ActionEvent.getType());
if (actionHandlers == 0) {
clickReg = ((CheckBox) decorated).addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
event.stopPropagation();
ActionEvent.fire(ModelCheck.this, ModelCheck.this);
}
});
}
actionHandlers++;
return new HandlerRegistration() {
@Override
public void removeHandler() {
superReg.removeHandler();
actionHandlers--;
if (actionHandlers == 0) {
assert clickReg != null : "Erroneous use of addActionHandler/removeHandler detected in ModelCheck";
clickReg.removeHandler();
clickReg = null;
}
}
};
}
@Override
public void setPublished(JavaScriptObject aValue) {
super.setPublished(aValue);
if (published != null) {
publish(this, published);
}
}
private static native void publish(ModelCheck aField, JavaScriptObject aPublished)/*-{
var B = @com.eas.core.Predefine::boxing;
aPublished.redraw = function(){
aField.@com.eas.bound.ModelCheck::rebind()();
};
Object.defineProperty(aPublished, "text", {
get : function() {
return aField.@com.eas.bound.ModelCheck::getText()();
},
set : function(aValue) {
if (aValue != null)
aField.@com.eas.bound.ModelCheck::setText(Ljava/lang/String;)('' + aValue);
else
aField.@com.eas.bound.ModelCheck::setText(Ljava/lang/String;)(null);
}
});
Object.defineProperty(aPublished, "value", {
get : function() {
var javaValue = aField.@com.eas.bound.ModelCheck::getValue()();
if (javaValue == null)
return null;
else
return javaValue.@java.lang.Boolean::booleanValue()();
},
set : function(aValue) {
if (aValue != null) {
var javaValue = B.boxAsJava((false != aValue));
aField.@com.eas.bound.ModelCheck::setValue(Ljava/lang/Boolean;Z)(javaValue, true);
} else {
aField.@com.eas.bound.ModelCheck::setValue(Ljava/lang/Boolean;Z)(null, true);
}
}
});
}-*/;
@Override
public String getText() {
return ((NullableCheckBox) decorated).getText();
}
@Override
public void setText(String aText) {
((NullableCheckBox) decorated).setText(aText);
}
@Override
public Boolean convert(Object aValue) {
BooleanValueConverter c = new BooleanValueConverter();
return c.convert(aValue);
}
@Override
public Boolean getValue() {
return super.getValue();
}
@Override
public void setValue(Boolean value, boolean fireEvents) {
super.setValue(value, fireEvents);
}
@Override
protected void clearValue() {
super.clearValue();
ActionEvent.fire(this, this);
}
@Override
public Object getJsValue() {
return Utils.toJs(getValue());
}
@Override
public void setJsValue(Object aValue) throws Exception {
Object javaValue = Utils.toJava(aValue);
setValue(convert(javaValue), true);
}
@Override
protected void setReadonly(boolean aValue) {
}
@Override
protected boolean isReadonly() {
return false;
}
}