diff --git a/CHANGELOG.md b/CHANGELOG.md index d3fa4c634..2f724e854 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ FlatLaf Change Log #### New features and improvements - Tree: Support for alternate row highlighting. (PR #903) +- Tree: Support wide cell renderer. (issue #922) - Extras: `FlatSVGIcon` color filters now can access painting component to implement component state based color mappings. (issue #906) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java index 75ffcd2dd..a1953cce1 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -1410,13 +1410,23 @@ public interface FlatClientProperties //---- JTree -------------------------------------------------------------- /** - * Override if a tree shows a wide selection. Default is {@code true}. + * Specifies whether tree shows a wide selection. Default is {@code true}. *
* Component {@link javax.swing.JTree}
* Value type {@link java.lang.Boolean}
*/
String TREE_WIDE_SELECTION = "JTree.wideSelection";
+ /**
+ * Specifies whether tree uses a wide cell renderer. Default is {@code false}.
+ *
+ * Component {@link javax.swing.JTree}
+ * Value type {@link java.lang.Boolean}
+ *
+ * @since 3.6
+ */
+ String TREE_WIDE_CELL_RENDERER = "JTree.wideCellRenderer";
+
/**
* Specifies whether tree item selection is painted. Default is {@code true}.
* If set to {@code false}, then the tree cell renderer is responsible for painting selection.
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 ed3ecc905..2007bc22d 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
@@ -106,6 +106,7 @@
* @uiDefault Tree.selectionInsets Insets
* @uiDefault Tree.selectionArc int
* @uiDefault Tree.wideSelection boolean
+ * @uiDefault Tree.wideCellRenderer boolean
* @uiDefault Tree.showCellFocusIndicator boolean
* @uiDefault Tree.showDefaultIcons boolean
*
@@ -146,6 +147,7 @@ public class FlatTreeUI
/** @since 3 */ @Styleable protected Insets selectionInsets;
/** @since 3 */ @Styleable protected int selectionArc;
@Styleable protected boolean wideSelection;
+ /** @since 3.6 */ @Styleable protected boolean wideCellRenderer;
@Styleable protected boolean showCellFocusIndicator;
/** @since 3 */ protected boolean showDefaultIcons;
@@ -198,6 +200,7 @@ protected void installDefaults() {
selectionInsets = UIManager.getInsets( "Tree.selectionInsets" );
selectionArc = UIManager.getInt( "Tree.selectionArc" );
wideSelection = UIManager.getBoolean( "Tree.wideSelection" );
+ wideCellRenderer = UIManager.getBoolean( "Tree.wideCellRenderer" );
showCellFocusIndicator = UIManager.getBoolean( "Tree.showCellFocusIndicator" );
showDefaultIcons = UIManager.getBoolean( "Tree.showDefaultIcons" );
@@ -314,6 +317,7 @@ protected PropertyChangeListener createPropertyChangeListener() {
if( e.getSource() == tree ) {
switch( e.getPropertyName() ) {
case TREE_WIDE_SELECTION:
+ case TREE_WIDE_CELL_RENDERER:
case TREE_PAINT_SELECTION:
HiDPIUtils.repaint( tree );
break;
@@ -584,6 +588,18 @@ protected void paintRow( Graphics g, Rectangle clipBounds, Insets insets, Rectan
UIScale.scale( selectionInsets ), arc, arc, arc, arc, 0 );
}
+ // update bounds for wide cell renderer
+ if( isWideSelection() && isWideCellRenderer() ) {
+ Rectangle wideBounds = new Rectangle( bounds );
+ if( tree.getComponentOrientation().isLeftToRight() )
+ wideBounds.width = tree.getWidth() - bounds.x - insets.right;
+ else {
+ wideBounds.x = insets.left;
+ wideBounds.width = bounds.x + bounds.width - insets.left;
+ }
+ bounds = wideBounds;
+ }
+
// do not paint row if editing
if( isEditing ) {
// paint wide selection
@@ -808,6 +824,11 @@ protected boolean isWideSelection() {
return clientPropertyBoolean( tree, TREE_WIDE_SELECTION, wideSelection );
}
+ /** @since 3.6 */
+ protected boolean isWideCellRenderer() {
+ return clientPropertyBoolean( tree, TREE_WIDE_CELL_RENDERER, wideCellRenderer );
+ }
+
protected boolean isPaintSelection() {
return clientPropertyBoolean( tree, TREE_PAINT_SELECTION, paintSelection );
}
diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties
index 1f23a13ce..c39995ffd 100644
--- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties
+++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLaf.properties
@@ -934,6 +934,7 @@ Tree.rendererMargins = 1,2,1,2
Tree.selectionInsets = 0,0,0,0
Tree.selectionArc = 0
Tree.wideSelection = true
+Tree.wideCellRenderer = false
Tree.repaintWholeRow = true
Tree.paintLines = false
Tree.showCellFocusIndicator = false
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 8058bed2a..596ac6c8e 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
@@ -969,6 +969,7 @@ void tree() {
"selectionInsets", Insets.class,
"selectionArc", int.class,
"wideSelection", boolean.class,
+ "wideCellRenderer", boolean.class,
"showCellFocusIndicator", boolean.class,
"paintSelection", boolean.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 b5fab0a98..f0ae44841 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
@@ -942,6 +942,7 @@ void tree() {
testInsets( c, ui, "selectionInsets", 1,2,3,4 );
testInteger( c, ui, "selectionArc", 123 );
testBoolean( c, ui, "wideSelection", true );
+ testBoolean( c, ui, "wideCellRenderer", true );
testBoolean( c, ui, "showCellFocusIndicator", true );
testBoolean( c, ui, "paintSelection", false );
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 621daa012..d20e49fb0 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
@@ -1191,6 +1191,7 @@ void tree() {
ui.applyStyle( "selectionInsets: 1,2,3,4" );
ui.applyStyle( "selectionArc: 8" );
ui.applyStyle( "wideSelection: true" );
+ ui.applyStyle( "wideCellRenderer: true" );
ui.applyStyle( "showCellFocusIndicator: true" );
ui.applyStyle( "paintSelection: false" );
diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java
index 83c0075c6..4c32d50a4 100644
--- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java
+++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java
@@ -29,19 +29,37 @@ public class FlatTree
implements FlatComponentExtension, FlatStyleableComponent
{
/**
- * Returns if the tree shows a wide selection
+ * Returns whether tree shows a wide selection
*/
public boolean isWideSelection() {
return getClientPropertyBoolean( TREE_WIDE_SELECTION, "Tree.wideSelection" );
}
/**
- * Sets if the tree shows a wide selection
+ * Specifies whether tree shows a wide selection
*/
public void setWideSelection( boolean wideSelection ) {
putClientProperty( TREE_WIDE_SELECTION, wideSelection );
}
+ /**
+ * Returns whether tree uses a wide cell renderer.
+ *
+ * @since 3.6
+ */
+ public boolean isWideCellRenderer() {
+ return getClientPropertyBoolean( TREE_WIDE_CELL_RENDERER, "Tree.wideCellRenderer" );
+ }
+
+ /**
+ * Specifies whether tree uses a wide cell renderer.
+ *
+ * @since 3.6
+ */
+ public void setWideCellRenderer( boolean wideCellRenderer ) {
+ putClientProperty( TREE_WIDE_CELL_RENDERER, wideCellRenderer );
+ }
+
/**
* Returns whether tree item selection is painted. Default is {@code true}.
* If set to {@code false}, then the tree cell renderer is responsible for painting selection.
diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponents2Test.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponents2Test.java
index 57cc183b3..f8fcade99 100644
--- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponents2Test.java
+++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponents2Test.java
@@ -16,6 +16,7 @@
package com.formdev.flatlaf.testing;
+import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.ComponentOrientation;
@@ -32,6 +33,7 @@
import java.util.List;
import java.util.Map;
import java.util.Random;
+import java.util.function.Supplier;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.TableModelEvent;
@@ -497,48 +499,23 @@ private void treeRendererChanged() {
if( !(sel instanceof String) )
return;
- JTree[] trees = { tree1, tree2, xTree1 };
+ Supplier