
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

/**
 * A SimpleTrackMousePanel is a panel that displays information about mouse
 * events on the panel, including the type of event, the position of the mouse,
 * a list of modifier keys that were down when the event occurred, and an indication
 * of which mouse button was involved, if any.
 * @author David J. Eck
 */
public class SimpleTrackMouse extends JPanel {

    public static void main(String[] args) {
        JFrame window = new JFrame("Click Me to Redraw");
        SimpleTrackMouse content = new SimpleTrackMouse();
        window.setContentPane(content);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setLocation(120,70);
        window.setSize(450,350);
        window.setVisible(true);
    }

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

    private String eventType = null;     // If non-null, gives the type of the most recent mouse event.
    private String modifierKeys = "";    // If non-empty, gives special keys that are held down.
    private String button = "";          // Information about which mouse button was used.
    private int mouseX, mouseY;          // Position of mouse (at most recent mouse event).


    /**
     * Constructor creates a mouse listener object and sets it to listen for
     * mouse events and mouse motion events on the panel.
     */
    public SimpleTrackMouse() { 
            // Set background color and arrange for the panel to listen for mouse events.
        setBackground(Color.WHITE);
        MouseHandler listener = new MouseHandler();
        addMouseListener(listener);        // Register mouse listener.
        addMouseMotionListener(listener);  // Register mouse motion listener.
    }


    /**
     * Records information about a mouse event on the panel.  This method is called
     * by the mouse handler object whenever a mouse event occurs.
     * @param evt the MouseEvent object for the event.
     * @param eventType a description of the type of event, such as "mousePressed".
     */
    private void setInfo(MouseEvent evt, String eventType) {
        this.eventType = eventType;
        mouseX = evt.getX();
        mouseY = evt.getY();
        modifierKeys = "";
        if (evt.isShiftDown())
            modifierKeys += "Shift  ";
        if (evt.isControlDown())
            modifierKeys += "Control  ";
        if (evt.isMetaDown())
            modifierKeys += "Meta  ";
        if (evt.isAltDown())
            modifierKeys += "Alt";
        switch ( evt.getButton() ) {
        case MouseEvent.BUTTON1:
            button = "Left";
            break;
        case MouseEvent.BUTTON2:
            button = "Middle";
            break;
        case MouseEvent.BUTTON3:
            button = "Right";
            break;
        default:
            button = "";
        }
        repaint();
    }


    /**
     * The paintComponent() method displays information about the most recent
     * mouse event on the panel (as set by the setInfo() method).
     */
    public void paintComponent(Graphics g) {

        super.paintComponent(g);  // Fills panel with background color.

        if (eventType == null) {
                // If eventType is null, no mouse event has yet occurred 
                // on the panel, so don't display any information.
            return;
        }

        g.setColor(Color.RED);  // Display information about the mouse event.
        g.drawString("Mouse event type:  " + eventType, 6, 18);
        if (modifierKeys.length() > 0)
            g.drawString("Modifier keys:  " + modifierKeys, 6, 38);
        else
            g.drawString("Modifier keys:  None", 6, 38);
        if (button.length() > 0)
            g.drawString("Button used:  " + button, 6, 58);
        g.setColor(Color.BLACK);
        g.drawString("(" + mouseX + "," + mouseY + ")", mouseX, mouseY);

    }  


    /**
     * An object belonging to class MouseHandler listens for mouse events
     * on the panel.  (Listening is set up in the constructor for the
     * SimpleTrackMousePanel class.)  When a mouse event occurs, the listener
     * simply calls the setInfo() method in the SimpleMouseTrackPanel class
     * with information about the mouse event that has occurred.
     */
    private class MouseHandler implements MouseListener, MouseMotionListener {

        public void mousePressed(MouseEvent evt) {
            setInfo(evt, "mousePressed");
        }

        public void mouseReleased(MouseEvent evt) {
            setInfo(evt, "mouseReleased");
        }

        public void mouseClicked(MouseEvent evt) {
            setInfo(evt, "mouseClicked");
        }

        public void mouseEntered(MouseEvent evt) {
            setInfo(evt, "mouseEntered");
        }

        public void mouseExited(MouseEvent evt) {
            setInfo(evt, "mouseExited");
        }

        public void mouseMoved(MouseEvent evt) {
            setInfo(evt, "mouseMoved");
        }

        public void mouseDragged(MouseEvent evt) {
            setInfo(evt, "mouseDragged");
        }

    }  // end nested class MouseHandler

}  // end of class SimpleMouseTracker

