/* 
 * Copyright (c) 1999-2002, Xiaoping Jia.  
 * All Rights Reserved. 
 */

import java.awt.*;
import javax.swing.JApplet;

/**
 *  An applet that displays a text banner that moves horizontally from right to left. 
 *  When the banner moves completely off the left end of the viewing area, 
 *  it reappears at the right end
 */
public class ScrollingBanner
        extends JApplet implements Runnable {

  protected Thread bannerThread;
  protected String text;
  protected Font font = new java.awt.Font("Sans serif", Font.BOLD, 24);    
  protected int x, y;
  protected int delay = 100;
  protected int offset = 1;
  protected Dimension d;

  public void init() {
    // get parameters "delay" and "text"
    String att = getParameter("delay");
    if (att != null) {
      delay = Integer.parseInt(att);
    }
    att = getParameter("text");
    if (att != null) {
      text = att;
    } else {
      text = "JApplet scrolling banner.";
    }

    // set initial position of the text
    d = getSize();
    x = d.width;
    y = font.getSize();
  }


  public void paint(Graphics g) {
    // get the font metrics to determine the length of the text
    g.setFont(font);
    FontMetrics fm = g.getFontMetrics();
    int length = fm.stringWidth(text);

    // adjust the position of text from the previous frame
    x -= offset;

    // if the text is completely off to the left end
    // move the position back to the right end
    if (x < -length)
      x = d.width;

    // set the pen color and draw the background
    g.setColor(Color.black);
    g.fillRect(0,0,d.width,d.height);

    // set the pen color, then draw the text
    g.setColor(Color.green);
    g.drawString(text, x, y);
  }

  public void start() {
    bannerThread = new Thread(this);
    bannerThread.start();
  }

  public void stop() {
    bannerThread = null;
  }

  public void run() {
    while (Thread.currentThread() == bannerThread) {
      try {
        Thread.currentThread().sleep(delay);
      }
      catch (InterruptedException e) {}
      repaint();
    }
  }

}
