Thank you for the review.
Here is the new version:
http://cr.openjdk.java.net/~alexsch/7154048/webrev.01/
1. The synthesizeMouseEnteredExitedEvents method is added as a native
method to the CPlatformWindow class.
Now it is invoked only in places that programmatically change a
window size:
- nativeSetNSWindowBounds method from the AWTWindow
- setVisible and setWindowState methods from the CPlatformWindow
2. The objective-c code is formatted.
3. I do not think that setting the lastMouseEventPeer after sending the
MOUSE_ENTERED event in the LWWindowPeer class can affect some logic in
the peer.
The postEvent method just post the MOUSE_ENTERED events to the
queue. It does not use the lastMouseEventPeer variable and there is no a
recursion that invokes the dispatchMouseEvent method again.
4. Dragging a window under a panel should not generate mouse
entered/exited events for components. However the events should be
generated if the window is moved out of the frame or moved in to the
frame. So one more condition that checks is the mouse crosess the frame
borders are added to the dispatchMouseEvent method from the
LWWindowPeer class.
The DragWindowOutOfFrameTest test is added that these events are
properly generated.
Thanks,
Alexandr.
On 4/19/2012 5:14 PM, Anthony Petrov wrote:
Hi Alexander,
1. I don't think that it's a good idea to add
synthesizeMouseEnteredExitedEvents calls to CWrapper methods. These
methods are supposed to perform direct calls to Cocoa API w/o any
side-effects. They may be used for windows that even aren't AWT
windows, and as such sending them the
synthesizeMouseEnteredExitedEvents message is useless, and just
doesn't seem right from CWrapper's purpose perspective. You may want
to introduce CPlatformWindow._synthesizeMouseEnteredExitedEvents()
native method that would call this native method, and then add a call
to it where needed in Java code.
2. Please follow formatting guidelines and reformat lines like this:
if(id != MouseEvent.MOUSE_DRAGGED){
to read as
if (id != MouseEvent.MOUSE_DRAGGED) {
instead. I see lots of such mis-formatted if() statements all over
your code.
3. In LWWindowPeer.java you are now setting the lastMouseEventPeer
after sending the MOUSE_ENTERED event. Before your fix it's been set
earlier. Can this change affect some logic in the peer code while
processing ENTERED events at a user event handler?
--
best regards,
Anthony
On 04/18/12 19:40, Alexander Scherbatiy wrote:
Please review a fix for CR 7154048.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7154048
webrev: http://cr.openjdk.java.net/~alexsch/7154048/webrev.00/
Let's see the following test case:
- Frame contains two components JLabel and JButton
- The JLabel component has a mouse listener
mousePressed: create a Window under the mouse click
mouseDragged: drag the created window
mouseReleased: close the Window
- A user clicks on the JLabel component, drags the mouse to the JButton
component and releases the mouse button
The current JDK 8 implementation shows the following events on Mac OS X:
--------------------------------------------------------
mouse pressed: javax.swing.JLabel
mouse exited: javax.swing.JLabel
mouse entered: javax.swing.JLabel
mouse dragged: javax.swing.JLabel
mouse exited: javax.swing.JLabel
mouse entered: javax.swing.JButton
mouse dragged: javax.swing.JLabel
mouse exited: javax.swing.JButton
mouse entered: Drag Window
mouse exited: Drag Window
mouse entered: javax.swing.JButton
mouse released: javax.swing.JButton
--------------------------------------------------------
There are several issues:
1) The window does not receive the mouse entered event when it is
created under the mouse
2) There are JLabel exited/JButton entered events during the window
dragging
3) JLabel does not receive the mouse released event
The fix synthesizes the mouse entered/exited events manually if they are
not received.
The entered/exited events synthesizing is added to setFrame, toFront,
toBack, and zoom methods of the AWTWindow and CWrapper classes.
There is an option to add the events synthesizing to the windowDidResize
notification. However this notification is sent when a window size is
changed in both cases, programmatically and when user is resized the
window. So in a lot of case there is no need for the our use case events
generation.
The LWWindowPeer class is updated to not generate extra mouse enter/exit
events during the mouse dragging.
Tho automated tests are added.
Thanks,
Alexandr.