package com.eas.bound;
import com.eas.client.converters.DoubleValueConverter;
import com.eas.core.Utils;
import com.eas.ui.HasEmptyText;
import com.eas.ui.events.ActionEvent;
import com.eas.ui.events.ActionHandler;
import com.eas.ui.events.HasActionHandlers;
import com.eas.widgets.ConstraintedSpinnerBox;
import com.eas.widgets.WidgetsUtils;
import com.eas.widgets.boxes.ExplicitDoubleBox;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.HasText;
public class ModelSpin extends ModelDecoratorBox<Double> implements HasEmptyText, HasActionHandlers {
protected String emptyText;
public ModelSpin() {
super(new ConstraintedSpinnerBox(new ExplicitDoubleBox()));
}
protected int actionHandlers;
protected HandlerRegistration valueChangeReg;
@Override
public HandlerRegistration addActionHandler(ActionHandler handler) {
final HandlerRegistration superReg = super.addHandler(handler, ActionEvent.getType());
if (actionHandlers == 0) {
valueChangeReg = addValueChangeHandler(new ValueChangeHandler<Double>() {
@Override
public void onValueChange(ValueChangeEvent<Double> event) {
if (!settingValue)
ActionEvent.fire(ModelSpin.this, ModelSpin.this);
}
});
}
actionHandlers++;
return new HandlerRegistration() {
@Override
public void removeHandler() {
superReg.removeHandler();
actionHandlers--;
if (actionHandlers == 0) {
assert valueChangeReg != null : "Erroneous use of addActionHandler/removeHandler detected in ModelSpin";
valueChangeReg.removeHandler();
valueChangeReg = null;
}
}
};
}
@Override
public String getEmptyText() {
return emptyText;
}
@Override
public void setEmptyText(String aValue) {
emptyText = aValue;
WidgetsUtils.applyEmptyText(getElement(), emptyText);
}
@Override
public String getText() {
return ((HasText) decorated).getText();
}
public void setText(String aValue) {
((HasText) decorated).setText(aValue);
}
@Override
public Double convert(Object aValue) {
DoubleValueConverter c = new DoubleValueConverter();
return c.convert(aValue);
}
public void setPublished(JavaScriptObject aValue) {
super.setPublished(aValue);
if (published != null) {
publish(this, published);
}
}
private native static void publish(ModelSpin aWidget, JavaScriptObject aPublished)/*-{
aPublished.redraw = function(){
aWidget.@com.eas.bound.ModelSpin::rebind()();
};
Object.defineProperty(aPublished, "emptyText", {
get : function() {
return aWidget.@com.eas.ui.HasEmptyText::getEmptyText()();
},
set : function(aValue) {
aWidget.@com.eas.ui.HasEmptyText::setEmptyText(Ljava/lang/String;)(aValue != null ? '' + aValue : null);
}
});
Object.defineProperty(aPublished, "value", {
get : function() {
var v = aWidget.@com.eas.bound.ModelSpin::getValue()();
if (v != null) {
return v.@java.lang.Number::doubleValue()();
} else
return null;
},
set : function(aValue) {
if (aValue != null) {
var v = aValue * 1;
var d = @java.lang.Double::new(D)(v);
aWidget.@com.eas.bound.ModelSpin::setValue(Ljava/lang/Double;Z)(d, true);
} else {
aWidget.@com.eas.bound.ModelSpin::setValue(Ljava/lang/Double;Z)(null, true);
}
}
});
Object.defineProperty(aPublished, "text", {
get : function() {
return aWidget.@com.eas.bound.ModelSpin::getText()();
},
set : function(aValue) {
aWidget.@com.eas.bound.ModelSpin::setText(Ljava/lang/String;)(aValue != null ? aValue + '' : '');
}
});
Object.defineProperty(aPublished, "min", {
get : function() {
var v = aWidget.@com.eas.bound.ModelSpin::getMin()();
if (v != null) {
return v.@java.lang.Number::doubleValue()();
} else
return null;
},
set : function(aValue) {
if (aValue != null) {
var v = aValue * 1;
var d = @java.lang.Double::new(D)(v);
aWidget.@com.eas.bound.ModelSpin::setMin(Ljava/lang/Double;)(d);
} else {
aWidget.@com.eas.bound.ModelSpin::setMin(Ljava/lang/Double;)(null);
}
}
});
Object.defineProperty(aPublished, "max", {
get : function() {
var v = aWidget.@com.eas.bound.ModelSpin::getMax()();
if (v != null) {
return v.@java.lang.Number::doubleValue()();
} else
return null;
},
set : function(aValue) {
if (aValue != null) {
var v = aValue * 1;
var d = @java.lang.Double::new(D)(v);
aWidget.@com.eas.bound.ModelSpin::setMax(Ljava/lang/Double;)(d);
} else {
aWidget.@com.eas.bound.ModelSpin::setMax(Ljava/lang/Double;)(null);
}
}
});
Object.defineProperty(aPublished, "step", {
get : function() {
var v = aWidget.@com.eas.bound.ModelSpin::getStep()();
if (v != null) {
return v.@java.lang.Number::doubleValue()();
} else
return null;
},
set : function(aValue) {
if (aValue != null) {
var v = aValue * 1;
var d = @java.lang.Double::new(D)(v);
aWidget.@com.eas.bound.ModelSpin::setStep(Ljava/lang/Double;)(d);
} else {
aWidget.@com.eas.bound.ModelSpin::setStep(Ljava/lang/Double;)(null);
}
}
});
}-*/;
@Override
public Double getValue() {
return super.getValue();
}
@Override
public void setValue(Double value, boolean fireEvents) {
super.setValue(value, fireEvents);
}
@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 clearValue() {
super.clearValue();
ActionEvent.fire(this, this);
}
public Double getMin() {
return ((ConstraintedSpinnerBox) decorated).getMin();
}
public void setMin(Double aValue) {
((ConstraintedSpinnerBox) decorated).setMin(aValue);
}
public Double getMax() {
return ((ConstraintedSpinnerBox) decorated).getMax();
}
public void setMax(Double aValue) {
((ConstraintedSpinnerBox) decorated).setMax(aValue);
}
public Double getStep() {
return ((ConstraintedSpinnerBox) decorated).getStep();
}
public void setStep(Double aValue) {
((ConstraintedSpinnerBox) decorated).setStep(aValue);
}
@Override
protected void setReadonly(boolean aValue) {
((ConstraintedSpinnerBox)decorated).setReadonly(aValue);
}
@Override
protected boolean isReadonly() {
return ((ConstraintedSpinnerBox)decorated).isReadonly();
}
}