From 60f3428da7c3f4375878e5c7e49694dc7c4d3e01 Mon Sep 17 00:00:00 2001 From: Ingo Kegel Date: Tue, 19 Jan 2021 17:46:41 +0100 Subject: [PATCH] Added a per-tree wide selection setting --- .../formdev/flatlaf/FlatClientProperties.java | 8 ++++ .../com/formdev/flatlaf/ui/FlatTreeUI.java | 41 +++++++++++++------ .../flatlaf/extras/components/FlatTree.java | 28 +++++++++++++ 3 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java 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 96831b16..f6d76737 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatClientProperties.java @@ -670,6 +670,14 @@ public interface FlatClientProperties */ String TAB_BUTTON_SELECTED_BACKGROUND = "JToggleButton.tab.selectedBackground"; + /** + * Override if a tree shows a wide selection. + *

+ * Component {@link javax.swing.JTree}
+ * Value type {@link java.lang.Boolean} + */ + String TREE_WIDE_SELECTION = "JTree.wideSelection"; + //---- helper methods ----------------------------------------------------- /** 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 4527270a..eae9cbdd 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 @@ -16,6 +16,8 @@ package com.formdev.flatlaf.ui; +import static com.formdev.flatlaf.FlatClientProperties.*; + import java.awt.Color; import java.awt.Component; import java.awt.Graphics; @@ -25,6 +27,7 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.lang.reflect.Field; import javax.swing.CellRendererPane; import javax.swing.JComponent; import javax.swing.JTree; @@ -119,7 +122,7 @@ public class FlatTreeUI selectionInactiveBackground = UIManager.getColor( "Tree.selectionInactiveBackground" ); selectionInactiveForeground = UIManager.getColor( "Tree.selectionInactiveForeground" ); selectionBorderColor = UIManager.getColor( "Tree.selectionBorderColor" ); - wideSelection = UIManager.getBoolean( "Tree.wideSelection" ); + wideSelection = clientPropertyBoolean( tree, TREE_WIDE_SELECTION, UIManager.getBoolean( "Tree.wideSelection" )); showCellFocusIndicator = UIManager.getBoolean( "Tree.showCellFocusIndicator" ); // scale @@ -145,9 +148,6 @@ public class FlatTreeUI @Override protected MouseListener createMouseListener() { - if( !wideSelection ) - return super.createMouseListener(); - return new BasicTreeUI.MouseHandler() { @Override public void mousePressed( MouseEvent e ) { @@ -165,7 +165,7 @@ public class FlatTreeUI } private MouseEvent handleWideMouseEvent( MouseEvent e ) { - if( !tree.isEnabled() || !SwingUtilities.isLeftMouseButton( e ) || e.isConsumed() ) + if( !wideSelection || !tree.isEnabled() || !SwingUtilities.isLeftMouseButton( e ) || e.isConsumed() ) return e; int x = e.getX(); @@ -192,18 +192,33 @@ public class FlatTreeUI @Override protected PropertyChangeListener createPropertyChangeListener() { - if( !wideSelection ) - return super.createPropertyChangeListener(); - return new BasicTreeUI.PropertyChangeHandler() { @Override public void propertyChange( PropertyChangeEvent e ) { super.propertyChange( e ); - - if( e.getSource() == tree && e.getPropertyName() == "dropLocation" ) { - JTree.DropLocation oldValue = (JTree.DropLocation) e.getOldValue(); - repaintWideDropLocation( oldValue ); - repaintWideDropLocation( tree.getDropLocation() ); + if (e.getSource() == tree ) { + switch( e.getPropertyName() ) { + case TREE_WIDE_SELECTION: + wideSelection = (Boolean) e.getNewValue(); + if (currentCellRenderer instanceof DefaultTreeCellRenderer) { + try { + Field fillBackgroundField = DefaultTreeCellRenderer.class + .getDeclaredField( "fillBackground" ); + fillBackgroundField.setAccessible( true ); + fillBackgroundField.set( currentCellRenderer, !wideSelection ); + } catch( Exception ignored ) { + } + } + tree.repaint(); + break; + case "dropLocation": + if (wideSelection) { + JTree.DropLocation oldValue = (JTree.DropLocation) e.getOldValue(); + repaintWideDropLocation( oldValue ); + repaintWideDropLocation( tree.getDropLocation() ); + } + break; + } } } 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 new file mode 100644 index 00000000..17bdae04 --- /dev/null +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/components/FlatTree.java @@ -0,0 +1,28 @@ +package com.formdev.flatlaf.extras.components; + +import javax.swing.*; +import static com.formdev.flatlaf.FlatClientProperties.TREE_WIDE_SELECTION; +import static com.formdev.flatlaf.FlatClientProperties.clientPropertyBoolean; + +/** + * Subclass of {@link JTree} that provides easy access to FlatLaf specific client properties. + * + */ +public class FlatTree + extends JTree + implements FlatComponentExtension +{ + /** + * Returns if the tree shows a wide selection + */ + public boolean isWideSelection() { + return clientPropertyBoolean( this, TREE_WIDE_SELECTION, UIManager.getBoolean( "Tree.wideSelection" )); + } + + /** + * Sets if the tree shows a wide selection + */ + public void setWideSelection(boolean wideSelection) { + putClientProperty( TREE_WIDE_SELECTION, wideSelection); + } +}