// Film, [ErlReh] S.216
// Film.java

import java.applet.*;
import java.awt.*;

public class Film1 extends Applet implements Runnable
{
Thread m_Film = null;

private Graphics m_Graphics;
private Image m_Images[];
private int m_nCurrImage;	// Index
private int m_nImgWidth = 0;
private int m_nImgHeight = 0;
private boolean m_fAllLoaded = false;

private String m_film = "tumble/T";
private String m_ext = "gif";
private int m_bps = 4;
private int m_von = 1;
private int m_bis = 20;


private final String PARAM_film = "film";
private final String PARAM_ext = "ext";
private final String PARAM_bps = "bps";
private final String PARAM_von = "von";
private final String PARAM_bis = "bis";

public String [][] getParameterInfo()
  {
  String [][] info = {
	{ "Parametername","Interner Typ","Bedeutung" },
	{ PARAM_film, "String", "Präfix der Bilddateien" },
	{ PARAM_ext, "String", "Suffix (GIF oder JPG)" }, 
	{ PARAM_bps, "int", "Bilder pro Sekunde" },
	{ PARAM_von, "int", "Erstes Bild" },
	{ PARAM_bis, "int", "Letztes Bild" }
	};
  return info;
  }

public String getAppletInfo()
  {
  return "Ein Beispiel-Applet zur Animation. r\n";
  }

public void init()
  {
  String param;
  param = getParameter (PARAM_film);
  if (param != null)
	m_film = param;
  param = getParameter (PARAM_ext);
  if (param != null)
	m_ext = param;
  param = getParameter (PARAM_bps);
  if (param != null)
	m_bps = Integer.parseInt(param);
  param = getParameter (PARAM_von);
  if (param != null)
	m_von = Integer.parseInt(param);
  param = getParameter (PARAM_bis);
  if (param != null)
	m_bis = Integer.parseInt(param);
  }

private void displayImage(Graphics g)
  {
  if (!m_fAllLoaded)
      return;
  g.drawImage(m_Images[m_nCurrImage], 
	(size().width-m_nImgWidth) / 2,
	(size().height -m_nImgHeight) / 2,
	null);
  }

public void paint (Graphics g)
  {
  if (m_fAllLoaded)
     {
     Rectangle r = g.getClipRect();
     g.clearRect(r.x,r.y,r.width,r.height);
     displayImage(g);
     }
  else
    g.drawString("Bilder werden geladen...", 10,20);
  }

public void start()
  {
if (m_Film == null)
    {
    m_Film = new Thread (this);
    m_Film.start();
    }
  }

public void stop()
  {
if (m_Film != null)
    {
    m_Film.stop();
    m_Film = null;
    }
  }

public void run ()
  {
  m_nCurrImage = 0;
  if (!m_fAllLoaded)
    {
    repaint();
    m_Graphics = getGraphics();
    m_Images = new Image[m_bis - m_von +1];
    MediaTracker tracker = new MediaTracker (this);
    String strImage;
    for (int i = m_von; i <= m_bis; i++)
	{
	strImage = m_film + i + "." + m_ext;
	System.out.println("Bild: = " + strImage);
	m_Images[i - m_von] = getImage(getDocumentBase(), strImage);
 	tracker.addImage(m_Images[i-m_von], 0);
	}
    try
	{
	tracker.waitForAll();
	m_fAllLoaded =!tracker.isErrorAny();
	}
    catch (InterruptedException e)
	{
	}
    if (!m_fAllLoaded)
	{
	stop();
	m_Graphics.drawString ("Ladefehler", 10,40);
	return;
	}
    m_nImgWidth = m_Images[0].getWidth(this);
    m_nImgHeight = m_Images[0].getHeight(this);
    }
  repaint();

  while (true)
    {
    try
	{
	displayImage(m_Graphics);
	m_nCurrImage++;
	if (m_nCurrImage == m_bis - m_von +1)
	  m_nCurrImage = 0;
	Thread.sleep (10000/m_bps);
	}
    catch (InterruptedException e)
	{
	stop();
	}
    }
  }
}
