diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/singleRow/SingleRowLayoutStrategy.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/singleRow/SingleRowLayoutStrategy.java index 92952f187eed..1d13371ac4c3 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/singleRow/SingleRowLayoutStrategy.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/singleRow/SingleRowLayoutStrategy.java @@ -84,6 +84,8 @@ public abstract class SingleRowLayoutStrategy { @Override public boolean isDragOut(TabLabel tabLabel, int deltaX, int deltaY) { + Rectangle bounds = tabLabel.getBounds(); + if (bounds.x + bounds.width + deltaX < 0 || bounds.x + bounds.width > tabLabel.getParent().getWidth()) return true; return Math.abs(deltaY) > tabLabel.getHeight() * TabLayout.getDragOutMultiplier(); } @@ -257,7 +259,9 @@ public abstract class SingleRowLayoutStrategy { @Override public boolean isDragOut(TabLabel tabLabel, int deltaX, int deltaY) { - return Math.abs(deltaX) > tabLabel.getHeight() * TabLayout.getDragOutMultiplier(); + Rectangle bounds = tabLabel.getBounds(); + if (bounds.y + bounds.height + deltaX < 0 || bounds.y + bounds.height > tabLabel.getParent().getHeight()) return true; + return Math.abs(deltaX) > tabLabel.getWidth() * TabLayout.getDragOutMultiplier(); } @Override diff --git a/platform/platform-impl/src/com/intellij/ui/docking/impl/DockManagerImpl.java b/platform/platform-impl/src/com/intellij/ui/docking/impl/DockManagerImpl.java index 79be45f0f0d8..b0207f435d72 100644 --- a/platform/platform-impl/src/com/intellij/ui/docking/impl/DockManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/docking/impl/DockManagerImpl.java @@ -16,10 +16,7 @@ import com.intellij.openapi.fileEditor.FileEditorProvider; import com.intellij.openapi.fileEditor.impl.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.FrameWrapper; -import com.intellij.openapi.util.ActionCallback; -import com.intellij.openapi.util.BusyObject; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.*; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.*; import com.intellij.openapi.wm.ex.WindowManagerEx; @@ -214,6 +211,7 @@ public final class DockManagerImpl extends DockManager implements PersistentStat private final @NotNull DockableContent myContent; + private DockContainer myStartDragContainer; private DockContainer myCurrentOverContainer; private final JLabel myImageContainer; @@ -221,6 +219,7 @@ public final class DockManagerImpl extends DockManager implements PersistentStat myWindow = new JDialog(WindowManager.getInstance().getFrame(myProject)); myWindow.setUndecorated(true); myContent = content; + myStartDragContainer = getContainerFor(me.getComponent()); Image previewImage = content.getPreviewImage(); @@ -343,21 +342,26 @@ public final class DockManagerImpl extends DockManager implements PersistentStat } private @Nullable DockContainer findContainerFor(RelativePoint point, @NotNull DockableContent content) { - for (DockContainer each : getAllContainers()) { + DockContainer candidate = null; + for (DockContainer each : myContainers) { RelativeRectangle rec = each.getAcceptArea(); if (rec.contains(point) && each.getContentResponse(content, point).canAccept()) { - return each; + if (candidate == null || Comparing.equal(candidate, myCurrentDragSession.myStartDragContainer)) { + candidate = each; + } } } - for (DockContainer each : getAllContainers()) { + for (DockContainer each : myContainers) { RelativeRectangle rec = each.getAcceptAreaFallback(); if (rec.contains(point) && each.getContentResponse(content, point).canAccept()) { - return each; + if (candidate == null || Comparing.equal(candidate, myCurrentDragSession.myStartDragContainer)) { + candidate = each; + } } } - return null; + return candidate; } private DockContainerFactory getFactory(String type) { @@ -468,6 +472,7 @@ public final class DockManagerImpl extends DockManager implements PersistentStat getReady().doWhenDone(() -> { if (myContainer.isEmpty()) { close(); + myContainers.remove(myContainer); } }); } diff --git a/platform/platform-impl/src/com/intellij/ui/tabs/layout/singleRowLayout/SingleRowLayoutStrategy.java b/platform/platform-impl/src/com/intellij/ui/tabs/layout/singleRowLayout/SingleRowLayoutStrategy.java index 98a07cf9b943..7934a838ae8f 100644 --- a/platform/platform-impl/src/com/intellij/ui/tabs/layout/singleRowLayout/SingleRowLayoutStrategy.java +++ b/platform/platform-impl/src/com/intellij/ui/tabs/layout/singleRowLayout/SingleRowLayoutStrategy.java @@ -5,6 +5,7 @@ import com.intellij.openapi.actionSystem.ActionToolbar; import com.intellij.ui.tabs.impl.LayoutPassInfo; import com.intellij.ui.tabs.impl.ShapeTransform; import com.intellij.ui.tabs.impl.TabLabel; +import com.intellij.ui.tabs.impl.TabLayout; import javax.swing.*; import java.awt.*; @@ -86,6 +87,8 @@ public abstract class SingleRowLayoutStrategy { @Override public boolean isDragOut(TabLabel tabLabel, int deltaX, int deltaY) { + Rectangle bounds = tabLabel.getBounds(); + if (bounds.x + bounds.width + deltaX < 0 || bounds.x + bounds.width > tabLabel.getParent().getWidth()) return true; return Math.abs(deltaY) > tabLabel.getHeight() * myLayout.getDragOutMultiplier(); } @@ -326,7 +329,9 @@ public abstract class SingleRowLayoutStrategy { @Override public boolean isDragOut(TabLabel tabLabel, int deltaX, int deltaY) { - return Math.abs(deltaX) > tabLabel.getHeight() * myLayout.getDragOutMultiplier(); + Rectangle bounds = tabLabel.getBounds(); + if (bounds.y + bounds.height + deltaX < 0 || bounds.y + bounds.height > tabLabel.getParent().getHeight()) return true; + return Math.abs(deltaX) > tabLabel.getWidth() * TabLayout.getDragOutMultiplier(); } @Override