diff --git a/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java b/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java index 2d8cfd90f960..96daec48e80d 100644 --- a/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java +++ b/platform/lang-impl/src/com/intellij/application/options/colors/FontOptions.java @@ -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 myFontNamesVector; - private static HashMap myFontNameToIsMonospaced; + private static ArrayList myFontNames; + private static ArrayList myMonospacedFontNames; private final EventDispatcher 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 fontNamesVector = (List)myFontNamesVector.clone(); - HashMap fontNameToIsMonospaced = (HashMap)myFontNameToIsMonospaced.clone(); + ArrayList fontNames = new ArrayList(myFontNames); + ArrayList monospacedFontNames = new ArrayList(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(); - myFontNameToIsMonospaced = new HashMap(); + if (myFontNames == null) { + myFontNames = new ArrayList(); + myMonospacedFontNames = new ArrayList(); 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) { diff --git a/platform/platform-impl/src/com/intellij/application/options/SelectFontDialog.java b/platform/platform-impl/src/com/intellij/application/options/SelectFontDialog.java index ec6e723dde3c..1d8055a981b8 100644 --- a/platform/platform-impl/src/com/intellij/application/options/SelectFontDialog.java +++ b/platform/platform-impl/src/com/intellij/application/options/SelectFontDialog.java @@ -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 myFontNames; private final String myInitialFontName; - private final HashMap myNameToIsMonospaced; + private final List myMonospacedFontNames; - public SelectFontDialog(Component parent, List fontNames, String initialFontName, HashMap nameToIsMonospaced) { + public SelectFontDialog(Component parent, List fontNames, String initialFontName, List 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(); } diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index 044966a4cbfe..94317160eb17 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -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: