src/share/classes/java/awt/Container.java

Print this page

        

@@ -4425,10 +4425,11 @@
     void dispose() {
         //System.out.println("Disposing lw dispatcher");
         stopListeningForOtherDrags();
         mouseEventTarget = null;
         targetLastEntered = null;
+        targetLastEnteredDT = null;
     }
 
     /**
      * Enables events to subcomponents.
      */

@@ -4615,48 +4616,69 @@
         }
         return e.isConsumed();
     }
 
     /*
-     * Generates enter/exit events as mouse moves over lw components
+     * Generates dnd enter/exit events as mouse moves over lw components
      * @param targetOver        Target mouse is over (including native container)
-     * @param e                 Mouse event in native container
+     * @param e                SunDropTarget mouse event in native container
      */
-    private void trackMouseEnterExit(Component targetOver, MouseEvent e) {
-        Component       targetEnter = null;
+    private void trackMouseDTEnterExit(Component targetOver, MouseEvent e) {
         int             id = e.getID();
-
-        if (e instanceof SunDropTargetEvent &&
-            id == MouseEvent.MOUSE_ENTERED &&
-            isMouseInNativeContainer == true) {
+        if (id == MouseEvent.MOUSE_ENTERED && isMouseDTInNativeContainer) {
             // This can happen if a lightweight component which initiated the
             // drag has an associated drop target. MOUSE_ENTERED comes when the
             // mouse is in the native container already. To propagate this event
             // properly we should null out targetLastEntered.
-            targetLastEntered = null;
-        } else if ( id != MouseEvent.MOUSE_EXITED &&
+            targetLastEnteredDT = null;
+        } else if (id == MouseEvent.MOUSE_ENTERED) {
+            isMouseDTInNativeContainer = true;
+        } else if (id == MouseEvent.MOUSE_EXITED) {
+            isMouseDTInNativeContainer = false;
+        }
+        targetLastEnteredDT = retargetMouseEnterExit(targetOver, e,
+                                                     targetLastEnteredDT,
+                                                     isMouseDTInNativeContainer);
+    }
+
+    /*
+     * Generates enter/exit events as mouse moves over lw components
+     * @param targetOver        Target mouse is over (including native container)
+     * @param e                 Mouse event in native container
+     */
+    private void trackMouseEnterExit(Component targetOver, MouseEvent e) {
+        if (e instanceof SunDropTargetEvent) {
+            trackMouseDTEnterExit(targetOver, e);
+            return;
+        }
+        int id = e.getID();
+
+        if ( id != MouseEvent.MOUSE_EXITED &&
              id != MouseEvent.MOUSE_DRAGGED &&
              id != LWD_MOUSE_DRAGGED_OVER &&
-             isMouseInNativeContainer == false ) {
+                !isMouseInNativeContainer) {
             // any event but an exit or drag means we're in the native container
             isMouseInNativeContainer = true;
             startListeningForOtherDrags();
-        } else if ( id == MouseEvent.MOUSE_EXITED ) {
+        } else if (id == MouseEvent.MOUSE_EXITED) {
             isMouseInNativeContainer = false;
             stopListeningForOtherDrags();
         }
-
-        if (isMouseInNativeContainer) {
-            targetEnter = targetOver;
+        targetLastEntered = retargetMouseEnterExit(targetOver, e,
+                                                   targetLastEntered,
+                                                   isMouseInNativeContainer);
         }
 
-        if (targetLastEntered == targetEnter) {
-                return;
-        }
+    private Component retargetMouseEnterExit(Component targetOver, MouseEvent e,
+                                             Component lastEntered,
+                                             boolean inNativeContainer) {
+        int id = e.getID();
+        Component targetEnter = inNativeContainer ? targetOver : null;
 
-        if (targetLastEntered != null) {
-            retargetMouseEvent(targetLastEntered, MouseEvent.MOUSE_EXITED, e);
+        if (lastEntered != targetEnter) {
+            if (lastEntered != null) {
+                retargetMouseEvent(lastEntered, MouseEvent.MOUSE_EXITED, e);
         }
         if (id == MouseEvent.MOUSE_EXITED) {
             // consume native exit event if we generate one
             e.consume();
         }

@@ -4666,12 +4688,12 @@
         }
         if (id == MouseEvent.MOUSE_ENTERED) {
             // consume native enter event if we generate one
             e.consume();
         }
-
-        targetLastEntered = targetEnter;
+        }
+        return targetEnter;
     }
 
     /*
      * Listens to global mouse drag events so even drags originating
      * from other heavyweight containers will generate enter/exit

@@ -4906,25 +4928,35 @@
      * a subcomponent.
      */
     private transient Component mouseEventTarget;
 
     /**
-     * The last component entered
+     * The last component entered by the {@code MouseEvent}.
      */
     private transient Component targetLastEntered;
 
     /**
+     * The last component entered by the {@code SunDropTargetEvent}.
+     */
+    private transient Component targetLastEnteredDT;
+
+    /**
      * Indicates whether {@code mouseEventTarget} was removed and nulled
      */
     private transient boolean isCleaned;
 
     /**
-     * Is the mouse over the native container
+     * Is the mouse over the native container.
      */
     private transient boolean isMouseInNativeContainer = false;
 
     /**
+     * Is DnD over the native container.
+     */
+    private transient boolean isMouseDTInNativeContainer = false;
+
+    /**
      * This variable is not used, but kept for serialization compatibility
      */
     private Cursor nativeCursor;
 
     /**

@@ -4958,7 +4990,10 @@
             mouseEventTarget = null;
         }
         if (targetLastEntered == removedComponent) {
             targetLastEntered = null;
         }
+        if (targetLastEnteredDT == removedComponent) {
+            targetLastEnteredDT = null;
+        }
     }
 }