import java.awt.*;

/** ButtonLikeListener derived from ImageButtonListener,
 * @version 1.0, Dec 19 1996
 * @author  David Geary
 *
 * @see     ButtonLike
 * @see     MomentaryButtonLikeListener
 * @see     SpringyButtonLikeListener
 * @see     StickyButtonLikeListener
 */

abstract public class ButtonLikeListener 
{
    protected ButtonLike ib = null;

    protected boolean button_armed = false;

    protected int clickCount = 0;

    abstract public void activate  (ButtonLike button);
    abstract public void arm       (ButtonLike button);
    abstract public void disarm    (ButtonLike button);

    ButtonLikeListener (ButtonLike ib) { this.ib = ib; }

    ButtonLikeListener () { }

    public void setTarget (ButtonLike ib) { this.ib = ib; }

/** Double-click reports as "Action" regardless,
 * but single-click depends on extended type of Listener */

    public synchronized void mousePressed (Event me) {
        if (null == ib) ib = (ButtonLike)me.target;
// System.out.println ("ButtonLikeListener Pressed:"+ib);

	if (1 < (clickCount = me.clickCount))
	    ib.processAction ();

        else if (ib.isEnabled ())
            arm (ib);
    }

    public synchronized void mouseClicked (Event me) {
        if (null == ib) ib = (ButtonLike)me.target;
// System.out.println ("ButtonLikeListener Clicked:"+ib);

	if (1 < clickCount)
	    clickCount = 0;

        else if (ib.isEnabled ()
          && button_armed )
            activate  (ib);
    }

    public synchronized void mouseReleased (Event me) {
        if (null == ib) ib = (ButtonLike)me.target;
// System.out.println ("ButtonLikeListener Released:"+ib);

	if (1 < clickCount)
	    clickCount = 0;

        else if (ib.contains (me.x, me.y)
          && ib.isEnabled ()
          && button_armed )
            activate  (ib);
    }

    public synchronized void mouseDragged (Event me) {
        if (null == ib) ib = (ButtonLike)me.target;
// System.out.println ("ButtonLikeListener Dragged:"+ib);
        if (ib.isEnabled ()) {
            if (ib.contains (me.x, me.y))
                arm (ib);
            else
                disarm (ib);
        }
    }

    public synchronized void mouseMoved (Event me) { }
    public synchronized void mouseEntered (Event me) { }
    public synchronized void mouseExited (Event me) { }
}
