From 7e0915cb9cd3836288ad1b13f0d5ac8711fca7c0 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 13 Jun 2021 11:21:55 +0200 Subject: [PATCH] FlatBorder: refractored ComboBox, ScrollPane and Spinner focus owner checking to UI delegates (for later usage) --- .../com/formdev/flatlaf/ui/FlatBorder.java | 43 +++---------------- .../formdev/flatlaf/ui/FlatComboBoxUI.java | 8 ++++ .../formdev/flatlaf/ui/FlatScrollPaneUI.java | 27 ++++++++++++ .../com/formdev/flatlaf/ui/FlatSpinnerUI.java | 10 +++++ 4 files changed, 52 insertions(+), 36 deletions(-) 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 df8802ff..27c8d424 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 @@ -22,17 +22,12 @@ import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; -import java.awt.KeyboardFocusManager; import java.awt.Paint; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JScrollPane; import javax.swing.JSpinner; -import javax.swing.JTable; -import javax.swing.JTextField; -import javax.swing.JTree; import javax.swing.JViewport; -import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.basic.BasicBorders; import com.formdev.flatlaf.FlatClientProperties; @@ -164,37 +159,13 @@ public class FlatBorder } protected boolean isFocused( Component c ) { - if( c instanceof JScrollPane ) { - JViewport viewport = ((JScrollPane)c).getViewport(); - Component view = (viewport != null) ? viewport.getView() : null; - if( view != null ) { - if( FlatUIUtils.isPermanentFocusOwner( view ) ) - return true; - - if( (view instanceof JTable && ((JTable)view).isEditing()) || - (view instanceof JTree && ((JTree)view).isEditing()) ) - { - Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); - if( focusOwner != null ) - return SwingUtilities.isDescendingFrom( focusOwner, view ); - } - } - return false; - } else if( c instanceof JComboBox && ((JComboBox)c).isEditable() ) { - Component editorComponent = ((JComboBox)c).getEditor().getEditorComponent(); - return (editorComponent != null) ? FlatUIUtils.isPermanentFocusOwner( editorComponent ) : false; - } else if( c instanceof JSpinner ) { - if( FlatUIUtils.isPermanentFocusOwner( c ) ) - return true; - - JComponent editor = ((JSpinner)c).getEditor(); - if( editor instanceof JSpinner.DefaultEditor ) { - JTextField textField = ((JSpinner.DefaultEditor)editor).getTextField(); - if( textField != null ) - return FlatUIUtils.isPermanentFocusOwner( textField ); - } - return false; - } else + if( c instanceof JScrollPane ) + return FlatScrollPaneUI.isPermanentFocusOwner( (JScrollPane) c ); + else if( c instanceof JComboBox ) + return FlatComboBoxUI.isPermanentFocusOwner( (JComboBox) c ); + else if( c instanceof JSpinner ) + return FlatSpinnerUI.isPermanentFocusOwner( (JSpinner) c ); + else return FlatUIUtils.isPermanentFocusOwner( c ); } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java index 6f4e2e3d..32de8ea0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatComboBoxUI.java @@ -590,6 +590,14 @@ public class FlatComboBoxUI return parentParent != null && !comboBox.getBackground().equals( parentParent.getBackground() ); } + public static boolean isPermanentFocusOwner( JComboBox comboBox ) { + if( comboBox.isEditable() ) { + Component editorComponent = comboBox.getEditor().getEditorComponent(); + return (editorComponent != null) ? FlatUIUtils.isPermanentFocusOwner( editorComponent ) : false; + } else + return FlatUIUtils.isPermanentFocusOwner( comboBox ); + } + //---- class FlatComboBoxButton ------------------------------------------- protected class FlatComboBoxButton diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java index fe2575cb..bd8ba14d 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatScrollPaneUI.java @@ -19,6 +19,7 @@ package com.formdev.flatlaf.ui; import java.awt.Component; import java.awt.Graphics; import java.awt.Insets; +import java.awt.KeyboardFocusManager; import java.awt.Rectangle; import java.awt.event.ContainerEvent; import java.awt.event.ContainerListener; @@ -34,11 +35,13 @@ import javax.swing.JComponent; import javax.swing.JScrollBar; import javax.swing.JScrollPane; import javax.swing.JTable; +import javax.swing.JTree; import javax.swing.JViewport; import javax.swing.LookAndFeel; import javax.swing.ScrollPaneConstants; import javax.swing.Scrollable; import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicScrollPaneUI; @@ -329,6 +332,28 @@ public class FlatScrollPaneUI paint( g, c ); } + public static boolean isPermanentFocusOwner( JScrollPane scrollPane ) { + JViewport viewport = scrollPane.getViewport(); + Component view = (viewport != null) ? viewport.getView() : null; + if( view == null ) + return false; + + // check whether view is focus owner + if( FlatUIUtils.isPermanentFocusOwner( view ) ) + return true; + + // check whether editor component in JTable or JTree is focus owner + if( (view instanceof JTable && ((JTable)view).isEditing()) || + (view instanceof JTree && ((JTree)view).isEditing()) ) + { + Component focusOwner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner(); + if( focusOwner != null ) + return SwingUtilities.isDescendingFrom( focusOwner, view ); + } + + return false; + } + //---- class Handler ------------------------------------------------------ /** @@ -350,11 +375,13 @@ public class FlatScrollPaneUI @Override public void focusGained( FocusEvent e ) { + // necessary to update focus border scrollpane.repaint(); } @Override public void focusLost( FocusEvent e ) { + // necessary to update focus border scrollpane.repaint(); } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java index 17c826d2..b7d8e4c8 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSpinnerUI.java @@ -221,6 +221,16 @@ public class FlatSpinnerUI : null; } + public static boolean isPermanentFocusOwner( JSpinner spinner ) { + if( FlatUIUtils.isPermanentFocusOwner( spinner ) ) + return true; + + JTextField textField = getEditorTextField( spinner.getEditor() ); + return (textField != null) + ? FlatUIUtils.isPermanentFocusOwner( textField ) + : false; + } + protected Color getBackground( boolean enabled ) { return enabled ? spinner.getBackground()