IDEA-80459 allow drag to finish before detaching drag helper
authorDennis Ushakov <dennis.ushakov@gmail.com>
Sun, 29 Jan 2012 12:49:47 +0000 (16:49 +0400)
committerDennis Ushakov <dennis.ushakov@gmail.com>
Sun, 29 Jan 2012 13:05:19 +0000 (17:05 +0400)
platform/platform-api/src/com/intellij/ui/MouseDragHelper.java

index 6dc032fe5a49f25f03684a7b0fe6a6410635b644..67e6abaaeb03028f255a12813c8c1281c3020487 100644 (file)
@@ -45,6 +45,7 @@ public abstract class MouseDragHelper implements MouseListener, MouseMotionListe
   private final Disposable myParentDisposable;
   private Dimension myDelta;
 
+  private boolean myDetachPostponed;
   private boolean myDetachingMode;
 
   public MouseDragHelper(Disposable parent, final JComponent dragComponent) {
@@ -62,7 +63,7 @@ public abstract class MouseDragHelper implements MouseListener, MouseMotionListe
       }
 
       public void hideNotify() {
-        detach();
+        detach(true);
       }
     });
 
@@ -80,10 +81,14 @@ public abstract class MouseDragHelper implements MouseListener, MouseMotionListe
   }
 
   public void stop() {
-    detach();
+    detach(false);
   }
 
-  private void detach() {
+  private void detach(boolean canPostponeDetach) {
+    if (canPostponeDetach && myDraggingNow) {
+      myDetachPostponed = true;
+      return;
+    }
     if (myGlassPane != null) {
       myGlassPane.removeMousePreprocessor(this);
       myGlassPane.removeMouseMotionPreprocessor(this);
@@ -125,6 +130,10 @@ public abstract class MouseDragHelper implements MouseListener, MouseMotionListe
         myPressPointScreen = null;
         myDetachingMode = false;
         e.consume();
+        if (myDetachPostponed) {
+          myDetachPostponed = false;
+          detach(false);
+        }
       }
     }
   }