/**
*
*/
package org.korsakow.ide.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.EventListener;
import javax.swing.event.EventListenerList;
/**
* TODO: get rid of this thing. its terrible in too many ways.
* @deprecated
* @author d
*
* @param <Listener>
*/
@Deprecated
public class EventDispatcher<Listener extends EventListener>
{
private EventListenerList listeners;
private Class<? extends Listener> clazz;
public EventDispatcher(Class<? extends Listener> clazz, EventListenerList listeners)
{
this.clazz = clazz;
this.listeners = listeners;
}
public EventDispatcher(Class<? extends Listener> clazz)
{
this(clazz, new EventListenerList());
}
public void add(Listener listener)
{
listeners.add((Class<Listener>)clazz, listener);
}
public void remove(Listener listener)
{
listeners.remove((Class<Listener>)clazz, listener);
}
public void notify(String eventName, Object... args)
{
try {
Method method = null;
// perform a relatively weak lookup on the method
// but its hard to be more precice, since args might have been boxed or subclasses
for (Method m : clazz.getMethods())
if (m.getName().equals(eventName) && m.getParameterTypes().length == args.length) {
method = m;
break;
}
if (method == null)
throw new NoSuchMethodException(String.format("Not found: %s.%s", clazz.getName(), eventName));
for (EventListener listener : listeners.getListeners(clazz))
method.invoke(listener, args);
} catch (InvocationTargetException e) {
// bypass pointless and annoyingly long traces (we dont lose any info, just cut out the middle man cause by reflection)
// if (e.getCause() != null)
// throw new RuntimeException(e.getCause());
// else
throw new RuntimeException(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}