From a2b615d4a750cf40fcb092ebd1f7fff94a19cd34 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 20 Apr 2020 11:27:29 +0200 Subject: [PATCH] focus indication border (or background) no longer hidden when temporary loosing focus (e.g. showing a popup menu) --- CHANGELOG.md | 2 ++ .../com/formdev/flatlaf/icons/FlatCheckBoxIcon.java | 2 +- .../com/formdev/flatlaf/icons/FlatHelpButtonIcon.java | 2 +- .../main/java/com/formdev/flatlaf/ui/FlatBorder.java | 8 ++++---- .../main/java/com/formdev/flatlaf/ui/FlatButtonUI.java | 6 ++++-- .../main/java/com/formdev/flatlaf/ui/FlatListUI.java | 10 +++++----- .../com/formdev/flatlaf/ui/FlatPasswordFieldUI.java | 2 +- .../main/java/com/formdev/flatlaf/ui/FlatSliderUI.java | 4 ++-- .../java/com/formdev/flatlaf/ui/FlatTabbedPaneUI.java | 2 +- .../main/java/com/formdev/flatlaf/ui/FlatTableUI.java | 10 +++++----- .../main/java/com/formdev/flatlaf/ui/FlatTreeUI.java | 3 +-- .../main/java/com/formdev/flatlaf/ui/FlatUIUtils.java | 5 +++++ .../flatlaf/jideoss/ui/FlatJideTabbedPaneUI.java | 2 +- .../flatlaf/swingx/ui/FlatDatePickerBorder.java | 3 ++- 14 files changed, 35 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f41444ec..2611340f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,8 @@ FlatLaf Change Log ## Unreleased +- Focus indication border (or background) no longer hidden when temporary + loosing focus (e.g. showing a popup menu). - List, Table and Tree: Item selection color of focused components no longer change from blue to gray when temporary loosing focus (e.g. showing a popup menu). diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java index e54787ed..993a003f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatCheckBoxIcon.java @@ -96,7 +96,7 @@ public class FlatCheckBoxIcon boolean selected = indeterminate || (c instanceof AbstractButton && ((AbstractButton)c).isSelected()); // paint focused border - if( c.hasFocus() && focusWidth > 0 ) { + if( FlatUIUtils.isPermanentFocusOwner( c ) && focusWidth > 0 ) { g2.setColor( focusColor ); paintFocusBorder( g2 ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java index 25ecc920..13e404b8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java @@ -82,7 +82,7 @@ public class FlatHelpButtonIcon */ boolean enabled = c.isEnabled(); - boolean focused = c.hasFocus(); + boolean focused = FlatUIUtils.isPermanentFocusOwner( c ); // paint focused border if( focused ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java index 0cf2b7ea..a6fae3c6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatBorder.java @@ -119,7 +119,7 @@ public class FlatBorder JViewport viewport = ((JScrollPane)c).getViewport(); Component view = (viewport != null) ? viewport.getView() : null; if( view != null ) { - if( view.hasFocus() ) + if( FlatUIUtils.isPermanentFocusOwner( view ) ) return true; if( (view instanceof JTable && ((JTable)view).isEditing()) || @@ -133,17 +133,17 @@ public class FlatBorder return false; } else if( c instanceof JComboBox && ((JComboBox)c).isEditable() ) { Component editorComponent = ((JComboBox)c).getEditor().getEditorComponent(); - return (editorComponent != null) ? editorComponent.hasFocus() : false; + return (editorComponent != null) ? FlatUIUtils.isPermanentFocusOwner( editorComponent ) : false; } else if( c instanceof JSpinner ) { JComponent editor = ((JSpinner)c).getEditor(); if( editor instanceof JSpinner.DefaultEditor ) { JTextField textField = ((JSpinner.DefaultEditor)editor).getTextField(); if( textField != null ) - return textField.hasFocus(); + return FlatUIUtils.isPermanentFocusOwner( textField ); } return false; } else - return c.hasFocus(); + return FlatUIUtils.isPermanentFocusOwner( c ); } protected boolean isTableCellEditor( Component c ) { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java index 6055b3bd..5dbcf556 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java @@ -294,7 +294,9 @@ public class FlatButtonUI // paint shadow Color shadowColor = def ? defaultShadowColor : this.shadowColor; - if( !isToolBarButton && shadowColor != null && shadowWidth > 0 && focusWidth > 0 && !c.hasFocus() && c.isEnabled() ) { + if( !isToolBarButton && shadowColor != null && shadowWidth > 0 && focusWidth > 0 && + !FlatUIUtils.isPermanentFocusOwner( c ) && c.isEnabled() ) + { g2.setColor( shadowColor ); g2.fill( new RoundRectangle2D.Float( focusWidth, focusWidth + UIScale.scale( (float) shadowWidth ), width - focusWidth * 2, height - focusWidth * 2, arc, arc ) ); @@ -382,7 +384,7 @@ public class FlatButtonUI if( hoverColor != null && b != null && b.getModel().isRollover() ) return hoverColor; - if( focusedColor != null && c.hasFocus() ) + if( focusedColor != null && FlatUIUtils.isPermanentFocusOwner( c ) ) return focusedColor; return enabledColor; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java index 8c975cb9..34cd9565 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatListUI.java @@ -81,7 +81,7 @@ public class FlatListUI selectionInactiveBackground = UIManager.getColor( "List.selectionInactiveBackground" ); selectionInactiveForeground = UIManager.getColor( "List.selectionInactiveForeground" ); - toggleSelectionColors( list.hasFocus() ); + toggleSelectionColors(); } @Override @@ -100,13 +100,13 @@ public class FlatListUI @Override public void focusGained( FocusEvent e ) { super.focusGained( e ); - toggleSelectionColors( true ); + toggleSelectionColors(); } @Override public void focusLost( FocusEvent e ) { super.focusLost( e ); - toggleSelectionColors( e.isTemporary() ); + toggleSelectionColors(); } }; } @@ -120,8 +120,8 @@ public class FlatListUI * already used in applications. Then either the inactive colors are not used, * or the application has to be changed to extend a FlatLaf renderer. */ - private void toggleSelectionColors( boolean focused ) { - if( focused ) { + private void toggleSelectionColors() { + if( FlatUIUtils.isPermanentFocusOwner( list ) ) { if( list.getSelectionBackground() == selectionInactiveBackground ) list.setSelectionBackground( selectionBackground ); if( list.getSelectionForeground() == selectionInactiveForeground ) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java index abccabea..96e6f15a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPasswordFieldUI.java @@ -168,7 +168,7 @@ public class FlatPasswordFieldUI protected void paintCapsLock( Graphics g ) { JTextComponent c = getComponent(); - if( !c.isFocusOwner() || + if( !FlatUIUtils.isPermanentFocusOwner( c ) || !Toolkit.getDefaultToolkit().getLockingKeyState( KeyEvent.VK_CAPS_LOCK ) ) return; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java index 0e3fa2f9..6467f0a0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSliderUI.java @@ -201,7 +201,7 @@ public class FlatSliderUI } if( coloredTrack != null ) { - FlatUIUtils.setColor( g, slider.hasFocus() ? focusColor : (hover ? hoverColor : thumbColor), thumbColor ); + FlatUIUtils.setColor( g, FlatUIUtils.isPermanentFocusOwner( slider ) ? focusColor : (hover ? hoverColor : thumbColor), thumbColor ); ((Graphics2D)g).fill( coloredTrack ); } @@ -212,7 +212,7 @@ public class FlatSliderUI @Override public void paintThumb( Graphics g ) { FlatUIUtils.setColor( g, slider.isEnabled() - ? (slider.hasFocus() ? focusColor : (hover ? hoverColor : thumbColor)) + ? (FlatUIUtils.isPermanentFocusOwner( slider ) ? focusColor : (hover ? hoverColor : thumbColor)) : disabledForeground, thumbColor ); 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 b4861f2b..1a8cf0ca 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 @@ -318,7 +318,7 @@ public class FlatTabbedPaneUI boolean enabled = tabPane.isEnabled(); g.setColor( enabled && tabPane.isEnabledAt( tabIndex ) && getRolloverTab() == tabIndex ? hoverColor - : (enabled && isSelected && tabPane.hasFocus() + : (enabled && isSelected && FlatUIUtils.isPermanentFocusOwner( tabPane ) ? focusColor : (selectedBackground != null && enabled && isSelected ? selectedBackground diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java index fd5ba89a..4d93a502 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTableUI.java @@ -113,7 +113,7 @@ public class FlatTableUI selectionInactiveBackground = UIManager.getColor( "Table.selectionInactiveBackground" ); selectionInactiveForeground = UIManager.getColor( "Table.selectionInactiveForeground" ); - toggleSelectionColors( table.hasFocus() ); + toggleSelectionColors(); int rowHeight = FlatUIUtils.getUIInt( "Table.rowHeight", 16 ); if( rowHeight > 0 ) @@ -160,13 +160,13 @@ public class FlatTableUI @Override public void focusGained( FocusEvent e ) { super.focusGained( e ); - toggleSelectionColors( true ); + toggleSelectionColors(); } @Override public void focusLost( FocusEvent e ) { super.focusLost( e ); - toggleSelectionColors( e.isTemporary() ); + toggleSelectionColors(); } }; } @@ -180,8 +180,8 @@ public class FlatTableUI * already used in applications. Then either the inactive colors are not used, * or the application has to be changed to extend a FlatLaf renderer. */ - private void toggleSelectionColors( boolean focused ) { - if( focused ) { + private void toggleSelectionColors() { + if( FlatUIUtils.isPermanentFocusOwner( table ) ) { if( table.getSelectionBackground() == selectionInactiveBackground ) table.setSelectionBackground( selectionBackground ); if( table.getSelectionForeground() == selectionInactiveForeground ) 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 7b525ecd..77333b56 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 @@ -20,7 +20,6 @@ import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Insets; -import java.awt.KeyboardFocusManager; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; @@ -222,7 +221,7 @@ public class FlatTreeUI TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf ) { boolean isEditing = (editingComponent != null && editingRow == row); - boolean hasFocus = (KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner() == tree); + boolean hasFocus = FlatUIUtils.isPermanentFocusOwner( tree ); boolean cellHasFocus = hasFocus && (row == getLeadSelectionRow()); boolean isSelected = tree.isRowSelected( row ); boolean isDropRow = isDropRow( row ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java index 4264dfec..35c5b888 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatUIUtils.java @@ -24,6 +24,7 @@ import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; +import java.awt.KeyboardFocusManager; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; @@ -136,6 +137,10 @@ public class FlatUIUtils return c instanceof JComponent && Boolean.TRUE.equals( ((JComponent)c).getClientProperty( "JComboBox.isTableCellEditor" ) ); } + public static boolean isPermanentFocusOwner( Component c ) { + return (KeyboardFocusManager.getCurrentKeyboardFocusManager().getPermanentFocusOwner() == c); + } + /** * Sets rendering hints used for painting. */ diff --git a/flatlaf-jide-oss/src/main/java/com/formdev/flatlaf/jideoss/ui/FlatJideTabbedPaneUI.java b/flatlaf-jide-oss/src/main/java/com/formdev/flatlaf/jideoss/ui/FlatJideTabbedPaneUI.java index da6f5f2f..7d1baea2 100644 --- a/flatlaf-jide-oss/src/main/java/com/formdev/flatlaf/jideoss/ui/FlatJideTabbedPaneUI.java +++ b/flatlaf-jide-oss/src/main/java/com/formdev/flatlaf/jideoss/ui/FlatJideTabbedPaneUI.java @@ -216,7 +216,7 @@ public class FlatJideTabbedPaneUI g.setColor( enabled && _tabPane.isEnabledAt( tabIndex ) && (_indexMouseOver == tabIndex || (_closeButtons != null && ((JideTabbedPane.NoFocusButton)_closeButtons[tabIndex]).isMouseOver())) ? hoverColor - : (enabled && isSelected && _tabPane.hasFocus() + : (enabled && isSelected && FlatUIUtils.isPermanentFocusOwner( _tabPane ) ? focusColor : _tabPane.getBackgroundAt( tabIndex )) ); g.fillRect( x, y, w, h ); diff --git a/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/ui/FlatDatePickerBorder.java b/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/ui/FlatDatePickerBorder.java index f9968ca0..9d9c809b 100644 --- a/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/ui/FlatDatePickerBorder.java +++ b/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/ui/FlatDatePickerBorder.java @@ -20,6 +20,7 @@ import java.awt.Component; import javax.swing.JTable; import org.jdesktop.swingx.JXDatePicker; import com.formdev.flatlaf.ui.FlatRoundBorder; +import com.formdev.flatlaf.ui.FlatUIUtils; /** * Border for {@link org.jdesktop.swingx.JXDatePicker}. @@ -32,7 +33,7 @@ public class FlatDatePickerBorder @Override protected boolean isFocused( Component c ) { if( c instanceof JXDatePicker ) - return ((JXDatePicker)c).getEditor().hasFocus(); + return FlatUIUtils.isPermanentFocusOwner( ((JXDatePicker)c).getEditor() ); return super.isFocused( c ); }