for (int i = 0; i < ids.length; i++) {
String id = String.valueOf(ids[i]);
Object val = getProperty(obj, id);
ScriptableWidget wid = wrap(aggregateField.getChild(id));
if (wid == null) {
throw new JavaScriptException("No field \"" + id + "\" in widget \"" + aggregateField.getId() + "\"");
}
if (wid.delegate instanceof Field ||
wid.delegate instanceof BooleanField ||
wid.delegate instanceof Output) {
if (val instanceof Scriptable) {
Scriptable s = (Scriptable)val;
if (s.has("value", s)) {
wid.jsSet_value(s.get("value", s));
}
}
} else {
wid.jsSet_value(val);
}
}
aggregateField.combineFields();
return;
}
// fall through
}
if (delegate instanceof DataWidget) {
value = unwrap(value);
if (value != null) {
// Coerce values
Datatype datatype = ((DataWidget)delegate).getDatatype();
Class typeClass = datatype.getTypeClass();
if (typeClass == String.class) {
value = Context.toString(value);
} else if (typeClass == boolean.class ||
typeClass == Boolean.class) {
value = Context.toBoolean(value) ? Boolean.TRUE : Boolean.FALSE;
} else {
if (value instanceof Double) {
// make cform accept a JS Number
if (typeClass == long.class || typeClass == Long.class) {
value = new Long(((Number)value).longValue());
} else if (typeClass == int.class ||
typeClass == Integer.class) {
value = new Integer(((Number)value).intValue());
} else if (typeClass == float.class ||
typeClass == Float.class) {
value = new Float(((Number)value).floatValue());
} else if (typeClass == short.class ||
typeClass == Short.class) {
value = new Short(((Number)value).shortValue());
} else if (typeClass == BigDecimal.class) {
value = new BigDecimal(((Number)value).doubleValue());
}
}
}
}
delegate.setValue(value);
} else if (delegate instanceof BooleanField) {
BooleanField field = (BooleanField)delegate;
field.setValue(new Boolean(Context.toBoolean(value)));
} else if (delegate instanceof Repeater) {
Repeater repeater = (Repeater)delegate;
if (value instanceof NativeArray) {
NativeArray arr = (NativeArray)value;
Object length = getProperty(arr, "length");
int len = ((Number)length).intValue();
for (int i = repeater.getSize(); i >= len; --i) {
deleteRow(repeater, i);
}
for (int i = 0; i < len; i++) {
Object elemValue = getProperty(arr, i);
ScriptableWidget wid = wrap(repeater.getRow(i));
wid.jsSet_value(elemValue);
}
}
} else if (delegate instanceof Repeater.RepeaterRow) {
Repeater.RepeaterRow row = (Repeater.RepeaterRow)delegate;
if (value instanceof Scriptable) {
Scriptable obj = (Scriptable)value;
Object[] ids = obj.getIds();
for (int i = 0; i < ids.length; i++) {
String id = String.valueOf(ids[i]);
Object val = getProperty(obj, id);
ScriptableWidget wid = wrap(row.getChild(id));
if (wid == null) {
throw new JavaScriptException("No field \"" + id + "\" in row " + i + " of repeater \"" + row.getParent().getId() + "\"");
}
if (wid.delegate instanceof Field ||
wid.delegate instanceof BooleanField ||
wid.delegate instanceof Output) {
if (val instanceof Scriptable) {
Scriptable s = (Scriptable)val;
if (s.has("value", s)) {
wid.jsSet_value(s.get("value", s));
}
}
} else {
wid.jsSet_value(val);
}
}
} else {
throw new JavaScriptException("Expected an object instead of: " + Context.toString(value));
}
} else if (delegate instanceof MultiValueField) {
MultiValueField field = (MultiValueField)delegate;
Object[] values = null;
if (value instanceof NativeArray) {