From 25ba4db86b434c9312ccd658692e8739b2bb2670 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Mon, 20 Feb 2012 19:51:15 +0100 Subject: [PATCH] correctly handle tab drag when selecting tab triggers row reordering (IDEA-65073) --- .../src/com/intellij/ui/MouseDragHelper.java | 4 ++++ .../com/intellij/ui/tabs/impl/DragHelper.java | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/platform/platform-api/src/com/intellij/ui/MouseDragHelper.java b/platform/platform-api/src/com/intellij/ui/MouseDragHelper.java index bb0ccb0cb25a..de67b2b116b8 100644 --- a/platform/platform-api/src/com/intellij/ui/MouseDragHelper.java +++ b/platform/platform-api/src/com/intellij/ui/MouseDragHelper.java @@ -115,6 +115,7 @@ public abstract class MouseDragHelper implements MouseListener, MouseMotionListe myPressPointScreen = new RelativePoint(e).getScreenPoint(); myPressPointComponent = e.getPoint(); + processMousePressed(e); myDelta = new Dimension(); if (myDragComponent.isShowing()) { @@ -209,6 +210,9 @@ public abstract class MouseDragHelper implements MouseListener, MouseMotionListe return true; } + protected void processMousePressed(MouseEvent event) { + } + protected void processDragCancel() { } diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java index c67151d77509..979f08e2fc22 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/DragHelper.java @@ -18,6 +18,7 @@ package com.intellij.ui.tabs.impl; import com.intellij.ui.InplaceButton; import com.intellij.ui.MouseDragHelper; import com.intellij.ui.ScreenUtil; +import com.intellij.ui.awt.RelativePoint; import com.intellij.ui.tabs.TabInfo; import org.jetbrains.annotations.Nullable; @@ -38,6 +39,7 @@ class DragHelper extends MouseDragHelper { Measurer myVertical = new Measurer.Height(); private TabInfo myDragOutSource; + private TabLabel myPressedTabLabel; public DragHelper(JBTabsImpl tabs) { super(tabs, tabs); @@ -81,19 +83,25 @@ class DragHelper extends MouseDragHelper { myDragOutSource.getDragOutDelegate().dragOutCancelled(myDragOutSource); } + @Override + protected void processMousePressed(MouseEvent event) { + // since selection change can cause tabs to be reordered, we need to remember the tab on which the mouse was pressed, otherwise + // we'll end up dragging the wrong tab (IDEA-65073) + myPressedTabLabel = findLabel(new RelativePoint(event).getPoint(myTabs)); + } + protected void processDrag(MouseEvent event, Point targetScreenPoint, Point startPointScreen) { if (!myTabs.isTabDraggingEnabled()) return; SwingUtilities.convertPointFromScreen(startPointScreen, myTabs); if (isDragJustStarted()) { - final TabLabel label = findLabel(startPointScreen); - if (label == null) return; + if (myPressedTabLabel == null) return; - final Rectangle labelBounds = label.getBounds(); + final Rectangle labelBounds = myPressedTabLabel.getBounds(); myHoldDelta = new Dimension(startPointScreen.x - labelBounds.x, startPointScreen.y - labelBounds.y); - myDragSource = label.getInfo(); + myDragSource = myPressedTabLabel.getInfo(); myDragRec = new Rectangle(startPointScreen, labelBounds.getSize()); myDragOriginalRec = (Rectangle)myDragRec.clone();