inner toolbar positioning support for tabs on top
authorDennis Ushakov <dennis.ushakov@gmail.com>
Tue, 31 Jan 2012 10:44:23 +0000 (14:44 +0400)
committerDennis Ushakov <dennis.ushakov@gmail.com>
Tue, 31 Jan 2012 10:52:58 +0000 (14:52 +0400)
platform/platform-api/src/com/intellij/ui/tabs/JBTabsPresentation.java
platform/platform-api/src/com/intellij/ui/tabs/impl/JBTabsImpl.java
platform/platform-api/src/com/intellij/ui/tabs/impl/singleRow/SingleRowLayoutStrategy.java

index cf4b8d05668e5e0033033390e78d6b068e4e83fa..33fe1a0064a64ea87fd1a665a8726a40a0005998 100644 (file)
@@ -40,12 +40,16 @@ public interface JBTabsPresentation {
 
   JBTabsPresentation setSideComponentVertical(boolean vertical);
 
+  JBTabsPresentation setSideComponentOnTabs(boolean onTabs);
+
   JBTabsPresentation setSingleRow(boolean singleRow);
 
   boolean isSingleRow();
 
   boolean isSideComponentVertical();
 
+  boolean isSideComponentOnTabs();
+
   JBTabsPresentation setUiDecorator(@Nullable UiDecorator decorator);
 
   boolean isRequestFocusOnLastFocusedComponent();
index b26bca42d27d1b57d96176f2707b88e8f6e9c662..bd5de74ad0bd66c0bb2798209aaa949b3d91a869 100644 (file)
@@ -97,6 +97,8 @@ public class JBTabsImpl extends JComponent
 
   private boolean myStealthTabMode = false;
 
+  private boolean mySideComponentOnTabs = true;
+
   private DataProvider myDataProvider;
 
   private final WeakHashMap<Component, Component> myDeferredToRemove = new WeakHashMap<Component, Component>();
@@ -1583,6 +1585,13 @@ public class JBTabsImpl extends JComponent
         g2d.setColor(CaptionPanel.CNT_ACTIVE_COLOR);
         g2d.drawLine((int)toolBounds.getMaxX(), toolBounds.y, (int)toolBounds.getMaxX(), (int)toolBounds.getMaxY() - 1);
       }
+    } else if (!isSideComponentOnTabs()) {
+      Toolbar toolbarComp = myInfo2Toolbar.get(mySelectedInfo);
+      if (toolbarComp != null && !toolbarComp.isEmpty()) {
+        Rectangle toolBounds = toolbarComp.getBounds();
+        g2d.setColor(CaptionPanel.CNT_ACTIVE_COLOR);
+        g2d.drawLine(toolBounds.x, (int)toolBounds.getMaxY(), (int)toolBounds.getMaxX() - 1, (int)toolBounds.getMaxY());
+      }
     }
 
     config.restore();
@@ -2156,7 +2165,9 @@ public class JBTabsImpl extends JComponent
   }
 
   public boolean isStealthModeEffective() {
-    return myStealthTabMode && getTabCount() == 1 && isSideComponentVertical() && getTabsPosition() == JBTabsPosition.top;
+    return myStealthTabMode && getTabCount() == 1 &&
+           (isSideComponentVertical() || !isSideComponentOnTabs()) &&
+           getTabsPosition() == JBTabsPosition.top;
   }
 
 
@@ -2842,6 +2853,15 @@ public class JBTabsImpl extends JComponent
     return this;
   }
 
+  @Override
+  public JBTabsPresentation setSideComponentOnTabs(boolean onTabs) {
+    mySideComponentOnTabs = onTabs;
+
+    relayout(true, false);
+
+    return this;
+  }
+
   public JBTabsPresentation setSingleRow(boolean singleRow) {
     myLayout = singleRow ? mySingleRowLayout : myTableLayout;
 
@@ -2870,6 +2890,11 @@ public class JBTabsImpl extends JComponent
     return !myHorizontalSide;
   }
 
+  @Override
+  public boolean isSideComponentOnTabs() {
+    return mySideComponentOnTabs;
+  }
+
   public TabLayout getEffectiveLayout() {
     if (myLayout == myTableLayout && getTabsPosition() == JBTabsPosition.top) return myTableLayout;
     return mySingleRowLayout;
index b9975f766155ee76b22176247911331bc62c82c6..8919f8cdf8e263da753a64f5d39ae319a4c236e5 100644 (file)
@@ -128,7 +128,7 @@ public abstract class SingleRowLayoutStrategy {
 
     @Override
     public boolean isSideComponentOnTabs() {
-      return !myTabs.isSideComponentVertical();
+      return !myTabs.isSideComponentVertical() && myTabs.isSideComponentOnTabs();
     }
 
     public ShapeTransform createShapeTransform(Rectangle labelRec) {
@@ -157,15 +157,23 @@ public abstract class SingleRowLayoutStrategy {
       if (myTabs.isHideTabs()) {
         myTabs.layoutComp(data, 0, 0, 0, 0);
       } else {
-        final int x = data.vToolbar != null ? data.vToolbar.getPreferredSize().width + 1 : 0;
-        final int y = data.compPosition + myTabs.myHeaderFitSize.height + (myTabs.isEditorTabs() ? 0 : 1);
+        final int vToolbarWidth = data.vToolbar != null ? data.vToolbar.getPreferredSize().width : 0;
+        final int x = vToolbarWidth > 0 ? vToolbarWidth + 1 : 0;
+        final int hToolbarHeight = !myTabs.isSideComponentOnTabs() && data.hToolbar != null ? data.hToolbar.getPreferredSize().height : 0;
+        final int y = data.compPosition + myTabs.myHeaderFitSize.height + (myTabs.isEditorTabs() ? 0 : 1) +
+                      (hToolbarHeight > 0 ? hToolbarHeight - 2 : 0);
 
         if (data.hToolbar != null) {
-          myTabs.layoutComp(x, y, data.comp, 0, 0);
-          int toolbarX = data.moreRect != null ? (int)data.moreRect.getMaxX() + myTabs.getToolbarInset() : (data.position + myTabs.getToolbarInset());
-          final Rectangle rec =
-            new Rectangle(toolbarX, data.insets.top + 1, myTabs.getSize().width - data.insets.left - toolbarX, myTabs.myHeaderFitSize.height);
-          myTabs.layout(data.hToolbar, rec);
+          final Rectangle compBounds = myTabs.layoutComp(x, y, data.comp, 0, 0);
+          if (myTabs.isSideComponentOnTabs()) {
+            int toolbarX = data.moreRect != null ? (int)data.moreRect.getMaxX() + myTabs.getToolbarInset() : (data.position + myTabs.getToolbarInset());
+            final Rectangle rec =
+              new Rectangle(toolbarX, data.insets.top + 1, myTabs.getSize().width - data.insets.left - toolbarX, myTabs.myHeaderFitSize.height);
+            myTabs.layout(data.hToolbar, rec);
+          } else {
+            final int toolbarHeight = data.hToolbar.getPreferredSize().height - 2;
+            myTabs.layout(data.hToolbar, compBounds.x, compBounds.y - toolbarHeight - 1, compBounds.width, toolbarHeight);
+          }
         } else if (data.vToolbar != null) {
           final Rectangle compBounds = myTabs.layoutComp(x, y, data.comp, 0, 0);
           final int toolbarWidth = data.vToolbar.getPreferredSize().width;