diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsTabSearchResultPanel.kt b/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsTabSearchResultPanel.kt index ea3e55b6e251..aa0460ffae9b 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsTabSearchResultPanel.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/InstalledPluginsTabSearchResultPanel.kt @@ -192,13 +192,11 @@ internal class InstalledPluginsTabSearchResultPanel( coroutineScope.launch { PluginModelAsyncOperationsExecutor.loadUpdates().let { updates -> if (!ContainerUtil.isEmpty(updates)) { - myPostFillGroupCallback = Runnable { + withContext(Dispatchers.EDT + ModalityState.any().asContextElement()) { PluginManagerConfigurablePanel.applyUpdates(myPanel, updates) mySelectionListener.accept(myInstalledPanelSupplier.get()) mySelectionListener.accept(panel) - } - withContext(Dispatchers.EDT + ModalityState.any().asContextElement()) { - updatePanel() + fullRepaint() } } } diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/MarketplacePluginsTabSearchResultPanel.kt b/platform/platform-impl/src/com/intellij/ide/plugins/MarketplacePluginsTabSearchResultPanel.kt index 228b0dfc1b57..2b7e69236144 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/MarketplacePluginsTabSearchResultPanel.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/MarketplacePluginsTabSearchResultPanel.kt @@ -23,7 +23,9 @@ import com.intellij.ide.plugins.newui.getPluginsViewCustomizer import com.intellij.openapi.actionSystem.ActionManager import com.intellij.openapi.actionSystem.DefaultActionGroup import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.application.EDT import com.intellij.openapi.application.ModalityState +import com.intellij.openapi.application.asContextElement import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.DumbAwareAction import com.intellij.openapi.project.Project @@ -35,6 +37,9 @@ import com.intellij.ui.scale.JBUIScale.scale import com.intellij.util.containers.ContainerUtil import com.intellij.util.ui.StatusText import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.jetbrains.annotations.ApiStatus import java.awt.Component import java.awt.Graphics @@ -174,15 +179,23 @@ internal class MarketplacePluginsTabSearchResultPanel( } else { PluginModelAsyncOperationsExecutor - .performMarketplaceSearch( - parser.urlQuery, - !result.getModels().isEmpty() - ).let { (searchResult, updates) -> + .performMarketplaceSearch(parser.urlQuery).let { searchResult -> applySearchResult( - result, searchResult, updates, customRepositoriesMap, + result, searchResult, customRepositoriesMap, parser, searchIndex ) updatePanel() + coroutineScope.launch(Dispatchers.IO) { + val updates = PluginModelAsyncOperationsExecutor.loadUpdates() + if (updates.isNotEmpty()) { + withContext(Dispatchers.EDT + ModalityState.any().asContextElement()) { + PluginManagerConfigurablePanel.applyUpdates(myPanel, updates) + mySelectionListener.accept(myMarketplacePanelSupplier.get()) + mySelectionListener.accept(panel) + fullRepaint() + } + } + } } } } @@ -198,7 +211,6 @@ internal class MarketplacePluginsTabSearchResultPanel( private fun applySearchResult( result: PluginsGroup, searchResult: PluginSearchResult, - updates: List, customRepositoriesMap: Map>, parser: SearchQueryParser.Marketplace, searchIndex: Int, @@ -259,14 +271,6 @@ internal class MarketplacePluginsTabSearchResultPanel( myMarketplaceSortByAction.setText(title) result.addSecondaryAction(myMarketplaceSortByAction) - - if (!ContainerUtil.isEmpty(updates)) { - myPostFillGroupCallback = Runnable { - PluginManagerConfigurablePanel.applyUpdates(myPanel, updates) - mySelectionListener.accept(myMarketplacePanelSupplier.get()) - mySelectionListener.accept(panel) - } - } } val ids = result.getModels().mapTo(LinkedHashSet()) { it.pluginId } result.getPreloadedModel().setInstalledPlugins(getInstance().findInstalledPluginsSync(ids)) diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/newui/PluginModelAsyncOperationsExecutor.kt b/platform/platform-impl/src/com/intellij/ide/plugins/newui/PluginModelAsyncOperationsExecutor.kt index 629655a1d7a7..9d237bfcbaa3 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/newui/PluginModelAsyncOperationsExecutor.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/newui/PluginModelAsyncOperationsExecutor.kt @@ -45,16 +45,10 @@ internal object PluginModelAsyncOperationsExecutor { suspend fun performMarketplaceSearch( query: String, - loadUpdates: Boolean, - ): Pair> { + ): PluginSearchResult { return withContext(Dispatchers.IO) { val pluginManager = UiPluginManager.getInstance() - val result = pluginManager.executeMarketplaceQuery(query, 10000, true) - val updates = mutableListOf() - if (loadUpdates) { - updates.addAll(pluginManager.getUpdateModels()) - } - result to updates + pluginManager.executeMarketplaceQuery(query, 10000, true) } } diff --git a/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchResultPanel.kt b/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchResultPanel.kt index 42fe7e9143c1..5cb392479ee9 100644 --- a/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchResultPanel.kt +++ b/platform/platform-impl/src/com/intellij/ide/plugins/newui/SearchResultPanel.kt @@ -5,7 +5,6 @@ import com.intellij.ide.IdeBundle import com.intellij.ide.plugins.PluginsGroupType import com.intellij.ide.plugins.newui.PluginLogo.endBatchMode import com.intellij.ide.plugins.newui.PluginLogo.startBatchMode -import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.EDT import com.intellij.openapi.application.ModalityState import com.intellij.openapi.application.asContextElement @@ -24,7 +23,6 @@ import kotlinx.coroutines.ensureActive import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.jetbrains.annotations.ApiStatus -import java.util.concurrent.atomic.AtomicBoolean import javax.swing.JComponent import javax.swing.JScrollBar import javax.swing.ScrollPaneConstants @@ -45,8 +43,6 @@ abstract class SearchResultPanel( private var isLoading = false private var myAnnounceSearchResultsAlarm: SingleAlarm? = null - @JvmField protected var myPostFillGroupCallback: Runnable? = null - init { myPanel.getAccessibleContext().setAccessibleName(IdeBundle.message("title.search.results")) group = PluginsGroup( @@ -138,20 +134,12 @@ abstract class SearchResultPanel( announceSearchResultsWithDelay() myPanel.initialSelection(false) - runPostFillGroupCallback() fullRepaint() } } protected abstract suspend fun handleQuery(query: String, result: PluginsGroup) - private fun runPostFillGroupCallback() { - if (myPostFillGroupCallback != null) { - myPostFillGroupCallback!!.run() - myPostFillGroupCallback = null - } - } - private fun loading(start: Boolean) { val panel = myPanel if (start) {