// (C) Copyright Jack Culpepper 1997
// This code may not be distributed without permission.
package gestalt;

import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import gestalt.Slave;

public class SlaveApplet extends Applet implements Runnable {
  protected Font font;
  protected String hostname;
  protected Graphics graphics;
  protected Slave slave;
  protected URL codebase;
  protected Image[] images;
  protected Image error;
  protected Image disconnected;
  protected static final int num_images = 10;
  protected Thread runner;
  protected int frame = 0;

  // one-time initialization for the applet
  public void init() {
    // create a font to display text with
    font = new Font( "Helvetica", Font.BOLD, 24 );

    // grab the codebase host's name
    codebase = this.getCodeBase();
    hostname = codebase.getHost();

    // grab and save off the graphics object
    graphics = getGraphics();

    // read in error images
    error = this.getImage( codebase, "images/gpn-banner-error.jpg" );
    disconnected = this.getImage( codebase,
      "images/gpn-banner-disconnected.jpg" );

    // read in the images I want to show
    images = new Image[ num_images ];
    System.out.print( "Loading: " );
    for ( int i = 0 ; i < images.length ; i++ ) {
      images[ i ] = this.getImage( codebase,
        "images/gpn-bannerb" + i + ".jpg" );
      System.out.print( "." );
      System.out.flush();
    }

    System.out.println( " Done." );

    GridLayout grid = new GridLayout( 1, 1 );

    this.setLayout( grid );
  }

  // called when the applet needs to be drawn
  public void paint( Graphics g ) {
    if ( slave != null && slave.isAlive() ) {
      if ( slave.connected ) {
        g.drawImage( images[ frame ], 0, 0, this );
      }
      else {
        g.drawImage( disconnected, 0, 0, this );
      }
    }
    else {
      g.drawImage( error, 0, 0, this );
    }
  }

  public void update( Graphics g ) {
    paint( g );
  }

  public void run() {
    while ( true ) {
      if ( slave.isAlive() && slave.connected ) {
        try {
          for ( ; frame < images.length ; frame++ ) {
            update( graphics );
            runner.sleep( 100 );
          }
          for ( frame-- ; frame >= 0 ; frame-- ) {
            update( graphics );
            runner.sleep( 100 );
          }
          frame++;
          runner.sleep( 500 );
        }
        catch ( InterruptedException e ) {

        }
      }
      else {
        frame = 0;
        update( graphics );
        try {
          runner.sleep( 500 );
        }
        catch ( InterruptedException e ) {

        }
      }
    }
  }

  public void start() {
    if ( slave == null ) {
      slave = new Slave( hostname );
    }
    if ( runner == null ) {
      runner = new Thread( this );
      runner.start();
    }
  }

  public void stop() {
    if ( slave != null ) {
      slave.stop();
      slave = null;
    }
    if ( runner != null ) {
      runner.stop();
      runner = null;
    }
  }
}

