package com.ui4j.spi;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.ui4j.api.dom.EventTarget;
import com.ui4j.api.event.EventHandler;
@SuppressWarnings("unchecked")
public class NativeEventManager implements EventManager {
private PageContext context;
public NativeEventManager(PageContext context) {
this.context = context;
}
@Override
public void bind(EventTarget target, String event, EventHandler handler) {
if (target != null && List.class.isAssignableFrom(target.getClass())) {
context.getEventRegistrar().register(target, event, handler);
Map<String, Object> map = new HashMap<>();
map.put("event", event);
map.put("listener", handler);
List<Map<String, Object>> events = (List<Map<String, Object>>) target.getProperty("events");
if (events == null || "undefined".equals(events.toString().trim())) {
target.setProperty("events", events = new ArrayList<>(1));
}
events.add(map);
}
}
public void unbind(EventTarget target) {
Object eventObject = target.getProperty("events");
if (eventObject == null || "undefined".equals(eventObject.toString().trim())) {
return;
}
if (List.class.isAssignableFrom(eventObject.getClass())) {
List<Map<String, Object>> events = (List<Map<String, Object>>) eventObject;
for (Map<String, Object> next : events) {
String event = next.get("event").toString();
EventHandler handler = (EventHandler) next.get("listener");
context.getEventRegistrar().unregister(target, event, handler);
}
events.clear();
target.removeProperty("events");
}
}
@Override
public void unbind(EventTarget target, String event) {
Object eventObject = target.getProperty("events");
if (eventObject == null || "undefined".equals(eventObject.toString().trim())) {
return;
}
List<Map<String, Object>> events = (List<Map<String, Object>>) eventObject;
List<Map<String, Object>> founds = new ArrayList<>();
for (Map<String, Object> next : events) {
String nextEvent = next.get("event").toString();
if (nextEvent.equals(event)) {
founds.add(next);
EventHandler handler = (EventHandler) next.get("listener");
context.getEventRegistrar().unregister(target, nextEvent, handler);
}
}
events.removeAll(founds);
}
@Override
public void unbind(EventTarget target, EventHandler handler) {
Object eventObject = target.getProperty("events");
if (eventObject == null || "undefined".equals(eventObject.toString().trim())) {
return;
}
List<Map<String, Object>> events = (List<Map<String, Object>>) eventObject;
Map<String, Object> found = Collections.<String, Object>emptyMap();
for (Map<String, Object> next : events) {
EventHandler nextHandler = (EventHandler) next.get("listener");
if (nextHandler.equals(handler)) {
found = next;
String nextEvent = next.get("event").toString();
context.getEventRegistrar().unregister(target, nextEvent, handler);
}
}
events.remove(found);
}
}