/* File.......: MyApplet.java
   Author.....: Michael Thomas 03/24/99, ver 1.0 - 03/24/99
                      
   Compile....: javac MyApplet.java -d bin

   Run Browser: MyApplet.html
   Run JDK....: appletviewer MyApplet.html

*/

import java.applet.Applet;  //needed for: extends Applet
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseEvent;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Point;
import java.awt.Button;
import java.awt.Frame;
import java.awt.BorderLayout;

//***********************************************************************
public class MyApplet extends Applet implements MouseListener,
                                                MouseMotionListener,
                                                ActionListener
//***********************************************************************
{
  static private int intClassMain    = 0;
  static private int intClassInit    = 0;
  static private int intClassDestroy = 0;
  static private int intClassStart   = 0;
  static private int intClassStop    = 0;

  private boolean blnLoadHtmlParms = true;
  
  private int intInit     = 0;
  private int intStart    = 0;
  private int intStop     = 0;
  private int intRepaint  = 0;
  private int intUpdate   = 0;
  private int intPaint    = 0;

  private String strFirst;
  private String strMiddle;
  private String strLast;
  
  private final int RADIUS = 7;
  private int intPosX = 0;
  private int intPosY = 0;

  private Point clickPoint = null;
  private MouseEvent mouseEvent = null;
  private Button butClear;

  private boolean bClearScreen = false;

//-----------------------------------------------------------------------
  public void init() {
//-----------------------------------------------------------------------  
  
    setBackground( Color.white );

    intInit++;
    intClassInit++;
    
    if ( this.blnLoadHtmlParms ) {
      this.strFirst  = this.getParameter( "First" );  
      this.strMiddle = this.getParameter( "Middle" );  
      this.strLast   = this.getParameter( "Last" );
    } else {
      this.strFirst  = "n/a";  
      this.strMiddle = "n/a"; 
      this.strLast   = "n/a";
    }
    
    this.addMouseListener(this);        //Activates MouseListener
    this.addMouseMotionListener(this);  //Activates MouseMotionListener

    butClear = new Button("Clear Screen");
      butClear.addActionListener( this );
      add( butClear );
  }

//-----------------------------------------------------------------------
  public void paint(Graphics g) {
//-----------------------------------------------------------------------  

    setBackground( Color.white );

    intPaint++;

    if (clickPoint != null)
    {
      g.fillOval(clickPoint.x - RADIUS,   //Draws a circle on the screen!
                 clickPoint.y - RADIUS,
                 RADIUS * 2, RADIUS * 2);
      clickPoint = null;
    }

    intPosX = 15; intPosY = 0;

    g.drawString("Class's main() called:  " +
                 intClassMain, intPosX, intPosY += 15 );
    g.drawString("Class's init() called:  " +
                 intClassInit, intPosX, intPosY += 15 );
    g.drawString("Class's start() called:  " +
                 intClassStart, intPosX, intPosY += 15 );
    g.drawString("Class's stop() called:  " +
                 intClassStop, intPosX, intPosY += 15 );
    g.drawString("Class's destroy() called:  " +
                 intClassDestroy, intPosX, intPosY += 15 );

    intPosY += 15;

    g.drawString("Applet's init() called:  " +
                 intInit, intPosX, intPosY += 15 );
    g.drawString("Applet's start() called:  " +
                 intStart, intPosX, intPosY += 15 );
    g.drawString("Applet's stop() called:  " +
                 intStop, intPosX, intPosY += 15 );
    g.drawString("Applet's repaint() called:  " +
                 intRepaint, intPosX, intPosY += 15 );
    g.drawString("Applet's update() called:  " +
                 intUpdate, intPosX, intPosY += 15 );
    g.drawString("Applet's paint() called:  " +
                 intPaint, intPosX, intPosY += 15 );
    
    intPosY += 15;
    
    g.drawString("HTML Parm First:  " +
                 strFirst, intPosX, intPosY += 15 );
    g.drawString("HTML Parm Middle:  " +
                 strMiddle, intPosX, intPosY += 15 );
    g.drawString("HTML Parm Last:  " +
                 strLast, intPosX, intPosY += 15 );    

  } //paint()

//-----------------------------------------------------------------------
  public void update(Graphics g)  {
//-----------------------------------------------------------------------
    
    intUpdate++;
    g.clearRect(0, 0, 200, this.getSize().height );  //Clear word area.

    if ( bClearScreen )
    { g.clearRect(0, 0, this.getSize().width, this.getSize().height );
      bClearScreen = false;
    }

    paint( g );

  } //update()

//-----------------------------------------------------------------------
  public void repaint()  {
//-----------------------------------------------------------------------
    
    //Normally this method is not overridden.  I overrode this method
    //  to show the difference in the calls to repaint() and the calls
    //  to update.  The super.repaint() is an asynchronous operation that
    //  is queued to be run.
    //Note:  The repaint() method has 4 overloaded methods.  You can repaint
    //  part of a screen.  You can also specify that the call to update()
    //  must occur in so many milliseconds.

    intRepaint++;
    super.repaint();
  }

//-----------------------------------------------------------------------
  public void start()  {
//-----------------------------------------------------------------------
    
    intStart++;
    intClassStart++;
    super.start();
  }
  
//-----------------------------------------------------------------------
  public void stop()  {
//-----------------------------------------------------------------------
    
    intStop++;
    intClassStop++;
    super.stop();
  }

//-----------------------------------------------------------------------
  public void destroy()  {
//-----------------------------------------------------------------------
    intClassDestroy++;
    super.destroy();
  }

//-----------------------------------------------------------------------
  public void actionPerformed(ActionEvent e)  { //MouseListener
//-----------------------------------------------------------------------
    
    bClearScreen = true;  //Used in update() to clear the screen.
    repaint();
  }
//-----------------------------------------------------------------------
  public void mousePressed(MouseEvent event) { //MouseListener
//-----------------------------------------------------------------------
    //This method is called the mouse button has been pressed.

    mouseEvent = event;
    clickPoint = event.getPoint();   //Store for the Circle!
    repaint();
  }

//-----------------------------------------------------------------------
  public void mouseClicked(MouseEvent event) {} //MouseListener
//-----------------------------------------------------------------------
  
//-----------------------------------------------------------------------
  public void mouseReleased(MouseEvent event) {} //MouseListener
//-----------------------------------------------------------------------

//-----------------------------------------------------------------------
  public void mouseEntered(MouseEvent event) {} //MouseListener
//-----------------------------------------------------------------------
  
//-----------------------------------------------------------------------
  public void mouseExited(MouseEvent event) {} //MouseListener
//-----------------------------------------------------------------------

//-----------------------------------------------------------------------
  public void mouseDragged(MouseEvent event)  { //MouseMotionListener
//-----------------------------------------------------------------------
    
    mouseEvent = event;
    clickPoint = event.getPoint();       //Store for the Circle!
    repaint();
  }

//-----------------------------------------------------------------------
  public void mouseMoved(MouseEvent event)  {} //MouseMotionListener
//-----------------------------------------------------------------------

//-----------------------------------------------------------------------
  public static void main( String args [] ) {
//-----------------------------------------------------------------------
    
    //1. This applet can be run as an application!!!
    //2. main() is not run if the Browser is running this Applet.

    intClassMain++;

    Frame app = new Frame( "Application - MyApplet" );  
    app.setSize( 760, 300);                         //set Frame: width, height

    app.addWindowListener(      //Register an anonymous class as a listener.
         new WindowAdapter() {
            public void windowClosing( WindowEvent e ) 
            {  
               System.exit( 0 );
            }
         }
    );
    
    MyApplet applet = new MyApplet();         //create the applet.
    applet.blnLoadHtmlParms = false;          //Don't get HTML parms because run as an Application.
    applet.init();                            //initialize applet.
    applet.start();                           //start applet.

    app.add( applet, BorderLayout.CENTER );   //add applet to center of frame.
    app.setVisible( true );                   //Make frame visible.

  } //main()

} //class MyApplet
