IDEA-80487 Debug tool window: generic UI: dropping tab into tab row turn views into...
authorDennis Ushakov <dennis.ushakov@gmail.com>
Sun, 29 Jan 2012 07:23:49 +0000 (11:23 +0400)
committerDennis Ushakov <dennis.ushakov@gmail.com>
Sun, 29 Jan 2012 07:51:41 +0000 (11:51 +0400)
platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerContentUi.java
platform/lang-impl/src/com/intellij/execution/ui/layout/impl/RunnerLayout.java

index d47221459564da3b2224d1a2fbf517dc6bf1f468..a6211227e0155f9169c894406d904b6c7182e9d6 100644 (file)
@@ -23,10 +23,8 @@ import com.intellij.ide.DataManager;
 import com.intellij.openapi.Disposable;
 import com.intellij.openapi.actionSystem.*;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.ActionCallback;
-import com.intellij.openapi.util.ActiveRunnable;
-import com.intellij.openapi.util.Disposer;
-import com.intellij.openapi.util.Ref;
+import com.intellij.openapi.util.*;
+import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.wm.IdeFocusManager;
 import com.intellij.openapi.wm.IdeFrame;
 import com.intellij.openapi.wm.ToolWindow;
@@ -47,6 +45,7 @@ import com.intellij.ui.switcher.SwitchTarget;
 import com.intellij.ui.tabs.JBTabs;
 import com.intellij.ui.tabs.TabInfo;
 import com.intellij.ui.tabs.TabsListener;
+import com.intellij.util.NotNullFunction;
 import com.intellij.util.containers.ContainerUtil;
 import com.intellij.util.ui.AbstractLayoutManager;
 import com.intellij.util.ui.UIUtil;
@@ -381,8 +380,10 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
   }
 
   private void storeDefaultIndices(Content[] contents) {
+    int i = 0;
     for (Content content : contents) {
       content.putUserData(RunnerLayout.DEFAULT_INDEX, getStateFor(content).getTab().getDefaultIndex());
+      //content.putUserData(CONTENT_NUMBER, i++);
     }
   }
 
@@ -431,6 +432,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
           getStateFor(content).assignTab(getTabFor(getSelectedGrid()));
           getStateFor(content).setPlaceInGrid(myLayoutSettings.getDefaultGridPlace(content));
         } else if (contents.size() == 1 && !wasRestoring) {
+          getStateFor(content).assignTab(null);
           getStateFor(content).setPlaceInGrid(myLayoutSettings.getDefaultGridPlace(content));
         }
         getStateFor(content).setWindow(myWindow);
@@ -553,7 +555,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
           grid.processAddToUi(false);
         }
 
-        if (myManager.getComponent().isShowing()) {
+        if (myManager.getComponent().isShowing() && !isStateBeingRestored()) {
           grid.restoreLastUiState();
         }
 
@@ -615,11 +617,17 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
     if (myCurrentOver != null || myOriginal != null) {
       Integer forcedDropIndex = content.getUserData(RunnerLayout.DROP_INDEX);
       final int index = myTabs.getDropInfoIndex() + (myOriginal != null ? myOriginal.getTabOffsetFor(this) : 0);
+      final int dropIndex = forcedDropIndex != null ? forcedDropIndex : index;
+      if (forcedDropIndex == null) {
+        moveFollowingTabs(dropIndex);
+      }
+      final int defaultIndex = content.getUserData(RunnerLayout.DEFAULT_INDEX);
       final TabImpl tab = myLayoutSettings.getOrCreateTab(forcedDropIndex != null ? forcedDropIndex : -1);
-      final Integer defaultIndex = content.getUserData(RunnerLayout.DEFAULT_INDEX);
-      tab.setDefaultIndex(defaultIndex != null ? defaultIndex : -1);
-      tab.setIndex(forcedDropIndex != null ? forcedDropIndex : index);
+      tab.setDefaultIndex(defaultIndex);
+      tab.setIndex(dropIndex);
       getStateFor(content).assignTab(tab);
+      content.putUserData(RunnerLayout.DROP_INDEX, null);
+      content.putUserData(RunnerLayout.DEFAULT_INDEX, null);
     }
     
     TabInfo tab = new TabInfo(grid).setObject(getStateFor(content).getTab()).setText("Tab");
@@ -653,6 +661,27 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
     return grid;
   }
 
+  private void moveFollowingTabs(int index) {
+    if (myOriginal != null) {
+      myOriginal.moveFollowingTabs(index);
+      return;
+    }
+    moveFollowingTabs(index, myTabs);
+    for (RunnerContentUi child : myChildren) {
+      moveFollowingTabs(index, child.myTabs);
+    }
+  }
+
+  private static void moveFollowingTabs(int index, final JBRunnerTabs tabs) {
+    for (TabInfo info : tabs.getTabs()) {
+      final TabImpl tab = getTabFor(info);
+      final int tabIndex = tab != null ? tab.getIndex() : -1;
+      if (tabIndex >= index) {
+        tab.setIndex(tabIndex + 1);
+      }
+    }
+  }
+
   private int getTabOffsetFor(RunnerContentUi ui) {
     int offset = myTabs.getTabCount();
     for (RunnerContentUi child : myChildren) {
@@ -760,22 +789,25 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
       return false;
     }
 
-    String title = t.getDisplayName();
     Icon icon = t.getIcon();
 
     GridImpl grid = getGridFor(tab);
     boolean hasToolbarContent = grid.updateGridUI();
 
     List<Content> contents = grid.getContents();
+    String title = contents.size() > 1 ? t.getDisplayName() : null;
     if (title == null) {
-      title = "";
-      Iterator<Content> all = contents.iterator();
-      while (all.hasNext()) {
-        Content each = all.next();
-        title += each.getTabName();
-        if (all.hasNext()) {
-          title += " | ";
-        }
+      final String name = myLayoutSettings.getDefaultDisplayName(t.getDefaultIndex());
+      if (name != null && contents.size() > 1) {
+        title = name;
+      } else {
+        title = StringUtil.join(contents, new NotNullFunction<Content, String>() {
+          @NotNull
+          @Override
+          public String fun(Content dom) {
+            return dom.getTabName();
+          }
+        },  " | ");
       }
     }
 
@@ -787,7 +819,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
     tab.setDragOutDelegate(myTabs.getTabs().size() > 1 || !isOriginal() ? myDragOutDelegate : null);
 
     Tab gridTab = grid.getTab();
-    tab.setText(title).setIcon(gridTab != null && gridTab.isDefault() ? null : icon);
+    tab.setText(title).setIcon(gridTab != null && gridTab.isDefault() && contents.size() > 1 ? null : icon);
 
     return hasToolbarContent;
   }
@@ -924,9 +956,6 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
   }
 
   public void beforeDispose() {
-    if (myComponent.getRootPane() != null) {
-      saveUiState();
-    }
     if (myOriginal != null) {
       myDisposing = true;
       fireContentClosed(null);
index c1d3913f670b6bc4724640c57d61fc843f9453e6..2f6dbc88635c8d7ee30315acad872690b633718f 100644 (file)
@@ -55,6 +55,12 @@ public class RunnerLayout  {
   public RunnerLayout(final String ID) {
     myID = ID;
   }
+  
+  @Nullable
+  public String getDefaultDisplayName(final int defaultIndex) {
+    final TabImpl.Default tab = myDefaultTabs.get(defaultIndex);
+    return tab != null ? tab.myDisplayName : null;
+  }
 
   @NotNull
   public TabImpl getOrCreateTab(final int index) {