package com.eas.bound;
import java.text.ParseException;
import com.eas.client.converters.DateValueConverter;
import com.eas.client.converters.DoubleValueConverter;
import com.eas.client.converters.StringValueConverter;
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.WidgetsUtils;
import com.eas.widgets.boxes.FormattedObjectBox;
import com.eas.widgets.boxes.ObjectFormat;
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;
public class ModelFormattedField extends ModelDecoratorBox<Object> implements HasEmptyText, HasActionHandlers {
protected String emptyText;
public ModelFormattedField() {
super(new FormattedObjectBox());
}
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<Object>() {
@Override
public void onValueChange(ValueChangeEvent<Object> event) {
if (!settingValue)
ActionEvent.fire(ModelFormattedField.this, ModelFormattedField.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 ModelFormattedField";
valueChangeReg.removeHandler();
valueChangeReg = null;
}
}
};
}
public String getFormat() {
return ((FormattedObjectBox) decorated).getFormat();
}
public void setFormat(String aValue) throws ParseException {
((FormattedObjectBox) decorated).setFormat(aValue);
}
public int getValueType() {
return ((FormattedObjectBox) decorated).getValueType();
}
public void setValueType(int aValue) throws ParseException {
((FormattedObjectBox) decorated).setValueType(aValue);
}
public String getText() {
return ((FormattedObjectBox) decorated).getText();
}
public void setText(String aValue) {
settingValue = true;
try {
((FormattedObjectBox) decorated).setText(aValue);
} finally {
settingValue = false;
}
}
@Override
public Object convert(Object aValue) {
switch (getValueType()) {
case ObjectFormat.CURRENCY:
case ObjectFormat.NUMBER:
case ObjectFormat.PERCENT:
DoubleValueConverter dc = new DoubleValueConverter();
return dc.convert(aValue);
case ObjectFormat.DATE:
case ObjectFormat.TIME:
DateValueConverter dtc = new DateValueConverter();
return dtc.convert(aValue);
case ObjectFormat.MASK:
case ObjectFormat.REGEXP:
case ObjectFormat.TEXT:
StringValueConverter sc = new StringValueConverter();
return sc.convert(aValue);
default:
return aValue;
}
}
public JavaScriptObject getOnParse() {
return ((FormattedObjectBox)decorated).getOnParse();
}
public void setOnParse(JavaScriptObject aValue) {
((FormattedObjectBox)decorated).setOnParse(aValue);
}
public JavaScriptObject getOnFormat() {
return ((FormattedObjectBox)decorated).getOnFormat();
}
public void setOnFormat(JavaScriptObject aValue) {
((FormattedObjectBox)decorated).setOnFormat(aValue);
}
@Override
public String getEmptyText() {
return emptyText;
}
@Override
public void setEmptyText(String aValue) {
emptyText = aValue;
WidgetsUtils.applyEmptyText(getElement(), emptyText);
}
@Override
public void setPublished(JavaScriptObject aValue) {
super.setPublished(aValue);
if (published != null) {
publish(this, published);
}
}
private native static void publish(ModelFormattedField aWidget, JavaScriptObject aPublished)/*-{
var B = @com.eas.core.Predefine::boxing;
aPublished.redraw = function(){
aWidget.@com.eas.bound.ModelFormattedField::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() {
return B.boxAsJs(aWidget.@com.eas.bound.ModelFormattedField::getJsValue()());
},
set : function(aValue) {
aWidget.@com.eas.bound.ModelFormattedField::setJsValue(Ljava/lang/Object;)(B.boxAsJava(aValue));
}
});
Object.defineProperty(aPublished, "valueType", {
get : function() {
var typeNum = aWidget.@com.eas.bound.ModelFormattedField::getValueType()()
var type;
if (typeNum === @com.eas.widgets.boxes.ObjectFormat::NUMBER ){
type = $wnd.Number;
} else if (typeNum === @com.eas.widgets.boxes.ObjectFormat::DATE ){
type = $wnd.Date;
} else if (typeNum === @com.eas.widgets.boxes.ObjectFormat::REGEXP ){
type = $wnd.RegExp;
} else {
type = $wnd.String;
}
return type;
},
set : function(aValue) {
var typeNum;
if (aValue === $wnd.Number ){
typeNum = @com.eas.widgets.boxes.ObjectFormat::NUMBER;
} else if (aValue === $wnd.Date ){
typeNum = @com.eas.widgets.boxes.ObjectFormat::DATE;
} else if (aValue === $wnd.RegExp ){
typeNum = @com.eas.widgets.boxes.ObjectFormat::REGEXP;
} else {
typeNum = @com.eas.widgets.boxes.ObjectFormat::TEXT;
}
aWidget.@com.eas.bound.ModelFormattedField::setValueType(I)(typeNum);
}
});
Object.defineProperty(aPublished, "text", {
get : function() {
return aWidget.@com.eas.bound.ModelFormattedField::getText()();
},
set : function(aValue) {
aWidget.@com.eas.bound.ModelFormattedField::setText(Ljava/lang/String;)(B.boxAsJava(aValue));
}
});
Object.defineProperty(aPublished, "format", {
get : function() {
return aWidget.@com.eas.bound.ModelFormattedField::getFormat()();
},
set : function(aValue) {
aWidget.@com.eas.bound.ModelFormattedField::setFormat(Ljava/lang/String;)(aValue != null ? '' + aValue : null);
}
});
Object.defineProperty(aPublished, "onFormat", {
get : function() {
return aWidget.@com.eas.bound.ModelFormattedField::getOnFormat()();
},
set : function(aValue) {
aWidget.@com.eas.bound.ModelFormattedField::setOnFormat(Lcom/google/gwt/core/client/JavaScriptObject;)(aValue);
}
});
Object.defineProperty(aPublished, "onParse", {
get : function() {
return aWidget.@com.eas.bound.ModelFormattedField::getOnParse()();
},
set : function(aValue) {
aWidget.@com.eas.bound.ModelFormattedField::setOnParse(Lcom/google/gwt/core/client/JavaScriptObject;)(aValue);
}
});
}-*/;
public Object getJsValue() {
return Utils.toJs(getValue());
}
public void setJsValue(Object value) throws Exception {
setValue(convert(Utils.toJava(value)), true);
}
@Override
protected void clearValue() {
super.clearValue();
ActionEvent.fire(this, this);
}
@Override
protected void setReadonly(boolean aValue) {
((FormattedObjectBox)decorated).getElement().setPropertyBoolean("readOnly", aValue);
}
@Override
protected boolean isReadonly() {
return ((FormattedObjectBox)decorated).getElement().getPropertyBoolean("readOnly");
}
}