package xapi.ui.api.event; import xapi.event.api.IsEventType; import xapi.fu.Log; import xapi.log.X_Log; import xapi.model.api.Model; import xapi.ui.api.UiElement; /** * Created by James X. Nelson (james @wetheinter.net) on 7/17/16. */ public interface UiEventContext<Payload, Node, Base extends UiElement<Node, ? extends Node, Base>> extends IsEventType, Model, Log { String KEY_EVENT_TYPE = "eventType"; String KEY_PAYLOAD_TYPE = "payload"; String KEY_NATIVE_EVENT_TYPE = "nativeType"; String KEY_NATIVE_EVENT_TARGET = "eventTarget"; String KEY_SOURCE_ID = "sourceTarget"; String DEFAULT_UI_TYPE = "ui"; @Override default String getEventType() { return getProperty(KEY_EVENT_TYPE, DEFAULT_UI_TYPE); } default UiEventContext<Payload, Node, Base> setEventType(String type) { setProperty(KEY_EVENT_TYPE, type); return this; } default String getNativeType() { return getProperty(KEY_NATIVE_EVENT_TYPE, DEFAULT_UI_TYPE); } default UiEventContext<Payload, Node, Base> setNativeType(String type) { setProperty(KEY_NATIVE_EVENT_TYPE, type); return this; } /** * * @param node - The raw ui node that fired this event. * @return true to allow null, * false to add a warning and an assert:false : "Error message"; * or, most preferably, THROW YOUR OWN EXCEPTIONS WITH MORE CONTEXT. */ default boolean validateTarget(Node node) { return node != null; } default boolean validateSource(Base node) { return node != null; } default Node getNativeEventTarget() { return getProperty(KEY_NATIVE_EVENT_TARGET, ()->{ // This is the default handler; if nothing was specified, check before we return null. if (validateTarget(null)) { return null; } log(LogLevel.WARN); X_Log.warn(getClass(), "Type", getClass(), "does not allow null target events. Me: ", this); assert false : "Type " + getClass() + " does not allow null target events. Me: " + this; return null; }); } default UiEventContext<Payload, Node, Base> setNativeEventTarget(Node node) { setProperty(KEY_NATIVE_EVENT_TARGET, node); return this; } default Base getSourceElement() { return getProperty(KEY_SOURCE_ID, ()->{ // This is the default handler; if nothing was specified, check before we return null. if (validateSource(null)) { return null; } log(LogLevel.WARN); X_Log.warn(getClass(), "Type", getClass(), "does not allow null sources events. Me: ", this); assert false : "Type " + getClass() + " does not allow null target events. Me: " + this; return null; }); } default UiEventContext<Payload, Node, Base> setSource(Base ui) { setProperty(KEY_SOURCE_ID, ui); return this; } default Payload getPayload() { return getProperty(KEY_PAYLOAD_TYPE); } default UiEventContext<Payload, Node, Base> setPayload(Payload payload) { setProperty(KEY_PAYLOAD_TYPE, payload); return this; } @Override default void print(LogLevel level, String debug) { X_Log.log(getClass(), xapi.log.api.LogLevel.valueOf(level.name()), debug); } }