From 15955db1b2000f30d84e5144a21e9ff65622c1d6 Mon Sep 17 00:00:00 2001 From: Denis Fokin Date: Fri, 2 Oct 2015 15:54:02 +0300 Subject: [PATCH] 1. Propagate antialiasing settings to more Swing components 2. Use default aa contrast value or system value for non-mac platforms --- .../com/intellij/ide/ui/AntialiasingType.java | 23 +++++++++++-------- .../src/com/intellij/ide/ui/UISettings.java | 4 +++- .../lookup/impl/LookupCellRenderer.java | 2 +- .../ExpandedItemListCellRendererWrapper.java | 3 +++ .../intellij/ui/SimpleColoredComponent.java | 2 +- .../JBComboBoxTableCellEditorComponent.java | 3 +++ .../com/intellij/ui/tabs/impl/TabLabel.java | 5 ---- .../ide/ui/AppearanceConfigurable.java | 11 +++++++-- .../ui/impl/DialogWrapperPeerImpl.java | 7 +++++- .../util/src/com/intellij/util/ui/UIUtil.java | 13 ++++++++++- 10 files changed, 51 insertions(+), 22 deletions(-) diff --git a/platform/editor-ui-api/src/com/intellij/ide/ui/AntialiasingType.java b/platform/editor-ui-api/src/com/intellij/ide/ui/AntialiasingType.java index 4cc37b39ea59..227e1fb17350 100644 --- a/platform/editor-ui-api/src/com/intellij/ide/ui/AntialiasingType.java +++ b/platform/editor-ui-api/src/com/intellij/ide/ui/AntialiasingType.java @@ -15,6 +15,7 @@ */ package com.intellij.ide.ui; +import com.intellij.util.ui.UIUtil; import sun.swing.SwingUtilities2; import java.awt.*; @@ -24,29 +25,31 @@ public enum AntialiasingType { GREYSCALE, OFF; - private static final SwingUtilities2.AATextInfo aaEnabled = - new SwingUtilities2.AATextInfo(RenderingHints.VALUE_TEXT_ANTIALIAS_ON, 140); - - private static final SwingUtilities2.AATextInfo lcdEnabled = - new SwingUtilities2.AATextInfo(RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB, 140); - private static final SwingUtilities2.AATextInfo aaDisabled = null; + private static SwingUtilities2.AATextInfo getLCDEnabledTextInfo () { + return new SwingUtilities2.AATextInfo(RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB, UIUtil.getLcdContrastValue()); + } + + private static SwingUtilities2.AATextInfo getAAEnabledTextInfo () { + return new SwingUtilities2.AATextInfo(RenderingHints.VALUE_TEXT_ANTIALIAS_ON, UIUtil.getLcdContrastValue()); + } + public static Object getAAHintForSwingComponent() { UISettings uiSettings = UISettings.getInstance(); - if (uiSettings == null) return aaEnabled; + if (uiSettings == null) return getAAEnabledTextInfo(); switch (uiSettings.IDE_AA_TYPE) { case SUBPIXEL: - return lcdEnabled; + return getLCDEnabledTextInfo(); case GREYSCALE: - return aaEnabled; + return getAAEnabledTextInfo(); case OFF: return aaDisabled; } - return aaEnabled; + return getAAEnabledTextInfo(); } public Object getRenderingHintValue () { diff --git a/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java b/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java index 5f0fb7766179..79b277ce1b7b 100644 --- a/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java +++ b/platform/editor-ui-api/src/com/intellij/ide/ui/UISettings.java @@ -281,6 +281,9 @@ public class UISettings extends SimpleModificationTracker implements PersistentS */ public static void setupAntialiasing(final Graphics g) { + Graphics2D g2d = (Graphics2D)g; + g2d.setRenderingHint(RenderingHints.KEY_TEXT_LCD_CONTRAST, UIUtil.getLcdContrastValue()); + Application application = ApplicationManager.getApplication(); if (application == null) { // We cannot use services while Aplication has not been loaded yet @@ -289,7 +292,6 @@ public class UISettings extends SimpleModificationTracker implements PersistentS return; } - Graphics2D g2d = (Graphics2D)g; UISettings uiSettings = getInstance(); if (uiSettings != null) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java index 863c718a78c6..e3cf89da17ce 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/lookup/impl/LookupCellRenderer.java @@ -468,7 +468,7 @@ public class LookupCellRenderer implements ListCellRenderer { @Override protected void applyAdditionalHints(@NotNull Graphics2D g) { - GraphicsUtil.setupAntialiasing(g); + super.applyAdditionalHints(g); } } diff --git a/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java b/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java index ce32d367fc68..1dfd31c825b8 100644 --- a/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java +++ b/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java @@ -15,9 +15,11 @@ */ package com.intellij.ui; +import com.intellij.ide.ui.AntialiasingType; import com.intellij.util.ObjectUtils; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; +import sun.swing.SwingUtilities2; import javax.swing.*; import java.awt.*; @@ -33,6 +35,7 @@ public class ExpandedItemListCellRendererWrapper implements ListCellRenderer { @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + list.putClientProperty(SwingUtilities2.AA_TEXT_PROPERTY_KEY, AntialiasingType.getAAHintForSwingComponent()); Component result = myWrappee.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (!myHandler.getExpandedItems().contains(index)) return result; Rectangle bounds = result.getBounds(); diff --git a/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java b/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java index 1a2587543d99..f1b87678a711 100644 --- a/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java +++ b/platform/platform-api/src/com/intellij/ui/SimpleColoredComponent.java @@ -733,7 +733,6 @@ public class SimpleColoredComponent extends JComponent implements Accessible, Co final List searchMatches = new ArrayList(); - UISettings.setupAntialiasing(g); applyAdditionalHints(g); final Font ownFont = getFont(); if (ownFont != null) { @@ -915,6 +914,7 @@ public class SimpleColoredComponent extends JComponent implements Accessible, Co } protected void applyAdditionalHints(@NotNull Graphics2D g) { + UISettings.setupAntialiasing(g); } @Override diff --git a/platform/platform-api/src/com/intellij/ui/components/editors/JBComboBoxTableCellEditorComponent.java b/platform/platform-api/src/com/intellij/ui/components/editors/JBComboBoxTableCellEditorComponent.java index fe69d4e77ee2..82b49fa96c8a 100644 --- a/platform/platform-api/src/com/intellij/ui/components/editors/JBComboBoxTableCellEditorComponent.java +++ b/platform/platform-api/src/com/intellij/ui/components/editors/JBComboBoxTableCellEditorComponent.java @@ -15,6 +15,7 @@ */ package com.intellij.ui.components.editors; +import com.intellij.ide.ui.AntialiasingType; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupAdapter; import com.intellij.openapi.ui.popup.JBPopupFactory; @@ -31,6 +32,7 @@ import com.intellij.util.Function; import com.intellij.util.PlatformIcons; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.EmptyIcon; +import sun.swing.SwingUtilities2; import javax.swing.*; import javax.swing.event.TableModelEvent; @@ -78,6 +80,7 @@ public class JBComboBoxTableCellEditorComponent extends JBLabel { } else { label.setIcon(getEmptyIcon()); } + label.putClientProperty(SwingUtilities2.AA_TEXT_PROPERTY_KEY, AntialiasingType.getAAHintForSwingComponent()); return label; } diff --git a/platform/platform-api/src/com/intellij/ui/tabs/impl/TabLabel.java b/platform/platform-api/src/com/intellij/ui/tabs/impl/TabLabel.java index 02fc3d28191d..14c188927d76 100644 --- a/platform/platform-api/src/com/intellij/ui/tabs/impl/TabLabel.java +++ b/platform/platform-api/src/com/intellij/ui/tabs/impl/TabLabel.java @@ -149,11 +149,6 @@ public class TabLabel extends JPanel { g.setClip(oldClip); } } - - @Override - protected void applyAdditionalHints(@NotNull Graphics2D g) { - UISettings.setupAntialiasing(g); - } }; label.setOpaque(false); label.setBorder(null); diff --git a/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java b/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java index ec092b3c7e39..950efd89f2cb 100644 --- a/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java +++ b/platform/platform-impl/src/com/intellij/ide/ui/AppearanceConfigurable.java @@ -175,6 +175,11 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab if (!myComponent.myAntialiasingInIDE.getSelectedItem().equals(settings.IDE_AA_TYPE)) { settings.IDE_AA_TYPE = (AntialiasingType)myComponent.myAntialiasingInIDE.getSelectedItem(); + for (Window w : Window.getWindows()) { + for (JComponent c : UIUtil.uiTraverser(w).filter(JComponent.class)) { + c.putClientProperty(SwingUtilities2.AA_TEXT_PROPERTY_KEY, AntialiasingType.getAAHintForSwingComponent()); + } + } shouldUpdateUI = true; } @@ -523,8 +528,10 @@ public class AppearanceConfigurable extends BaseConfigurable implements Searchab } private static class AAListCellRenderer extends ListCellRendererWrapper { - private static final SwingUtilities2.AATextInfo SUBPIXEL_HINT = new SwingUtilities2.AATextInfo(RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB, 140); - private static final SwingUtilities2.AATextInfo GREYSCALE_HINT = new SwingUtilities2.AATextInfo(RenderingHints.VALUE_TEXT_ANTIALIAS_ON, 140); + private static final SwingUtilities2.AATextInfo SUBPIXEL_HINT = new SwingUtilities2.AATextInfo( + RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB, UIUtil.getLcdContrastValue()); + private static final SwingUtilities2.AATextInfo GREYSCALE_HINT = new SwingUtilities2.AATextInfo( + RenderingHints.VALUE_TEXT_ANTIALIAS_ON, UIUtil.getLcdContrastValue()); @Override public void customize(JList list, AntialiasingType value, int index, boolean selected, boolean hasFocus) { diff --git a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java index 727a8b70a91f..9eda882e61f6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/ui/impl/DialogWrapperPeerImpl.java @@ -18,6 +18,7 @@ package com.intellij.openapi.ui.impl; import com.intellij.ide.DataManager; import com.intellij.ide.IdeEventQueue; import com.intellij.ide.impl.TypeSafeDataProviderAdapter; +import com.intellij.ide.ui.AntialiasingType; import com.intellij.ide.ui.UISettings; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.Application; @@ -57,6 +58,7 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import sun.swing.SwingUtilities2; import javax.swing.*; import java.awt.*; @@ -955,12 +957,15 @@ public class DialogWrapperPeerImpl extends DialogWrapperPeer implements FocusTra } @Override - public void windowOpened(WindowEvent e) { + public void windowOpened(final WindowEvent e) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { myOpened = true; final DialogWrapper activeWrapper = getActiveWrapper(); + for (JComponent c : UIUtil.uiTraverser(e.getWindow()).filter(JComponent.class)) { + c.putClientProperty(SwingUtilities2.AA_TEXT_PROPERTY_KEY, AntialiasingType.getAAHintForSwingComponent()); + } if (activeWrapper == null) { myFocusedCallback.setRejected(); myTypeAheadDone.setRejected(); diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index daed73559738..92776e23b813 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -3077,13 +3077,24 @@ public class UIUtil { // Evaluate the value depending on our current theme if (lcdContrastValue == 0) { - lcdContrastValue = UIUtil.isUnderDarcula() ? 100 : 250; + if (SystemInfo.isMacIntel64) { + lcdContrastValue = UIUtil.isUnderDarcula() ? 100 : 250; + } else { + Map map = (Map)Toolkit.getDefaultToolkit().getDesktopProperty("awt.font.desktophints"); + + if (map == null) { + lcdContrastValue = 140; + } else { + lcdContrastValue = ((Integer)map.get(RenderingHints.KEY_TEXT_LCD_CONTRAST)); + } + } } if (lcdContrastValue < 100 || lcdContrastValue > 250) { // the default value lcdContrastValue = 140; } + return lcdContrastValue; }