/**
 MoveImage.java  20/08/99
 
 This class creates a movable image over existing
 image by dragging the image with the mouse
 **/
 
import java.applet.Applet;
import java.awt.Image;
import java.awt.image.*;
import java.awt.Graphics;
import java.awt.MediaTracker;
import java.util.StringTokenizer;
import java.util.Vector;

public class MoveImage extends Applet implements Runnable { 
   // The base image on which to move
   Image baseImage;
   
   // The list of movableImage objects
   MovableImage movImages[];
   
   // MediaTracker for loading and constructing the images
   MediaTracker tracker;
   
   // Create image using a filter
   Image makeImage(Image img, ImageFilter filter) {
      return createImage( new FilteredImageSource( img.getSource(), filter ));
      }
   
   // Add image to the tracker
   void addImage(Image img) {
      tracker.addImage(img, 1);
      }
   
   public void init() {   
      String s;
      tracker = new MediaTracker(this);
      try {
         baseImage = getImage(getDocumentBase(), getParameter("baseimg"));
         addImage(baseImage);
         tracker.waitForID(1);
         }
      catch (Exception e) {
         System.out.println("error processing: " + e);
         e.printStackTrace();
         }         
      Vector imgVec = new Vector();
      int num = 1;
      while (true) {
         MovableImage newImage;
         s = getParameter("movImg"+num);
         if (s == null) {
            break;
            } 
         else {
         try {
            int classend = s.indexOf(",");
            String name = s.substring(0, classend);
            newImage = (MovableImage) Class.forName(name).newInstance();
            s = s.substring(classend+1);
            int nameend = s.indexOf(",");
            String imgname = s.substring(0, nameend);
            Image tempimg = getImage(getDocumentBase(), imgname );
            addImage(tempimg);
            tracker.waitForID(1);
            s = s.substring(nameend+1);
            int w = tempimg.getWidth(this);
            int h = tempimg.getHeight(this);
            newImage.init(this, tempimg, w, h, s, baseImage.getWidth(this), baseImage.getHeight(this) );
            imgVec.addElement(newImage);
            } 
         catch (Exception e) {
            System.out.println("error processing: "+ e );
            e.printStackTrace();
            break;
            }
         }
         num++;
         }
      movImages = new MovableImage[imgVec.size()];
      imgVec.copyInto(movImages);
      }
      
   
   Thread MovImgThread;
   
   public void start() {
      if (MovImgThread == null) {
         MovImgThread = new Thread(this);
         MovImgThread.start();
         }
      }
      
   public void run() {
      repaint();
      }
      
   public void stop() {
      MovImgThread = null;
      }
      
   public void paint(Graphics g) {
      if (baseImage == null) { 
         return;
         }
      g.drawImage(baseImage, 0, 0, this);
      if (movImages != null) {
         for (int i=0; i<movImages.length; ++i) {
            movImages[i].drawimg(g);
            }
         }
      }
      
   public void update(Graphics g) {
      if (baseImage == null) { 
         return;
         }
      g.drawImage(baseImage, 0, 0, this);
      if (movImages != null) {
         for (int i=0; i<movImages.length; ++i) {
            movImages[i].drawimg(g);
            }
         }
      }
       
   public boolean mouseDown(java.awt.Event evt, int x, int y) {
      for (int i=0; i<movImages.length; i++) {
         movImages[i].press(x,y);
         }
      return true;
      }
      
   public boolean mouseDrag(java.awt.Event evt, int x, int y) {
      for (int i=0; i<movImages.length; i++) {
         movImages[i].dragged(x,y);
         }
      return true;
      }
      
   public boolean mouseUp(java.awt.Event evt, int x, int y) {
      for (int i=0; i<movImages.length; i++) {
         movImages[i].lift(x,y);
         }
      return true;
      }
      
   }
               
      
   
