//
// $Source: /nfs/elm/d3/home/cur/djb1/java/javat/RCS/ImageTracker.java,v $
//
// $Id: ImageTracker.java,v 1.1 1997/06/23 17:04:34 djb1 Exp $
//
// Track loading of a set of Images, notifying when images are done
//
// (C) Copyright 1997 Dave Beckett <D.J.Beckett@ukc.ac.uk>
// University of Kent at Canterbury
//

import java.awt.Component;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.image.ImageObserver;


public class ImageTracker implements Runnable 
{
  private ImageArrival ia;
  private Thread my_thread;
  private MediaTracker tracker;
  private Image[] images;
  private boolean[] imagesLoaded;
  private int nImages;
  private int imagesLoadedCount;
  
  public ImageTracker (Image[] images, Component comp, ImageArrival ia) 
  {
    this.images=images;
    this.ia=ia;
    
    tracker=new MediaTracker(comp);
    
    nImages=images.length;
    
    imagesLoadedCount=0;
    imagesLoaded=new boolean[nImages];
    for (int i=0; i<nImages; i++) {
      imagesLoaded[i]=false;
      tracker.addImage(images[i], i);
    }

    my_thread=new Thread(this, "ImageTracker");
    
    // Start my thread (tracker handler)
    my_thread.start();
  }
  
  
  public void run() 
  {
    boolean running=true;
    
    while(running && my_thread != null) {
      imagesLoadedCount=0;
      for (int i=0; i<nImages; i++) {
	if (!imagesLoaded[i]) {
	  try {
	    tracker.waitForID(i);
	    imagesLoaded[i]=true;
	    ia.imageLoaded(i);
	  }
	  catch (InterruptedException e)
	    {
	      running=false;
	      break;
	    }
	}
	if (imagesLoaded[i]) {
	  imagesLoadedCount++;
	}
      }
      
      if (imagesLoadedCount == nImages) {
	ia.allImagesLoaded();
	// kill myself
	my_thread=null;
      } else {
	try 
	  {
	    Thread.sleep(100);
	  }
	catch (InterruptedException e)
	  {
	    break;
	  }
      }
      
    }
  } // while
}


