package org.korsakow.ide.util; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.EventListener; import java.util.List; public class EventListenerWeakList { private static class Entry { public final Class clazz; public final WeakReference<EventListener> listener; public Entry(Class clazz, EventListener listener) { this.clazz = clazz; this.listener = new WeakReference<EventListener>(listener); } public boolean equals(Object object) { if (object instanceof Entry == false) return false; Entry other = (Entry)object; if (!clazz.equals(other.clazz)) return false; if (!listener.equals(other.listener)) return false; EventListener l1 = listener.get(); EventListener l2 = other.listener.get(); if (l1==null || l2==null) return false; return l1.equals(l2); } } private List<Entry> listeners = new ArrayList<Entry>(); public void add(Class clazz, EventListener listener) { Entry entry = new Entry(clazz, listener); listeners.add(entry); } public <T extends EventListener> List<T> getListeners(Class<T> clazz) { List<T> listeners = new ArrayList<T>(); for (Entry entry : this.listeners) { if (entry.clazz.equals(clazz)) { T listener = (T)entry.listener.get(); if (listener != null) listeners.add(listener); } } return listeners; } }