package org.phylowidget.render.images;
import java.awt.Image;
import java.io.File;
import java.net.URL;
import java.util.Hashtable;
import java.util.Queue;
import java.util.concurrent.LinkedBlockingQueue;
import javax.imageio.ImageIO;
import org.phylowidget.PWContext;
import org.phylowidget.PWPlatform;
import org.phylowidget.PhyloTree;
import org.phylowidget.tree.PhyloNode;
import org.phylowidget.tree.RootedTree;
import processing.core.PApplet;
public class ImageLoader implements Runnable
{
static Hashtable<String, Image> imageMap;
static Hashtable<String, Integer> loadedImageURLs;
static Hashtable<String, PhyloNode> urlsToNodes;
static Thread thread;
PWContext context;
public ImageLoader()
{
context = PWPlatform.getInstance().getThisAppContext();
}
boolean loadingImg = false;
PhyloNode loadingNode = null;
public synchronized Image getImageForNode(PhyloNode n)
{
if (thread == null)
{
loadedImageURLs = new Hashtable<String, Integer>();
imageMap = new Hashtable<String, Image>();
urlsToNodes = new Hashtable<String,PhyloNode>();
thread = new Thread(this);
thread.start();
}
String imgS = n.getAnnotation(ImageSearcher.IMG_TAG);
if (imgS != null)
{
addImage(imgS,n);
Image img = imageMap.get(imgS);
if (img != null)
{
/*
* The latest image is here, so unload the old image from the hashtable and the annotation map.
*/
String oldImgS = n.getAnnotation(ImageSearcher.OLD_IMG_TAG);
if (oldImgS != null)
{
removeImage(oldImgS);
n.clearAnnotation(ImageSearcher.OLD_IMG_TAG);
}
return img;
}
context.getPW().setMessage("Loading image...");
String oldImgS = n.getAnnotation(ImageSearcher.OLD_IMG_TAG);
if (oldImgS != null)
{
img = imageMap.get(oldImgS);
return img;
} else
return null;
} else
return null;
}
synchronized void removeImage(String imageURL)
{
Image i = imageMap.get(imageURL);
if (i != null)
{
i.flush();
i = null;
}
imageMap.remove(imageURL);
loadedImageURLs.remove(imageURL);
}
static final Integer integer = new Integer(0);
synchronized void addImage(String imageURL,PhyloNode n)
{
// if (!PhyloWidget.ui.canAccessInternet())
// {
// context.getP().setMessage("Image loading failed: requires PhyloWidget full!");
// return;
// }
if (!loadedImageURLs.containsKey(imageURL))
{
loadedImageURLs.put(imageURL, integer);
imagesToLoad.add(imageURL);
urlsToNodes.put(imageURL,n);
notifyAll();
}
}
Queue<String> imagesToLoad = new LinkedBlockingQueue<String>();
public void run()
{
while (true)
{
if (!imagesToLoad.isEmpty())
{
String imgS = null;
try
{
imgS = imagesToLoad.remove();
URL url = null;
try {
url = new URL(imgS);
} catch (Exception e) {
RootedTree t = context.trees().getTree();
PhyloTree pt = (PhyloTree) t;
if (pt.getBaseURL().length() > 0)
{
imgS = imgS.replaceAll("\"", "");
File f = new File(pt.getBaseURL(),imgS);
url = f.toURL();
}
}
PApplet p = context.getPW();
// InputStream in = p.openStream(imgS);
// byte[] bytes = PApplet.loadBytes(in);
// if (bytes == null)
// {
// in.close();
// continue;
// }
// Image img = p.getImage(new URL(imgS));
Image img = ImageIO.read(url);
context.getPW().setMessage("Finished loading image!");
// System.out.println(img);
// Image img = Toolkit.getDefaultToolkit().createImage(bytes);
// bytes = null;
imageMap.put(imgS, img);
PhyloNode n = urlsToNodes.get(imgS);
if (n != null)
{
n.setAnnotation("img_a", 0);
}
} catch (Exception e)
{
e.printStackTrace();
loadedImageURLs.remove(imgS);
}
}
if (imagesToLoad.isEmpty())
{
synchronized (this)
{
try
{
wait();
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
}
public void dispose()
{
if (imageMap != null)
{
imageMap.clear();
}
if (imagesToLoad != null)
{
imagesToLoad.clear();
}
if (loadedImageURLs != null)
{
loadedImageURLs.clear();
}
thread = null;
}
}