mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-82372 Select Font dialog can't render some OTF fonts
This commit is contained in:
@@ -28,7 +28,7 @@ import com.intellij.openapi.ui.Messages;
|
||||
import com.intellij.ui.DocumentAdapter;
|
||||
import com.intellij.ui.IdeBorderFactory;
|
||||
import com.intellij.util.EventDispatcher;
|
||||
import com.intellij.util.containers.HashMap;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
@@ -37,7 +37,6 @@ import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class FontOptions extends JPanel implements OptionsPanel{
|
||||
@@ -48,8 +47,8 @@ public class FontOptions extends JPanel implements OptionsPanel{
|
||||
private JTextField myLineSpacingField;
|
||||
private JTextField myFontNameField;
|
||||
|
||||
private static ArrayList<String> myFontNamesVector;
|
||||
private static HashMap<String, Boolean> myFontNameToIsMonospaced;
|
||||
private static ArrayList<String> myFontNames;
|
||||
private static ArrayList<String> myMonospacedFontNames;
|
||||
private final EventDispatcher<ColorAndFontSettingsListener> myDispatcher = EventDispatcher.create(ColorAndFontSettingsListener.class);
|
||||
private boolean myIsInSchemeChange = false;
|
||||
private String myTitle;
|
||||
@@ -114,13 +113,13 @@ public class FontOptions extends JPanel implements OptionsPanel{
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public Runnable showOption(final String option) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void applyChangesToScheme() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -241,16 +240,16 @@ public class FontOptions extends JPanel implements OptionsPanel{
|
||||
private void selectFont() {
|
||||
initFontTables();
|
||||
|
||||
List<String> fontNamesVector = (List<String>)myFontNamesVector.clone();
|
||||
HashMap fontNameToIsMonospaced = (HashMap)myFontNameToIsMonospaced.clone();
|
||||
ArrayList<String> fontNames = new ArrayList<String>(myFontNames);
|
||||
ArrayList<String> monospacedFontNames = new ArrayList<String>(myMonospacedFontNames);
|
||||
String initialFontName = myFontNameField.getText();
|
||||
if (!fontNamesVector.contains(EditorSettingsExternalizable.DEFAULT_FONT_NAME)) {
|
||||
fontNamesVector.add(0, EditorSettingsExternalizable.DEFAULT_FONT_NAME);
|
||||
if (!fontNames.contains(EditorSettingsExternalizable.DEFAULT_FONT_NAME)) {
|
||||
fontNames.add(0, EditorSettingsExternalizable.DEFAULT_FONT_NAME);
|
||||
}
|
||||
if (!fontNamesVector.contains(initialFontName)) {
|
||||
fontNamesVector.add(0, initialFontName);
|
||||
if (!fontNames.contains(initialFontName)) {
|
||||
fontNames.add(0, initialFontName);
|
||||
}
|
||||
SelectFontDialog selectFontDialog = new SelectFontDialog(this, fontNamesVector, initialFontName, fontNameToIsMonospaced);
|
||||
SelectFontDialog selectFontDialog = new SelectFontDialog(this, fontNames, initialFontName, monospacedFontNames);
|
||||
selectFontDialog.show();
|
||||
if (!selectFontDialog.isOK()) {
|
||||
return;
|
||||
@@ -265,9 +264,9 @@ public class FontOptions extends JPanel implements OptionsPanel{
|
||||
|
||||
@SuppressWarnings({"AssignmentToStaticFieldFromInstanceMethod"})
|
||||
private void initFontTables() {
|
||||
if (myFontNamesVector == null) {
|
||||
myFontNamesVector = new ArrayList<String>();
|
||||
myFontNameToIsMonospaced = new HashMap<String, Boolean>();
|
||||
if (myFontNames == null) {
|
||||
myFontNames = new ArrayList<String>();
|
||||
myMonospacedFontNames = new ArrayList<String>();
|
||||
|
||||
ProgressManager.getInstance().runProcessWithProgressSynchronously(new InitFontsRunnable(), ApplicationBundle.message("progress.analyzing.fonts"), false, null);
|
||||
}
|
||||
@@ -326,15 +325,25 @@ public class FontOptions extends JPanel implements OptionsPanel{
|
||||
}
|
||||
FontMetrics plainMetrics = getFontMetrics(plainFont);
|
||||
FontMetrics boldMetrics = getFontMetrics(boldFont);
|
||||
myFontNamesVector.add(fontName);
|
||||
if (plainMetrics.getDescent() < 0 ||
|
||||
boldMetrics.getDescent() < 0 ||
|
||||
plainMetrics.getAscent() < 0 ||
|
||||
boldMetrics.getAscent() < 0) {
|
||||
continue;
|
||||
}
|
||||
int plainL = plainMetrics.charWidth('l');
|
||||
int boldL = boldMetrics.charWidth('l');
|
||||
int plainW = plainMetrics.charWidth('W');
|
||||
int boldW = boldMetrics.charWidth('W');
|
||||
int plainSpace = plainMetrics.charWidth(' ');
|
||||
int boldSpace = boldMetrics.charWidth(' ');
|
||||
boolean isMonospaced = plainL == plainW && plainL == boldL && plainW == boldW && plainSpace == boldSpace;
|
||||
myFontNameToIsMonospaced.put(fontName, isMonospaced);
|
||||
if (plainL <= 0 || boldL <= 0 || plainW <= 0 || boldW <= 0 || plainSpace <= 0 || boldSpace <= 0) {
|
||||
continue;
|
||||
}
|
||||
myFontNames.add(fontName);
|
||||
if (plainL == plainW && plainL == boldL && plainW == boldW && plainSpace == boldSpace) {
|
||||
myMonospacedFontNames.add(fontName);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Throwable e) {
|
||||
|
||||
@@ -23,9 +23,10 @@ import com.intellij.ui.ListScrollingUtil;
|
||||
import com.intellij.ui.ListSpeedSearch;
|
||||
import com.intellij.ui.ScrollPaneFactory;
|
||||
import com.intellij.ui.components.JBList;
|
||||
import com.intellij.util.containers.HashMap;
|
||||
|
||||
import javax.swing.*;
|
||||
import javax.swing.event.ListSelectionEvent;
|
||||
import javax.swing.event.ListSelectionListener;
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
@@ -37,11 +38,11 @@ public class SelectFontDialog extends DialogWrapper {
|
||||
private JCheckBox myShowMonospacedCheckbox;
|
||||
private final List<String> myFontNames;
|
||||
private final String myInitialFontName;
|
||||
private final HashMap myNameToIsMonospaced;
|
||||
private final List<String> myMonospacedFontNames;
|
||||
|
||||
public SelectFontDialog(Component parent, List<String> fontNames, String initialFontName, HashMap nameToIsMonospaced) {
|
||||
public SelectFontDialog(Component parent, List<String> fontNames, String initialFontName, List<String> monospacedFontNames) {
|
||||
super(parent, true);
|
||||
myNameToIsMonospaced = nameToIsMonospaced;
|
||||
myMonospacedFontNames = monospacedFontNames;
|
||||
setTitle(ApplicationBundle.message("title.select.font"));
|
||||
myFontNames = fontNames;
|
||||
myInitialFontName = initialFontName;
|
||||
@@ -51,7 +52,6 @@ public class SelectFontDialog extends DialogWrapper {
|
||||
protected JComponent createCenterPanel() {
|
||||
myShowMonospacedCheckbox = new JCheckBox(ApplicationBundle.message("checkbox.show.only.monospaced.fonts"));
|
||||
final boolean useOnlyMonospacedFonts = EditorColorsManager.getInstance().isUseOnlyMonospacedFonts();
|
||||
myShowMonospacedCheckbox.setSelected(useOnlyMonospacedFonts);
|
||||
myFontList = new JBList();
|
||||
new ListSpeedSearch(myFontList);
|
||||
myFontList.setModel(new DefaultListModel());
|
||||
@@ -84,10 +84,11 @@ public class SelectFontDialog extends DialogWrapper {
|
||||
|
||||
panel.add(myShowMonospacedCheckbox, BorderLayout.NORTH);
|
||||
panel.add(ScrollPaneFactory.createScrollPane(myFontList), BorderLayout.CENTER);
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
myShowMonospacedCheckbox.setSelected(useOnlyMonospacedFonts);
|
||||
myShowMonospacedCheckbox.setSelected(useOnlyMonospacedFonts);
|
||||
myFontList.addListSelectionListener(new ListSelectionListener() {
|
||||
@Override
|
||||
public void valueChanged(ListSelectionEvent e) {
|
||||
setOKActionEnabled(myFontList.getSelectedValue() != null);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -97,20 +98,15 @@ public class SelectFontDialog extends DialogWrapper {
|
||||
private void fillList(boolean onlyMonospaced) {
|
||||
DefaultListModel model = (DefaultListModel) myFontList.getModel();
|
||||
model.removeAllElements();
|
||||
for (int i = 0; i < myFontNames.size(); i++) {
|
||||
String fontName = myFontNames.get(i);
|
||||
if (!onlyMonospaced || Boolean.TRUE.equals(myNameToIsMonospaced.get(fontName))) {
|
||||
for (String fontName : myFontNames) {
|
||||
if (!onlyMonospaced || myMonospacedFontNames.contains(fontName)) {
|
||||
model.addElement(fontName);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void show() {
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
public void run() {
|
||||
ListScrollingUtil.selectItem(myFontList, myInitialFontName);
|
||||
}
|
||||
});
|
||||
ListScrollingUtil.selectItem(myFontList, myInitialFontName);
|
||||
super.show();
|
||||
}
|
||||
|
||||
|
||||
@@ -501,7 +501,7 @@ combobox.scheme.name=Scheme name:
|
||||
progress.analyzing.fonts=Analyzing Fonts
|
||||
error.readonly.scheme.cannot.be.modified=Read-only scheme cannot be modified. Please do "Save As..." first.
|
||||
error.shared.scheme.cannot.be.modified=Shared scheme cannot be modified. Please do "Save As..." first.
|
||||
title.cannot.modify.readonly.scheme=Cannot Modify read-only Scheme
|
||||
title.cannot.modify.readonly.scheme=Cannot Modify Read-Only Scheme
|
||||
title.save.color.scheme.as=Save Color Scheme As
|
||||
title.path.variables=Path Variables
|
||||
editbox.path.macro.value=Value:
|
||||
|
||||
Reference in New Issue
Block a user