visual switcher - editor tabs
authorKirill Kalishev <kirill.kalishev@jetbrains.com>
Fri, 23 Apr 2010 14:08:03 +0000 (18:08 +0400)
committerKirill Kalishev <kirill.kalishev@jetbrains.com>
Fri, 23 Apr 2010 14:08:03 +0000 (18:08 +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
platform/platform-api/src/com/intellij/ui/switcher/SwitchProvider.java
platform/platform-api/src/com/intellij/ui/switcher/SwitchingSession.java
platform/platform-api/src/com/intellij/ui/tabs/JBTabs.java
platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java
platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionToolbarImpl.java
platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorTabbedContainer.java
platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java
platform/platform-impl/src/com/intellij/ui/content/impl/ContentManagerImpl.java

index fc3d1ccfceb12911c48e2b84d37a8c68933bec93..47e7735431d806d201a791e51751c051e546985d 100644 (file)
@@ -47,8 +47,6 @@ import javax.swing.border.EmptyBorder;
 import java.awt.*;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Set;
 
 public class GridCellImpl implements GridCell, Disposable {
@@ -98,7 +96,7 @@ public class GridCellImpl implements GridCell, Disposable {
       }
     }).setSideComponentVertical(!context.getLayoutSettings().isToolbarHorizontal())
       .setStealthTabMode(true)
-      .setFocusCycle(false).setPaintFocus(true);
+      .setFocusCycle(false).setPaintFocus(true).setProvideSwitchTargets(false);
 
     myTabs.addTabMouseListener(new MouseAdapter() {
       public void mousePressed(final MouseEvent e) {
@@ -250,7 +248,7 @@ public class GridCellImpl implements GridCell, Disposable {
   }
 
   public java.util.List<SwitchTarget> getTargets(boolean onlyVisible) {
-    return myTabs.getTargets(onlyVisible);
+    return myTabs.getTargets(onlyVisible, false);
   }
 
   public SwitchTarget getTargetForSelection() {
index d4240ba68797c5069bebe0455cb5bf3df5fb1649..d94b6c4bfd27a9c808fa248d437f0ceefb8d0fce 100644 (file)
@@ -29,7 +29,6 @@ import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.Ref;
 import com.intellij.openapi.wm.IdeFocusManager;
 import com.intellij.openapi.wm.ToolWindow;
-import com.intellij.ui.awt.RelativeRectangle;
 import com.intellij.ui.components.panels.NonOpaquePanel;
 import com.intellij.ui.components.panels.Wrapper;
 import com.intellij.ui.content.*;
@@ -158,7 +157,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
             }
             return null;
           }
-        }).setInnerInsets(new Insets(1, 0, 0, 0)).setToDrawBorderIfTabsHidden(false).setUiDecorator(new UiDecorator() {
+        }).setProvideSwitchTargets(false).setInnerInsets(new Insets(1, 0, 0, 0)).setToDrawBorderIfTabsHidden(false).setUiDecorator(new UiDecorator() {
         @NotNull
         public UiDecoration getDecoration() {
           return new UiDecoration(null, new Insets(1, 8, 1, 8));
@@ -1122,10 +1121,10 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
     return cell != null ? cell : myTabs.getCurrentTarget();
   }
 
-  public List<SwitchTarget> getTargets(boolean onlyVisible) {
+  public List<SwitchTarget> getTargets(boolean onlyVisible, boolean originalProvider) {
     List<SwitchTarget> result = new ArrayList<SwitchTarget>();
 
-    result.addAll(myTabs.getTargets(true));
+    result.addAll(myTabs.getTargets(true, false));
     result.addAll(getSelectedGrid().getTargets(onlyVisible));
 
     Iterator<Wrapper> toolbars = myMinimizedButtonsPlaceholder.values().iterator();
@@ -1135,7 +1134,7 @@ public class RunnerContentUi implements ContentUI, Disposable, CellTransform.Fac
       JComponent target = each.getTargetComponent();
       if (target instanceof ActionToolbar) {
         ActionToolbar tb = (ActionToolbar)target;
-        result.addAll(tb.getTargets(onlyVisible));
+        result.addAll(tb.getTargets(onlyVisible, false));
       }
     }
 
index 980200657b2cfbc912b686e2a5f81b80b8db55ed..8b97f695227c7266dd37d52dbc21efa115577df7 100644 (file)
@@ -24,7 +24,7 @@ public interface SwitchProvider {
 
   DataKey<SwitchProvider> KEY = DataKey.create("SwitchProvider");
 
-  List<SwitchTarget> getTargets(boolean onlyVisible);
+  List<SwitchTarget> getTargets(boolean onlyVisible, boolean originalProvider);
   SwitchTarget getCurrentTarget();
 
   JComponent getComponent();
index b642fc30bbbb0e11417960cae1e33d01aad5e96a..fc6bcbe9cc2e0dc3457e75c8af745a3e20d3909f 100644 (file)
@@ -16,9 +16,7 @@
 package com.intellij.ui.switcher;
 
 import com.intellij.openapi.Disposable;
-import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.ui.AbstractPainter;
-import com.intellij.openapi.ui.Painter;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.wm.IdeGlassPane;
 import com.intellij.openapi.wm.IdeGlassPaneUtil;
@@ -27,7 +25,6 @@ import com.intellij.ui.awt.RelativePoint;
 
 import javax.swing.*;
 import java.awt.*;
-import java.awt.event.InputEvent;
 import java.awt.event.KeyEvent;
 import java.util.*;
 import java.util.List;
@@ -54,14 +51,14 @@ public class SwitchingSession implements KeyEventDispatcher, Disposable {
     KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this);
 
 
-    myTargets = myProvider.getTargets(true);
+    myTargets = myProvider.getTargets(true, true);
 
     Component eachParent = myProvider.getComponent();
     eachParent = eachParent.getParent();
     while (eachParent != null) {
       if (eachParent instanceof SwitchProvider) {
         SwitchProvider eachProvider = (SwitchProvider)eachParent;
-        myTargets.addAll(eachProvider.getTargets(true));
+        myTargets.addAll(eachProvider.getTargets(true, false));
         if (eachProvider.isCycleRoot()) {
           break;
         }
index 3a17bfd35aa8629617094f848a2977a3007ffe95..e5f352b4d1e7ec6cc46da098c4dfb6fb25c6298b 100644 (file)
@@ -114,4 +114,6 @@ public interface JBTabs extends SwitchProvider {
   JBTabs setNavigationActionsEnabled(boolean enabled);
 
   boolean isDisposed();
+
+  JBTabs setAdditinalSwitchProviderWhenOriginal(SwitchProvider delegate);
 }
index 0896ca332f87c83edcd6892831c9d1ffd4a0c532..7a436021127a1e4122ce948f26e59f6d8b969b65 100644 (file)
@@ -156,6 +156,7 @@ public class JBTabsImpl extends JComponent
   private boolean myUseBufferedPaint = true;
 
   private boolean myOwnSwitchProvider = true;
+  private SwitchProvider mySwitchDelegate;
 
   public JBTabsImpl(@NotNull Project project) {
     this(project, project);
@@ -289,6 +290,11 @@ public class JBTabsImpl extends JComponent
     return myDisposed;
   }
 
+  public JBTabs setAdditinalSwitchProviderWhenOriginal(SwitchProvider delegate) {
+    mySwitchDelegate = delegate;
+    return this;
+  }
+
   public void dispose() {
     myDisposed = true;
     mySelectedInfo = null;
@@ -2743,16 +2749,29 @@ public class JBTabsImpl extends JComponent
     repaint();
   }
 
-  public List<SwitchTarget> getTargets(boolean onlyVisible) {
+  public List<SwitchTarget> getTargets(boolean onlyVisible, boolean originalProvider) {
     ArrayList<SwitchTarget> result = new ArrayList<SwitchTarget>();
     for (TabInfo each : myVisibleInfos) {
       result.add(new TabTarget(each));
     }
+
+    if (originalProvider && mySwitchDelegate != null) {
+      List<SwitchTarget> additional = mySwitchDelegate.getTargets(onlyVisible, false);
+      if (additional != null) {
+        result.addAll(additional);
+      }
+    }
+
     return result;
   }
 
 
   public SwitchTarget getCurrentTarget() {
+    if (mySwitchDelegate != null) {
+      SwitchTarget selection = mySwitchDelegate.getCurrentTarget();
+      if (selection != null) return selection;
+    }
+
     return new TabTarget(getSelectedInfo());
   }
 
index 403a8e037f3623e2d4faed3d8ec25821faaa266e..e0e8ee86cdeb35e972d591638d112a2ad7084992 100644 (file)
@@ -40,7 +40,6 @@ import com.intellij.openapi.util.IconLoader;
 import com.intellij.openapi.wm.IdeFocusManager;
 import com.intellij.ui.awt.RelativePoint;
 import com.intellij.ui.awt.RelativeRectangle;
-import com.intellij.ui.switcher.SwitchProvider;
 import com.intellij.ui.switcher.SwitchTarget;
 import com.intellij.util.ui.UIUtil;
 import com.intellij.util.ui.update.UiNotifyConnector;
@@ -991,7 +990,7 @@ public class ActionToolbarImpl extends JPanel implements ActionToolbar {
     }
   }
 
-  public List<SwitchTarget> getTargets(boolean onlyVisible) {
+  public List<SwitchTarget> getTargets(boolean onlyVisible, boolean originalProvider) {
     ArrayList<SwitchTarget> result = new ArrayList<SwitchTarget>();
 
     if ((getBounds().width * getBounds().height) <= 0) return result;
index 8f3a4bf9c8ee05a8c7076ea3c94106a1f32ecb29..b4b81b88c97a61ae95233004c7c31968b8c32e0c 100644 (file)
@@ -39,8 +39,11 @@ import com.intellij.openapi.wm.ToolWindowManager;
 import com.intellij.openapi.wm.ex.ToolWindowManagerAdapter;
 import com.intellij.openapi.wm.ex.ToolWindowManagerEx;
 import com.intellij.ui.SimpleTextAttributes;
+import com.intellij.ui.switcher.SwitchProvider;
+import com.intellij.ui.switcher.SwitchTarget;
 import com.intellij.ui.tabs.*;
 import com.intellij.ui.tabs.impl.JBTabsImpl;
+import com.intellij.util.ui.AwtVisitor;
 import com.intellij.util.ui.TimedDeadzone;
 import com.intellij.util.ui.UIUtil;
 import org.jetbrains.annotations.NonNls;
@@ -52,6 +55,7 @@ import javax.swing.border.EmptyBorder;
 import java.awt.*;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -96,7 +100,7 @@ final class EditorTabbedContainer implements Disposable, CloseAction.CloseTarget
             newEditor.selectNotify();
           }
         }
-      });
+      }).setAdditinalSwitchProviderWhenOriginal(new MySwitchProvider());
 
     setTabPlacement(UISettings.getInstance().EDITOR_TAB_PLACEMENT);
 
@@ -178,7 +182,7 @@ final class EditorTabbedContainer implements Disposable, CloseAction.CloseTarget
   public void setBackgroundColorAt(final int index, final Color color) {
     myTabs.getTabAt(index).setTabColor(color);
   }
-  
+
   public void setTabLayoutPolicy(final int policy) {
     switch (policy) {
       case JTabbedPane.SCROLL_TAB_LAYOUT:
@@ -222,7 +226,8 @@ final class EditorTabbedContainer implements Disposable, CloseAction.CloseTarget
     TabInfo tab = myTabs.findInfo(file);
     if (tab != null) return;
 
-    tab = new TabInfo(comp).setText(calcTabTitle(myProject, file)).setIcon(icon).setTooltipText(tooltip).setObject(file).setTabColor(calcTabColor(myProject, file));
+    tab = new TabInfo(comp).setText(calcTabTitle(myProject, file)).setIcon(icon).setTooltipText(tooltip).setObject(file)
+      .setTabColor(calcTabColor(myProject, file));
     tab.setTestableUi(new MyQueryable(tab));
 
     final DefaultActionGroup tabActions = new DefaultActionGroup();
@@ -301,7 +306,8 @@ final class EditorTabbedContainer implements Disposable, CloseAction.CloseTarget
       final VirtualFile file = (VirtualFile)myTabInfo.getObject();
       if (ActionPlaces.EDITOR_TAB.equals(e.getPlace())) {
         window = myWindow;
-      } else {
+      }
+      else {
         window = mgr.getCurrentWindow();
       }
 
@@ -379,4 +385,53 @@ final class EditorTabbedContainer implements Disposable, CloseAction.CloseTarget
       }
     }
   }
+
+  private class MySwitchProvider implements SwitchProvider {
+    public List<SwitchTarget> getTargets(final boolean onlyVisible, boolean originalProvider) {
+      final ArrayList<SwitchTarget> result = new ArrayList<SwitchTarget>();
+      TabInfo selected = myTabs.getSelectedInfo();
+      new AwtVisitor(selected.getComponent()) {
+        @Override
+        public boolean visit(Component component) {
+          if (component instanceof JBTabs) {
+            JBTabs tabs = (JBTabs)component;
+            if (tabs != myTabs) {
+              result.addAll(tabs.getTargets(onlyVisible, false));
+              return true;
+            }
+          }
+          return false;
+        }
+      };
+      return result;
+    }
+
+    public SwitchTarget getCurrentTarget() {
+      TabInfo selected = myTabs.getSelectedInfo();
+      final Ref<SwitchTarget> targetRef = new Ref<SwitchTarget>();
+      new AwtVisitor(selected.getComponent()) {
+        @Override
+        public boolean visit(Component component) {
+          if (component instanceof JBTabs) {
+            JBTabs tabs = (JBTabs)component;
+            if (tabs != myTabs) {
+              targetRef.set(tabs.getCurrentTarget());
+              return true;
+            }
+          }
+          return false;
+        }
+      };
+
+      return targetRef.get();
+    }
+
+    public JComponent getComponent() {
+      return null;
+    }
+
+    public boolean isCycleRoot() {
+      return false;
+    }
+  }
 }
index 5eb14263bd1fc1da5e343f151e96307a579b8474..77ca8292b2cd1240360b33a31b8976a67b094443 100644 (file)
@@ -442,7 +442,7 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh
 
   }
 
-  public List<SwitchTarget> getTargets(boolean onlyVisible) {
+  public List<SwitchTarget> getTargets(boolean onlyVisible, boolean originalProvider) {
     List<SwitchTarget> result = new ArrayList<SwitchTarget>();
 
     if (myType == ToolWindowContentUiType.TABBED) {
index 8d177693bd8d33a06ad418628688cbe66762a131..b74548c14ae45dceb42ad25f8b8a72e1b9b8547a 100644 (file)
@@ -135,9 +135,9 @@ public class ContentManagerImpl implements ContentManager, PropertyChangeListene
       return null;
     }
 
-    public List<SwitchTarget> getTargets(boolean onlyVisible) {
+    public List<SwitchTarget> getTargets(boolean onlyVisible, boolean originalProvider) {
       if (myUI instanceof SwitchProvider) {
-        return ((SwitchProvider)myUI).getTargets(onlyVisible);
+        return ((SwitchProvider)myUI).getTargets(onlyVisible, false);
       }
       return new ArrayList<SwitchTarget>();
     }