public void eventDispatched(AWTEvent e) {
boolean isForeignDrag = (e instanceof MouseEvent) &&
!(e instanceof SunDropTargetEvent) &&
(e.id == MouseEvent.MOUSE_DRAGGED) &&
(e.getSource() != nativeContainer);
if (!isForeignDrag) {
// only interested in drags from other hw components
return;
}
MouseEvent srcEvent = (MouseEvent)e;
MouseEvent me;
synchronized (nativeContainer.getTreeLock()) {
Component srcComponent = srcEvent.getComponent();
// component may have disappeared since drag event posted
// (i.e. Swing hierarchical menus)
if ( !srcComponent.isShowing() ) {
return;
}
// see 5083555
// check if srcComponent is in any modal blocked window
Component c = nativeContainer;
while ((c != null) && !(c instanceof Window)) {
c = c.getParent_NoClientCode();
}
if ((c == null) || ((Window)c).isModalBlocked()) {
return;
}
//
// create an internal 'dragged-over' event indicating
// we are being dragged over from another hw component
//
me = new MouseEvent(nativeContainer,
LWD_MOUSE_DRAGGED_OVER,
srcEvent.getWhen(),
srcEvent.getModifiersEx() | srcEvent.getModifiers(),
srcEvent.getX(),
srcEvent.getY(),
srcEvent.getXOnScreen(),
srcEvent.getYOnScreen(),
srcEvent.getClickCount(),
srcEvent.isPopupTrigger(),
srcEvent.getButton());
((AWTEvent)srcEvent).copyPrivateDataInto(me);
// translate coordinates to this native container
final Point ptSrcOrigin = srcComponent.getLocationOnScreen();
if (AppContext.getAppContext() != nativeContainer.appContext) {
final MouseEvent mouseEvent = me;
Runnable r = new Runnable() {
public void run() {
if (!nativeContainer.isShowing() ) {
return;
}
Point ptDstOrigin = nativeContainer.getLocationOnScreen();
mouseEvent.translatePoint(ptSrcOrigin.x - ptDstOrigin.x,
ptSrcOrigin.y - ptDstOrigin.y );
Component targetOver =
nativeContainer.getMouseEventTarget(mouseEvent.getX(),
mouseEvent.getY(),
Container.INCLUDE_SELF);
trackMouseEnterExit(targetOver, mouseEvent);
}
};
SunToolkit.executeOnEventHandlerThread(nativeContainer, r);
return;
} else {
if (!nativeContainer.isShowing() ) {
return;
}
Point ptDstOrigin = nativeContainer.getLocationOnScreen();
me.translatePoint( ptSrcOrigin.x - ptDstOrigin.x, ptSrcOrigin.y - ptDstOrigin.y );
}
}
//System.out.println("Track event: " + me);
// feed the 'dragged-over' event directly to the enter/exit
// code (not a real event so don't pass it to dispatchEvent)
Component targetOver =
nativeContainer.getMouseEventTarget(me.getX(), me.getY(),
Container.INCLUDE_SELF);
trackMouseEnterExit(targetOver, me);
}
|
void retargetMouseEvent(Component target,
int id,
MouseEvent e) {
if (target == null) {
return; // mouse is over another hw component or target is disabled
}
int x = e.getX(), y = e.getY();
Component component;
for(component = target;
component != null && component != nativeContainer;
component = component.getParent()) {
x -= component.x;
y -= component.y;
}
MouseEvent retargeted;
if (component != null) {
if (e instanceof SunDropTargetEvent) {
retargeted = new SunDropTargetEvent(target,
id,
x,
y,
((SunDropTargetEvent)e).getDispatcher());
} else if (id == MouseEvent.MOUSE_WHEEL) {
retargeted = new MouseWheelEvent(target,
id,
e.getWhen(),
e.getModifiersEx() | e.getModifiers(),
x,
y,
e.getXOnScreen(),
e.getYOnScreen(),
e.getClickCount(),
e.isPopupTrigger(),
((MouseWheelEvent)e).getScrollType(),
((MouseWheelEvent)e).getScrollAmount(),
((MouseWheelEvent)e).getWheelRotation(),
((MouseWheelEvent)e).getPreciseWheelRotation());
}
else {
retargeted = new MouseEvent(target,
id,
e.getWhen(),
e.getModifiersEx() | e.getModifiers(),
x,
y,
e.getXOnScreen(),
e.getYOnScreen(),
e.getClickCount(),
e.isPopupTrigger(),
e.getButton());
}
((AWTEvent)e).copyPrivateDataInto(retargeted);
if (target == nativeContainer) {
// avoid recursively calling LightweightDispatcher...
((Container)target).dispatchEventToSelf(retargeted);
} else {
assert AppContext.getAppContext() == target.appContext;
if (nativeContainer.modalComp != null) {
if (((Container)nativeContainer.modalComp).isAncestorOf(target)) {
target.dispatchEvent(retargeted);
} else {
e.consume();
}
} else {
target.dispatchEvent(retargeted);
}
}
}
}
Sends a mouse event to the current mouse event recipient using
the given event (sent to the windowed host) as a srcEvent. If
the mouse event target is still in the component tree, the
coordinates of the event are translated to those of the target.
If the target has been removed, we don't bother to send the
message. |