package org.swellrt.api.js.generic;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import org.swellrt.api.SwellRTUtils;
import org.swellrt.api.js.WaveClientJS;
import org.swellrt.model.generic.ListType;
import org.swellrt.model.generic.Type;
public class ListTypeJS extends JavaScriptObject implements ListType.Listener {
public native static ListTypeJS create(ListType delegate) /*-{
var jso = {
_delegate: delegate,
values: new Array(),
callbackMap: new Object(),
eventHandlers: new Object(),
registerEventHandler: function(event, handler) {
this.eventHandlers[event] = handler;
},
unregisterEventHandler: function(event, handler) {
this.eventHandlers[event] = null;
},
getDelegate: function() {
return this._delegate;
},
add: function(value, index) {
var _value = value.getDelegate();
if ((index !== undefined) && (typeof index == "number")) {
var oldValue = this.get(index);
_value = delegate.@org.swellrt.model.generic.ListType::add(ILorg/swellrt/model/generic/Type;)(index, _value);
if (oldValue && oldValue.type() == "FileType") {
oldValue.clear();
}
} else
_value = delegate.@org.swellrt.model.generic.ListType::add(Lorg/swellrt/model/generic/Type;)(_value);
return @org.swellrt.api.js.generic.AdapterTypeJS::adapt(Lorg/swellrt/model/generic/Type;)(_value);
},
remove: function(index) {
var oldValue = this.get(index);
var _value = delegate.@org.swellrt.model.generic.ListType::remove(I)(index);
return @org.swellrt.api.js.generic.AdapterTypeJS::adapt(Lorg/swellrt/model/generic/Type;)(_value);
if (oldValue && oldValue.type() == "FileType") {
oldValue.clear();
}
},
get: function(index) {
var _value = delegate.@org.swellrt.model.generic.ListType::get(I)(index);
return @org.swellrt.api.js.generic.AdapterTypeJS::adapt(Lorg/swellrt/model/generic/Type;)(_value);
},
size: function() {
return delegate.@org.swellrt.model.generic.ListType::size()();
},
type: function() {
return delegate.@org.swellrt.model.generic.ListType::getType()();
}
}; // jso
// Populate the JavaScript array of values
var _values = delegate.@org.swellrt.model.generic.ListType::getValues()();
if (_values != null) // Prevent errors in unattached delegates
jso.values = @org.swellrt.api.SwellRTUtils::typeIterableToJs(Ljava/lang/Iterable;)(_values);
return jso;
}-*/;
protected ListTypeJS() {
}
private final native void fireEvent(String event, Object parameter) /*-{
if (this.eventHandlers[event] != null) {
this.eventHandlers[event](parameter);
}
}-*/;
private final native ListType getDelegate() /*-{
return this._delegate;
}-*/;
private final native JsArray<JavaScriptObject> getValues() /*-{
return this.values;
}-*/;
@Override
public final void onValueAdded(Type value) {
ListType delegate = getDelegate();
int index = delegate.indexOf(value);
// Update the JS array
JsArray<JavaScriptObject> values = getValues();
JavaScriptObject oldValue = values.get(index);
JavaScriptObject newValue = AdapterTypeJS.adapt(value);
values.set(index, newValue);
JsArray<JavaScriptObject> changes = SwellRTUtils.createJsArray();
SwellRTUtils.addStringToJsArray(changes, Integer.toString(index));
changes.push(newValue);
if (oldValue != null) changes.push(oldValue);
// Fire JS Event with parameters: index, newValue, [oldValue]
fireEvent(WaveClientJS.ITEM_ADDED, changes);
}
@Override
public final void onValueRemoved(Type value) {
JsArray<JavaScriptObject> values = getValues();
int removedIndex = -1;
JavaScriptObject removedValue = null;
for (int i = 0; i < values.length(); i++) {
Type delegate = SwellRTUtils.getDelegate(values.get(i));
if (value.equals(delegate)) {
removedIndex = i;
break;
}
}
removedValue = values.get(removedIndex);
SwellRTUtils.removeJsArrayElement(values, removedIndex);
JsArray<JavaScriptObject> changes = SwellRTUtils.createJsArray();
SwellRTUtils.addStringToJsArray(changes, Integer.toString(removedIndex));
changes.push(removedValue);
// Fire JS Event with parameters: index, removedValue
fireEvent(WaveClientJS.ITEM_REMOVED, changes);
}
}