< prev index next >

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

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this --- 1,7 ---- /* ! * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this
*** 39,48 **** --- 39,49 ---- import java.io.ObjectOutputStream; import java.io.ObjectStreamField; import java.io.PrintStream; import java.io.PrintWriter; + import java.lang.ref.WeakReference; import java.security.AccessController; import java.util.EventListener; import java.util.HashSet; import java.util.Set;
*** 3319,3338 **** if (cont == this || isParentOf(cont)) { kfm.setGlobalCurrentFocusCycleRootPriv(null); } } - @Override - void clearLightweightDispatcherOnRemove(Component removedComponent) { - if (dispatcher != null) { - dispatcher.removeReferences(removedComponent); - } else { - //It is a Lightweight Container, should clear parent`s Dispatcher - super.clearLightweightDispatcherOnRemove(removedComponent); - } - } - final Container getTraversalRoot() { if (isFocusCycleRoot()) { return findTraversalRoot(); } --- 3320,3329 ----
*** 4429,4452 **** private static final PlatformLogger eventLog = PlatformLogger.getLogger("java.awt.event.LightweightDispatcher"); LightweightDispatcher(Container nativeContainer) { this.nativeContainer = nativeContainer; ! mouseEventTarget = null; eventMask = 0; } /* * Clean up any resources allocated when dispatcher was created; * should be called from Container.removeNotify */ void dispose() { //System.out.println("Disposing lw dispatcher"); stopListeningForOtherDrags(); ! mouseEventTarget = null; ! targetLastEntered = null; ! targetLastEnteredDT = null; } /** * Enables events to subcomponents. */ --- 4420,4445 ---- private static final PlatformLogger eventLog = PlatformLogger.getLogger("java.awt.event.LightweightDispatcher"); LightweightDispatcher(Container nativeContainer) { this.nativeContainer = nativeContainer; ! mouseEventTarget = new WeakReference<>(null); ! targetLastEntered = new WeakReference<>(null); ! targetLastEnteredDT = new WeakReference<>(null); eventMask = 0; } /* * Clean up any resources allocated when dispatcher was created; * should be called from Container.removeNotify */ void dispose() { //System.out.println("Disposing lw dispatcher"); stopListeningForOtherDrags(); ! mouseEventTarget.clear(); ! targetLastEntered.clear(); ! targetLastEnteredDT.clear(); } /** * Enables events to subcomponents. */
*** 4529,4573 **** nativeContainer.getMouseEventTarget(e.getX(), e.getY(), Container.INCLUDE_SELF); trackMouseEnterExit(mouseOver, e); // 4508327 : MOUSE_CLICKED should only go to the recipient of // the accompanying MOUSE_PRESSED, so don't reset mouseEventTarget on a // MOUSE_CLICKED. if (!isMouseGrab(e) && id != MouseEvent.MOUSE_CLICKED) { ! mouseEventTarget = (mouseOver != nativeContainer) ? mouseOver: null; ! isCleaned = false; } ! if (mouseEventTarget != null) { switch (id) { case MouseEvent.MOUSE_ENTERED: case MouseEvent.MOUSE_EXITED: break; case MouseEvent.MOUSE_PRESSED: ! retargetMouseEvent(mouseEventTarget, id, e); break; case MouseEvent.MOUSE_RELEASED: ! retargetMouseEvent(mouseEventTarget, id, e); break; case MouseEvent.MOUSE_CLICKED: // 4508327: MOUSE_CLICKED should never be dispatched to a Component // other than that which received the MOUSE_PRESSED event. If the // mouse is now over a different Component, don't dispatch the event. // The previous fix for a similar problem was associated with bug // 4155217. ! if (mouseOver == mouseEventTarget) { retargetMouseEvent(mouseOver, id, e); } break; case MouseEvent.MOUSE_MOVED: ! retargetMouseEvent(mouseEventTarget, id, e); break; case MouseEvent.MOUSE_DRAGGED: if (isMouseGrab(e)) { ! retargetMouseEvent(mouseEventTarget, id, e); } break; case MouseEvent.MOUSE_WHEEL: // This may send it somewhere that doesn't have MouseWheelEvents // enabled. In this case, Component.dispatchEventImpl() will --- 4522,4567 ---- nativeContainer.getMouseEventTarget(e.getX(), e.getY(), Container.INCLUDE_SELF); trackMouseEnterExit(mouseOver, e); + Component met = mouseEventTarget.get(); // 4508327 : MOUSE_CLICKED should only go to the recipient of // the accompanying MOUSE_PRESSED, so don't reset mouseEventTarget on a // MOUSE_CLICKED. if (!isMouseGrab(e) && id != MouseEvent.MOUSE_CLICKED) { ! met = (mouseOver != nativeContainer) ? mouseOver : null; ! mouseEventTarget = new WeakReference<>(met); } ! if (met != null) { switch (id) { case MouseEvent.MOUSE_ENTERED: case MouseEvent.MOUSE_EXITED: break; case MouseEvent.MOUSE_PRESSED: ! retargetMouseEvent(met, id, e); break; case MouseEvent.MOUSE_RELEASED: ! retargetMouseEvent(met, id, e); break; case MouseEvent.MOUSE_CLICKED: // 4508327: MOUSE_CLICKED should never be dispatched to a Component // other than that which received the MOUSE_PRESSED event. If the // mouse is now over a different Component, don't dispatch the event. // The previous fix for a similar problem was associated with bug // 4155217. ! if (mouseOver == met) { retargetMouseEvent(mouseOver, id, e); } break; case MouseEvent.MOUSE_MOVED: ! retargetMouseEvent(met, id, e); break; case MouseEvent.MOUSE_DRAGGED: if (isMouseGrab(e)) { ! retargetMouseEvent(met, id, e); } break; case MouseEvent.MOUSE_WHEEL: // This may send it somewhere that doesn't have MouseWheelEvents // enabled. In this case, Component.dispatchEventImpl() will
*** 4582,4595 **** } //Consuming of wheel events is implemented in "retargetMouseEvent". if (id != MouseEvent.MOUSE_WHEEL) { e.consume(); } - } else if (isCleaned && id != MouseEvent.MOUSE_WHEEL) { - //After mouseEventTarget was removed and cleaned should consume all events - //until new mouseEventTarget is found - e.consume(); } return e.isConsumed(); } private boolean processDropTargetEvent(SunDropTargetEvent e) { --- 4576,4585 ----
*** 4650,4662 **** } 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) --- 4640,4653 ---- } else if (id == MouseEvent.MOUSE_ENTERED) { isMouseDTInNativeContainer = true; } else if (id == MouseEvent.MOUSE_EXITED) { isMouseDTInNativeContainer = false; } ! Component tle = retargetMouseEnterExit(targetOver, e, ! targetLastEnteredDT.get(), isMouseDTInNativeContainer); + targetLastEnteredDT = new WeakReference<>(tle); } /* * Generates enter/exit events as mouse moves over lw components * @param targetOver Target mouse is over (including native container)
*** 4678,4690 **** startListeningForOtherDrags(); } else if (id == MouseEvent.MOUSE_EXITED) { isMouseInNativeContainer = false; stopListeningForOtherDrags(); } ! targetLastEntered = retargetMouseEnterExit(targetOver, e, ! targetLastEntered, isMouseInNativeContainer); } private Component retargetMouseEnterExit(Component targetOver, MouseEvent e, Component lastEntered, boolean inNativeContainer) { --- 4669,4682 ---- startListeningForOtherDrags(); } else if (id == MouseEvent.MOUSE_EXITED) { isMouseInNativeContainer = false; stopListeningForOtherDrags(); } ! Component tle = retargetMouseEnterExit(targetOver, e, ! targetLastEntered.get(), isMouseInNativeContainer); + targetLastEntered = new WeakReference<>(tle); } private Component retargetMouseEnterExit(Component targetOver, MouseEvent e, Component lastEntered, boolean inNativeContainer) {
*** 4942,4967 **** * The current subcomponent being hosted by this windowed * component that has events being forwarded to it. If this * is null, there are currently no events being forwarded to * a subcomponent. */ ! private transient Component mouseEventTarget; /** * 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. */ private transient boolean isMouseInNativeContainer = false; --- 4934,4954 ---- * The current subcomponent being hosted by this windowed * component that has events being forwarded to it. If this * is null, there are currently no events being forwarded to * a subcomponent. */ ! private transient WeakReference<Component> mouseEventTarget; /** * The last component entered by the {@code MouseEvent}. */ ! private transient WeakReference<Component> targetLastEntered; /** * The last component entered by the {@code SunDropTargetEvent}. */ ! private transient WeakReference<Component> targetLastEnteredDT; /** * Is the mouse over the native container. */ private transient boolean isMouseInNativeContainer = false;
*** 4998,5016 **** private static final long MOUSE_MASK = AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_WHEEL_EVENT_MASK; - - void removeReferences(Component removedComponent) { - if (mouseEventTarget == removedComponent) { - isCleaned = true; - mouseEventTarget = null; - } - if (targetLastEntered == removedComponent) { - targetLastEntered = null; - } - if (targetLastEnteredDT == removedComponent) { - targetLastEnteredDT = null; - } - } } --- 4985,4990 ----
< prev index next >