From eaa13efbc7d64774e101b70e79264c9b65756bc0 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Thu, 5 Dec 2019 15:16:24 +0300 Subject: [PATCH] ui: better paddings for DarculaCheckBoxUI GitOrigin-RevId: ddcc457e116b7444b6dfb4ee63b32a3d24e70b5c --- .../ui/laf/darcula/ui/DarculaCheckBoxUI.java | 65 +++++++++++++++++-- .../laf/darcula/ui/DarculaRadioButtonUI.java | 12 ++-- .../laf/win10/WinIntelliJCheckBoxUI.java | 4 +- .../laf/win10/WinIntelliJRadioButtonUI.java | 4 +- 4 files changed, 69 insertions(+), 16 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaCheckBoxUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaCheckBoxUI.java index d620097e0759..146d33feaa10 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaCheckBoxUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaCheckBoxUI.java @@ -6,6 +6,7 @@ import com.intellij.ide.ui.laf.darcula.DarculaUIUtil; import com.intellij.ui.ComponentUtil; import com.intellij.ui.scale.JBUIScale; import com.intellij.util.ui.*; +import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.plaf.ComponentUI; @@ -154,7 +155,8 @@ public class DarculaCheckBoxUI extends MetalCheckBoxUI { @Override public Dimension getPreferredSize(JComponent c) { - return updatePreferredSize(c, super.getPreferredSize(c)); + Dimension dimension = computeOurPreferredSize(c); + return dimension != null ? dimension : super.getPreferredSize(c); } @Override @@ -162,11 +164,64 @@ public class DarculaCheckBoxUI extends MetalCheckBoxUI { return getPreferredSize(c); } - protected Dimension updatePreferredSize(JComponent c, Dimension size) { - if (c.getBorder() instanceof DarculaCheckBoxBorder) { - JBInsets.removeFrom(size, c.getInsets()); + protected Dimension computeOurPreferredSize(JComponent c) { + return computeCheckboxPreferredSize(c, getDefaultIcon()); + } + + /** + * @See {@link javax.swing.plaf.basic.BasicRadioButtonUI#getPreferredSize} + * The difference is that we do not include `DarculaCheckBoxBorder` insets to the icon size. + */ + @Nullable + static Dimension computeCheckboxPreferredSize(JComponent c, Icon defaultIcon) { + if (c.getComponentCount() > 0) { + return null; } - return size; + + AbstractButton b = (AbstractButton)c; + Rectangle prefViewRect = new Rectangle(); + Rectangle prefIconRect = new Rectangle(); + Rectangle prefTextRect = new Rectangle(); + + String text = b.getText(); + + Icon buttonIcon = b.getIcon(); + if (buttonIcon == null) { + buttonIcon = defaultIcon; + } + + Font font = b.getFont(); + FontMetrics fm = b.getFontMetrics(font); + + prefViewRect.x = prefViewRect.y = 0; + prefViewRect.width = Short.MAX_VALUE; + prefViewRect.height = Short.MAX_VALUE; + prefIconRect.x = prefIconRect.y = prefIconRect.width = prefIconRect.height = 0; + prefTextRect.x = prefTextRect.y = prefTextRect.width = prefTextRect.height = 0; + + SwingUtilities.layoutCompoundLabel( + c, fm, text, buttonIcon, + b.getVerticalAlignment(), b.getHorizontalAlignment(), + b.getVerticalTextPosition(), b.getHorizontalTextPosition(), + prefViewRect, prefIconRect, prefTextRect, + text == null ? 0 : b.getIconTextGap()); + + Insets insets = b.getInsets(); + if (!(b.getBorder() instanceof DarculaCheckBoxBorder)) { + JBInsets.addTo(prefIconRect, insets); + } + JBInsets.addTo(prefTextRect, insets); + + // find the union of the icon and text rects (from Rectangle.java) + int x1 = Math.min(prefIconRect.x, prefTextRect.x); + int x2 = Math.max(prefIconRect.x + prefIconRect.width, + prefTextRect.x + prefTextRect.width); + int y1 = Math.min(prefIconRect.y, prefTextRect.y); + int y2 = Math.max(prefIconRect.y + prefIconRect.height, + prefTextRect.y + prefTextRect.height); + int width = x2 - x1; + int height = y2 - y1; + return new Dimension(width, height); } @Override diff --git a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaRadioButtonUI.java b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaRadioButtonUI.java index e282e0b8d7b3..e1e1e0b8c1af 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaRadioButtonUI.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/laf/darcula/ui/DarculaRadioButtonUI.java @@ -1,8 +1,8 @@ // Copyright 2000-2019 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.ui.scale.JBUIScale; import com.intellij.ide.ui.laf.darcula.DarculaLaf; +import com.intellij.ui.scale.JBUIScale; import com.intellij.util.ui.*; import javax.swing.*; @@ -121,7 +121,8 @@ public class DarculaRadioButtonUI extends MetalRadioButtonUI { @Override public Dimension getPreferredSize(JComponent c) { - return updatePreferredSize(c, super.getPreferredSize(c)); + Dimension dimension = computeOurPreferredSize(c); + return dimension != null ? dimension : super.getPreferredSize(c); } @Override @@ -129,11 +130,8 @@ public class DarculaRadioButtonUI extends MetalRadioButtonUI { return getPreferredSize(c); } - protected Dimension updatePreferredSize(JComponent c, Dimension size) { - if (c.getBorder() instanceof DarculaRadioButtonBorder) { - JBInsets.removeFrom(size, c.getInsets()); - } - return size; + protected Dimension computeOurPreferredSize(JComponent c) { + return DarculaCheckBoxUI.computeCheckboxPreferredSize(c, getDefaultIcon()); } @Override diff --git a/plugins/laf/win10/src/com/intellij/laf/win10/WinIntelliJCheckBoxUI.java b/plugins/laf/win10/src/com/intellij/laf/win10/WinIntelliJCheckBoxUI.java index 04028f8977a6..0270fa0943b4 100644 --- a/plugins/laf/win10/src/com/intellij/laf/win10/WinIntelliJCheckBoxUI.java +++ b/plugins/laf/win10/src/com/intellij/laf/win10/WinIntelliJCheckBoxUI.java @@ -32,8 +32,8 @@ public class WinIntelliJCheckBoxUI extends DarculaCheckBoxUI { } @Override - protected Dimension updatePreferredSize(JComponent c, Dimension size) { - return size; + protected Dimension computeOurPreferredSize(JComponent c) { + return null; } @Override diff --git a/plugins/laf/win10/src/com/intellij/laf/win10/WinIntelliJRadioButtonUI.java b/plugins/laf/win10/src/com/intellij/laf/win10/WinIntelliJRadioButtonUI.java index 21f12bbf8956..1a9b7d4b00d5 100644 --- a/plugins/laf/win10/src/com/intellij/laf/win10/WinIntelliJRadioButtonUI.java +++ b/plugins/laf/win10/src/com/intellij/laf/win10/WinIntelliJRadioButtonUI.java @@ -23,8 +23,8 @@ public class WinIntelliJRadioButtonUI extends DarculaRadioButtonUI { } @Override - protected Dimension updatePreferredSize(JComponent c, Dimension size) { - return size; + protected Dimension computeOurPreferredSize(JComponent c) { + return null; } @SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"})