From 4e3ba12bfb0fa04cd8efd7d732892218637eaa33 Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Thu, 10 Mar 2016 20:29:59 +0300 Subject: [PATCH] Improve performance of AppearanceConfigurable loading: load and initialize list of fonts in the background if possible --- .../src/com/intellij/ui/FontComboBox.java | 48 +++++++++++++++---- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/ui/FontComboBox.java b/platform/platform-impl/src/com/intellij/ui/FontComboBox.java index 3bf552f6b275..e5c20fdf389f 100644 --- a/platform/platform-impl/src/com/intellij/ui/FontComboBox.java +++ b/platform/platform-impl/src/com/intellij/ui/FontComboBox.java @@ -15,10 +15,13 @@ */ package com.intellij.ui; +import com.intellij.openapi.application.Application; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.ui.ComboBox; import com.intellij.util.ui.FontInfo; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; @@ -47,9 +50,7 @@ public final class FontComboBox extends ComboBox { public void setMonospacedOnly(boolean monospaced) { if (myModel.myMonospacedOnly != monospaced) { myModel.myMonospacedOnly = monospaced; - Object item = myModel.getSelectedItem(); - myModel.setSelectedItem(null); - myModel.setSelectedItem(item); + myModel.updateSelectedItem(); } } @@ -74,19 +75,48 @@ public final class FontComboBox extends ComboBox { } private static final class Model extends AbstractListModel implements ComboBoxModel { - private final List myAllFonts; - private final List myMonoFonts; + private volatile List myAllFonts = Collections.emptyList(); + private volatile List myMonoFonts = Collections.emptyList(); private boolean myMonospacedOnly; private Object mySelectedItem; private Model(boolean withAllStyles) { - myAllFonts = FontInfo.getAll(withAllStyles); - myMonoFonts = new ArrayList(); - for (FontInfo info : myAllFonts) { + Application application = ApplicationManager.getApplication(); + if (application == null || application.isUnitTestMode()) { + setFonts(FontInfo.getAll(withAllStyles)); + } + else { + application.executeOnPooledThread(new Runnable() { + @Override + public void run() { + List allFonts = FontInfo.getAll(withAllStyles); + application.invokeLater(new Runnable() { + @Override + public void run() { + setFonts(allFonts); + updateSelectedItem(); + } + }, application.getAnyModalityState()); + } + }); + } + } + + private void setFonts(List allFonts) { + List monoFonts = new ArrayList<>(); + for (FontInfo info : allFonts) { if (info.isMonospaced()) { - myMonoFonts.add(info); + monoFonts.add(info); } } + myAllFonts = allFonts; + myMonoFonts = monoFonts; + } + + private void updateSelectedItem() { + Object item = getSelectedItem(); + setSelectedItem(null); + setSelectedItem(item); } @Override