From bd70704b215077603c261b5dbcb9d12dfd0fc111 Mon Sep 17 00:00:00 2001 From: Kirill Kirichenko Date: Tue, 6 Mar 2018 17:41:25 +0300 Subject: [PATCH] IDEA-187791 Make JButtons colorable --- .../actionSystem/ex/ComboBoxAction.java | 3 +- .../ide/ui/laf/darcula/DarculaUIUtil.java | 13 +++ .../laf/darcula/ui/DarculaButtonPainter.java | 15 +-- .../ui/laf/darcula/ui/DarculaButtonUI.java | 38 +++---- .../laf/darcula/ui/DarculaOptionButtonUI.kt | 6 +- .../laf/intellij/MacIntelliJButtonBorder.java | 3 +- .../ui/laf/intellij/MacIntelliJButtonUI.java | 72 ++++++------ .../laf/intellij/WinIntelliJButtonBorder.java | 39 ++++--- .../ui/laf/intellij/WinIntelliJButtonUI.java | 52 ++++++--- .../internal/ui/ButtonStyleAction.java | 105 ++++++++++++++++++ .../src/idea/PlatformActions.xml | 1 + 11 files changed, 246 insertions(+), 101 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/internal/ui/ButtonStyleAction.java diff --git a/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java b/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java index 4f98b77de8fb..474e2a7213dc 100644 --- a/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java +++ b/platform/platform-api/src/com/intellij/openapi/actionSystem/ex/ComboBoxAction.java @@ -351,7 +351,8 @@ public abstract class ComboBoxAction extends AnAction implements CustomComponent public Dimension getPreferredSize() { Dimension prefSize = super.getPreferredSize(); int width = prefSize.width + getArrowIcon(isEnabled()).getIconWidth() + JBUI.scale(5); - width += UIUtil.isUnderWin10LookAndFeel() ? JBUI.scale(10) : 0; + width += UIUtil.isUnderWin10LookAndFeel() ? JBUI.scale(10) : + UIUtil.isUnderDefaultMacTheme() ? JBUI.scale(5) : 0; return new Dimension(width, isSmallVariant() ? JBUI.scale(24) : prefSize.height); } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaUIUtil.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaUIUtil.java index ca63becb655c..e061256445a4 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaUIUtil.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/DarculaUIUtil.java @@ -17,6 +17,7 @@ package com.intellij.ide.ui.laf.darcula; import com.intellij.ide.IdeEventQueue; import com.intellij.ide.ui.laf.IntelliJLaf; +import com.intellij.ide.ui.laf.darcula.ui.DarculaButtonUI; import com.intellij.ide.ui.laf.darcula.ui.DarculaEditorTextFieldBorder; import com.intellij.openapi.editor.event.EditorMouseAdapter; import com.intellij.openapi.editor.event.EditorMouseEvent; @@ -33,6 +34,7 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import javax.swing.*; +import javax.swing.plaf.UIResource; import javax.swing.text.JTextComponent; import javax.swing.text.Position; import java.awt.*; @@ -423,4 +425,15 @@ public class DarculaUIUtil { public static boolean isEmpty(Dimension d) { return d == null || d.width == 0 && d.height == 0; } + + public static Color getButtonTextColor(@NotNull AbstractButton button) { + Color fg = button.getForeground(); + if (fg instanceof UIResource && DarculaButtonUI.isDefaultButton(button)) { + Color selectedFg = UIManager.getColor("Button.darcula.selectedButtonForeground"); + if (selectedFg != null) { + return selectedFg; + } + } + return fg; + } } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaButtonPainter.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaButtonPainter.java index 45aa02761ebd..1567062299be 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaButtonPainter.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaButtonPainter.java @@ -85,13 +85,14 @@ public class DarculaButtonPainter implements Border, UIResource { } public Color getBorderColor(Component button) { - return button.isEnabled() ? - button.hasFocus() ? - UIManager.getColor(DarculaButtonUI.isDefaultButton((JComponent)button) ? - "Button.darcula.defaultFocusedBorderColor" : "Button.darcula.focusedBorderColor") : - UIManager.getColor(button.isEnabled() && DarculaButtonUI.isDefaultButton((JComponent)button) ? - "Button.darcula.defaultBorderColor" : "Button.darcula.borderColor") - : UIManager.getColor("Button.darcula.disabledBorderColor"); + AbstractButton b = (AbstractButton)button; + Color borderColor = (Color)b.getClientProperty("JButton.borderColor"); + return button.isEnabled() ? borderColor != null ? borderColor : + button.hasFocus() ? + UIManager.getColor(DarculaButtonUI.isDefaultButton(b) ? "Button.darcula.defaultFocusedBorderColor" : "Button.darcula.focusedBorderColor") : + UIManager.getColor(button.isEnabled() && DarculaButtonUI.isDefaultButton(b) ? "Button.darcula.defaultBorderColor" : "Button.darcula.borderColor") + + : UIManager.getColor("Button.darcula.disabledBorderColor"); } protected void paintShadow(Graphics2D g2, Rectangle r) { diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaButtonUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaButtonUI.java index e8df60a42962..604ecf710ebf 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaButtonUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaButtonUI.java @@ -26,14 +26,12 @@ import com.intellij.util.ui.JBInsets; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.MacUIUtil; import com.intellij.util.ui.UIUtil; -import org.jetbrains.annotations.NotNull; import sun.swing.SwingUtilities2; import javax.swing.*; import javax.swing.plaf.ColorUIResource; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.FontUIResource; -import javax.swing.plaf.UIResource; import javax.swing.plaf.basic.BasicButtonUI; import javax.swing.plaf.basic.BasicHTML; import javax.swing.text.View; @@ -101,17 +99,8 @@ public class DarculaButtonUI extends BasicButtonUI { float bw = DarculaUIUtil.bw(); if (c.isEnabled()) { - if (isSquare(c)) { - g2.setPaint(UIUtil.getGradientPaint(r.x, r.y, getButtonColorStart(), r.x + r.width, r.y + r.height, getButtonColorEnd())); - g2.fill(new RoundRectangle2D.Float(bw, bw, r.width - bw * 2, r.height - bw * 2, arc, arc)); - } - else { - g2.setPaint(isDefaultButton(c) ? - UIUtil.getGradientPaint(0, 0, getDefaultButtonColorStart(), 0, r.height, getDefaultButtonColorEnd()) : - UIUtil.getGradientPaint(0, 0, getButtonColorStart(), 0, r.height, getButtonColorEnd())); - - g2.fill(new RoundRectangle2D.Float(bw, bw, r.width - bw * 2, r.height - bw * 2, arc, arc)); - } + g2.setPaint(getBackground(c, r)); + g2.fill(new RoundRectangle2D.Float(bw, bw, r.width - bw * 2, r.height - bw * 2, arc, arc)); } } finally { g2.dispose(); @@ -120,6 +109,15 @@ public class DarculaButtonUI extends BasicButtonUI { } } + private Paint getBackground(JComponent c, Rectangle r) { + Color backgroundColor = (Color)c.getClientProperty("JButton.backgroundColor"); + + return backgroundColor != null ? backgroundColor : + isDefaultButton(c) ? + UIUtil.getGradientPaint(0, 0, getDefaultButtonColorStart(), 0, r.height, getDefaultButtonColorEnd()) : + UIUtil.getGradientPaint(0, 0, getButtonColorStart(), 0, r.height, getButtonColorEnd()); + } + @Override public void paint(Graphics g, JComponent c) { if (paintDecorations((Graphics2D)g, c)) { @@ -134,7 +132,7 @@ public class DarculaButtonUI extends BasicButtonUI { AbstractButton button = (AbstractButton)c; ButtonModel model = button.getModel(); - g.setColor(getTextColor(button)); + g.setColor(getButtonTextColor(button)); FontMetrics metrics = SwingUtilities2.getFontMetrics(c, g); int mnemonicIndex = DarculaLaf.isAltPressed() ? button.getDisplayedMnemonicIndex() : -1; @@ -149,15 +147,9 @@ public class DarculaButtonUI extends BasicButtonUI { } } - public static Color getTextColor(@NotNull AbstractButton button) { - Color fg = button.getForeground(); - if (fg instanceof UIResource && isDefaultButton(button)) { - final Color selectedFg = UIManager.getColor("Button.darcula.selectedButtonForeground"); - if (selectedFg != null) { - fg = selectedFg; - } - } - return fg; + protected Color getButtonTextColor(AbstractButton button) { + Color textColor = (Color)button.getClientProperty("JButton.textColor"); + return textColor != null ? textColor : DarculaUIUtil.getButtonTextColor(button); } public static Color getDisabledTextColor() { diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaOptionButtonUI.kt b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaOptionButtonUI.kt index 15914a7c40cc..7d08af76aa87 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaOptionButtonUI.kt +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaOptionButtonUI.kt @@ -1,10 +1,8 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.ide.ui.laf.darcula.ui -import com.intellij.ide.ui.laf.darcula.DarculaUIUtil.bw -import com.intellij.ide.ui.laf.darcula.DarculaUIUtil.lw +import com.intellij.ide.ui.laf.darcula.DarculaUIUtil.* import com.intellij.ide.ui.laf.darcula.ui.DarculaButtonUI.getDisabledTextColor -import com.intellij.ide.ui.laf.darcula.ui.DarculaButtonUI.getTextColor import com.intellij.ide.ui.laf.darcula.ui.DarculaComboBoxUI.getArrowButtonPreferredSize import com.intellij.ui.components.BasicOptionButtonUI import com.intellij.util.ui.JBUI @@ -55,7 +53,7 @@ open class DarculaOptionButtonUI : BasicOptionButtonUI() { g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON) g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE) - g.color = if (b.isEnabled) getTextColor(b) else getDisabledTextColor() + g.color = if (b.isEnabled) getButtonTextColor(b) else getDisabledTextColor() g.fill(DarculaComboBoxUI.getArrowShape(b)) } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJButtonBorder.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJButtonBorder.java index fab31a21df90..2603f15fcfef 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJButtonBorder.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJButtonBorder.java @@ -32,8 +32,7 @@ import static com.intellij.ide.ui.laf.intellij.MacIntelliJButtonUI.ARC_SIZE; public class MacIntelliJButtonBorder implements Border, UIResource { @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { - if (!c.hasFocus() || - c instanceof JComponent && UIUtil.isHelpButton(c)) return; + if (!c.hasFocus() || c instanceof JComponent && UIUtil.isHelpButton(c)) return; Graphics2D g2 = (Graphics2D)g.create(); try { diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJButtonUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJButtonUI.java index c83ad92beed9..ecf2d0a504db 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJButtonUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/MacIntelliJButtonUI.java @@ -19,6 +19,7 @@ import com.intellij.ide.ui.laf.IconCache; import com.intellij.ide.ui.laf.IntelliJLaf; import com.intellij.ide.ui.laf.darcula.ui.DarculaButtonUI; import com.intellij.ui.Gray; +import com.intellij.util.ui.JBInsets; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.MacUIUtil; import com.intellij.util.ui.UIUtil; @@ -41,7 +42,6 @@ public class MacIntelliJButtonUI extends DarculaButtonUI { return new MacIntelliJButtonUI(); } - @SuppressWarnings("UseJBColor") @Override public void paint(Graphics g, JComponent c) { if (!(c.getBorder() instanceof MacIntelliJButtonBorder) && !isComboButton(c)) { @@ -64,23 +64,12 @@ public class MacIntelliJButtonUI extends DarculaButtonUI { g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, MacUIUtil.USE_QUARTZ ? RenderingHints.VALUE_STROKE_PURE : RenderingHints.VALUE_STROKE_NORMALIZE); float lw = getLineWidth(g2); - Insets i = c.getBorder().getBorderInsets(c); // ComboButton adds arrow width to the insets, so take the bare border. + Insets i = c.getInsets(); // Draw background Shape outerRect = new RoundRectangle2D.Float(i.left, i.top, w - (i.left + i.right), h - (i.top + i.bottom), ARC_SIZE, ARC_SIZE); - Paint p; - if (!b.isEnabled()) { - p = Gray.xF1; - } else if (isDefaultButton(c)) { - p = IntelliJLaf.isGraphite() ? - new GradientPaint(w/2, i.top, new Color(0xb2b2b7), w/2, h - (i.top + i.bottom), new Color(0x929297)) : - new GradientPaint(w/2, i.top, new Color(0x68b2fa), w/2, h - (i.top + i.bottom), new Color(0x0e80ff)); - } else { - p = Gray.xFF; - } - - g2.setPaint(p); + g2.setPaint(getBackgroundPaint(c)); g2.fill(outerRect); // Draw outline @@ -90,9 +79,7 @@ public class MacIntelliJButtonUI extends DarculaButtonUI { w - lw*2 - (i.left + i.right), h - lw*2 - (i.top + i.bottom), ARC_SIZE - lw, ARC_SIZE - lw), false); - - p = getBorderPaint(c); - g2.setPaint(p); + g2.setPaint(getBorderPaint(c)); g2.fill(outline); paintContents(g2, b); @@ -107,23 +94,37 @@ public class MacIntelliJButtonUI extends DarculaButtonUI { } @SuppressWarnings("UseJBColor") - public static Paint getBorderPaint(JComponent c) { - int w = c.getWidth(); - int h = c.getHeight(); - Insets i = c.getBorder().getBorderInsets(c); - Paint p; - if (!c.isEnabled()) { - p = new GradientPaint(w / 2, i.top, Gray.xD2, w / 2, h - (i.top + i.bottom), Gray.xC3); + private static Paint getBackgroundPaint(JComponent b) { + int h = b.getHeight(); + Insets i = b.getInsets(); + + if (!b.isEnabled()) { + return Gray.xF1; + } else if (isDefaultButton(b)) { + return IntelliJLaf.isGraphite() ? + new GradientPaint(0, i.top, new Color(0xb2b2b7), 0, h - (i.top + i.bottom), new Color(0x929297)) : + new GradientPaint(0, i.top, new Color(0x68b2fa), 0, b.getHeight() - (i.top + i.bottom), new Color(0x0e80ff)); + } else { + Color backgroundColor = (Color)b.getClientProperty("JButton.backgroundColor"); + return backgroundColor != null ? backgroundColor : Gray.xFF; } - else if (isDefaultButton(c)) { - p = IntelliJLaf.isGraphite() ? - new GradientPaint(w / 2, i.top, new Color(0xa5a5ab), w / 2, h - (i.top + i.bottom), new Color(0x7d7d83)) : - new GradientPaint(w / 2, i.top, new Color(0x4ba0f8), w / 2, h - (i.top + i.bottom), new Color(0x095eff)); + } + + @SuppressWarnings("UseJBColor") + public static Paint getBorderPaint(JComponent b) { + int h = b.getHeight(); + Insets i = b.getBorder().getBorderInsets(b); + + if (!b.isEnabled()) { + return new GradientPaint(0, i.top, Gray.xD2, 0, h - (i.top + i.bottom), Gray.xC3); + } else if (isDefaultButton(b)) { + return IntelliJLaf.isGraphite() ? + new GradientPaint(0, i.top, new Color(0xa5a5ab), 0, h - (i.top + i.bottom), new Color(0x7d7d83)) : + new GradientPaint(0, i.top, new Color(0x4ba0f8), 0, h - (i.top + i.bottom), new Color(0x095eff)); + } else { + Color borderColor = (Color)b.getClientProperty("JButton.borderColor"); + return borderColor != null ? borderColor : new GradientPaint(0, i.top, Gray.xC9, 0, h - (i.top + i.bottom), Gray.xAC); } - else { - p = new GradientPaint(w / 2, i.top, Gray.xC9, w / 2, h - (i.top + i.bottom), Gray.xAC); - } - return p; } @Override @@ -151,4 +152,11 @@ public class MacIntelliJButtonUI extends DarculaButtonUI { } SwingUtilities2.drawStringUnderlineCharAt(c, g, text, -1, x, y); } + + @Override protected void modifyViewRect(AbstractButton b, Rectangle rect) { + JBInsets.removeFrom(rect, b.getInsets()); + if (isComboButton(b)) { + JBInsets.removeFrom(rect, JBUI.insetsLeft(5)); + } + } } diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/WinIntelliJButtonBorder.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/WinIntelliJButtonBorder.java index 72c58b7ac98e..5148f4f5d0ba 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/WinIntelliJButtonBorder.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/WinIntelliJButtonBorder.java @@ -25,7 +25,6 @@ public class WinIntelliJButtonBorder implements Border, UIResource { Graphics2D g2 = (Graphics2D)g.create(); AbstractButton b = (AbstractButton)c; - ButtonModel bm = b.getModel(); Rectangle outerRect = new Rectangle(x, y, width, height); try { JBInsets.removeFrom(outerRect, getOuterInsets()); @@ -33,34 +32,40 @@ public class WinIntelliJButtonBorder implements Border, UIResource { g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE); - Color color = UIManager.getColor("Button.intellij.native.borderColor"); - if (!c.isEnabled()) { - g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, DISABLED_ALPHA_LEVEL)); - } else if (bm.isPressed()) { - color = UIManager.getColor("Button.intellij.native.pressedBorderColor"); - } else if (b.hasFocus() || bm.isRollover()) { - color = UIManager.getColor("Button.intellij.native.focusedBorderColor"); - } else { - if (DarculaButtonUI.isDefaultButton(b)) { - color = UIManager.getColor("Button.intellij.native.focusedBorderColor"); - } - } - int bw = getBorderWidth(b); - Path2D border = new Path2D.Float(Path2D.WIND_EVEN_ODD); border.append(outerRect, false); Rectangle innerRect = new Rectangle(outerRect); - JBInsets.removeFrom(innerRect, JBUI.insets(bw)); + JBInsets.removeFrom(innerRect, JBUI.insets(getBorderWidth(b))); border.append(innerRect, false); - g2.setColor(color); + g2.setColor(getBorderColor(b)); + if (!c.isEnabled()) { + g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, DISABLED_ALPHA_LEVEL)); + } + g2.fill(border); } finally { g2.dispose(); } } + private static Color getBorderColor(AbstractButton b) { + ButtonModel bm = b.getModel(); + + Color focusedBorderColor = (Color)b.getClientProperty("JButton.focusedBorderColor"); + if (bm.isPressed()) { + return focusedBorderColor != null ? + focusedBorderColor : UIManager.getColor("Button.intellij.native.pressedBorderColor"); + } else if (b.hasFocus() || bm.isRollover() || DarculaButtonUI.isDefaultButton(b)) { + return focusedBorderColor != null ? + focusedBorderColor : UIManager.getColor("Button.intellij.native.focusedBorderColor"); + } else { + Color borderColor = (Color)b.getClientProperty("JButton.borderColor"); + return borderColor != null ? borderColor : UIManager.getColor("Button.intellij.native.borderColor"); + } + } + @NotNull public JBInsets getOuterInsets() { return JBUI.insets(1); diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/WinIntelliJButtonUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/WinIntelliJButtonUI.java index f6d820c85e8d..bf45fc78836e 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/WinIntelliJButtonUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/intellij/WinIntelliJButtonUI.java @@ -16,6 +16,7 @@ package com.intellij.ide.ui.laf.intellij; import com.intellij.ide.ui.laf.IconCache; +import com.intellij.ide.ui.laf.darcula.DarculaUIUtil; import com.intellij.ide.ui.laf.darcula.ui.DarculaButtonUI; import com.intellij.util.ui.JBInsets; import com.intellij.util.ui.JBUI; @@ -73,8 +74,6 @@ public class WinIntelliJButtonUI extends DarculaButtonUI { help.paintIcon(c, g, i.left, i.top + (c.getHeight() - help.getIconHeight()) / 2); } else if (c instanceof AbstractButton) { AbstractButton b = (AbstractButton)c; - ButtonModel bm = b.getModel(); - Graphics2D g2 = (Graphics2D)g.create(); try { Rectangle r = new Rectangle(c.getSize()); @@ -89,15 +88,11 @@ public class WinIntelliJButtonUI extends DarculaButtonUI { g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, MacUIUtil.USE_QUARTZ ? RenderingHints.VALUE_STROKE_PURE : RenderingHints.VALUE_STROKE_NORMALIZE); - Color color = bm.isPressed() ? UIManager.getColor("Button.intellij.native.pressedBackgroundColor") : - c.hasFocus() || bm.isRollover() ? UIManager.getColor("Button.intellij.native.focusedBackgroundColor") : - c.getBackground(); - if (!b.isEnabled()) { g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, DISABLED_ALPHA_LEVEL)); } - g2.setColor(color); + g2.setColor(getBackgroundColor(b)); g2.fill(r); paintContents(g2, b); @@ -108,16 +103,11 @@ public class WinIntelliJButtonUI extends DarculaButtonUI { } @Override protected void modifyViewRect(AbstractButton b, Rectangle rect) { - if (!isComboButton(b)) { + if (isComboButton(b)) { + JBInsets.removeFrom(rect, JBUI.insetsLeft(6)); + } else { JBInsets.removeFrom(rect, b.getInsets()); } - - if (isComboButton(b)) { - int delta = JBUI.scale(6); - rect.x += delta; - rect.width -= delta; - } - rect.y -= JBUI.scale(1); // Move one pixel up } @@ -151,4 +141,36 @@ public class WinIntelliJButtonUI extends DarculaButtonUI { g2.dispose(); } } + + @Override + protected Color getButtonTextColor(AbstractButton button) { + Color focusedColor = (Color)button.getClientProperty("JButton.focusedTextColor"); + Color textColor = (Color)button.getClientProperty("JButton.textColor"); + + boolean focusedStyle = button.hasFocus() || button.getModel().isRollover(); + + if (focusedStyle && focusedColor != null) { + return focusedColor; + } else if (!focusedStyle && textColor != null) { + return textColor; + } else { + return DarculaUIUtil.getButtonTextColor(button); + } + } + + private static Color getBackgroundColor(AbstractButton b) { + ButtonModel bm = b.getModel(); + + Color focusedColor = (Color)b.getClientProperty("JButton.focusedBackgroundColor"); + if (bm.isPressed()) { + return focusedColor != null ? + focusedColor : UIManager.getColor("Button.intellij.native.pressedBackgroundColor"); + } else if (b.hasFocus() || bm.isRollover()) { + return focusedColor != null ? + focusedColor :UIManager.getColor("Button.intellij.native.focusedBackgroundColor"); + } else { + Color backgroundColor = (Color)b.getClientProperty("JButton.backgroundColor"); + return backgroundColor != null ? backgroundColor : b.getBackground(); + } + } } diff --git a/platform/platform-impl/src/com/intellij/internal/ui/ButtonStyleAction.java b/platform/platform-impl/src/com/intellij/internal/ui/ButtonStyleAction.java new file mode 100644 index 000000000000..51258c6357f5 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/internal/ui/ButtonStyleAction.java @@ -0,0 +1,105 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.internal.ui; + +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.project.DumbAwareAction; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.ui.JBColor; +import com.intellij.util.ui.JBUI; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.awt.*; + +@SuppressWarnings("UseJBColor") +public class ButtonStyleAction extends DumbAwareAction { + private static final String TEXT_COLOR = "JButton.textColor"; + private static final String FOCUSED_TEXT_COLOR = "JButton.focusedTextColor"; + private static final String BACKGROUND_PROPERTY = "JButton.backgroundColor"; + private static final String FOCUSED_BACKGROUND_PROPERTY = "JButton.focusedBackgroundColor"; + private static final String BORDER_PROPERTY = "JButton.borderColor"; + private static final String FOCUSED_BORDER_PROPERTY = "JButton.focusedBorderColor"; + + private static final Color WHITE_BACKGROUND = new JBColor(Color.WHITE, new Color(0x3c3f41)); + private static final Color WHITE_FOREGROUND = new JBColor(Color.WHITE, new Color(0xbbbbbb)); + private static final Color GREEN_BACKGROUND = new JBColor(0x5d9b47, 0x457335); + private static final Color GREEN_BORDER = new JBColor(0x5d9b47, 0x457335); + private static final Color GREEN_FOCUSED_BACKGROUND = new Color(0xe1f6da); + + private static final Color BLUE_BACKGROUND = new JBColor(0x1d73bf, 0x134d80); + + @Override + public void actionPerformed(AnActionEvent e) { + Project project = e.getProject(); + if (project != null) { + new MyButtonStyleAction(project).show(); + } + } + + private static class MyButtonStyleAction extends DialogWrapper { + private MyButtonStyleAction(Project project) { + super(project); + init(); + } + + @Nullable + @Override + protected JComponent createCenterPanel() { + JPanel panel = new JPanel(new GridBagLayout()); + GridBagConstraints gc = new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.LINE_START, GridBagConstraints.HORIZONTAL, + JBUI.insets(5), 0, 0); + + JButton button1 = new JButton("Button 1"); + button1.putClientProperty(BACKGROUND_PROPERTY, WHITE_BACKGROUND); + button1.putClientProperty(FOCUSED_BACKGROUND_PROPERTY, GREEN_FOCUSED_BACKGROUND); + button1.putClientProperty(BORDER_PROPERTY, GREEN_BORDER); + button1.putClientProperty(FOCUSED_BORDER_PROPERTY, GREEN_BORDER); + button1.putClientProperty(FOCUSED_TEXT_COLOR, GREEN_BORDER); + button1.putClientProperty(TEXT_COLOR, GREEN_BORDER); + panel.add(button1, gc); + + JButton button2 = new JButton("Button 2"); + //Color fg2 = button2.getForeground(); + //button2.setForeground(new JBColor(() -> button2.hasFocus() ? fg2 : Color.WHITE)); + button2.putClientProperty(TEXT_COLOR, WHITE_FOREGROUND); + button2.putClientProperty(BACKGROUND_PROPERTY, BLUE_BACKGROUND); + button2.putClientProperty(BORDER_PROPERTY, BLUE_BACKGROUND); + gc.gridy++; + panel.add(button2, gc); + + JButton button3 = new JButton("Button 3"); + //Color fg3 = button3.getForeground(); + //button3.setForeground(new JBColor(() -> button3.hasFocus() ? fg3 : Color.WHITE)); + button3.putClientProperty(TEXT_COLOR, WHITE_FOREGROUND); + button3.putClientProperty(BACKGROUND_PROPERTY, GREEN_BACKGROUND); + button3.putClientProperty(FOCUSED_BACKGROUND_PROPERTY, GREEN_FOCUSED_BACKGROUND); + button3.putClientProperty(BORDER_PROPERTY, GREEN_BORDER); + button3.putClientProperty(FOCUSED_BORDER_PROPERTY, GREEN_BORDER); + gc.gridy++; + panel.add(button3, gc); + + JButton button4 = new JButton("Button 4"); + gc.gridy++; + panel.add(button4, gc); + + gc.gridx++; + gc.gridy = 0; + gc.fill = GridBagConstraints.REMAINDER; + gc.insets = JBUI.emptyInsets(); + gc.weightx = 1.0; + panel.add(new JPanel(), gc); + + gc.gridy++; + panel.add(new JPanel(), gc); + + gc.gridy++; + panel.add(new JPanel(), gc); + + gc.gridy++; + panel.add(new JPanel(), gc); + + return panel; + } + } +} diff --git a/platform/platform-resources/src/idea/PlatformActions.xml b/platform/platform-resources/src/idea/PlatformActions.xml index a3fe763586ce..b99f02f3157c 100644 --- a/platform/platform-resources/src/idea/PlatformActions.xml +++ b/platform/platform-resources/src/idea/PlatformActions.xml @@ -767,6 +767,7 @@ text="Add Test Notification"/> +