private static class CMJ_dispatchMouseEvent extends ControlCommandMessage {
private static int buttonPressedCount;
@Override
public Object run(Object[] args) {
NativeComponent nativeComponent = getNativeComponent();
if(nativeComponent == null || !nativeComponent.isShowing()) {
return null;
}
int type = (Integer)args[0];
int e_x = (Integer)args[1];
int e_y = (Integer)args[2];
int e_button = (Integer)args[3];
int e_count = (Integer)args[4];
int e_stateMask = (Integer)args[5];
Point e_cursorLocation = (Point)args[6];
switch(type) {
case MouseEvent.MOUSE_PRESSED:
buttonPressedCount++;
break;
case MouseEvent.MOUSE_RELEASED:
buttonPressedCount--;
if(buttonPressedCount < 0) {
buttonPressedCount = 0;
}
break;
case MouseEvent.MOUSE_DRAGGED:
case MouseEvent.MOUSE_MOVED:
break;
}
int button = SWTUtils.translateSWTMouseButton(e_button);
if(button == 0) {
switch(type) {
case MouseEvent.MOUSE_PRESSED:
case MouseEvent.MOUSE_RELEASED:
case MouseEvent.MOUSE_CLICKED:
return null;
}
}
if(buttonPressedCount != 0 && type == MouseEvent.MOUSE_MOVED) {
type = MouseEvent.MOUSE_DRAGGED;
}
MouseEvent me;
if(Utils.IS_JAVA_6_OR_GREATER) {
// Not specifying the absX and Y in Java 6 results in a deadlock when pressing alt+F4 while moving the mouse over a native control
if(type == MouseEvent.MOUSE_WHEEL) {
me = new MouseWheelEvent(nativeComponent, type, System.currentTimeMillis(), SWTUtils.translateSWTModifiers(e_stateMask), e_x, e_y, e_cursorLocation.x, e_cursorLocation.y, 0, false, MouseWheelEvent.WHEEL_UNIT_SCROLL, Math.abs(e_count), e_count < 0? 1: -1);
} else {
boolean isPopupTrigger = type == MouseEvent.MOUSE_RELEASED && button == MouseEvent.BUTTON3;
me = new MouseEvent(nativeComponent, type, System.currentTimeMillis(), SWTUtils.translateSWTModifiers(e_stateMask), e_x, e_y, e_cursorLocation.x, e_cursorLocation.y, e_count, isPopupTrigger, button);
}
} else {
if(type == MouseEvent.MOUSE_WHEEL) {
me = new MouseWheelEvent(nativeComponent, type, System.currentTimeMillis(), SWTUtils.translateSWTModifiers(e_stateMask), e_x, e_y, 0, false, MouseWheelEvent.WHEEL_UNIT_SCROLL, Math.abs(e_count), e_count < 0? 1: -1);
} else {
boolean isPopupTrigger = type == MouseEvent.MOUSE_RELEASED && button == MouseEvent.BUTTON3;
me = new MouseEvent(nativeComponent, type, System.currentTimeMillis(), SWTUtils.translateSWTModifiers(e_stateMask), e_x, e_y, e_count, isPopupTrigger, button);
}
}
// Manually dispatch the mouse event, otherwise Swing's focus handling is triggered resulting in focus issues.
switch(me.getID()) {
case MouseEvent.MOUSE_PRESSED:
// Dismiss any currently shown popup menus.
MenuSelectionManager.defaultManager().clearSelectedPath();
for(MouseListener mouseListener: nativeComponent.getMouseListeners()) {
mouseListener.mousePressed(me);
}
break;
case MouseEvent.MOUSE_RELEASED:
for(MouseListener mouseListener: nativeComponent.getMouseListeners()) {
mouseListener.mouseReleased(me);
}
break;
case MouseEvent.MOUSE_CLICKED:
for(MouseListener mouseListener: nativeComponent.getMouseListeners()) {
mouseListener.mouseClicked(me);
}
break;
case MouseEvent.MOUSE_ENTERED:
for(MouseListener mouseListener: nativeComponent.getMouseListeners()) {
mouseListener.mouseEntered(me);
}
break;
case MouseEvent.MOUSE_EXITED:
for(MouseListener mouseListener: nativeComponent.getMouseListeners()) {
mouseListener.mouseExited(me);
}
break;
case MouseEvent.MOUSE_MOVED:
for(MouseMotionListener mouseListener: nativeComponent.getMouseMotionListeners()) {
mouseListener.mouseMoved(me);
}
break;
case MouseEvent.MOUSE_DRAGGED:
for(MouseMotionListener mouseListener: nativeComponent.getMouseMotionListeners()) {
mouseListener.mouseDragged(me);
}
break;
case MouseEvent.MOUSE_WHEEL:
for(java.awt.event.MouseWheelListener mouseListener: nativeComponent.getMouseWheelListeners()) {
mouseListener.mouseWheelMoved((MouseWheelEvent)me);
}
break;
}
return null;