/* File.......: MyMouse.java
   Author.....: Michael Thomas 03/10/99, ver 1.0 - 03/12/99
                      
   Compile....: javac MyMouse.java -d bin

   Run Browser: MyMouse.html
   Run JDK....: appletviewer MyMouse.html

*/

import java.applet.Applet;  //needed for: extends Applet
import java.awt.Graphics;   //needed for: paint(Graphics g)
import java.awt.Color;      //needed for: Color
import java.awt.*;
import java.awt.event.*;

//***********************************************************************
public class MyMouse extends Applet implements MouseListener,
                                               MouseMotionListener
//***********************************************************************
{ //Note:  The adapter for MouseListener is MouseAdapter.
  //       The adapter for MouseMotionListener is MouseMotionAdapter.

  private static final int RADIUS = 7;
  private String [] strMessage;
  private int intIndex;
  private int intPosX = 0;
  private int intPosY = 0;

  private Point clickPoint = null;
  private MouseEvent mouseEvent = null;

  private boolean bMoved = false;
  private int intMoved = 0;

  private boolean bDragged = false;
  private int intDragged = 0;

  private String strWhichButton;

  public void init()
  {  addMouseListener(this);        //Activates MouseListener
     addMouseMotionListener(this);  //Activates MouseMotionListener

     InitButtonTrail();
     showStatus("Started MyMouse");
  }

//-----------------------------------------------------------------------
  public void paint(Graphics g)
  { setBackground( Color.white );
    //Note: Component.getSize()

    if (clickPoint != null)
      g.fillOval(clickPoint.x - RADIUS,   //Draws a circle on the screen!
                 clickPoint.y - RADIUS,
                 RADIUS * 2, RADIUS * 2);

    intPosX = 150; // getSize().width - 275; 
    intPosY = 0;

    if ( mouseEvent != null ) {

      g.drawString( "Mouse Position: "+ mouseEvent.getPoint(), //Point.toString() called!
                     intPosX, intPosY += 15 );
      g.drawString( "Mouse Clicks: "+ mouseEvent.getClickCount(), 
                     intPosX, intPosY += 15 );

      //Mouse Buttons: Center Button - Alt Key & left button
      //               Right  Button - Ctrl (Meta) key & left button.
      g.drawString( "Mouse Button: "+ strWhichButton, 
                     intPosX, intPosY += 15 );

    }

    if ( bMoved ) {
      g.drawString( "mouseMoved(): " + Twirl("mouseMoved"),
                    intPosX, intPosY += 15 );
      bMoved = false;
    }

    if ( bDragged ) {
      g.drawString( "mouseDragged(): " + Twirl("mouseDragged"),
                    intPosX, intPosY += 15 );
      bDragged = false;
    }

    intPosX = 5; 
    intPosY = 0;
    for (int intX = 0; intX < strMessage.length; intX++ )
      if ( strMessage[intX] == null )
        break;
      else
       g.drawString( strMessage[intX],  intPosX, intPosY += 15);

  } //paint()
//-----------------------------------------------------------------------
  private char Twirl( String strMode )
  { int intPos = 0;
    char cReturn = ' ';

    intPos = ( strMode == "mouseMoved" ? intMoved : intDragged );
    intPos++;

    switch(intPos) {
    case 1:
      cReturn = '|'; break;
    case 2:
      cReturn = '/'; break;
    case 3:
      cReturn = '-'; break;
    case 4:
      cReturn = '\\'; break;
    default:
      cReturn = '|';
      intPos = 1; break;
    }

    if ( strMode == "mouseMoved" )
      intMoved = intPos;  //Keep track of position.
    else
      intDragged = intPos;  //Keep track of position.
     
  return cReturn;
}
//-----------------------------------------------------------------------
  public void mousePressed(MouseEvent event)  //MouseListener
  { //This method is called the mouse button has been pressed.

    mouseEvent = event;
    strWhichButton = WhichButton();  

    InitButtonTrail();
    ButtonTrail("mousePressed");

    clickPoint = event.getPoint();       //Store for the Circle!
    repaint();
  }

//-----------------------------------------------------------------------
  public void mouseClicked(MouseEvent event)  //MouseListener
  { //This method is called whenever a mouse button is clicked.
    //(click = follows a press & release, if the mouse is not moved!)

    mouseEvent = event;
    strWhichButton = WhichButton();

    ButtonTrail("mouseClicked");

    repaint();
  }
//-----------------------------------------------------------------------
  public void mouseReleased(MouseEvent event)  //MouseListener
  { //This method is called whenever a mouse button has been released.

    mouseEvent = event;
    strWhichButton = WhichButton();  

    ButtonTrail("mouseReleased");

    repaint();
  }
//-----------------------------------------------------------------------
  public void mouseEntered(MouseEvent event)  //MouseListener
  { //This method is called whenever the mouse enters the component.

    mouseEvent = event;
    strWhichButton = "";  

    ButtonTrail("mouseEntered");

    repaint();
  }
//-----------------------------------------------------------------------
  public void mouseExited(MouseEvent event)  //MouseListener
  { //This method is called whenever the mouse pointer leaves the component.

    mouseEvent = event;
    strWhichButton = "";  

    ButtonTrail("mouseExited");

    repaint();
  }

//-----------------------------------------------------------------------
  public void mouseDragged(MouseEvent event)  //MouseMotionListener
  { //This method is constantly called whenever the mouse is pressed
    //inside the component implementing the MouseMotionListener and then
    //is dragged.  While dragging, the mouse may exit the component and
    //this method is still called!

    mouseEvent = event;
    strWhichButton = WhichButton();

    clickPoint = event.getPoint();       //Store for the Circle!
    bDragged = true;
    repaint();
  }

//-----------------------------------------------------------------------
  public void mouseMoved(MouseEvent event)  //MouseMotionListener
  { //This method is constantly called whenever the mouse is moved
    //while the mouse is on the component implementing MouseMotionListener.

    mouseEvent = event;
    strWhichButton = "";

    bMoved = true;
    repaint();
  }

//-----------------------------------------------------------------------
  private String WhichButton()
  {
    String strReturn = "";

    //MouseEvent extends InputEvent which has these methods.
    if ( mouseEvent.isShiftDown() )
      strReturn = ( mouseEvent.isMetaDown() ? "Shift + (Right)" :
                                              "Shift + (Left)");
    else if ( mouseEvent.isControlDown() )
      strReturn = ( mouseEvent.isMetaDown() ? "Ctrl + (Right)" :
                                              "Ctrl + (Left)");
    else if ( mouseEvent.isAltDown() )
      strReturn = ( mouseEvent.isMetaDown() ? "Alt + (Right)" :
                                              "Alt + (Left) also (center)");
    else if ( mouseEvent.isMetaDown() )
      strReturn = "(right) also Meta + (Left) ";  //I don't know what a Meta key is.
    else
      strReturn = "(left)";

    return strReturn;
  }

//-----------------------------------------------------------------------
  void ButtonTrail(String strMsg)
  {
    if ( intIndex < strMessage.length - 1 )
      strMessage[intIndex] = strMsg;
    else
      {InitButtonTrail();
       strMessage[intIndex] = strMsg;
      }
    intIndex++;

  }

//-----------------------------------------------------------------------
  void InitButtonTrail()
  { intIndex = 0; strMessage = new String[10];}

} //class MyMouse





