package xapi.components.api;
import elemental.dom.Element;
import com.google.gwt.core.client.js.JsProperty;
import com.google.gwt.core.client.js.JsType;
/**
* Created by james on 25/10/15.
*/
@JsType
public interface IsControlledComponent
<E extends Element, W extends IsWebComponent<E>, C extends IsComponentController<E, W>>
extends IsWebComponent<E>,
OnWebComponentAttached<E>,
OnWebComponentCreated<E>,
OnWebComponentDetached<E>
{
@Override
default E element() {
return IsWebComponent.super.element();
}
@JsProperty
C getController();
@JsProperty
void setController(C controller);
default C getOrMakeController() {
C c = getController();
if (c == null) {
c = createController();
setController(c);
}
return c;
}
default C createController() {
throw new UnsupportedOperationException();
}
@Override
default void onAttached(E element) {
getOrMakeController().onAttached((W)this);
}
@Override
default void onDetached(E element) {
getOrMakeController().onDetached((W)this);
}
@Override
default void onCreated(E element) {
getOrMakeController().onCreated((W)this);
}
}