package VASSAL.tools.menu;
import java.awt.Container;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JComponent;
/**
* @author Joel Uckelman
* @since 3.1.0
*/
public abstract class AbstractProxy<T extends JComponent>
implements ChildProxy<T> {
protected final List<WeakReference<T>> peers =
new ArrayList<WeakReference<T>>();
protected final ReferenceQueue<T> queue = new ReferenceQueue<T>();
protected void processQueue() {
Reference<? extends T> ref;
while ((ref = queue.poll()) != null) {
peers.remove(ref);
}
}
protected void forEachPeer(Functor<T> functor) {
processQueue();
for (WeakReference<T> ref : peers) {
final T peer = ref.get();
if (peer != null) {
functor.apply(peer);
}
}
}
protected ParentProxy parent;
public ParentProxy getParent() {
return parent;
}
public void setParent(ParentProxy parent) {
this.parent = parent;
if (parent == null) {
forEachPeer(new Functor<T>() {
public void apply(T peer) {
final Container par = peer.getParent();
if (par != null) {
par.remove(peer);
}
}
});
}
}
public abstract T createPeer();
}