package hep.aida.ref.plotter; import java.lang.ref.WeakReference; import java.util.ArrayList; /** * * @author The AIDA team @ SLAC. */ public abstract class WeakStyleListener implements StyleListener { protected ArrayList listeners = new ArrayList(); public WeakStyleListener() { } StyleListener[] getValidStyleListeners() { StyleListener[] listenerArray = new StyleListener[0]; if (listeners == null || listeners.size() == 0) return listenerArray; Object[] objArray = listeners.toArray(); ArrayList list = new ArrayList(objArray.length); for ( int i = 0; i < objArray.length; i++ ) { WeakReference wr = (WeakReference) objArray[i]; StyleListener listener = (StyleListener) wr.get(); if (listener == null) { listeners.remove(wr); } else { list.add(listener); } } listenerArray = new StyleListener[list.size()]; listenerArray = (StyleListener[]) list.toArray(listenerArray); list.clear(); return listenerArray; } public abstract void styleChanged(BaseStyle style); void addStyleListener( StyleListener listener ) { if (hasListener(listener) || listener == null) return; listeners.add(new WeakReference(listener)); } boolean hasListener(StyleListener listener) { Object[] objArray = listeners.toArray(); for ( int i = 0; i < objArray.length; i++ ) { WeakReference wr = (WeakReference) objArray[i]; StyleListener localListener = (StyleListener) wr.get(); if (localListener == null) { listeners.remove(wr); } else { if (localListener == listener) return true; } } return false; } void removeStyleListener( StyleListener listener ) { Object[] objArray = listeners.toArray(); for ( int i = 0; i < objArray.length; i++ ) { WeakReference wr = (WeakReference) objArray[i]; StyleListener localListener = (StyleListener) wr.get(); if (localListener == null) { listeners.remove(wr); } else { if (localListener == listener) { listeners.remove(wr); } } } } }