From 6e453c170f9d84a136010cc7fe8d082f5d64fdf3 Mon Sep 17 00:00:00 2001 From: Dar Date: Fri, 29 Dec 2023 12:38:34 +0100 Subject: [PATCH] new: support for hover on splitpane divider --- .../formdev/flatlaf/ui/FlatSplitPaneUI.java | 57 ++++++++++++++++++- .../formdev/flatlaf/FlatDarkLaf.properties | 2 + .../formdev/flatlaf/FlatLightLaf.properties | 2 + .../flatlaf/testing/FlatTestLaf.properties | 2 + 4 files changed, 62 insertions(+), 1 deletion(-) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 2914f655..cfd521d9 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -21,6 +21,7 @@ import java.awt.Container; import java.awt.Cursor; import java.awt.Graphics; import java.awt.Insets; +import java.awt.Dimension; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -52,6 +53,8 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault SplitPane.border Border * @uiDefault SplitPaneDivider.border Border * @uiDefault SplitPaneDivider.draggingColor Color only used if continuousLayout is false + * @uiDefault SplitPaneDivider.showHover boolean optional; default is false + * @uiDefault SplitPaneDivider.hoverColor Color the divider color on mouse hover if SplitPaneDivider.showHover is enabled * * * @@ -88,6 +91,8 @@ public class FlatSplitPaneUI @Styleable protected Color oneTouchPressedArrowColor; private Map oldStyleValues; + + private boolean dragging; public static ComponentUI createUI( JComponent c ) { return new FlatSplitPaneUI(); @@ -182,12 +187,36 @@ public class FlatSplitPaneUI } return FlatStylingSupport.getAnnotatedStyleableValue( this, key ); } + + /* + * @see javax.swing.plaf.basic.BasicSplitPaneUI#startDragging() + */ + @Override + protected void startDragging() { + super.startDragging(); + + // update dragging status + dragging = true; + } + + /* + * @see javax.swing.plaf.basic.BasicSplitPaneUI#finishDraggingTo(int) + */ + @Override + protected void finishDraggingTo( int location ) { + super.finishDraggingTo( location ); + + // update dragging status + dragging = false; + } //---- class FlatSplitPaneDivider ----------------------------------------- protected class FlatSplitPaneDivider extends BasicSplitPaneDivider { + @Styleable protected Color hoverColor = UIManager.getColor("SplitPaneDivider.hoverColor"); + @Styleable protected boolean showHover = UIManager.getBoolean("SplitPaneDivider.showHover"); @Styleable protected String style = UIManager.getString( "SplitPaneDivider.style" ); @Styleable protected Color gripColor = UIManager.getColor( "SplitPaneDivider.gripColor" ); @Styleable protected int gripDotCount = FlatUIUtils.getUIInt( "SplitPaneDivider.gripDotCount", 3 ); @@ -251,8 +280,23 @@ public class FlatSplitPaneUI @Override public void paint( Graphics g ) { - super.paint( g ); + if( showHover && isMouseOver() && !dragging ) { + g.setColor( hoverColor ); + + // respect basic ui paint code + Dimension size = splitPane.getSize(); + if( orientation == JSplitPane.HORIZONTAL_SPLIT ) { + g.fillRect( 0, 0, dividerSize - 1, + size.height - 1 ); + } else { + g.fillRect( 0, 0, size.width - 1, + dividerSize - 1 ); + } + } + + super.paint( g ); + if( "plain".equals( style ) ) return; @@ -263,6 +307,17 @@ public class FlatSplitPaneUI FlatUIUtils.resetRenderingHints( g, oldRenderingHints ); } + + /* + * @see javax.swing.plaf.basic.BasicSplitPaneDivider#setMouseOver(boolean) + */ + @Override + protected void setMouseOver( boolean mouseOver ) { + super.setMouseOver( mouseOver ); + + if( showHover ) + repaint(); + } protected void paintGrip( Graphics g, int x, int y, int width, int height ) { FlatUIUtils.paintGrip( g, x, y, width, height, diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties index e6a3413d..da9af5d5 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatDarkLaf.properties @@ -303,6 +303,8 @@ Slider.disabledThumbColor = $Slider.disabledTrackColor #---- SplitPane ---- SplitPaneDivider.draggingColor = $Component.borderColor +SplitPaneDivider.showHover = false +SplitPaneDivider.hoverColor = darken($Component.borderColor,5%,derived) #---- TabbedPane ---- diff --git a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties index 272c965d..01efa70c 100644 --- a/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties +++ b/flatlaf-core/src/main/resources/com/formdev/flatlaf/FlatLightLaf.properties @@ -309,6 +309,8 @@ Slider.disabledThumbColor = $Slider.disabledTrackColor #---- SplitPane ---- SplitPaneDivider.draggingColor = $Component.borderColor +SplitPaneDivider.showHover = false +SplitPaneDivider.hoverColor = darken($Component.borderColor,5%,derived) #---- TabbedPane ---- diff --git a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties index 6a60b729..b42bc1c4 100644 --- a/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties +++ b/flatlaf-testing/src/main/resources/com/formdev/flatlaf/testing/FlatTestLaf.properties @@ -368,6 +368,8 @@ Spinner.focusedBackground = #ff8 #---- SplitPane ---- SplitPaneDivider.draggingColor = #800 +SplitPaneDivider.showHover = false +SplitPaneDivider.hoverColor = #a00 SplitPaneDivider.oneTouchArrowColor = #0f0 SplitPaneDivider.oneTouchHoverArrowColor = #f00 SplitPaneDivider.oneTouchPressedArrowColor = #00f