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

public class Example05 extends Applet
   implements MouseListener, MouseMotionListener {

   int x0, y0;    // coordinates of the upper-left corner of the box
   static final int boxWidth = 40;
   static final int boxHeight = 40;
   int mouse_x, mouse_y;  // most recently recorded mouse coordinates
   boolean isBoxBeingDragged = false;

   public void init() {
      setBackground( Color.black );

      x0 = getWidth() / 2 - boxWidth / 2;
      y0 = getHeight() / 2 - boxHeight / 2;

      addMouseListener( this );
      addMouseMotionListener( this );
   }

   public void mouseEntered( MouseEvent e ) { }
   public void mouseExited( MouseEvent e ) { }
   public void mouseClicked( MouseEvent e ) { }
   public void mousePressed( MouseEvent e ) {
      mouse_x = e.getX();
      mouse_y = e.getY();
      if (
         x0 <= mouse_x
         && mouse_x < x0+boxWidth
         && y0 <= mouse_y
         && mouse_y < y0+boxHeight
      ) {
         isBoxBeingDragged = true;
      }
      e.consume();
   }
   public void mouseReleased( MouseEvent e ) {
      isBoxBeingDragged = false;
      e.consume();
   }
   public void mouseMoved( MouseEvent e ) { }
   public void mouseDragged( MouseEvent e ) {
      int new_mouse_x = e.getX();
      int new_mouse_y = e.getY();
      if ( isBoxBeingDragged ) {
         // displace the box by the distance
         // the mouse moved since the last event
         x0 += new_mouse_x - mouse_x;
         y0 += new_mouse_y - mouse_y;

         repaint();
         e.consume();
      }
      mouse_x = new_mouse_x;
      mouse_y = new_mouse_y;
   }

   public void paint( Graphics g ) {
      g.setColor( Color.gray );
      g.fillRect( x0, y0, boxWidth, boxHeight );
   }
}

