IDEA-80340 Run/Debug tool window: generic UI: reorder tabs fails, if tab was dragged...
authorDennis Ushakov <dennis.ushakov@gmail.com>
Thu, 26 Jan 2012 12:41:25 +0000 (16:41 +0400)
committerDennis Ushakov <dennis.ushakov@gmail.com>
Thu, 26 Jan 2012 18:10:48 +0000 (22:10 +0400)
platform/lang-impl/src/com/intellij/execution/ui/layout/impl/GridCellImpl.java
platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java

index 3834cef853ed7ab6c8cb03ffb838435e5a9da22b..8c2491099805146fb9b938feb48535de5586c996 100644 (file)
@@ -100,7 +100,7 @@ public class GridCellImpl implements GridCell {
       }
     });
     rebuildPopupGroup();
-    myTabs.addListener(new TabsListener() {
+    myTabs.addListener(new TabsListener.Adapter() {
 
       public void beforeSelectionChanged(TabInfo oldSelection, TabInfo newSelection) {
         if (oldSelection != null && myContext.isStateBeingRestored()) {
index 7f87a1f89830a68867f5dc236758e6f8b4172355..22fc32582665a19b5ae7377168cb540be093fa0e 100644 (file)
@@ -125,9 +125,13 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
   private TabInfo myCurrentOverInfo;
   private RunnerContentUi myOriginal;
   private CopyOnWriteArraySet<Listener> myDockingListeners = new CopyOnWriteArraySet<Listener>();
-  private List<RunnerContentUi> myChildren = new ArrayList<RunnerContentUi>(); 
+  private Set<RunnerContentUi> myChildren = new TreeSet<RunnerContentUi>(new Comparator<RunnerContentUi>() {
+    @Override
+    public int compare(RunnerContentUi o1, RunnerContentUi o2) {
+      return o1.myWindow - o2.myWindow;
+    }
+  }); 
   private int myWindow;
-  private int ourWindowCounter;
 
   public RunnerContentUi(Project project,
                          RunnerLayoutUi ui,
@@ -214,6 +218,11 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
         }
       }
 
+      @Override
+      public void tabsMoved() {
+        saveUiState();
+      }
+
       public void selectionChanged(final TabInfo oldSelection, final TabInfo newSelection) {
         if (!myTabs.getComponent().isShowing()) return;
 
@@ -594,6 +603,17 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
     grid = new GridImpl(this, mySessionName);
     grid.setBorder(new EmptyBorder(1, 0, 0, 0));
 
+    if (myCurrentOver != null) {
+      final int index = ((JBRunnerTabs)myCurrentOver).getDropInfoIndex() + (myOriginal != null ? myOriginal.getTabOffsetFor(this) : 0);
+      for (TabInfo info : myTabs.getTabs()) {
+        final TabImpl tab = getTabFor(info);
+        if (tab != null && tab.getIndex() >= index) {
+          tab.setIndex(tab.getIndex() + 1);
+        }
+      }
+      getStateFor(content).assignTab(myLayoutSettings.getOrCreateTab(index));
+    }
+    
     TabInfo tab = new TabInfo(grid).setObject(getStateFor(content).getTab()).setText("Tab");
 
 
@@ -625,6 +645,15 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
     return grid;
   }
 
+  private int getTabOffsetFor(RunnerContentUi ui) {
+    int offset = myTabs.getTabCount();
+    for (RunnerContentUi child : myChildren) {
+      if (child == ui) break;
+      offset += child.myTabs.getTabCount();
+    }
+    return offset;
+  }
+
   @Nullable
   public GridCell findCellFor(final Content content) {
     GridImpl cell = getGridFor(content, false);
@@ -775,13 +804,37 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
   public void saveUiState() {
     if (isStateBeingRestored()) return;
 
+    if (myOriginal != null) {
+      myOriginal.saveUiState();
+      return;
+    }
+    int offset = updateTabsIndices(myTabs, 0);
+    for (RunnerContentUi child : myChildren) {
+      offset = updateTabsIndices(child.myTabs, offset);
+    }
+
+    doSaveUiState();
+  }
+
+  private int updateTabsIndices(final JBRunnerTabs tabs, int offset) {
+    for (TabInfo each : tabs.getTabs()) {
+      final int index = myTabs.getIndexOf(each);
+      final TabImpl tab = getTabFor(each);
+      if (tab != null) tab.setIndex(index + offset);
+    }
+    return offset + tabs.getTabCount();
+  }
+
+  private void doSaveUiState() {
+    if (isStateBeingRestored()) return;
+
     for (TabInfo each : myTabs.getTabs()) {
       GridImpl eachGrid = getGridFor(each);
       eachGrid.saveUiState();
     }
 
     for (RunnerContentUi child : myChildren) {
-      child.saveUiState();
+      child.doSaveUiState();
     }
   }