From 4e7b0d11d0fe6db1d9b4a13b576468a404bb9fb9 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Thu, 24 Jun 2021 13:43:19 +0200 Subject: [PATCH] Styling: support Tree icons --- .../flatlaf/icons/FlatTreeClosedIcon.java | 2 ++ .../flatlaf/icons/FlatTreeCollapsedIcon.java | 35 +++++++++++++++++++ .../flatlaf/icons/FlatTreeExpandedIcon.java | 5 +++ .../flatlaf/icons/FlatTreeLeafIcon.java | 2 ++ .../flatlaf/icons/FlatTreeOpenIcon.java | 2 ++ .../com/formdev/flatlaf/ui/FlatTreeUI.java | 31 ++++++++++++++++ .../formdev/flatlaf/ui/FlatStylingTests.java | 8 +++++ 7 files changed, 85 insertions(+) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java index df160011..c149bb9c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeClosedIcon.java @@ -37,6 +37,8 @@ public class FlatTreeClosedIcon @Override protected void paintIcon( Component c, Graphics2D g ) { + FlatTreeCollapsedIcon.setStyleColorFromTreeUI( c, g, ui -> ui.iconClosedColor ); + /* diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java index 481b2e42..d245f79c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeCollapsedIcon.java @@ -19,7 +19,12 @@ package com.formdev.flatlaf.icons; import java.awt.Color; import java.awt.Component; import java.awt.Graphics2D; +import java.util.function.Function; +import javax.swing.JTree; +import javax.swing.SwingUtilities; import javax.swing.UIManager; +import javax.swing.plaf.TreeUI; +import com.formdev.flatlaf.ui.FlatTreeUI; import com.formdev.flatlaf.ui.FlatUIUtils; /** @@ -46,8 +51,12 @@ public class FlatTreeCollapsedIcon @Override protected void paintIcon( Component c, Graphics2D g ) { + setStyleColorFromTreeUI( c, g ); rotate( c, g ); + String arrowType = getStyleFromTreeUI( c, ui -> ui.iconArrowType ); + boolean chevron = (arrowType != null) ? FlatUIUtils.isChevron( arrowType ) : this.chevron; + if( chevron ) { // chevron arrow g.fill( FlatUIUtils.createPath( 3,1, 3,2.5, 6,5.5, 3,8.5, 3,10, 4.5,10, 9,5.5, 4.5,1 ) ); @@ -57,8 +66,34 @@ public class FlatTreeCollapsedIcon } } + void setStyleColorFromTreeUI( Component c, Graphics2D g ) { + setStyleColorFromTreeUI( c, g, ui -> ui.iconCollapsedColor ); + } + void rotate( Component c, Graphics2D g ) { if( !c.getComponentOrientation().isLeftToRight() ) g.rotate( Math.toRadians( 180 ), width / 2., height / 2. ); } + + /** + * Because this icons are always shared for all trees, + * get icon specific style from FlatTreeUI. + */ + static T getStyleFromTreeUI( Component c, Function f ) { + JTree tree = (c instanceof JTree) + ? (JTree) c + : (JTree) SwingUtilities.getAncestorOfClass( JTree.class, c ); + if( tree != null ) { + TreeUI ui = tree.getUI(); + if( ui instanceof FlatTreeUI ) + return f.apply( (FlatTreeUI) ui ); + } + return null; + } + + static void setStyleColorFromTreeUI( Component c, Graphics2D g, Function f ) { + Color color = getStyleFromTreeUI( c, f ); + if( color != null ) + g.setColor( color ); + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeExpandedIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeExpandedIcon.java index 113139e9..3e99f3ef 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeExpandedIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeExpandedIcon.java @@ -34,6 +34,11 @@ public class FlatTreeExpandedIcon super( UIManager.getColor( "Tree.icon.expandedColor" ) ); } + @Override + void setStyleColorFromTreeUI( Component c, Graphics2D g ) { + setStyleColorFromTreeUI( c, g, ui -> ui.iconExpandedColor ); + } + @Override void rotate( Component c, Graphics2D g ) { g.rotate( Math.toRadians( 90 ), width / 2., height / 2. ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java index 6ec8900d..b85ccbb1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeLeafIcon.java @@ -37,6 +37,8 @@ public class FlatTreeLeafIcon @Override protected void paintIcon( Component c, Graphics2D g ) { + FlatTreeCollapsedIcon.setStyleColorFromTreeUI( c, g, ui -> ui.iconLeafColor ); + /* diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java index f8754d9e..e2ca5213 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTreeOpenIcon.java @@ -37,6 +37,8 @@ public class FlatTreeOpenIcon @Override protected void paintIcon( Component c, Graphics2D g ) { + FlatTreeCollapsedIcon.setStyleColorFromTreeUI( c, g, ui -> ui.iconOpenColor ); + /* diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java index 147e608c..cfd8b724 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTreeUI.java @@ -96,6 +96,28 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault Tree.wideSelection boolean * @uiDefault Tree.showCellFocusIndicator boolean * + * + * + * @uiDefault Component.arrowType String chevron (default) or triangle + * @uiDefault Tree.icon.expandedColor Color + * + * + * + * @uiDefault Component.arrowType String chevron (default) or triangle + * @uiDefault Tree.icon.collapsedColor Color + * + * + * + * @uiDefault Tree.icon.leafColor Color + * + * + * + * @uiDefault Tree.icon.closedColor Color + * + * + * + * @uiDefault Tree.icon.openColor Color + * * @author Karl Tauber */ public class FlatTreeUI @@ -109,6 +131,15 @@ public class FlatTreeUI @Styleable protected boolean wideSelection; @Styleable protected boolean showCellFocusIndicator; + // for icons + // (needs to be public because icon classes are in another package) + @Styleable(dot=true) public String iconArrowType; + @Styleable(dot=true) public Color iconExpandedColor; + @Styleable(dot=true) public Color iconCollapsedColor; + @Styleable(dot=true) public Color iconLeafColor; + @Styleable(dot=true) public Color iconClosedColor; + @Styleable(dot=true) public Color iconOpenColor; + private Color defaultCellNonSelectionBackground; private Color defaultSelectionBackground; private Color defaultSelectionForeground; diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 2d7c3d27..4016852a 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -573,6 +573,14 @@ public class FlatStylingTests ui.applyStyle( "selectionBorderColor: #fff" ); ui.applyStyle( "wideSelection: true" ); ui.applyStyle( "showCellFocusIndicator: true" ); + + // icons + ui.applyStyle( "icon.arrowType: chevron" ); + ui.applyStyle( "icon.expandedColor: #fff" ); + ui.applyStyle( "icon.collapsedColor: #fff" ); + ui.applyStyle( "icon.leafColor: #fff" ); + ui.applyStyle( "icon.closedColor: #fff" ); + ui.applyStyle( "icon.openColor: #fff" ); } //---- component borders --------------------------------------------------