From e630ffe846c41446db521e542d84bae3a8bc2d98 Mon Sep 17 00:00:00 2001 From: pchelko Date: Fri, 13 Sep 2013 17:41:47 +0400 Subject: [PATCH] 8015455: java/awt/dnd/DisposeFrameOnDragCrash/DisposeFrameOnDragTest.java hangs on windows Reviewed-by: serb, anthony --- src/share/classes/java/awt/dnd/DropTarget.java | 17 +++++++++++++++++ .../classes/javax/swing/TransferHandler.java | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/src/share/classes/java/awt/dnd/DropTarget.java b/src/share/classes/java/awt/dnd/DropTarget.java index b167b8e63..a1fd5b56d 100644 --- a/src/share/classes/java/awt/dnd/DropTarget.java +++ b/src/share/classes/java/awt/dnd/DropTarget.java @@ -351,6 +351,8 @@ public class DropTarget implements DropTargetListener, Serializable { * @see #isActive */ public synchronized void dragEnter(DropTargetDragEvent dtde) { + isDraggingInside = true; + if (!active) return; if (dtListener != null) { @@ -421,6 +423,8 @@ public class DropTarget implements DropTargetListener, Serializable { * @see #isActive */ public synchronized void dragExit(DropTargetEvent dte) { + isDraggingInside = false; + if (!active) return; if (dtListener != null && active) dtListener.dragExit(dte); @@ -444,6 +448,8 @@ public class DropTarget implements DropTargetListener, Serializable { * @see #isActive */ public synchronized void drop(DropTargetDropEvent dtde) { + isDraggingInside = false; + clearAutoscroll(); if (dtListener != null && active) @@ -533,6 +539,12 @@ public class DropTarget implements DropTargetListener, Serializable { ((DropTargetPeer)nativePeer).removeDropTarget(this); componentPeer = nativePeer = null; + + synchronized (this) { + if (isDraggingInside) { + dragExit(new DropTargetEvent(getDropTargetContext())); + } + } } /** @@ -855,4 +867,9 @@ public class DropTarget implements DropTargetListener, Serializable { */ private transient FlavorMap flavorMap; + + /* + * If the dragging is currently inside this drop target + */ + private transient boolean isDraggingInside; } diff --git a/src/share/classes/javax/swing/TransferHandler.java b/src/share/classes/javax/swing/TransferHandler.java index ed8a8d1ea..f5d85408e 100644 --- a/src/share/classes/javax/swing/TransferHandler.java +++ b/src/share/classes/javax/swing/TransferHandler.java @@ -1268,6 +1268,14 @@ public class TransferHandler implements Serializable { } } } + if (!isActive()) { + // If the Drop target is inactive the dragExit will not be dispatched to the dtListener, + // so make sure that we clean up the dtListener anyway. + DropTargetListener dtListener = getDropTargetListener(); + if (dtListener != null && dtListener instanceof DropHandler) { + ((DropHandler)dtListener).cleanup(false); + } + } } public void drop(DropTargetDropEvent e) { -- GitLab