//********************************************************************

// marquee.java

//********************************************************************



import java.applet.*;

import java.awt.Graphics;

import java.awt.Font;



//********************************************************************



public class marquee3 extends Applet implements Runnable

  {

    int width = 0;

    int height = 0;

    int length = 0;

    int delay = 0;



    int point_size = 10;

    String message = "Hello, Java!";

    String font_to_use = "TimesRoman";



    char char_array[];

    int offset_x[];

    int offset_y[];



    //----------------------------------------------------------------



    public void init()

      {

        String parameter;



        parameter = getParameter("MESSAGE");

        if (parameter != null)

          message = parameter;



        parameter = getParameter("FONT");

        if (parameter != null)

          font_to_use = parameter;



        parameter = getParameter("POINT_SIZE");

        if (parameter != null)

          point_size = Integer.parseInt(parameter);



        parameter = getParameter("DELAY");

        if (parameter != null)

          delay = Integer.parseInt(parameter);



        length = message.length();

        char_array = new char[length];

        message.getChars(0, length, char_array, 0);

        offset_x = new int[length];

        offset_y = new int[length];

      }



    //----------------------------------------------------------------



    public void start()

      {

        (new Thread(this)).start();

      }



    //----------------------------------------------------------------



    void get_defaults()

      {

        width = size().width;

        height = size().height;

      }



    //----------------------------------------------------------------



    public void re_draw()

      {

        repaint();



        try

          {

            Thread.sleep(delay);

          }

        catch (InterruptedException e)

          {

          }

      }



    //----------------------------------------------------------------



    public void run()

      {

        while (true)

          {

            //--------------------------------------------------------

            // Go up on the left side.

            //--------------------------------------------------------

            for (int y1 = height - point_size; y1 > point_size;

                y1 -= point_size)

              {

                int j = -1;



                for (int i = 0; i < length; i++)

                  {

                    if (y1 + i * point_size > height - point_size)

                      {

                        if (j < 0)

                          j = i;



                        offset_y[i] = height - point_size;

                        offset_x[i] = (i - j + 2) * point_size;

                      }

                    else

                      {

                        offset_y[i] = y1 + i * point_size;

                        offset_x[i] = point_size;

                      }

                  }



                re_draw();

              }



            //--------------------------------------------------------

            // Go right at the top.

            //--------------------------------------------------------

            for (int x1 = point_size; x1 < width; x1 += point_size)

              {

                int j = -1;



                for (int i = 0; i < length; i++)

                  {

                    if (x1 - i * point_size < point_size * 2)

                      {

                        if (j < 0)

                          j = i;



                        offset_y[i] = (i - j + 1) * point_size;

                        offset_x[i] = point_size;

                      }

                    else

                      {

                        offset_y[i] = point_size;

                        offset_x[i] = x1 - i * point_size;

                      }

                  }



                re_draw();

              }



            //--------------------------------------------------------

            // Go down on the right side.

            //--------------------------------------------------------

            for (int y1 = point_size * 2; y1 < height - point_size;

                 y1 += point_size)

              {

                int j = -1;



                for (int i = 0; i < length; i++)

                  {

                    if (y1 - i * point_size < point_size)

                      {

                        if (j < 0)

                          j = i;



                        offset_y[i] = point_size;

                        offset_x[i] = width - (i - j + 2) * point_size;

                      }

                    else

                      {

                        offset_y[i] = y1 - i * point_size;

                        offset_x[i] = width - point_size;

                      }

                  }



                re_draw();

              }



            //--------------------------------------------------------

            // Go left at the bottom.

            //--------------------------------------------------------

            for (int x1 = width - point_size; x1 > point_size;

                 x1 -= point_size)

              {

                int j = -1;



                for (int i = 0; i < length; i++)

                  {

                    if (x1 + i * point_size > width - point_size * 2)

                      {

                        if (j < 0)

                          j = i;



                        offset_y[i] = height - (i - j + 1) * point_size;

                        offset_x[i] = width - point_size;

                      }

                    else

                      {

                        offset_y[i] = height - point_size;

                        offset_x[i] = x1 + i * point_size;

                      }

                  }



                re_draw();

              }

          }

      }



    //----------------------------------------------------------------



    public void paint(Graphics g)

      {

        get_defaults();

        Font font = new Font(font_to_use, Font.PLAIN, point_size);

        g.setFont(font);



        for (int i = 0; i < message.length(); i++)

          g.drawChars(char_array, i, 1, offset_x[i], offset_y[i]);

      }

  }

