package br.com.etyllica.core.input.mouse;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.util.List;
import javax.swing.event.MouseInputListener;
import br.com.etyllica.core.event.MouseEvent;
import br.com.etyllica.core.event.PointerEvent;
import br.com.etyllica.core.event.PointerState;
import br.com.etyllica.util.concurrency.ConcurrentList;
/**
*
* @author yuripourre
*
*/
public class Mouse implements MouseMotionListener, MouseInputListener, MouseWheelListener {
protected int x = 0;
protected int y = 0;
protected int z = 0;
protected int clicks = 0;
protected boolean dragged = false;
protected int dragButton = 0;
protected int dragX = 0;
protected int dragY = 0;
private ConcurrentList<PointerEvent> events = new ConcurrentList<PointerEvent>(4);
public Mouse(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getZ() {
return z;
}
public void setZ(int z) {
this.z = z;
}
public void setCoordinates(int x, int y) {
setX(x);
setY(y);
}
private void addEvent(int button, PointerState state) {
addEvent(button, state, 0);
}
private void addEvent(int button, PointerState state, int amount) {
addEvent(button, state, 0, amount);
}
private void addEvent(int button, PointerState state, int amountX, int amountY) {
MouseEvent key = MouseEvent.MOUSE_NONE;
switch (button) {
case java.awt.event.MouseEvent.BUTTON1:
key = MouseEvent.MOUSE_BUTTON_LEFT;
break;
case java.awt.event.MouseEvent.BUTTON2:
key = MouseEvent.MOUSE_BUTTON_MIDDLE;
break;
case java.awt.event.MouseEvent.BUTTON3:
key = MouseEvent.MOUSE_BUTTON_RIGHT;
break;
}
events.add(new PointerEvent(key, state, x, y, amountX, amountY));
}
@Override
public void mouseClicked( java.awt.event.MouseEvent me ) {
PointerState state = PointerState.CLICK;
if (me.getClickCount() == 2) {
state = PointerState.DOUBLE_CLICK;
}else if (me.getClickCount() > 2) {
state = PointerState.MULTIPLE_CLICK;
}
setCoordinates(me.getX(),me.getY());
addEvent(me.getButton(),state, me.getClickCount());
me.consume();
}
@Override
public void mousePressed( java.awt.event.MouseEvent me ) {
setCoordinates(me.getX(),me.getY());
addEvent(me.getButton(),PointerState.PRESSED);
pressDragButton(me.getButton());
me.consume();
}
private void pressDragButton(int button) {
if(dragButton == 0) {
dragButton = button;
}
}
private void releaseDragButton(int button) {
if(dragButton == button) {
dragged = false;
dragButton = 0;
}
}
@Override
public void mouseReleased( java.awt.event.MouseEvent me ) {
setCoordinates(me.getX(),me.getY());
addEvent(me.getButton(),PointerState.RELEASED);
releaseDragButton(me.getButton());
me.consume();
}
@Override
public void mouseMoved( java.awt.event.MouseEvent me ) {
setCoordinates(me.getX(),me.getY());
addMouseMoveEvent(x, y);
me.consume();
}
@Override
public void mouseEntered( java.awt.event.MouseEvent me ) {
//mouseMoved( me );
me.consume();
}
@Override
public void mouseExited( java.awt.event.MouseEvent me ) {
me.consume();
}
@Override
public void mouseDragged( java.awt.event.MouseEvent me ) {
if(!dragged) {
dragX = me.getX();
dragY = me.getY();
dragged = true;
}
int deltaX = me.getX()-dragX;
int deltaY = me.getY()-dragY;
setCoordinates(me.getX(), me.getY());
addEvent(dragButton, PointerState.DRAGGED, deltaX, deltaY);
me.consume();
}
@Override
public void mouseWheelMoved(MouseWheelEvent mwe) {
MouseEvent key = MouseEvent.MOUSE_WHEEL_DOWN;
if(mwe.getWheelRotation()<0) {
key = MouseEvent.MOUSE_WHEEL_UP;
}
events.add(new PointerEvent(key, PointerState.PRESSED, x, y, mwe.getWheelRotation()));
}
public void addMouseMoveEvent(int x, int y) {
events.add(new PointerEvent(MouseEvent.MOUSE_NONE, PointerState.MOVE, x, y));
}
public void addEvent(PointerEvent event) {
events.add(event);
}
public List<PointerEvent> lock() {
return events.lock();
}
public void unlock() {
events.unlock();
}
public boolean hasEvents() {
return !events.isEmpty();
}
}