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 1f585521..de802eee 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 @@ -40,6 +40,7 @@ import java.awt.event.MouseListener; import java.awt.geom.Rectangle2D; import java.beans.PropertyChangeListener; import java.lang.ref.WeakReference; +import java.util.Map; import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.CellRendererPane; @@ -67,6 +68,7 @@ import javax.swing.plaf.basic.BasicComboPopup; import javax.swing.plaf.basic.ComboPopup; import javax.swing.text.JTextComponent; import com.formdev.flatlaf.FlatClientProperties; +import com.formdev.flatlaf.ui.FlatStyleSupport.Styleable; import com.formdev.flatlaf.util.SystemInfo; import com.formdev.flatlaf.util.UIScale; @@ -110,39 +112,47 @@ import com.formdev.flatlaf.util.UIScale; public class FlatComboBoxUI extends BasicComboBoxUI { - protected int minimumWidth; - protected int editorColumns; - protected String buttonStyle; - protected String arrowType; + @Styleable protected int minimumWidth; + @Styleable protected int editorColumns; + @Styleable protected String buttonStyle; + @Styleable protected String arrowType; protected boolean isIntelliJTheme; - protected Color borderColor; - protected Color disabledBorderColor; + @Styleable protected Color borderColor; + @Styleable protected Color disabledBorderColor; - protected Color editableBackground; - protected Color focusedBackground; - protected Color disabledBackground; - protected Color disabledForeground; + @Styleable protected Color editableBackground; + @Styleable protected Color focusedBackground; + @Styleable protected Color disabledBackground; + @Styleable protected Color disabledForeground; - protected Color buttonBackground; - protected Color buttonEditableBackground; - protected Color buttonFocusedBackground; - protected Color buttonArrowColor; - protected Color buttonDisabledArrowColor; - protected Color buttonHoverArrowColor; - protected Color buttonPressedArrowColor; + @Styleable protected Color buttonBackground; + @Styleable protected Color buttonEditableBackground; + @Styleable protected Color buttonFocusedBackground; + @Styleable protected Color buttonArrowColor; + @Styleable protected Color buttonDisabledArrowColor; + @Styleable protected Color buttonHoverArrowColor; + @Styleable protected Color buttonPressedArrowColor; - protected Color popupFocusedBackground; + @Styleable protected Color popupFocusedBackground; private MouseListener hoverListener; protected boolean hover; protected boolean pressed; private WeakReference lastRendererComponent; + private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { return new FlatComboBoxUI(); } + @Override + public void installUI( JComponent c ) { + super.installUI( c ); + + applyStyle( FlatStyleSupport.getStyle( comboBox ) ); + } + @Override protected void installListeners() { super.installListeners(); @@ -250,6 +260,8 @@ public class FlatComboBoxUI popupFocusedBackground = null; + oldStyleValues = null; + MigLayoutVisualPadding.uninstall( comboBox ); } @@ -329,6 +341,11 @@ public class FlatComboBoxUI comboBox.repaint(); else if( FlatClientProperties.MINIMUM_WIDTH.equals( propertyName ) ) comboBox.revalidate(); + else if( FlatClientProperties.STYLE.equals( propertyName ) ) { + applyStyle( e.getNewValue() ); + comboBox.revalidate(); + comboBox.repaint(); + } }; } @@ -403,6 +420,29 @@ public class FlatComboBoxUI return new FlatComboBoxButton(); } + /** + * @since TODO + */ + protected void applyStyle( Object style ) { + int oldEditorColumns = editorColumns; + + oldStyleValues = FlatStyleSupport.parseAndApply( oldStyleValues, style, this::applyStyleProperty ); + + if( arrowButton instanceof FlatComboBoxButton ) + ((FlatComboBoxButton)arrowButton).updateStyle(); + if( popup instanceof FlatComboPopup ) + ((FlatComboPopup)popup).updateStyle(); + if( editorColumns != oldEditorColumns && editor instanceof JTextField ) + ((JTextField)editor).setColumns( editorColumns ); + } + + /** + * @since TODO + */ + protected Object applyStyleProperty( String key, Object value ) { + return FlatStyleSupport.applyToAnnotatedObject( this, key, value ); + } + @Override public void update( Graphics g, JComponent c ) { float focusWidth = FlatUIUtils.getBorderFocusWidth( c ); @@ -632,6 +672,11 @@ public class FlatComboBoxUI hoverForeground, hoverBackground, pressedForeground, pressedBackground ); } + protected void updateStyle() { + updateStyle( arrowType, buttonArrowColor, buttonDisabledArrowColor, + buttonHoverArrowColor, null, buttonPressedArrowColor, null ); + } + @Override protected boolean isHover() { return super.isHover() || (!comboBox.isEditable() ? hover : false); @@ -727,6 +772,10 @@ public class FlatComboBoxUI super.configureList(); list.setCellRenderer( new PopupListCellRenderer() ); + updateStyle(); + } + + void updateStyle() { if( popupFocusedBackground != null ) list.setBackground( popupFocusedBackground ); } diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java index 03b18f91..fe15d12c 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/FlatStylingTests.java @@ -118,6 +118,36 @@ public class FlatStylingTests radioButton( ui ); } + @Test + void comboBox() { + FlatComboBoxUI ui = new FlatComboBoxUI(); + + // create arrow button + ui.installUI( new JComboBox<>() ); + + ui.applyStyle( "minimumWidth: 100" ); + ui.applyStyle( "editorColumns: 10" ); + ui.applyStyle( "buttonStyle: auto" ); + ui.applyStyle( "arrowType: chevron" ); + ui.applyStyle( "borderColor: #fff" ); + ui.applyStyle( "disabledBorderColor: #fff" ); + + ui.applyStyle( "editableBackground: #fff" ); + ui.applyStyle( "focusedBackground: #fff" ); + ui.applyStyle( "disabledBackground: #fff" ); + ui.applyStyle( "disabledForeground: #fff" ); + + ui.applyStyle( "buttonBackground: #fff" ); + ui.applyStyle( "buttonFocusedBackground: #fff" ); + ui.applyStyle( "buttonEditableBackground: #fff" ); + ui.applyStyle( "buttonArrowColor: #fff" ); + ui.applyStyle( "buttonDisabledArrowColor: #fff" ); + ui.applyStyle( "buttonHoverArrowColor: #fff" ); + ui.applyStyle( "buttonPressedArrowColor: #fff" ); + + ui.applyStyle( "popupFocusedBackground: #fff" ); + } + @Test void editorPane() { FlatEditorPaneUI ui = new FlatEditorPaneUI();