From 22cb1b50a6eea4d27cc1b10c936b4e1d4642f32e Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 14 Nov 2021 22:11:19 +0100 Subject: [PATCH 1/4] ComboBox (not editable): fixed regression that may display text in non-editable combo boxes in bold (issue #423) fixes commits 02f32396697135d139a6728b041b38221c485f7c and 0b6df8be1c3fe3be0103a5f149afcbed065c41f8 --- CHANGELOG.md | 8 ++++++ .../formdev/flatlaf/ui/FlatComboBoxUI.java | 28 ++++++++----------- .../testing/FlatCustomBordersTest.java | 8 +++--- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fee209ac..714b7dde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ FlatLaf Change Log ================== +## 1.6.3 + +#### Fixed bugs + +- ComboBox (not editable): Fixed regression in FlatLaf 1.6.2 that may display + text in non-editable combo boxes in bold. (issue #423) + + ## 1.6.2 #### Fixed bugs 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 d6fef81f..259fb550 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 @@ -482,22 +482,6 @@ public class FlatComboBoxUI @Override @SuppressWarnings( "unchecked" ) public void paintCurrentValue( Graphics g, Rectangle bounds, boolean hasFocus ) { - // apply clipping using rounded rectangle to avoid that renderer paints - // outside of border if combobox uses larger arc for edges - // (e.g. FlatClientProperties.COMPONENT_ROUND_RECT is true) - FlatBorder border = FlatUIUtils.getOutsideFlatBorder( comboBox ); - if( border != null ) { - int clipArc = border.getArc( comboBox ) - (border.getLineWidth( comboBox ) * 2); - if( clipArc > 0 ) { - int x = bounds.x; - int width = bounds.width + bounds.height; - if( !comboBox.getComponentOrientation().isLeftToRight() ) - x -= bounds.height; - ((Graphics2D)g).clip( FlatUIUtils.createComponentRectangle( - x, bounds.y, width, bounds.height, scale( (float) clipArc ) ) ); - } - } - paddingBorder.uninstall(); ListCellRenderer renderer = comboBox.getRenderer(); @@ -511,11 +495,23 @@ public class FlatComboBoxUI c.setBackground( getBackground( enabled ) ); c.setForeground( getForeground( enabled ) ); + // make renderer component temporary non-opaque to avoid that renderer paints + // background outside of border if combobox uses larger arc for edges + // (e.g. FlatClientProperties.COMPONENT_ROUND_RECT is true) + boolean oldOpaque = true; + if( c instanceof JComponent ) { + oldOpaque = ((JComponent)c).isOpaque(); + ((JComponent)c).setOpaque( false ); + } + boolean shouldValidate = (c instanceof JPanel); paddingBorder.install( c ); currentValuePane.paintComponent( g, c, comboBox, bounds.x, bounds.y, bounds.width, bounds.height, shouldValidate ); paddingBorder.uninstall(); + + if( c instanceof JComponent ) + ((JComponent)c).setOpaque( oldOpaque ); } @Override diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatCustomBordersTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatCustomBordersTest.java index fecc5730..2d2bd064 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatCustomBordersTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatCustomBordersTest.java @@ -34,7 +34,7 @@ public class FlatCustomBordersTest private static final Color RED = new Color( 0x60ff0000, true ); private static final Color GREEN = new Color( 0x6000ff00, true ); private static final Color MAGENTA = new Color( 0x60ff00ff, true ); - private static final Color ORANGE = new Color( 0x60ffc800, true ); + private static final Color BLUE = new Color( 0x300000ff, true ); public static void main( String[] args ) { SwingUtilities.invokeLater( () -> { @@ -127,7 +127,7 @@ public class FlatCustomBordersTest @SuppressWarnings( "unchecked" ) private void applySpecialComboBoxRenderers() { BasicComboBoxRenderer sharedRenderer = new BasicComboBoxRenderer(); - sharedRenderer.setBorder( new LineBorder( ORANGE, UIScale.scale( 2 ) ) ); + sharedRenderer.setBorder( new LineBorder( BLUE, UIScale.scale( 2 ) ) ); comboBox29.setRenderer( sharedRenderer ); comboBox30.setRenderer( sharedRenderer ); @@ -160,7 +160,7 @@ public class FlatCustomBordersTest } private void applyCustomComboBoxEditorBorder( JComboBox comboBox ) { - applyCustomComboBoxEditorBorder( comboBox, new LineBorder( ORANGE, UIScale.scale( 6 ) ) ); + applyCustomComboBoxEditorBorder( comboBox, new LineBorder( BLUE, UIScale.scale( 6 ) ) ); } private void applyCustomComboBoxEditorBorderWithIcon( JComboBox comboBox ) { @@ -180,7 +180,7 @@ public class FlatCustomBordersTest } private void applyCustomComboBoxRendererBorder( JComboBox comboBox ) { - applyCustomComboBoxRendererBorder( comboBox, new LineBorder( ORANGE, UIScale.scale( 6 ) ) ); + applyCustomComboBoxRendererBorder( comboBox, new LineBorder( BLUE, UIScale.scale( 6 ) ) ); } private void applyCustomComboBoxRendererBorderWithIcon( JComboBox comboBox ) { From e44ff5b72aa67dc718cea998008bab0f46e4d97b Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 14 Nov 2021 22:34:28 +0100 Subject: [PATCH 2/4] Tree: Fixed editing cell issue with custom cell renderer and cell editor that use same component for rendering and editing (fixes #385) (cherry picked from commit 161ee090a8f395600374d260886a7c1b0ccfab7b) --- CHANGELOG.md | 2 + .../com/formdev/flatlaf/ui/FlatTreeUI.java | 39 +++++++++++++------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 714b7dde..97afed73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ FlatLaf Change Log - ComboBox (not editable): Fixed regression in FlatLaf 1.6.2 that may display text in non-editable combo boxes in bold. (issue #423) +- Tree: Fixed editing cell issue with custom cell renderer and cell editor that + use same component for rendering and editing. (issue #385) ## 1.6.2 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 0db85395..ebdb2b40 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 @@ -263,9 +263,19 @@ public class FlatTreeUI boolean isDropRow = isDropRow( row ); boolean needsSelectionPainting = (isSelected || isDropRow) && isPaintSelection(); - // do not paint row if editing, except if selection needs painted - if( isEditing && !needsSelectionPainting ) + // do not paint row if editing + if( isEditing ) { + // paint wide selection + // (do not access cell renderer here to avoid side effect + // if renderer component is also used as editor component) + if( isSelected && isWideSelection() ) { + Color oldColor = g.getColor(); + g.setColor( selectionInactiveBackground ); + paintWideSelection( g, clipBounds, insets, bounds, path, row, isExpanded, hasBeenExpanded, isLeaf ); + g.setColor( oldColor ); + } return; + } boolean hasFocus = FlatUIUtils.isPermanentFocusOwner( tree ); boolean cellHasFocus = hasFocus && (row == getLeadSelectionRow()); @@ -322,14 +332,7 @@ public class FlatTreeUI if( isWideSelection() ) { // wide selection - g.fillRect( 0, bounds.y, tree.getWidth(), bounds.height ); - - // paint expand/collapse icon - // (was already painted before, but painted over with wide selection) - if( shouldPaintExpandControl( path, row, isExpanded, hasBeenExpanded, isLeaf ) ) { - paintExpandControl( g, clipBounds, insets, bounds, - path, row, isExpanded, hasBeenExpanded, isLeaf ); - } + paintWideSelection( g, clipBounds, insets, bounds, path, row, isExpanded, hasBeenExpanded, isLeaf ); } else { // non-wide selection paintCellBackground( g, rendererComponent, bounds ); @@ -353,8 +356,7 @@ public class FlatTreeUI } // paint renderer - if( !isEditing ) - rendererPane.paintComponent( g, rendererComponent, tree, bounds.x, bounds.y, bounds.width, bounds.height, true ); + rendererPane.paintComponent( g, rendererComponent, tree, bounds.x, bounds.y, bounds.width, bounds.height, true ); // restore background selection color and border selection color if( oldBackgroundSelectionColor != null ) @@ -363,6 +365,19 @@ public class FlatTreeUI ((DefaultTreeCellRenderer)rendererComponent).setBorderSelectionColor( oldBorderSelectionColor ); } + private void paintWideSelection( Graphics g, Rectangle clipBounds, Insets insets, Rectangle bounds, + TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf ) + { + g.fillRect( 0, bounds.y, tree.getWidth(), bounds.height ); + + // paint expand/collapse icon + // (was already painted before, but painted over with wide selection) + if( shouldPaintExpandControl( path, row, isExpanded, hasBeenExpanded, isLeaf ) ) { + paintExpandControl( g, clipBounds, insets, bounds, + path, row, isExpanded, hasBeenExpanded, isLeaf ); + } + } + private void paintCellBackground( Graphics g, Component rendererComponent, Rectangle bounds ) { int xOffset = 0; int imageOffset = 0; From 2593a43d7212c2082a31a21da21b94b789808234 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 14 Nov 2021 22:42:10 +0100 Subject: [PATCH 3/4] release 1.6.3 --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index d1401962..d9b018d8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,7 +14,7 @@ * limitations under the License. */ -val releaseVersion = "1.6.2" +val releaseVersion = "1.6.3" val developmentVersion = "2.0-SNAPSHOT" version = if( java.lang.Boolean.getBoolean( "release" ) ) releaseVersion else developmentVersion From cb70fb4e822b222b0f2cabf9a7fc215baade32a5 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Sun, 14 Nov 2021 23:06:23 +0100 Subject: [PATCH 4/4] GitHub Actions: run Gradle wrapper validation only once (to reduce risk of connection timeout) --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e9b8aa99..60a2ce19 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,6 +34,7 @@ jobs: - uses: actions/checkout@v2 - uses: gradle/wrapper-validation-action@v1 + if: matrix.java == '1.8' - name: Setup Java ${{ matrix.java }} uses: actions/setup-java@v1