diff --git a/CHANGELOG.md b/CHANGELOG.md index 95f0b646..47da870e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,11 @@ FlatLaf Change Log ## 2.5-SNAPSHOT +#### New features and improvements + +- TabbedPane: New option to disable tab run rotation in wrap layout. Set UI + value `TabbedPane.rotateTabRuns` to `false`. (issue #574) + #### Fixed bugs - Fixed missing UI value `MenuItem.acceleratorDelimiter` on macOS. (was `null`, diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java index db7506e8..094a04b3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java @@ -145,7 +145,7 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault TabbedPane.showTabSeparators boolean * @uiDefault TabbedPane.tabSeparatorsFullHeight boolean * @uiDefault TabbedPane.hasFullBorder boolean - * @uiDefault TabbedPane.activeTabBorder boolean + * @uiDefault TabbedPane.rotateTabRuns boolean * * @uiDefault TabbedPane.tabLayoutPolicy String wrap (default) or scroll * @uiDefault TabbedPane.tabType String underlined (default) or card @@ -220,6 +220,7 @@ public class FlatTabbedPaneUI @Styleable protected boolean tabSeparatorsFullHeight; @Styleable protected boolean hasFullBorder; @Styleable protected boolean tabsOpaque = true; + /** @since 2.5 */ @Styleable protected boolean rotateTabRuns = true; @Styleable(type=String.class) private int tabType; @Styleable(type=String.class) private int tabsPopupPolicy; @@ -342,6 +343,7 @@ public class FlatTabbedPaneUI tabSeparatorsFullHeight = UIManager.getBoolean( "TabbedPane.tabSeparatorsFullHeight" ); hasFullBorder = UIManager.getBoolean( "TabbedPane.hasFullBorder" ); tabsOpaque = UIManager.getBoolean( "TabbedPane.tabsOpaque" ); + rotateTabRuns = FlatUIUtils.getUIBoolean( "TabbedPane.rotateTabRuns", true ); tabType = parseTabType( UIManager.getString( "TabbedPane.tabType" ) ); tabsPopupPolicy = parseTabsPopupPolicy( UIManager.getString( "TabbedPane.tabsPopupPolicy" ) ); @@ -1092,7 +1094,7 @@ public class FlatTabbedPaneUI // paint selection indicator if( isSelected ) - paintTabSelection( g, tabPlacement, x, y, w, h ); + paintTabSelection( g, tabPlacement, tabIndex, x, y, w, h ); if( tabPane.getTabComponentAt( tabIndex ) != null ) return; @@ -1281,14 +1283,19 @@ public class FlatTabbedPaneUI } } - protected void paintTabSelection( Graphics g, int tabPlacement, int x, int y, int w, int h ) { + protected void paintTabSelection( Graphics g, int tabPlacement, int tabIndex, int x, int y, int w, int h ) { g.setColor( tabPane.isEnabled() ? (isTabbedPaneOrChildFocused() ? underlineColor : inactiveUnderlineColor) : disabledUnderlineColor ); // paint underline selection boolean atBottom = (getTabType() != TAB_TYPE_CARD); - Insets contentInsets = getContentBorderInsets( tabPlacement ); + Insets contentInsets = atBottom + ? ((!rotateTabRuns && runCount > 1 && !isScrollTabLayout() && getRunForTab( tabPane.getTabCount(), tabIndex ) > 0) + ? new Insets( 0, 0, 0, 0 ) + : getContentBorderInsets( tabPlacement )) + : null; + int tabSelectionHeight = scale( atBottom ? this.tabSelectionHeight : cardTabSelectionHeight ); int sx, sy; switch( tabPlacement ) { @@ -1447,7 +1454,7 @@ public class FlatTabbedPaneUI else g.clipRect( 0, vr.y, tabPane.getWidth(), vr.height ); - paintTabSelection( g, tabPlacement, tabRect.x, tabRect.y, tabRect.width, tabRect.height ); + paintTabSelection( g, tabPlacement, selectedIndex, tabRect.x, tabRect.y, tabRect.width, tabRect.height ); g.setClip( oldClip ); } } @@ -1600,6 +1607,11 @@ public class FlatTabbedPaneUI super.getTabRunCount( tabPane ); } + @Override + protected boolean shouldRotateTabRuns( int tabPlacement ) { + return rotateTabRuns; + } + private boolean isLastInRun( int tabIndex ) { int run = getRunForTab( tabPane.getTabCount(), tabIndex ); return lastTabInRun( tabPane.getTabCount(), run ) == tabIndex; diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java index 94f853e3..cbc87636 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableInfo.java @@ -722,6 +722,7 @@ public class TestFlatStyleableInfo "tabSeparatorsFullHeight", boolean.class, "hasFullBorder", boolean.class, "tabsOpaque", boolean.class, + "rotateTabRuns", boolean.class, "tabType", String.class, "tabsPopupPolicy", String.class, diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableValue.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableValue.java index c105f2e7..1cf294b7 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableValue.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableValue.java @@ -739,6 +739,7 @@ public class TestFlatStyleableValue testBoolean( c, ui, "tabSeparatorsFullHeight", false ); testBoolean( c, ui, "hasFullBorder", false ); testBoolean( c, ui, "tabsOpaque", false ); + testBoolean( c, ui, "rotateTabRuns", false ); testString( c, ui, "tabType", "card" ); testString( c, ui, "tabsPopupPolicy", "asNeeded" ); diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java index 6c7c431a..fd28dca5 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyling.java @@ -891,6 +891,7 @@ public class TestFlatStyling ui.applyStyle( "tabSeparatorsFullHeight: false" ); ui.applyStyle( "hasFullBorder: false" ); ui.applyStyle( "tabsOpaque: false" ); + ui.applyStyle( "rotateTabRuns: false" ); ui.applyStyle( "tabType: card" ); ui.applyStyle( "tabsPopupPolicy: asNeeded" ); diff --git a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt index 9f0d4025..a6a59cc2 100644 --- a/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt +++ b/flatlaf-theme-editor/src/main/resources/com/formdev/flatlaf/themeeditor/FlatLafUIKeys.txt @@ -840,6 +840,7 @@ TabbedPane.hoverColor TabbedPane.inactiveUnderlineColor TabbedPane.labelShift TabbedPane.light +TabbedPane.rotateTabRuns TabbedPane.scrollButtonsPlacement TabbedPane.scrollButtonsPolicy TabbedPane.selectedBackground