Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ComboBox: support rounded selection #548

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -114,6 +114,9 @@
* @uiDefault ComboBox.buttonHoverArrowColor Color
* @uiDefault ComboBox.buttonPressedArrowColor Color
* @uiDefault ComboBox.popupBackground Color optional
* @uiDefault ComboBox.popupInsets Insets
* @uiDefault ComboBox.selectionInsets Insets
* @uiDefault ComboBox.selectionArc int
*
* @author Karl Tauber
*/
Expand Down Expand Up @@ -144,6 +147,9 @@ public class FlatComboBoxUI
@Styleable protected Color buttonPressedArrowColor;

@Styleable protected Color popupBackground;
/** @since 3 */ @Styleable protected Insets popupInsets;
/** @since 3 */ @Styleable protected Insets selectionInsets;
/** @since 3 */ @Styleable protected int selectionArc;

private MouseListener hoverListener;
protected boolean hover;
Expand Down Expand Up @@ -239,6 +245,9 @@ protected void installDefaults() {
buttonPressedArrowColor = UIManager.getColor( "ComboBox.buttonPressedArrowColor" );

popupBackground = UIManager.getColor( "ComboBox.popupBackground" );
popupInsets = UIManager.getInsets( "ComboBox.popupInsets" );
selectionInsets = UIManager.getInsets( "ComboBox.selectionInsets" );
selectionArc = UIManager.getInt( "ComboBox.selectionArc" );

// set maximumRowCount
int maximumRowCount = UIManager.getInt( "ComboBox.maximumRowCount" );
Expand Down Expand Up @@ -818,30 +827,34 @@ protected void configurePopup() {
// make opaque to avoid that background shines thru border (e.g. at 150% scaling)
setOpaque( true );

// set popup border
// use non-UIResource to avoid that it is overwritten when making
// popup visible (see JPopupMenu.setInvoker()) in theme editor preview
// set popup border
// use non-UIResource to avoid that it is overwritten when making
// popup visible (see JPopupMenu.setInvoker()) in theme editor preview
Border border = UIManager.getBorder( "PopupMenu.border" );
if( border != null )
setBorder( FlatUIUtils.nonUIResource( border ) );
}

@Override
protected void configureList() {
super.configureList();

list.setCellRenderer( new PopupListCellRenderer() );
updateStyle();
}

void updateStyle() {
if( popupBackground != null )
list.setBackground( popupBackground );
list.setBackground( popupBackground );

// set popup background because it may shine thru when scaled (e.g. at 150%)
// use non-UIResource to avoid that it is overwritten when making
// popup visible (see JPopupMenu.setInvoker()) in theme editor preview
setBackground( FlatUIUtils.nonUIResource( list.getBackground() ) );
// set popup background because it may shine thru when scaled (e.g. at 150%)
// use non-UIResource to avoid that it is overwritten when making
// popup visible (see JPopupMenu.setInvoker()) in theme editor preview
setBackground( FlatUIUtils.nonUIResource( list.getBackground() ) );

scroller.setViewportBorder( (popupInsets != null) ? new FlatEmptyBorder( popupInsets ) : null );
scroller.setOpaque( false );

if( list.getUI() instanceof FlatListUI ) {
FlatListUI ui = (FlatListUI) list.getUI();
ui.selectionInsets = selectionInsets;
ui.selectionArc = selectionArc;
}
}

@Override
Expand Down
Expand Up @@ -37,6 +37,7 @@
import javax.swing.UIManager;
import javax.swing.event.ListSelectionListener;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
import javax.swing.plaf.basic.BasicListUI;
import com.formdev.flatlaf.FlatClientProperties;
import com.formdev.flatlaf.ui.FlatStylingSupport.Styleable;
Expand Down Expand Up @@ -306,7 +307,8 @@ protected void paintCell( Graphics g, int row, Rectangle rowBounds, ListCellRend
// rounded selection or selection insets
if( isSelected &&
!isFileList && // rounded selection is not supported for file list
rendererComponent instanceof DefaultListCellRenderer &&
(rendererComponent instanceof DefaultListCellRenderer ||
rendererComponent instanceof BasicComboBoxRenderer) &&
(selectionArc > 0 ||
(selectionInsets != null &&
(selectionInsets.top != 0 || selectionInsets.left != 0 || selectionInsets.bottom != 0 || selectionInsets.right != 0))) )
Expand Down
Expand Up @@ -285,6 +285,10 @@ ComboBox.buttonDisabledArrowColor = @buttonDisabledArrowColor
ComboBox.buttonHoverArrowColor = @buttonHoverArrowColor
ComboBox.buttonPressedArrowColor = @buttonPressedArrowColor

ComboBox.popupInsets = 0,0,0,0
ComboBox.selectionInsets = 0,0,0,0
ComboBox.selectionArc = 0


#---- Component ----

Expand Down
Expand Up @@ -173,7 +173,10 @@ void comboBox() {
"buttonHoverArrowColor", Color.class,
"buttonPressedArrowColor", Color.class,

"popupBackground", Color.class
"popupBackground", Color.class,
"popupInsets", Insets.class,
"selectionInsets", Insets.class,
"selectionArc", int.class
);

// border
Expand Down
Expand Up @@ -304,6 +304,9 @@ void comboBox() {
ui.applyStyle( "buttonPressedArrowColor: #fff" );

ui.applyStyle( "popupBackground: #fff" );
ui.applyStyle( "popupInsets: 1,2,3,4" );
ui.applyStyle( "selectionInsets: 1,2,3,4" );
ui.applyStyle( "selectionArc: 8" );

// border
flatRoundBorder( style -> ui.applyStyle( style ) );
Expand Down
3 changes: 3 additions & 0 deletions flatlaf-testing/dumps/uidefaults/FlatDarkLaf_1.8.0.txt
Expand Up @@ -220,8 +220,11 @@ ComboBox.maximumRowCount 15
ComboBox.minimumWidth 72
ComboBox.noActionOnKeyNavigation false
ComboBox.padding 2,6,2,6 javax.swing.plaf.InsetsUIResource [UI]
ComboBox.popupInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI]
ComboBox.selectionArc 0
ComboBox.selectionBackground #4b6eaf HSL 219 40 49 javax.swing.plaf.ColorUIResource [UI]
ComboBox.selectionForeground #bbbbbb HSL 0 0 73 javax.swing.plaf.ColorUIResource [UI]
ComboBox.selectionInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI]
ComboBox.timeFactor 1000
ComboBoxUI com.formdev.flatlaf.ui.FlatComboBoxUI

Expand Down
3 changes: 3 additions & 0 deletions flatlaf-testing/dumps/uidefaults/FlatLightLaf_1.8.0.txt
Expand Up @@ -224,8 +224,11 @@ ComboBox.maximumRowCount 15
ComboBox.minimumWidth 72
ComboBox.noActionOnKeyNavigation false
ComboBox.padding 2,6,2,6 javax.swing.plaf.InsetsUIResource [UI]
ComboBox.popupInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI]
ComboBox.selectionArc 0
ComboBox.selectionBackground #2675bf HSL 209 67 45 javax.swing.plaf.ColorUIResource [UI]
ComboBox.selectionForeground #ffffff HSL 0 0 100 javax.swing.plaf.ColorUIResource [UI]
ComboBox.selectionInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI]
ComboBox.timeFactor 1000
ComboBoxUI com.formdev.flatlaf.ui.FlatComboBoxUI

Expand Down
3 changes: 3 additions & 0 deletions flatlaf-testing/dumps/uidefaults/FlatTestLaf_1.8.0.txt
Expand Up @@ -231,8 +231,11 @@ ComboBox.minimumWidth 72
ComboBox.noActionOnKeyNavigation false
ComboBox.padding 2,6,2,6 javax.swing.plaf.InsetsUIResource [UI]
ComboBox.popupBackground #ffffcc HSL 60 100 90 javax.swing.plaf.ColorUIResource [UI]
ComboBox.popupInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI]
ComboBox.selectionArc 0
ComboBox.selectionBackground #00aa00 HSL 120 100 33 javax.swing.plaf.ColorUIResource [UI]
ComboBox.selectionForeground #ffff00 HSL 60 100 50 javax.swing.plaf.ColorUIResource [UI]
ComboBox.selectionInsets 0,0,0,0 javax.swing.plaf.InsetsUIResource [UI]
ComboBox.timeFactor 1000
ComboBoxUI com.formdev.flatlaf.ui.FlatComboBoxUI

Expand Down
Expand Up @@ -196,8 +196,11 @@ ComboBox.minimumWidth
ComboBox.noActionOnKeyNavigation
ComboBox.padding
ComboBox.popupBackground
ComboBox.popupInsets
ComboBox.selectionArc
ComboBox.selectionBackground
ComboBox.selectionForeground
ComboBox.selectionInsets
ComboBox.timeFactor
ComboBoxUI
Component.accentColor
Expand Down