diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ff50cf0..d45319fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,6 +43,10 @@ jobs: distribution: adopt # Java 8 and 11 are pre-installed on ubuntu-latest cache: gradle + - name: Check with Error Prone + if: matrix.java == '11' + run: ./gradlew errorprone clean -Dtoolchain=${{ matrix.toolchain }} + - name: Build with Gradle run: ./gradlew build -Dtoolchain=${{ matrix.toolchain }} diff --git a/build.gradle.kts b/build.gradle.kts index c0b0f9d9..e2ac96ea 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,6 +14,8 @@ * limitations under the License. */ +import net.ltgt.gradle.errorprone.errorprone + val releaseVersion = "3.1.1" val developmentVersion = "3.2-SNAPSHOT" @@ -43,6 +45,10 @@ if( !toolchainJavaVersion.isNullOrEmpty() ) println() +plugins { + alias( libs.plugins.errorprone ) apply false +} + allprojects { tasks { withType().configureEach { @@ -81,4 +87,55 @@ allprojects { isFailOnError = false } } + + + //---- Error Prone ---- + + tasks.register( "errorprone" ) { + group = "verification" + tasks.withType().forEach { + dependsOn( it ) + } + } + + val useErrorProne = gradle.startParameter.taskNames.contains( "errorprone" ) + if( useErrorProne ) { + plugins.withType { + apply( plugin = libs.plugins.errorprone.get().pluginId ) + + dependencies { + "errorprone"( libs.errorprone ) + } + + tasks.withType().configureEach { + options.compilerArgs.add( "-Werror" ) + options.errorprone { + disable( + "ReferenceEquality", // reports usage of '==' for objects + "StringSplitter", // reports String.split() + "JavaTimeDefaultTimeZone", // reports Year.now() + "MissingSummary", // reports `/** @since 2 */` + "InvalidBlockTag", // reports @uiDefault in javadoc + "AlreadyChecked", // reports false positives + "InlineMeSuggester", // suggests using Error Prone annotations for deprecated methods + "TypeParameterUnusedInFormals", + "UnsynchronizedOverridesSynchronized", + ) + when( project.name ) { + "flatlaf-intellij-themes" -> disable( + "MutablePublicArray", // reports FlatAllIJThemes.INFOS + ) + "flatlaf-theme-editor" -> disable( + "CatchAndPrintStackTrace", + ) + "flatlaf-testing" -> disable( + "CatchAndPrintStackTrace", + "JdkObsolete", // reports Hashtable used for JSlider.setLabelTable() + "JavaUtilDate", // reports usage of class Date + ) + } + } + } + } + } } diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java index 0aab3e4a..cbde4129 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -391,7 +391,7 @@ public abstract class FlatLaf Method m = UIManager.class.getMethod( "createLookAndFeel", String.class ); aquaLaf = (BasicLookAndFeel) m.invoke( null, "Mac OS X" ); } else - aquaLaf = (BasicLookAndFeel) Class.forName( aquaLafClassName ).getDeclaredConstructor().newInstance(); + aquaLaf = Class.forName( aquaLafClassName ).asSubclass( BasicLookAndFeel.class ).getDeclaredConstructor().newInstance(); } catch( Exception ex ) { LoggingFacade.INSTANCE.logSevere( "FlatLaf: Failed to initialize Aqua look and feel '" + aquaLafClassName + "'.", ex ); throw new IllegalStateException(); @@ -581,10 +581,13 @@ public abstract class FlatLaf Object activeFont = new ActiveFont( null, null, -1, 0, 0, 0, 0 ); // override fonts + List fontKeys = new ArrayList<>( 50 ); for( Object key : defaults.keySet() ) { if( key instanceof String && (((String)key).endsWith( ".font" ) || ((String)key).endsWith( "Font" )) ) - defaults.put( key, activeFont ); + fontKeys.add( (String) key ); } + for( String key : fontKeys ) + defaults.put( key, activeFont ); // add fonts that are not set in BasicLookAndFeel defaults.put( "RootPane.font", activeFont ); @@ -1541,7 +1544,7 @@ public abstract class FlatLaf int newStyle = (style != -1) ? style : (styleChange != 0) - ? baseStyle & ~((styleChange >> 16) & 0xffff) | (styleChange & 0xffff) + ? (baseStyle & ~((styleChange >> 16) & 0xffff)) | (styleChange & 0xffff) : baseStyle; // new size diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatPropertiesLaf.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatPropertiesLaf.java index 002400e6..bcf296b6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatPropertiesLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatPropertiesLaf.java @@ -21,6 +21,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Locale; import java.util.Properties; /** @@ -96,7 +97,7 @@ public class FlatPropertiesLaf protected ArrayList> getLafClassesForDefaultsLoading() { ArrayList> lafClasses = new ArrayList<>(); lafClasses.add( FlatLaf.class ); - switch( baseTheme.toLowerCase() ) { + switch( baseTheme.toLowerCase( Locale.ENGLISH ) ) { default: case "light": lafClasses.add( FlatLightLaf.class ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/LinuxFontPolicy.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/LinuxFontPolicy.java index 81b86516..5bb234fb 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/LinuxFontPolicy.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/LinuxFontPolicy.java @@ -23,11 +23,14 @@ import java.awt.GraphicsEnvironment; import java.awt.Toolkit; import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; +import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.StringTokenizer; import javax.swing.text.StyleContext; import com.formdev.flatlaf.util.LoggingFacade; @@ -68,7 +71,7 @@ class LinuxFontPolicy if( word.endsWith( "," ) ) word = word.substring( 0, word.length() - 1 ).trim(); - String lword = word.toLowerCase(); + String lword = word.toLowerCase( Locale.ENGLISH ); if( lword.equals( "italic" ) || lword.equals( "oblique" ) ) style |= Font.ITALIC; else if( lword.equals( "bold" ) ) @@ -104,7 +107,7 @@ class LinuxFontPolicy size = 1; // handle logical font names - String logicalFamily = mapFcName( family.toLowerCase() ); + String logicalFamily = mapFcName( family.toLowerCase( Locale.ENGLISH ) ); if( logicalFamily != null ) family = logicalFamily; @@ -143,7 +146,7 @@ class LinuxFontPolicy return createFont( Font.DIALOG, style, size, dsize ); // check whether last work contains some font weight (e.g. Ultra-Bold or Heavy) - String lastWord = family.substring( index + 1 ).toLowerCase(); + String lastWord = family.substring( index + 1 ).toLowerCase( Locale.ENGLISH ); if( lastWord.contains( "bold" ) || lastWord.contains( "heavy" ) || lastWord.contains( "black" ) ) style |= Font.BOLD; @@ -257,6 +260,7 @@ class LinuxFontPolicy return createFont( family, style, size, dsize ); } + @SuppressWarnings( "MixedMutabilityReturnType" ) // Error Prone private static List readConfig( String filename ) { File userHome = new File( System.getProperty( "user.home" ) ); @@ -277,7 +281,9 @@ class LinuxFontPolicy // read config file ArrayList lines = new ArrayList<>( 200 ); - try( BufferedReader reader = new BufferedReader( new FileReader( file ) ) ) { + try( BufferedReader reader = new BufferedReader( new InputStreamReader( + new FileInputStream( file ), StandardCharsets.US_ASCII ) ) ) + { String line; while( (line = reader.readLine()) != null ) lines.add( line ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java index 7ce8a2e1..f6b1691a 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -348,8 +348,11 @@ class UIDefaultsLoader // convert binary color to string if( newValue instanceof Color ) { Color color = (Color) newValue; + int rgb = color.getRGB() & 0xffffff; int alpha = color.getAlpha(); - return String.format( (alpha != 255) ? "#%06x%02x" : "#%06x", color.getRGB() & 0xffffff, alpha ); + return (alpha != 255) + ? String.format( "#%06x%02x", rgb, alpha ) + : String.format( "#%06x", rgb ); } throw new IllegalArgumentException( "property value type '" + newValue.getClass().getName() + "' not supported in references" ); @@ -702,8 +705,6 @@ class UIDefaultsLoader /** * Parses a hex color in {@code #RGB}, {@code #RGBA}, {@code #RRGGBB} or {@code #RRGGBBAA} * format and returns it as color object. - * - * @throws IllegalArgumentException */ static ColorUIResource parseColor( String value ) { int rgba = parseColorRGBA( value ); @@ -716,8 +717,6 @@ class UIDefaultsLoader * Parses a hex color in {@code #RGB}, {@code #RGBA}, {@code #RRGGBB} or {@code #RRGGBBAA} * format and returns it as {@code rgba} integer suitable for {@link java.awt.Color}, * which includes alpha component in bits 24-31. - * - * @throws IllegalArgumentException */ static int parseColorRGBA( String value ) { int len = value.length(); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java index c4f002f8..3452e487 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatInternalFrameCloseIcon.java @@ -53,8 +53,8 @@ public class FlatInternalFrameCloseIcon g.setColor( FlatButtonUI.buttonStateColor( c, c.getForeground(), null, null, hoverForeground, pressedForeground ) ); - float mx = width / 2; - float my = height / 2; + float mx = width / 2f; + float my = height / 2f; float r = 3.25f; Path2D path = new Path2D.Float( Path2D.WIND_EVEN_ODD, 4 ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java index ef2df55a..4330c0a4 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatTabbedPaneCloseIcon.java @@ -94,8 +94,8 @@ public class FlatTabbedPaneCloseIcon Color fg = FlatButtonUI.buttonStateColor( c, closeForeground, null, null, closeHoverForeground, closePressedForeground ); g.setColor( FlatUIUtils.deriveColor( fg, c.getForeground() ) ); - float mx = width / 2; - float my = height / 2; + float mx = width / 2f; + float my = height / 2f; float r = ((bg != null) ? closeCrossFilledSize : closeCrossPlainSize) / 2; // paint cross diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/json/JsonParser.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/json/JsonParser.java index b001a79f..7bc99f57 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/json/JsonParser.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/json/JsonParser.java @@ -502,9 +502,9 @@ class JsonParser { } private boolean isHexDigit() { - return current >= '0' && current <= '9' - || current >= 'a' && current <= 'f' - || current >= 'A' && current <= 'F'; + return (current >= '0' && current <= '9') + || (current >= 'a' && current <= 'f') + || (current >= 'A' && current <= 'F'); } private boolean isEndOfText() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/json/Location.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/json/Location.java index 43e913e2..cb5e70a6 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/json/Location.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/json/Location.java @@ -69,7 +69,7 @@ public class Location { if (obj == null) { return false; } - if (getClass() != obj.getClass()) { + if (!(obj instanceof Location)) { return false; } Location other = (Location)obj; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java index cbf01434..249a701b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatLabelUI.java @@ -24,6 +24,7 @@ import java.awt.Rectangle; import java.beans.PropertyChangeEvent; import java.util.Arrays; import java.util.HashSet; +import java.util.Locale; import java.util.Map; import java.util.Set; import javax.swing.Icon; @@ -179,7 +180,7 @@ public class FlatLabelUI // BASE_SIZE rule is parsed in javax.swing.text.html.StyleSheet.addRule() String style = ""; - String lowerText = text.toLowerCase(); + String lowerText = text.toLowerCase( Locale.ENGLISH ); int headIndex; int styleIndex; @@ -228,7 +229,7 @@ public class FlatLabelUI int tagBegin = i + 1; for( i += 2; i < textLength; i++ ) { if( !Character.isLetterOrDigit( text.charAt( i ) ) ) { - String tag = text.substring( tagBegin, i ).toLowerCase(); + String tag = text.substring( tagBegin, i ).toLowerCase( Locale.ENGLISH ); if( tagsUseFontSizeSet.contains( tag ) ) return true; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupFactory.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupFactory.java index cb0f4f3d..46ea8ed5 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupFactory.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatPopupFactory.java @@ -391,7 +391,7 @@ public class FlatPopupFactory //---- class NonFlashingPopup --------------------------------------------- - private class NonFlashingPopup + private static class NonFlashingPopup extends Popup { private Popup delegate; 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 c28efa5d..a62e8369 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 @@ -360,8 +360,8 @@ public class FlatScrollPaneUI protected void updateViewport( PropertyChangeEvent e ) { super.updateViewport( e ); - JViewport oldViewport = (JViewport) (e.getOldValue()); - JViewport newViewport = (JViewport) (e.getNewValue()); + JViewport oldViewport = (JViewport) e.getOldValue(); + JViewport newViewport = (JViewport) e.getNewValue(); removeViewportListeners( oldViewport ); addViewportListeners( newViewport ); diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java index 43c8ddea..2914f655 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatSplitPaneUI.java @@ -87,7 +87,6 @@ public class FlatSplitPaneUI @Styleable protected Color oneTouchHoverArrowColor; @Styleable protected Color oneTouchPressedArrowColor; - private PropertyChangeListener propertyChangeListener; private Map oldStyleValues; public static ComponentUI createUI( JComponent c ) { @@ -126,19 +125,9 @@ public class FlatSplitPaneUI } @Override - protected void installListeners() { - super.installListeners(); - - propertyChangeListener = FlatStylingSupport.createPropertyChangeListener( splitPane, this::installStyle, null ); - splitPane.addPropertyChangeListener( propertyChangeListener ); - } - - @Override - protected void uninstallListeners() { - super.uninstallListeners(); - - splitPane.removePropertyChangeListener( propertyChangeListener ); - propertyChangeListener = null; + protected PropertyChangeListener createPropertyChangeListener() { + return FlatStylingSupport.createPropertyChangeListener( splitPane, this::installStyle, + super.createPropertyChangeListener() ); } @Override diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java index bb1d44cf..de736756 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatStylingSupport.java @@ -278,6 +278,7 @@ public class FlatStylingSupport * @throws IllegalArgumentException on syntax errors * @throws ClassCastException if value type does not fit to expected type */ + @SuppressWarnings( "ReturnValueIgnored" ) // Error Prone public static Map parseAndApply( Map oldStyleValues, Object style, BiFunction applyProperty ) throws UnknownStyleException, IllegalArgumentException 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 f2ff61be..6cc8efb9 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 @@ -1967,7 +1967,7 @@ public class FlatTabbedPaneUI //---- class TabCloseButton ----------------------------------------------- - private class TabCloseButton + private static class TabCloseButton extends JButton implements UIResource { @@ -1977,7 +1977,7 @@ public class FlatTabbedPaneUI //---- class ContainerUIResource ------------------------------------------ - private class ContainerUIResource + private static class ContainerUIResource extends JPanel implements UIResource { @@ -2382,7 +2382,7 @@ public class FlatTabbedPaneUI if( isPreciseWheel && getScrollButtonsPlacement() == BOTH && getScrollButtonsPolicy() == AS_NEEDED_SINGLE && - (isLeftToRight() || !horizontal) || // scroll buttons are hidden in right-to-left + (isLeftToRight() || !horizontal) && // scroll buttons are hidden in right-to-left scrollBackwardButtonPrefSize != null ) { // special cases for scrolling with touchpad or high-resolution wheel: @@ -3051,7 +3051,7 @@ public class FlatTabbedPaneUI break; case CENTER: - shiftTabs( 0, (diff) / 2 ); + shiftTabs( 0, diff / 2 ); topHeight += diff / 2; bottomHeight += diff - (diff / 2); break; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java index 987c3652..93fe344c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatTitlePane.java @@ -682,7 +682,7 @@ public class FlatTitlePane // Seems to be a bug in sun.awt.X11.XNETProtocol.requestState(), // which does some strange state XOR-ing... if( (oldState & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_VERT ) - newState = oldState & ~Frame.MAXIMIZED_BOTH | Frame.MAXIMIZED_HORIZ; + newState = (oldState & ~Frame.MAXIMIZED_BOTH) | Frame.MAXIMIZED_HORIZ; } frame.setExtendedState( newState ); 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 5a1ca8f2..b585647a 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 @@ -575,7 +575,7 @@ public class FlatTreeUI if( isSelected && isWideSelection() ) { Color oldColor = g.getColor(); g.setColor( selectionInactiveBackground ); - paintWideSelection( g, clipBounds, insets, bounds, path, row, isExpanded, hasBeenExpanded, isLeaf ); + paintWideSelection( g, bounds, row ); g.setColor( oldColor ); } return; @@ -633,7 +633,7 @@ public class FlatTreeUI if( isWideSelection() ) { // wide selection - paintWideSelection( g, clipBounds, insets, bounds, path, row, isExpanded, hasBeenExpanded, isLeaf ); + paintWideSelection( g, bounds, row ); } else { // non-wide selection paintCellBackground( g, rendererComponent, bounds, row, true ); @@ -702,9 +702,7 @@ public class FlatTreeUI return oldColor; } - private void paintWideSelection( Graphics g, Rectangle clipBounds, Insets insets, Rectangle bounds, - TreePath path, int row, boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf ) - { + private void paintWideSelection( Graphics g, Rectangle bounds, int row ) { float arcTop, arcBottom; arcTop = arcBottom = UIScale.scale( selectionArc / 2f ); 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 c43df699..b50ba470 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 @@ -725,7 +725,7 @@ public class FlatUIUtils { dotSize = UIScale.scale( dotSize ); gap = UIScale.scale( gap ); - int gripSize = (dotSize * dotCount) + ((gap * (dotCount - 1))); + int gripSize = (dotSize * dotCount) + (gap * (dotCount - 1)); // calculate grip position float gx; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/Graphics2DProxy.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/Graphics2DProxy.java index 2bc42296..809a87f3 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/Graphics2DProxy.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/Graphics2DProxy.java @@ -28,7 +28,6 @@ import java.awt.Paint; import java.awt.Polygon; import java.awt.Rectangle; import java.awt.RenderingHints; -import java.awt.RenderingHints.Key; import java.awt.Shape; import java.awt.Stroke; import java.awt.font.FontRenderContext; @@ -368,12 +367,12 @@ public class Graphics2DProxy } @Override - public void setRenderingHint( Key hintKey, Object hintValue ) { + public void setRenderingHint( RenderingHints.Key hintKey, Object hintValue ) { delegate.setRenderingHint( hintKey, hintValue ); } @Override - public Object getRenderingHint( Key hintKey ) { + public Object getRenderingHint( RenderingHints.Key hintKey ) { return delegate.getRenderingHint( hintKey ); } diff --git a/flatlaf-core/src/main/module-info/module-info.java b/flatlaf-core/src/main/module-info/module-info.java index 762c5d63..a8ba681a 100644 --- a/flatlaf-core/src/main/module-info/module-info.java +++ b/flatlaf-core/src/main/module-info/module-info.java @@ -14,7 +14,7 @@ * limitations under the License. */ -/** +/* * @author Karl Tauber */ module com.formdev.flatlaf { diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableValue.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableValue.java index eac5d453..54e72610 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableValue.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatStyleableValue.java @@ -1214,6 +1214,7 @@ public class TestFlatStyleableValue //---- class TestIcon ----------------------------------------------------- + @SuppressWarnings( "EqualsHashCode" ) // Error Prone public static class TestIcon implements Icon { diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestUtils.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestUtils.java index 1fc939de..3d584ca9 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestUtils.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestUtils.java @@ -30,6 +30,7 @@ import com.formdev.flatlaf.FlatSystemProperties; */ public class TestUtils { + @SuppressWarnings( "MutablePublicArray" ) // Error Prone public static final float[] FACTORS = { 1f, 1.25f, 1.5f, 1.75f, 2f, 2.25f, 2.5f, 2.75f, 3f, 3.25f, 3.5f, 3.75f, 4f, 5f, 6f }; public static void setup( boolean withFocus ) { diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java index d834b0a4..fde38fc5 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java @@ -440,9 +440,9 @@ class DemoFrame Class lafClass = UIManager.getLookAndFeel().getClass(); try { - FlatLaf.setup( lafClass.newInstance() ); + FlatLaf.setup( lafClass.getDeclaredConstructor().newInstance() ); FlatLaf.updateUI(); - } catch( InstantiationException | IllegalAccessException ex ) { + } catch( Exception ex ) { LoggingFacade.INSTANCE.logSevere( null, ex ); } } diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java index fcdc2a93..e6e034aa 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatSVGIcon.java @@ -279,7 +279,7 @@ public class FlatSVGIcon private static synchronized URI loadFromStream( InputStream in ) throws IOException { try( InputStream in2 = in ) { - return svgUniverse.loadSVG( in2, "/flatlaf-stream-" + (streamNumber++) ); + return svgUniverse.loadSVG( in2, "/flatlaf-stream-" + streamNumber++ ); } } @@ -474,7 +474,7 @@ public class FlatSVGIcon URI uri = this.uri; if( uri == null ) { URL url = getIconURL( name, dark ); - if( url == null & dark ) + if( url == null && dark ) url = getIconURL( name, false ); if( url == null ) { diff --git a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatUIDefaultsInspector.java b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatUIDefaultsInspector.java index d925d36d..75b2f13d 100644 --- a/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatUIDefaultsInspector.java +++ b/flatlaf-extras/src/main/java/com/formdev/flatlaf/extras/FlatUIDefaultsInspector.java @@ -770,6 +770,7 @@ public class FlatUIDefaultsInspector return String.valueOf( value ); } + @SuppressWarnings( "FormatString" ) // Error Prone private static String color2hex( Color color ) { int rgb = color.getRGB(); boolean hasAlpha = color.getAlpha() != 255; diff --git a/flatlaf-extras/src/main/module-info/module-info.java b/flatlaf-extras/src/main/module-info/module-info.java index a62e610b..2baec393 100644 --- a/flatlaf-extras/src/main/module-info/module-info.java +++ b/flatlaf-extras/src/main/module-info/module-info.java @@ -14,7 +14,7 @@ * limitations under the License. */ -/** +/* * @author Karl Tauber */ module com.formdev.flatlaf.extras { diff --git a/flatlaf-fonts/flatlaf-fonts-inter/src/main/module-info/module-info.java b/flatlaf-fonts/flatlaf-fonts-inter/src/main/module-info/module-info.java index 48b6d6f6..e739a736 100644 --- a/flatlaf-fonts/flatlaf-fonts-inter/src/main/module-info/module-info.java +++ b/flatlaf-fonts/flatlaf-fonts-inter/src/main/module-info/module-info.java @@ -14,7 +14,7 @@ * limitations under the License. */ -/** +/* * @author Karl Tauber */ module com.formdev.flatlaf.fonts.inter { diff --git a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/module-info/module-info.java b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/module-info/module-info.java index 362791b6..db048ea0 100644 --- a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/module-info/module-info.java +++ b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/module-info/module-info.java @@ -14,7 +14,7 @@ * limitations under the License. */ -/** +/* * @author Karl Tauber */ module com.formdev.flatlaf.fonts.jetbrains_mono { diff --git a/flatlaf-fonts/flatlaf-fonts-roboto-mono/src/main/module-info/module-info.java b/flatlaf-fonts/flatlaf-fonts-roboto-mono/src/main/module-info/module-info.java index 021817fd..4ea88adf 100644 --- a/flatlaf-fonts/flatlaf-fonts-roboto-mono/src/main/module-info/module-info.java +++ b/flatlaf-fonts/flatlaf-fonts-roboto-mono/src/main/module-info/module-info.java @@ -14,7 +14,7 @@ * limitations under the License. */ -/** +/* * @author Karl Tauber */ module com.formdev.flatlaf.fonts.roboto_mono { diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java index 82e57e21..dc5210ad 100644 --- a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java +++ b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java @@ -14,7 +14,7 @@ * limitations under the License. */ -/** +/* * @author Karl Tauber */ module com.formdev.flatlaf.fonts.roboto { diff --git a/flatlaf-intellij-themes/src/main/module-info/module-info.java b/flatlaf-intellij-themes/src/main/module-info/module-info.java index fc6caf64..fae301f2 100644 --- a/flatlaf-intellij-themes/src/main/module-info/module-info.java +++ b/flatlaf-intellij-themes/src/main/module-info/module-info.java @@ -14,7 +14,7 @@ * limitations under the License. */ -/** +/* * @author Karl Tauber */ module com.formdev.flatlaf.intellijthemes { diff --git a/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java b/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java index ba23a195..7fc49321 100644 --- a/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java +++ b/flatlaf-natives/flatlaf-natives-jna/src/main/java/com/formdev/flatlaf/natives/jna/windows/FlatWindowsNativeWindowBorder.java @@ -869,7 +869,6 @@ public class FlatWindowsNativeWindowBorder int GetSystemMetricsForDpi( int nIndex, int dpi ); boolean IsZoomed( HWND hWnd ); - HANDLE GetProp( HWND hWnd, String lpString ); HMENU GetSystemMenu( HWND hWnd, boolean bRevert ); boolean SetMenuItemInfo( HMENU hmenu, int item, boolean fByPositon, MENUITEMINFO lpmii ); diff --git a/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/ui/FlatTaskPaneUI.java b/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/ui/FlatTaskPaneUI.java index 6fc0f7c0..c323688c 100644 --- a/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/ui/FlatTaskPaneUI.java +++ b/flatlaf-swingx/src/main/java/com/formdev/flatlaf/swingx/ui/FlatTaskPaneUI.java @@ -229,7 +229,7 @@ public class FlatTaskPaneUI // compute chevron position int cx = (int) (x + width / 2 - cw / 2); - int cy = (int) (y + (height / 2 - ch)); + int cy = (int) (y + height / 2 - ch); float offset = ch + UIScale.scale( 1f ); // set stroke with scaled width diff --git a/flatlaf-swingx/src/main/module-info/module-info.java b/flatlaf-swingx/src/main/module-info/module-info.java index 6e3ffc4f..f68831e9 100644 --- a/flatlaf-swingx/src/main/module-info/module-info.java +++ b/flatlaf-swingx/src/main/module-info/module-info.java @@ -14,7 +14,7 @@ * limitations under the License. */ -/** +/* * @author Karl Tauber */ module com.formdev.flatlaf.swingx { diff --git a/flatlaf-testing/flatlaf-testing-modular-app/src/main/module-info/module-info.java b/flatlaf-testing/flatlaf-testing-modular-app/src/main/module-info/module-info.java index 3316462b..9dae644f 100644 --- a/flatlaf-testing/flatlaf-testing-modular-app/src/main/module-info/module-info.java +++ b/flatlaf-testing/flatlaf-testing-modular-app/src/main/module-info/module-info.java @@ -14,7 +14,7 @@ * limitations under the License. */ -/** +/* * @author Karl Tauber */ module com.formdev.flatlaf.testing.modular.app { diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponents2Test.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponents2Test.java index f4721eba..a21f27e4 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponents2Test.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatComponents2Test.java @@ -1456,7 +1456,7 @@ public class FlatComponents2Test //---- TestTableRowHeaderModel -------------------------------------------- - private class TestTableRowHeaderModel + private static class TestTableRowHeaderModel extends AbstractTableModel implements TableModelListener { diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatDisabledIconsTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatDisabledIconsTest.java index 944de42f..8af6622f 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatDisabledIconsTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatDisabledIconsTest.java @@ -932,7 +932,7 @@ public class FlatDisabledIconsTest @Override public int filterRGB(int x, int y, int rgb) { // Reduce the color bandwidth in quarter (>> 2) and Shift 0x88. - return (rgb & 0xff000000) + 0x888888 + ((((rgb >> 16) & 0xff) >> 2) << 16) + ((((rgb >> 8) & 0xff) >> 2) << 8) + (((rgb) & 0xff) >> 2); + return (rgb & 0xff000000) + 0x888888 + ((((rgb >> 16) & 0xff) >> 2) << 16) + ((((rgb >> 8) & 0xff) >> 2) << 8) + ((rgb & 0xff) >> 2); } } } diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatMenusTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatMenusTest.java index c04e885d..2fe51c10 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatMenusTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatMenusTest.java @@ -937,7 +937,7 @@ public class FlatMenusTest //---- class PopupMenu ---------------------------------------------------- - private class PopupMenu extends JPopupMenu { + private static class PopupMenu extends JPopupMenu { private PopupMenu() { initComponents(); } diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatSubMenusTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatSubMenusTest.java index 2016b53f..de4e775c 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatSubMenusTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatSubMenusTest.java @@ -398,7 +398,7 @@ public class FlatSubMenusTest //---- class PopupMenu ---------------------------------------------------- - private class PopupMenu extends JPopupMenu { + private static class PopupMenu extends JPopupMenu { private PopupMenu() { initComponents(); } diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/uidefaults/UIDefaultsDump.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/uidefaults/UIDefaultsDump.java index 9669aed9..ba84d3e8 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/uidefaults/UIDefaultsDump.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/uidefaults/UIDefaultsDump.java @@ -22,16 +22,20 @@ import java.awt.Font; import java.awt.Insets; import java.io.BufferedReader; import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; +import java.io.Writer; import java.lang.reflect.Array; import java.lang.reflect.Field; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; @@ -229,7 +233,8 @@ public class UIDefaultsDump } if( origFile != null ) { try { - Map defaults1 = parse( new FileReader( origFile ) ); + Map defaults1 = parse( new InputStreamReader( + new FileInputStream( origFile ), StandardCharsets.UTF_8 ) ); Map defaults2 = parse( new StringReader( stringWriter.toString() ) ); content = diff( defaults1, defaults2 ); @@ -242,7 +247,9 @@ public class UIDefaultsDump // write to file file.getParentFile().mkdirs(); - try( FileWriter fileWriter = new FileWriter( file ) ) { + try( Writer fileWriter = new OutputStreamWriter( + new FileOutputStream( file ), StandardCharsets.UTF_8 ) ) + { fileWriter.write( content ); } catch( IOException ex ) { ex.printStackTrace(); @@ -419,7 +426,7 @@ public class UIDefaultsDump } else if( value instanceof Character ) { char ch = ((Character)value).charValue(); if( ch >= ' ' && ch <= '~' ) - out.printf( "'%c'", value ); + out.printf( "'%c'", ch ); else out.printf( "'\\u%h'", (int) ch ); } else if( value.getClass().isArray() ) diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/uidefaults/UIDefaultsKeysDump.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/uidefaults/UIDefaultsKeysDump.java index 335a90c9..6ebbf88f 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/uidefaults/UIDefaultsKeysDump.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/uidefaults/UIDefaultsKeysDump.java @@ -19,10 +19,13 @@ package com.formdev.flatlaf.testing.uidefaults; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.HashSet; import java.util.Locale; @@ -47,7 +50,9 @@ public class UIDefaultsKeysDump // load existing keys file HashSet keys = new HashSet<>(); - try( BufferedReader reader = new BufferedReader( new FileReader( keysFile ) ) ) { + try( BufferedReader reader = new BufferedReader( new InputStreamReader( + new FileInputStream( keysFile ), StandardCharsets.UTF_8 ) ) ) + { String key; while( (key = reader.readLine()) != null ) { keys.add( key ); @@ -64,7 +69,9 @@ public class UIDefaultsKeysDump collectKeys( FlatTestLaf.class.getName(), keys ); // write key file - try( Writer fileWriter = new BufferedWriter( new FileWriter( keysFile ) ) ) { + try( Writer fileWriter = new BufferedWriter( new OutputStreamWriter( + new FileOutputStream( keysFile ), StandardCharsets.UTF_8 ) ) ) + { String[] sortedKeys = keys.toArray( new String[keys.size()] ); Arrays.sort( sortedKeys ); for( String key : sortedKeys ) { diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatLafThemeEditor.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatLafThemeEditor.java index a2fd6792..7fec2952 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatLafThemeEditor.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatLafThemeEditor.java @@ -46,6 +46,6 @@ public class FlatLafThemeEditor System.setProperty( "apple.awt.application.appearance", "system" ); } - FlatThemeFileEditor.main( args ); + FlatThemeFileEditor.launch( args ); } } diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeEditorOverlay.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeEditorOverlay.java index dc44e79d..433ce610 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeEditorOverlay.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeEditorOverlay.java @@ -52,6 +52,7 @@ class FlatThemeEditorOverlay private Font font; private Font baseFont; + @SuppressWarnings( "FormatString" ) // Error Prone @Override public void paint( Graphics g, JComponent c ) { // paint the syntax text area diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java index 49964862..c2535f69 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java @@ -102,7 +102,7 @@ class FlatThemeFileEditor private final FlatThemePropertiesBaseManager propertiesBaseManager = new FlatThemePropertiesBaseManager(); private final JButton newButton; - static void main( String[] args ) { + static void launch( String[] args ) { File dir = (args.length > 0) ? new File( args[0] ) : null; @@ -1306,7 +1306,7 @@ class FlatThemeFileEditor super.addElement( obj ); } else { int index = binarySearch( this, obj, comparator ); - insertElementAt( obj, (index < 0) ? ((-index)-1) : index ); + insertElementAt( obj, (index < 0) ? (-index - 1) : index ); } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 02214382..5539769d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -54,6 +54,12 @@ junit-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "jun junit-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junit" } junit-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" } +# errorprone +errorprone = "com.google.errorprone:error_prone_core:2.19.1" + [bundles] junit = [ "junit-api", "junit-params" ] + +[plugins] +errorprone = { id = "net.ltgt.errorprone", version = "3.1.0" }