/* The code was developed by Jan Hakenberg in 2010-2014.
 * The file was released to public domain by the author. */

package amodeus.amodeus.util.gui;

import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

public class LazyMouse implements MouseListener, MouseMotionListener {
    public static final float DEFAULT_TOLERANCE = 3;
    // ---
    private Point myPressedC = new Point(); // component
    private Point myPressedS = new Point(); // screen
    private boolean isClick;
    private float tolerance = DEFAULT_TOLERANCE;
    private final LazyMouseListener lazyMouseListener;

    public LazyMouse(LazyMouseListener myLazyMouseListener) {
        this.lazyMouseListener = myLazyMouseListener;
    }

    public void setTolerance(float tolerance) {
        if (tolerance < 0)
            throw new RuntimeException("tolerance is negative");
        this.tolerance = tolerance;
    }

    @Override
    public final void mousePressed(MouseEvent myMouseEvent) {
        myPressedC = myMouseEvent.getPoint();
        myPressedS = myMouseEvent.getLocationOnScreen();
        isClick = true;
    }

    private boolean shortFromPressed(MouseEvent myMouseEvent) {
        Point myPointC = myMouseEvent.getPoint();
        Point myPointS = myMouseEvent.getLocationOnScreen();
        return Math.hypot(myPointC.x - myPressedC.x, myPointC.y - myPressedC.y) <= tolerance && //
                Math.hypot(myPointS.x - myPressedS.x, myPointS.y - myPressedS.y) <= tolerance;
    }

    @Override
    public final void mouseReleased(MouseEvent myMouseEvent) {
        isClick &= shortFromPressed(myMouseEvent);
        if (isClick)
            lazyMouseListener.lazyClicked(myMouseEvent);
    }

    @Override
    public final void mouseClicked(MouseEvent myMouseEvent) {
        // this has to be empty!
    }

    @Override
    public final void mouseDragged(MouseEvent myMouseEvent) {
        isClick &= shortFromPressed(myMouseEvent);
        if (!isClick)
            lazyMouseListener.lazyDragged(myMouseEvent);
    }

    @Override
    public void mouseMoved(MouseEvent myMouseEvent) {
        // empty by default
    }

    @Override
    public void mouseEntered(MouseEvent myMouseEvent) {
        // empty by default
    }

    @Override
    public void mouseExited(MouseEvent myMouseEvent) {
        // empty by default
    }

    public void addListenersTo(Component myComponent) {
        myComponent.addMouseListener(this);
        myComponent.addMouseMotionListener(this);
    }
}