// Program: scrollerv.java
// Purpose: This program implements a vertical scroller.
// Author : Chunyen Liu
// Date   : 1998/12/21
// Note   : All rights reverved by the author

import java.awt.Graphics;
import java.awt.Font;
import java.awt.Color;
import java.awt.Image;
import java.applet.*;

public class scrollerv extends Applet implements Runnable 
   {
   // general setup
   Thread t = null;
   boolean suspended = false;
   Image oi;
   Graphics og;
   int x = 0, y = 0;
   int width = 0, height = 0;
   int sw, sh, sd;

   // input params 
   int nlines, id = 0;
   String [] message;
   String font = "Helvetica";
   int fontSize = 12;
   int step = 8, delay = 50;
   int backR = 0, backG = 255, backB = 0;
   int foreR = 255, foreG = 255, foreB = 255;

   public void init()
      {
      // get all params
      nlines = Integer.parseInt(getParameter("nlines"));
      message = new String[nlines];
      for (int i = 0; i < nlines; i++)
         message[i] = getParameter("message" + (i+1));
      font = getParameter("font");
      fontSize = Integer.parseInt(getParameter("fontsize"));
      step = Integer.parseInt(getParameter("step"));
      delay = Integer.parseInt(getParameter("delay"));
      backR = Integer.parseInt(getParameter("backgroundr"));
      backG = Integer.parseInt(getParameter("backgroundg"));
      backB = Integer.parseInt(getParameter("backgroundb"));
      foreR = Integer.parseInt(getParameter("foregroundr"));
      foreG = Integer.parseInt(getParameter("foregroundg"));
      foreB = Integer.parseInt(getParameter("foregroundb"));

      // set up applet size and double buffering
      width = size().width;
      height = size().height;
      resize(width, height);
      oi = createImage(width, height);
      og = oi.getGraphics();
      } 

   public void start()
      {
      if (t == null)
         {
         t = new Thread(this);
         t.start();
         }
      }

   public void stop()
      {
      if (t != null && t.isAlive())
         t.stop();
      t = null;
      }

   public void run()
      {
      Thread.currentThread().setPriority(Thread.NORM_PRIORITY - 1);
      while (true)
         {
         repaint();
         y -= step;
         if (y < -sh )
            {
            y = height;
            id = (id + 1 + nlines) % nlines;
            }
         try
            {
            Thread.sleep(delay);
            }
         catch (InterruptedException e) {}
         }
      }

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

   public void paint(Graphics g)
      {
      og.setFont(new Font(font, Font.BOLD, fontSize));
      og.setColor(new Color(backR, backG, backB));
      og.fillRect(0, 0, width - 1, height -1);
      og.setColor(new Color(foreR, foreG, foreB));
      og.drawRect(0, 0, width - 1, height -1);

      sw = (og.getFontMetrics()).stringWidth(message[id]);
      sh = (og.getFontMetrics()).getHeight();
      sd = (og.getFontMetrics()).getDescent();
      x = (width - sw) / 2;

      og.setColor(Color.black);
      og.drawString(message[id], x + 1, y + 1);
      og.setColor(new Color(foreR, foreG, foreB));
      og.drawString(message[id], x, y);
      g.drawImage(oi, 0, 0, this);
      }

   // use mouse to toggle animation
   public boolean mouseDown(java.awt.Event evt, int x, int y)
      {
      if (suspended)
         {
         t.resume();
         }
      else
         {
         t.suspend();
         }
      suspended = !suspended;
      return true;
      }
   }
