From d0b0f098d9e49806e8bcd0247bd267d66dfec5f0 Mon Sep 17 00:00:00 2001 From: mmatessi <17149962+basix86@users.noreply.github.com> Date: Thu, 27 Feb 2020 15:46:28 +0100 Subject: [PATCH] disabledIcon --- .../java/com/formdev/flatlaf/FlatLaf.java | 18 ++++---- .../com/formdev/flatlaf/ui/FlatButtonUI.java | 2 + .../ui/FlatDisabledButtonImageFilter.java | 28 ++++++++++++ .../com/formdev/flatlaf/ui/FlatUIUtils.java | 45 +++++++++++++------ 4 files changed, 69 insertions(+), 24 deletions(-) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDisabledButtonImageFilter.java 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 c02ec1e1..eb72c17b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -36,20 +36,13 @@ import java.util.Map; import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; -import javax.swing.AbstractButton; -import javax.swing.JLabel; -import javax.swing.JRootPane; -import javax.swing.JTabbedPane; -import javax.swing.LookAndFeel; -import javax.swing.PopupFactory; -import javax.swing.SwingUtilities; -import javax.swing.UIDefaults; -import javax.swing.UIManager; -import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.*; import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.FontUIResource; +import javax.swing.plaf.IconUIResource; import javax.swing.plaf.basic.BasicLookAndFeel; import javax.swing.text.html.HTMLEditorKit; +import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.util.SystemInfo; import com.formdev.flatlaf.util.UIScale; @@ -111,6 +104,11 @@ public abstract class FlatLaf return true; } + @Override + public Icon getDisabledIcon(JComponent component, Icon icon) { + return new IconUIResource(FlatUIUtils.getDisabledIcon(icon)); + } + @Override public void initialize() { if( SystemInfo.IS_MAC ) diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java index 6055b3bd..2c8ec701 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java @@ -86,6 +86,8 @@ import com.formdev.flatlaf.util.UIScale; * @uiDefault Button.toolbar.spacingInsets Insets * @uiDefault Button.toolbar.hoverBackground Color * @uiDefault Button.toolbar.pressedBackground Color + * @uiDefault Button.disabledGrayMinValue int optional + * @uiDefault Button.disabledGrayMinValue int optional * * @author Karl Tauber */ diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDisabledButtonImageFilter.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDisabledButtonImageFilter.java new file mode 100644 index 00000000..7e1c4a5f --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatDisabledButtonImageFilter.java @@ -0,0 +1,28 @@ +package com.formdev.flatlaf.ui; + +import java.awt.image.RGBImageFilter; + +/** + * Used to create a disabled Icon with the ocean look. + *
+ * Imported from MetalUtils.getOceanDisabledButtonIcon + */ +class FlatDisabledButtonImageFilter extends RGBImageFilter { + private float min; + private float factor; + + FlatDisabledButtonImageFilter( int min, int max ) { + canFilterIndexColorModel = true; + this.min = ( float ) min; + this.factor = ( max - min ) / 255f; + } + + public int filterRGB( int x, int y, int rgb ) { + // Coefficients are from the sRGB color space: + int gray = Math.min( 255, ( int ) ( ( ( 0.2125f * ( ( rgb >> 16 ) & 0xFF ) ) + + ( 0.7154f * ( ( rgb >> 8 ) & 0xFF ) ) + + ( 0.0721f * ( rgb & 0xFF )) + .5f ) * factor + min) ); + + return ( rgb & 0xff000000 ) | ( gray << 16 ) | ( gray << 8 ) | ( gray ); + } +} 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 8a15c8d1..590baf62 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 @@ -16,17 +16,7 @@ package com.formdev.flatlaf.ui; -import java.awt.Color; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.Shape; +import java.awt.*; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.MouseAdapter; @@ -34,10 +24,11 @@ import java.awt.event.MouseEvent; import java.awt.geom.Path2D; import java.awt.geom.Rectangle2D; import java.awt.geom.RoundRectangle2D; +import java.awt.image.BufferedImage; +import java.awt.image.FilteredImageSource; +import java.awt.image.ImageProducer; import java.util.function.Consumer; -import javax.swing.JComponent; -import javax.swing.LookAndFeel; -import javax.swing.UIManager; +import javax.swing.*; import javax.swing.plaf.UIResource; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.util.DerivedColor; @@ -433,6 +424,32 @@ public class FlatUIUtils return explicitlySet; } + public static Icon getDisabledIcon( Icon icon ) { + Image image = safeGetImage(icon); + int grayMinValue = FlatUIUtils.getUIInt( "Button.disabledGrayMinValue", 180 ); + int grayMaxValue = FlatUIUtils.getUIInt( "Button.disabledGrayMaxValue", 215 ); + FlatDisabledButtonImageFilter imageFilter = new FlatDisabledButtonImageFilter(grayMinValue, grayMaxValue); + ImageProducer producer = new FilteredImageSource(image.getSource(), imageFilter); + return new ImageIcon(Toolkit.getDefaultToolkit().createImage(producer)); + } + + private static Image safeGetImage(Icon icon) { + if ( icon instanceof ImageIcon ) { + return ( ( ImageIcon ) icon ).getImage(); + } else { + int width = icon.getIconWidth(); + int height = icon.getIconHeight(); + GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice device = environment.getDefaultScreenDevice(); + GraphicsConfiguration configuration = device.getDefaultConfiguration(); + BufferedImage image = configuration.createCompatibleImage( width, height ); + Graphics2D g = image.createGraphics(); + icon.paintIcon( null, g, 0, 0 ); + g.dispose(); + return image; + } + } + //---- class HoverListener ------------------------------------------------ public static class HoverListener