/* * ImageSaveManager.java * * Created on March 8, 2006, 1:36 PM */ package Current.popups.ImageSave; import java.util.*; import java.lang.ref.WeakReference; /** * This class maintains a list of all the open canvases that * can/should be able to output interesting images. * */ public class ImageSaveManager { public interface ImageSaveListener { public void imageSaveListChanged(); } private class Pair { public String title; public WeakReference WR; public Pair(String t, ImageSaver is) { title=t; WR=new WeakReference(is); } } private LinkedList image_generators; WeakReference listener=null; /** Creates a new instance of ImageSaveManager */ public ImageSaveManager() { image_generators=new LinkedList(); } public void hear(ImageSaveListener l) { listener=new WeakReference(l); } public void dontHear(ImageSaveListener l) { if (listener!=null) { if (l==listener.get()) { listener=null; } } } public void changed() { if (listener!=null) { if (listener.get()!=null) { //System.out.println("sent changed"); ((ImageSaveListener)(listener.get())).imageSaveListChanged(); } else { System.out.println("Warning: Listener vanished without telling me!"); } } } public void add(String title, ImageSaver is){ image_generators.add(new Pair(title,is)); changed(); } /** This is a function that removes all references of the given object */ public void remove(Object obj){ Object o; for (ListIterator it=image_generators.listIterator(); it.hasNext();){ o=((Pair)it.next()).WR.get(); if (o==null) { it.remove(); System.err.println("Warning:1: ImageSaveManager removing something manually"); } else if (o==obj) { //System.out.println("removing renderer: "+obj.getClass().getName()); it.remove(); changed(); } } } /** Returns an ImageSaver or null if none exists with the given title */ public ImageSaver get(String title) { for (ListIterator it=image_generators.listIterator(); it.hasNext();){ Pair p=((Pair)it.next()); if (p.title==title) { Object o=p.WR.get(); if (o==null) { it.remove(); System.err.println("Warning:2: ImageSaveManager removing something manually"); } else { return (ImageSaver)o; } } } System.err.println("Warning:3: Failed to return an ImageSaver"); return null; } public String[] getTitles() { String[] ret=new String[image_generators.size()]; int i=0; for (ListIterator it=image_generators.listIterator(); it.hasNext();){ ret[i]=((Pair)it.next()).title; i++; } return ret; } }