package xapi.polymer.core;
import static xapi.components.impl.JsFunctionSupport.wrapConsumer;
import static xapi.components.impl.JsSupport.getBoolean;
import static xapi.components.impl.JsSupport.getDouble;
import static xapi.components.impl.JsSupport.getInt;
import static xapi.components.impl.JsSupport.getLong;
import static xapi.components.impl.JsSupport.newElement;
import static xapi.components.impl.JsSupport.setAttr;
import static xapi.components.impl.JsSupport.setBoolean;
import static xapi.components.impl.JsSupport.setDouble;
import static xapi.components.impl.JsSupport.setInt;
import static xapi.components.impl.JsSupport.setLong;
import static xapi.polymer.core.PolymerSupport.setPolymerAttr;
import java.util.function.Consumer;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.js.JsProperty;
import com.google.gwt.core.client.js.JsType;
import com.google.gwt.event.dom.client.ClickEvent;
import elemental.dom.Element;
import elemental.events.Event;
import elemental.events.EventRemover;
import elemental.events.KeyboardEvent;
import elemental.js.dom.JsElement;
import xapi.components.api.HasElement;
@JsType
public interface PolymerElement extends HasElement<Element> {
@JsProperty
<V> V value();
default int valueAsInt() {
return getInt(this, "value");
}
default double valueAsDouble() {
return getDouble(this, "value");
}
default long valueAsLong() {
return getLong(this, "value");
}
default boolean valueAsBoolean() {
return getBoolean(this, "value");
}
void addEventListener(String name, JavaScriptObject func);
void removeEventListener(String name, JavaScriptObject func);
default EventRemover onCoreChange(Consumer<Event> event) {
JavaScriptObject func = wrapConsumer(event);
addEventListener("core-change", func);
return () -> removeEventListener("core-change", func);
}
default EventRemover onChange(Consumer<Event> event) {
JavaScriptObject func = wrapConsumer(event);
addEventListener("change", func);
return () -> removeEventListener("change", func);
}
default EventRemover onClick(Consumer<ClickEvent> event) {
JavaScriptObject func = wrapConsumer(event);
addEventListener("click", func);
return () -> removeEventListener("click", func);
}
default EventRemover onKeyUp(Consumer<KeyboardEvent> event) {
JavaScriptObject func = wrapConsumer(event);
addEventListener("keyup", func);
return () -> removeEventListener("keyup", func);
}
default EventRemover onKeyDown(Consumer<KeyboardEvent> event) {
JavaScriptObject func = wrapConsumer(event);
addEventListener("keydown", func);
return () -> removeEventListener("keydown", func);
}
default EventRemover onKeyPress(Consumer<KeyboardEvent> event) {
JavaScriptObject func = wrapConsumer(event);
addEventListener("keypress", func);
return () -> removeEventListener("keypress", func);
}
@JsProperty
void setChecked(boolean checked);
default void attribute(String name) {
setAttr(element(), name);
}
@JsProperty
void setValue(Object newVal);
default void setValueAsInt(int newVal) {
setInt(this, "value", newVal);
}
default void setValueAsDouble(double newVal) {
setDouble(this, "value", newVal);
}
default void setValueAsBoolean(boolean newVal) {
setBoolean(this, "value", newVal);
}
default void setValueAsLong(long newVal) {
setLong(this, "value", newVal);
}
@JsProperty
void setLabel(String label);
void appendChild(Element e);
@JsProperty
void setInnerHTML(String html);
@Override
default Element element() {
return (JsElement)this;
}
default PolymerElement querySelector(String selector) {
return (PolymerElement) element().querySelector(selector);
}
static PolymerElement newButton(String text) {
Element icon = newElement("paper-button");
icon.setInnerText(text);
icon.setClassName("xapi-button");
return (PolymerElement) icon;
}
static PolymerElement newButtonRaised(String text) {
return setPolymerAttr(newButton(text), "raised");
}
static PolymerElement newIconButtonFloatingMini(String iconName) {
Element icon = newIconButtonFloating(iconName);
setAttr(icon, "mini");
return (PolymerElement) icon;
}
static Element newIconButtonFloating(String iconName) {
Element icon = newElement("paper-fab");
icon.setAttribute("icon", iconName);
return icon;
}
static PolymerElement newIconButton(String iconName) {
Element icon = newElement("core-icon-button");
icon.setAttribute("icon", iconName);
return (PolymerElement) icon;
}
static PolymerElement newIcon(String iconName) {
Element icon = newElement("core-icon");
icon.setAttribute("icon", iconName);
return (PolymerElement) icon;
}
static Element newFlex() {
return setAttr(newElement("div"), "flex");
}
static Element newFlexHorizontal() {
return setAttr(newFlex(), "horizontal");
}
static Element newFlexHorizontal(String size) {
return setAttr(newFlexHorizontal(), size);
}
static Element newFlexVertical() {
return setAttr(newFlex(), "vertical");
}
static Element newFlexVertical(String size) {
return setAttr(newFlexVertical(), size);
}
static Element newLayout() {
return setAttr(newElement("div"), "layout");
}
static Element newLayoutCenter() {
return setAttr(newLayout(), "center");
}
static Element newLayoutCenterHorizontal() {
return setAttr(newLayoutCenter(), "horizontal");
}
static Element newLayoutCenterVertical() {
return setAttr(newLayoutCenter(), "vertical");
}
static Element newLayoutHorizontal() {
return setAttr(newLayout(), "horizontal");
}
static Element newLayoutVertical() {
return setAttr(newLayout(), "vertical");
}
@JsProperty
boolean checked();
}