package net.sf.colossus.gui;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
/**
* This listener can be used to make a Component draggable.
*
* If subscribed as MouseListener and MouseMotionListener, the component this
* listener subscribes to will become draggable by mouse. This subscription is
* done by the static method #makeDraggable(Component) to make sure it is done
* the right way.
*/
public class DragListener extends MouseAdapter implements MouseMotionListener
{
private final Component component;
private Point lastMousePos;
private DragListener(Component component)
{
this.component = component;
}
@Override
public void mouseDragged(MouseEvent e)
{
Point loc = component.getLocation();
// find mouse pos on parent instead of on panel, since the latter moves
Point newMousePos = e.getPoint();
newMousePos.translate(loc.x, loc.y);
if (lastMousePos != null)
{
int diffX = newMousePos.x - lastMousePos.x;
int diffY = newMousePos.y - lastMousePos.y;
loc.x += diffX;
loc.y += diffY;
component.setLocation(loc);
}
lastMousePos = newMousePos;
}
@Override
public void mouseMoved(MouseEvent e)
{
// nothing to do
}
@Override
public void mouseReleased(MouseEvent e)
{
// reset stored mouse position in case a second drag occurs
this.lastMousePos = null;
}
public static void makeDraggable(Component component)
{
DragListener listener = new DragListener(component);
component.addMouseListener(listener);
component.addMouseMotionListener(listener);
}
}