package java.awt;
import java.util.ArrayList;
import java.awt.image.ImageObserver;
public class MediaTracker implements java.io.Serializable
{
public static final int LOADING = 1 << 0;
public static final int ABORTED = 1 << 1;
public static final int ERRORED = 1 << 2;
public static final int COMPLETE = 1 << 3;
Component target;
MediaEntry head;
static final long serialVersionUID = -483174189758638095L;
class MediaEntry implements ImageObserver
{
int id;
Image image;
MediaEntry next;
int status;
int width;
int height;
public boolean imageUpdate(Image img, int flags, int x, int y,
int width, int height)
{
if ((flags & ABORT) != 0)
status = ABORTED & COMPLETE;
else if ((flags & ERROR) != 0)
status = ERRORED & COMPLETE;
else if ((flags & ALLBITS) != 0)
status = COMPLETE;
else
status = LOADING;
synchronized (MediaTracker.this)
{
MediaTracker.this.notifyAll();
}
return ((status & COMPLETE) != 0);
}
}
public MediaTracker(Component c)
{
target = c;
}
public void addImage(Image image, int id)
{
MediaEntry e = new MediaEntry();
e.id = id;
e.image = image;
e.next = head;
head = e;
target.checkImage(image, e);
}
public void addImage(Image image, int id, int width, int height)
{
MediaEntry e = new MediaEntry();
e.id = id;
e.image = image;
e.next = head;
e.width = width;
e.height = height;
head = e;
target.checkImage(image, width, height, e);
}
public boolean checkAll()
{
return checkAll(false);
}
public boolean checkAll(boolean load)
{
MediaEntry e = head;
boolean result = true;
while (e != null)
{
if ((e.status & COMPLETE) == 0)
{
if (load)
{
result = false;
if (e.status == 0)
{
target.prepareImage(e.image, e);
e.status = LOADING;
}
}
else
return false;
}
e = e.next;
}
return result;
}
public boolean isErrorAny()
{
MediaEntry e = head;
while (e != null)
{
if ((e.status & ERRORED) != 0)
return true;
e = e.next;
}
return false;
}
public Object[] getErrorsAny()
{
MediaEntry e = head;
ArrayList result = null;
while (e != null)
{
if ((e.status & ERRORED) != 0)
{
if (result == null)
result = new ArrayList();
result.add(e.image);
}
e = e.next;
}
if (result == null)
return null;
else
return result.toArray();
}
public void waitForAll() throws InterruptedException
{
synchronized (this)
{
while (checkAll(true) == false)
wait();
}
}
public boolean waitForAll(long ms) throws InterruptedException
{
long start = System.currentTimeMillis();
synchronized (this)
{
while (!checkAll(true))
wait(ms);
}
if ((System.currentTimeMillis() - start) < ms)
return true;
else
return false;
}
public int statusAll(boolean load)
{
int result = 0;
MediaEntry e = head;
while (e != null)
{
if (load && e.status == 0)
{
target.prepareImage(e.image, e);
e.status = LOADING;
}
result |= e.status;
e = e.next;
}
return result;
}
public boolean checkID(int id)
{
return checkID(id, false);
}
public boolean checkID(int id, boolean load)
{
MediaEntry e = head;
boolean result = true;
while (e != null)
{
if (e.id == id && ((e.status & COMPLETE) == 0))
{
if (load)
{
result = false;
if (e.status == 0)
{
target.prepareImage(e.image, e);
e.status = LOADING;
}
}
else
return false;
}
e = e.next;
}
return result;
}
public boolean isErrorID(int id)
{
MediaEntry e = head;
while (e != null)
{
if (e.id == id && ((e.status & ERRORED) != 0))
return true;
e = e.next;
}
return false;
}
public Object[] getErrorsID(int id)
{
MediaEntry e = head;
ArrayList result = null;
while (e != null)
{
if (e.id == id && ((e.status & ERRORED) != 0))
{
if (result == null)
result = new ArrayList();
result.add(e.image);
}
e = e.next;
}
if (result == null)
return null;
else
return result.toArray();
}
public void waitForID(int id) throws InterruptedException
{
MediaEntry e = head;
synchronized (this)
{
while (checkID (id, true) == false)
wait();
}
}
public boolean waitForID(int id, long ms) throws InterruptedException
{
MediaEntry e = head;
long start = System.currentTimeMillis();
synchronized (this)
{
while (checkID (id, true) == false)
wait(ms);
}
if ((System.currentTimeMillis() - start) < ms)
return true;
else
return false;
}
public int statusID(int id, boolean load)
{
int result = 0;
MediaEntry e = head;
while (e != null)
{
if (e.id == id)
{
if (load && e.status == 0)
{
target.prepareImage(e.image, e);
e.status = LOADING;
}
result |= e.status;
}
e = e.next;
}
return result;
}
public void removeImage(Image image)
{
MediaEntry e = head;
MediaEntry prev = null;
while (e != null)
{
if (e.image == image)
{
if (prev == null)
head = e.next;
else
prev.next = e.next;
}
prev = e;
e = e.next;
}
}
public void removeImage(Image image, int id)
{
MediaEntry e = head;
MediaEntry prev = null;
while (e != null)
{
if (e.id == id && e.image == image)
{
if (prev == null)
head = e.next;
else
prev.next = e.next;
}
else
prev = e;
e = e.next;
}
}
public void removeImage(Image image, int id, int width, int height)
{
MediaEntry e = head;
MediaEntry prev = null;
while (e != null)
{
if (e.id == id && e.image == image
&& e.width == width && e.height == height)
{
if (prev == null)
head = e.next;
else
prev.next = e.next;
}
else
prev = e;
e = e.next;
}
}
}