package fr.xtof54.jsgo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* This class is used to receive and dispatch events
*
* @author xtof
*
*/
public class EventManager {
enum eventType {loginStarted, loginEnd, downloadListStarted, downloadListEnd, downloadListGamesEnd, downloadGameStarted, downloadGameEnd, GameOK, moveSentStart, moveSentEnd, gobanReady,
msgSendStart, msgSendEnd, ladderStart, ladderEnd, ladderChallengeStart, ladderChallengeEnd, showMessage, copyEidogoStart, copyEidogoEnd};
private static EventManager em = new EventManager();
public static EventManager getEventManager() {
return em;
}
private EventManager() {}
public interface EventListener {
public void reactToEvent();
public String getName();
}
private HashMap<eventType, List<EventListener>> listeners = new HashMap<EventManager.eventType, List<EventListener>>();
public void registerListener(eventType e, EventListener f) {
System.out.println("registering event listener "+e+" "+f.getName());
List<EventListener> l = listeners.get(e);
final String name = f.getName();
if (l==null) {
l=new ArrayList<EventManager.EventListener>();
listeners.put(e, l);
} else {
for (EventListener el : l)
if (el.getName().equals(name)) {
System.out.println("refusing event "+el.getName());
// refuse to register 2 times the same listener !
return;
}
}
l.add(f);
}
public void unregisterListener(eventType e, EventListener f) {
System.out.println("unregistering event listener "+e+" "+f.getName());
List<EventListener> l = listeners.get(e);
if (l!=null) {
l.remove(f);
if (l.size()==0) listeners.remove(e);
}
}
public String message=null;
public void sendEvent(final eventType e, String msg) {
message=""+msg;
sendEvent(e);
}
public void sendEvent(final eventType e) {
Thread tt = new Thread(new Runnable() {
@Override
public void run() {
List<EventListener> l = listeners.get(e);
System.out.println("Event sent: "+e+" "+l);
if (l!=null) {
// make a copy of the listeners list to avoid concurrent modification of the original list
ArrayList<EventListener> list = new ArrayList<EventManager.EventListener>();
list.addAll(l);
for (EventListener f : list)
f.reactToEvent();
}
}
});
tt.start();
}
}