diff --git a/java/java-impl/src/com/intellij/ide/util/FQNameCellRenderer.java b/java/java-impl/src/com/intellij/ide/util/FQNameCellRenderer.java index 7057b01edcd8..1a269212a0d2 100644 --- a/java/java-impl/src/com/intellij/ide/util/FQNameCellRenderer.java +++ b/java/java-impl/src/com/intellij/ide/util/FQNameCellRenderer.java @@ -5,6 +5,7 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorFontType; import com.intellij.psi.PsiClass; import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleTextAttributes; @@ -18,7 +19,7 @@ public class FQNameCellRenderer extends SimpleColoredComponent implements ListCe public FQNameCellRenderer() { EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme(); - FONT = new Font(scheme.getEditorFontName(), Font.PLAIN, scheme.getEditorFontSize()); + FONT = scheme.getFont(EditorFontType.PLAIN); setOpaque(true); } diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorFontType.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorFontType.java index f0a2ed15b4aa..d72137c333c7 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorFontType.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/colors/EditorFontType.java @@ -1,6 +1,7 @@ // Copyright 2000-2021 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.openapi.editor.colors; +import org.intellij.lang.annotations.JdkConstants; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,4 +41,17 @@ public enum EditorFontType { public @NotNull Font getGlobalFont() { return EditorColorsManager.getInstance().getGlobalScheme().getFont(this); } + + public static @NotNull EditorFontType forJavaStyle(@JdkConstants.FontStyle int style) { + switch (style) { + case Font.BOLD: + return BOLD; + case Font.ITALIC: + return ITALIC; + case Font.BOLD | Font.ITALIC : + return BOLD_ITALIC; + default: + return PLAIN; + } + } } diff --git a/platform/lang-impl/src/com/intellij/refactoring/suggested/ChangeSignaturePopup.kt b/platform/lang-impl/src/com/intellij/refactoring/suggested/ChangeSignaturePopup.kt index 6ab9fd6cc7a9..bca02a096261 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/suggested/ChangeSignaturePopup.kt +++ b/platform/lang-impl/src/com/intellij/refactoring/suggested/ChangeSignaturePopup.kt @@ -9,6 +9,7 @@ import com.intellij.openapi.Disposable import com.intellij.openapi.editor.Document import com.intellij.openapi.editor.colors.EditorColorsManager import com.intellij.openapi.editor.colors.EditorColorsScheme +import com.intellij.openapi.editor.colors.EditorFontType import com.intellij.openapi.editor.ex.EditorEx import com.intellij.openapi.project.Project import com.intellij.openapi.ui.ComponentValidator @@ -47,7 +48,7 @@ internal class ChangeSignaturePopup( @Nls private val nextButtonText = RefactoringBundle.message("suggested.refactoring.next.button.text") - private val editorFont = Font(colorsScheme.editorFontName, Font.PLAIN, colorsScheme.editorFontSize) + private val editorFont = colorsScheme.getFont(EditorFontType.PLAIN) private val signatureChangePage = SignatureChangesPage(signatureChangeModel, editorFont, screenSize, nameOfStuffToUpdate) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java index 04e65e902c38..8eb5291bf748 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java @@ -20,6 +20,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorFontType; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.event.DocumentListener; import com.intellij.openapi.editor.event.SelectionEvent; @@ -859,14 +860,17 @@ public final class EditorUtil { */ public static Font getEditorFont() { EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme(); - int size = UISettings.getInstance().getPresentationMode() - ? UISettings.getInstance().getPresentationModeFontSize() - 4 : scheme.getEditorFontSize(); - return UIUtil.getFontWithFallback(scheme.getEditorFontName(), Font.PLAIN, size); + Font editorFont = scheme.getFont(EditorFontType.PLAIN); + if (UISettings.getInstance().getPresentationMode()) { + editorFont = editorFont.deriveFont(UISettings.getInstance().getPresentationModeFontSize() - 4f); + } + return UIUtil.getFontWithFallback(editorFont); } public static Font getEditorFont(int size) { EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme(); - return UIUtil.getFontWithFallback(scheme.getEditorFontName(), Font.PLAIN, size); + Font font = scheme.getFont(EditorFontType.PLAIN).deriveFont((float)size); + return UIUtil.getFontWithFallback(font); } public static int getDefaultCaretWidth() { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFragmentRenderer.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFragmentRenderer.java index 746b4d3a6504..2d358e8f81cf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFragmentRenderer.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFragmentRenderer.java @@ -7,6 +7,7 @@ import com.intellij.codeInsight.hint.HintManagerImpl; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.colors.EditorColors; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorFontType; import com.intellij.openapi.editor.ex.EditorGutterComponentEx; import com.intellij.openapi.editor.ex.RangeHighlighterEx; import com.intellij.openapi.editor.ex.util.EditorUIUtil; @@ -240,7 +241,7 @@ class EditorFragmentRenderer { int h = lineHeight - 2; EditorColorsScheme colorsScheme = myEditor.getColorsScheme(); - Font font = UIUtil.getFontWithFallback(colorsScheme.getEditorFontName(), Font.PLAIN, colorsScheme.getEditorFontSize()); + Font font = UIUtil.getFontWithFallback(colorsScheme.getFont(EditorFontType.PLAIN)); g2d.setFont(font.deriveFont(font.getSize() * .8F)); for (RangeHighlighterEx ex : myHighlighters) { diff --git a/platform/util/ui/src/com/intellij/util/ui/UIUtil.java b/platform/util/ui/src/com/intellij/util/ui/UIUtil.java index b64c1a45cd63..ff5b853fdf76 100644 --- a/platform/util/ui/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/ui/src/com/intellij/util/ui/UIUtil.java @@ -2004,7 +2004,19 @@ public final class UIUtil { } public static @NotNull FontUIResource getFontWithFallback(@NotNull Font font) { - return getFontWithFallback(font.getFamily(), font.getStyle(), font.getSize()); + // On macOS font fallback is implemented in JDK by default + // (except for explicitly registered fonts, e.g. the fonts we bundle with IDE, for them we don't have a solution now) + if (!SystemInfo.isMac) { + try { + font = FontUtilitiesAccessor.createFontWithFallback(font); + } + catch (Throwable e) { + getLogger().warn(e); + // this might not give the same result, but if accessing FontUtilities via reflection failed, we have no choice + return getFontWithFallback(font.getFamily(), font.getStyle(), font.getSize()); + } + } + return font instanceof FontUIResource ? (FontUIResource)font : new FontUIResource(font); } public static @NotNull FontUIResource getFontWithFallback(@Nullable String familyName, @JdkConstants.FontStyle int style, int size) { @@ -3465,4 +3477,33 @@ public final class UIUtil { } return Math.min(result, 255); } + + private static class FontUtilitiesAccessor { + private static final Method fontSupportsDefaultEncodingMethod; + private static final Method getCompositeFontUIResourceMethod; + + static { + Method m1 = null; + Method m2 = null; + try { + Class c = Class.forName("sun.font.FontUtilities"); + m1 = c.getDeclaredMethod("fontSupportsDefaultEncoding", Font.class); + m2 = c.getDeclaredMethod("getCompositeFontUIResource", Font.class); + } + catch (Throwable e) { + getLogger().warn(e); + } + fontSupportsDefaultEncodingMethod = m1; + getCompositeFontUIResourceMethod = m2; + } + + private static Font createFontWithFallback(Font font) throws Exception { + if (fontSupportsDefaultEncodingMethod == null || + getCompositeFontUIResourceMethod == null || + Boolean.TRUE.equals(fontSupportsDefaultEncodingMethod.invoke(null, font))) { + return font; + } + return (Font)getCompositeFontUIResourceMethod.invoke(null, font); + } + } } \ No newline at end of file diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/inline/InlineDebugRenderer.java b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/inline/InlineDebugRenderer.java index c3aa5329e075..14c54c479dd0 100644 --- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/inline/InlineDebugRenderer.java +++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/inline/InlineDebugRenderer.java @@ -8,6 +8,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorCustomElementRenderer; import com.intellij.openapi.editor.Inlay; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorFontType; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.event.EditorMouseEvent; import com.intellij.openapi.editor.ex.EditorEx; @@ -99,7 +100,7 @@ public final class InlineDebugRenderer implements EditorCustomElementRenderer { EditorColorsScheme colorsScheme = editor.getColorsScheme(); TextAttributes attributes = editor.getColorsScheme().getAttributes(DebuggerColors.INLINED_VALUES_EXECUTION_LINE); int fontStyle = attributes == null ? Font.PLAIN : attributes.getFontType(); - return UIUtil.getFontWithFallback(colorsScheme.getEditorFontName(), fontStyle, colorsScheme.getEditorFontSize()); + return UIUtil.getFontWithFallback(colorsScheme.getFont(EditorFontType.forJavaStyle(fontStyle))); } diff --git a/python/src/com/jetbrains/python/codeInsight/imports/PyImportChooser.java b/python/src/com/jetbrains/python/codeInsight/imports/PyImportChooser.java index c0f5ecf45986..911f4873c8f6 100644 --- a/python/src/com/jetbrains/python/codeInsight/imports/PyImportChooser.java +++ b/python/src/com/jetbrains/python/codeInsight/imports/PyImportChooser.java @@ -5,6 +5,7 @@ import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorFontType; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.psi.PsiElement; import com.intellij.ui.SimpleColoredComponent; @@ -46,7 +47,7 @@ public class PyImportChooser implements ImportChooser { CellRenderer() { EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme(); - FONT = new Font(scheme.getEditorFontName(), Font.PLAIN, scheme.getEditorFontSize()); + FONT = scheme.getFont(EditorFontType.PLAIN); setOpaque(true); } diff --git a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlNSRenderer.java b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlNSRenderer.java index 8efadf70ce72..cb1a9ad89475 100644 --- a/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlNSRenderer.java +++ b/xml/impl/src/com/intellij/codeInsight/daemon/impl/analysis/XmlNSRenderer.java @@ -18,6 +18,7 @@ package com.intellij.codeInsight.daemon.impl.analysis; import com.intellij.icons.AllIcons; import com.intellij.openapi.editor.colors.EditorColorsManager; import com.intellij.openapi.editor.colors.EditorColorsScheme; +import com.intellij.openapi.editor.colors.EditorFontType; import com.intellij.openapi.util.NlsSafe; import com.intellij.ui.ColoredListCellRenderer; import com.intellij.ui.SimpleTextAttributes; @@ -35,7 +36,7 @@ public class XmlNSRenderer extends ColoredListCellRenderer { public XmlNSRenderer() { EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme(); - setFont(new Font(scheme.getEditorFontName(), Font.PLAIN, scheme.getEditorFontSize())); + setFont(scheme.getFont(EditorFontType.PLAIN)); } @Override