package cn.liutils.cgui.gui.event;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import cn.liutils.cgui.gui.Widget;
public final class GuiEventBus {
public GuiEventBus() {}
Map< Class<? extends GuiEvent>, LinkedList<GuiHandlerNode> > eventHandlers = new HashMap();
public final void postEvent(Widget widget, GuiEvent event) {
List<GuiHandlerNode> list = eventHandlers.get(event.getClass());
if(list != null) {
for(GuiHandlerNode n : list) {
n.handler.handleEvent(widget, event);
}
}
}
public void regEventHandler(GuiEventHandler handler) {
reg(handler.getEventClass(), handler);
}
public void regAtBeginning(GuiEventHandler handler) {
regAtBeginning(handler.getEventClass(), handler);
}
public void reg(Class<? extends GuiEvent> clazz, IGuiEventHandler handler) {
getRawList(clazz).add(new GuiHandlerNode(handler));
}
public void regAtBeginning(Class<? extends GuiEvent> clazz, IGuiEventHandler handler) {
getRawList(clazz).addFirst(new GuiHandlerNode(handler));
}
public void remove(GuiEventHandler handler) {
getRawList(handler.getEventClass()).remove(new GuiHandlerNode(handler));
}
public void remove(Class<? extends GuiEvent> clazz, IGuiEventHandler handler) {
getRawList(clazz).remove(new GuiHandlerNode(handler));
}
private LinkedList<GuiHandlerNode> getRawList(Class<? extends GuiEvent> clazz) {
LinkedList<GuiHandlerNode> ret = eventHandlers.get(clazz);
if(ret == null) {
eventHandlers.put(clazz, ret = new LinkedList());
}
return ret;
}
public GuiEventBus copy() {
GuiEventBus ret = new GuiEventBus();
for(Entry< Class<? extends GuiEvent>, LinkedList<GuiHandlerNode>> ent : eventHandlers.entrySet()) {
ret.getRawList(ent.getKey()).addAll(ent.getValue());
}
return ret;
}
private class GuiHandlerNode {
IGuiEventHandler handler;
public GuiHandlerNode(IGuiEventHandler handler) {
this.handler = handler;
}
@Override
public boolean equals(Object another) {
return another instanceof GuiHandlerNode && ((GuiHandlerNode) another).handler == handler;
}
@Override
public int hashCode() {
return handler.hashCode();
}
}
}