e04d7da3289fec1ddce6cce82e2678956d462fa9
[idea/community.git] / platform / editor-ui-api / src / com / intellij / openapi / editor / colors / FontPreferences.java
1 /*
2  * Copyright 2000-2017 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.editor.colors;
17
18 import com.intellij.openapi.options.FontSize;
19 import com.intellij.openapi.util.SystemInfo;
20 import org.jetbrains.annotations.NonNls;
21 import org.jetbrains.annotations.NotNull;
22 import org.jetbrains.annotations.Nullable;
23
24 import java.awt.*;
25 import java.util.Collections;
26 import java.util.List;
27
28 public class FontPreferences {
29   public final static @NonNls @NotNull String DEFAULT_FONT_NAME = getDefaultFontName();
30   public final static int DEFAULT_FONT_SIZE = FontSize.SMALL.getSize();
31
32   public final static float DEFAULT_LINE_SPACING = 1.0f;
33   public final static String FALLBACK_FONT_FAMILY         = "Monospaced";
34   public final static String MAC_OS_DEFAULT_FONT_FAMILY   = "Menlo";
35   public final static String LINUX_DEFAULT_FONT_FAMILY    = "DejaVu Sans Mono";
36   public final static String WINDOWS_DEFAULT_FONT_FAMILY  = FALLBACK_FONT_FAMILY;
37
38   @NotNull
39   public List<String> getEffectiveFontFamilies() {
40     return Collections.emptyList();
41   }
42
43   @NotNull
44   public List<String> getRealFontFamilies() {
45     return Collections.emptyList();
46   }
47
48   @NotNull
49   public String getFontFamily() {
50     return FALLBACK_FONT_FAMILY;
51   }
52
53   public int getSize(@NotNull String fontFamily) {
54     return DEFAULT_FONT_SIZE;
55   }
56
57   public void copyTo(@NotNull FontPreferences preferences) {
58   }
59
60   public boolean useLigatures() {
61     return false;
62   }
63
64   public boolean hasSize(@NotNull String fontName) {
65     return false;
66   }
67
68   public float getLineSpacing() {
69     return DEFAULT_LINE_SPACING;
70   }
71
72   /**
73    * There is a possible case that particular font family is not available at particular environment (e.g. Monaco under *nix).
74    * However, java environment tries to mask that via 'Dialog' fonts, i.e. when we try to create font like
75    * {@code new Font("Monaco", style, size)}, it creates a font object which has font family "Monaco" but is a "Dialog" font.
76    * <p/>
77    * That's why we have a special check for such a situation.
78    *
79    * @param fontName        font family name to check
80    * @param fontSize        target font size
81    * @param fallbackScheme  colors scheme to use for fallback fonts retrieval (if necessary);
82    * @return                fallback font family to use if font family with the given name is not registered at current environment;
83    *                        <code>null</code> if font family with the given name is registered at the current environment
84    */
85   @Nullable
86   public static String getFallbackName(@NotNull String fontName, int fontSize, @Nullable EditorColorsScheme fallbackScheme) {
87     Font plainFont = new Font(fontName, Font.PLAIN, fontSize);
88     if (plainFont.getFamily().equals("Dialog") && !("Dialog".equals(fontName) || fontName.startsWith("Dialog."))) {
89       return fallbackScheme == null ? DEFAULT_FONT_NAME : fallbackScheme.getEditorFontName();
90     }
91     return null;
92   }
93
94   public static String getDefaultFontName() {
95     if (SystemInfo.isWindows) return WINDOWS_DEFAULT_FONT_FAMILY;
96     if (SystemInfo.isMacOSSnowLeopard) return MAC_OS_DEFAULT_FONT_FAMILY;
97     if (SystemInfo.isXWindow && !GraphicsEnvironment.isHeadless()) {
98       for (Font font : GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts()) {
99         if (LINUX_DEFAULT_FONT_FAMILY.equals(font.getName())) {
100           return font.getFontName();
101         }
102       }
103     }
104     return FALLBACK_FONT_FAMILY;
105   }
106 }