WEB-68184 Use coroutines in EditorFloatingToolbar#addFloatingToolbarComponent: run provider.isApplicable on bg

provider.isApplicable could cause long operation on EDT, with these changes it doesn't
Also e.g. in ScriptConfigurationFloatingToolbarProvider#isApplicable -> ReloadScriptConfigurationKt#getProjectKtFile -> PsiDocumentManager#getPsiFile: @RequiresBackgroundThread

Merge-request: IJ-MR-173654
Merged-by: Arsenii Iusufov <arsenii.iusufov@jetbrains.com>

GitOrigin-RevId: 0e3b31d0f733299ce9e59130079f40cc5695975e
This commit is contained in:
Arsenii Iusufov
2025-08-29 14:34:02 +00:00
committed by intellij-monorepo-bot
parent fbe73a428f
commit aacbe72d76
@@ -2,6 +2,9 @@
package com.intellij.openapi.editor.toolbar.floating
import com.intellij.openapi.Disposable
import com.intellij.openapi.application.UI
import com.intellij.openapi.application.UiWithModelAccess
import com.intellij.openapi.application.readAction
import com.intellij.openapi.editor.event.EditorMouseEvent
import com.intellij.openapi.editor.event.EditorMouseMotionListener
import com.intellij.openapi.editor.impl.EditorImpl
@@ -10,8 +13,13 @@ import com.intellij.openapi.extensions.PluginDescriptor
import com.intellij.openapi.extensions.createExtensionDisposable
import com.intellij.openapi.observable.util.addComponent
import com.intellij.openapi.observable.util.whenKeyPressed
import com.intellij.openapi.rd.createLifetime
import com.intellij.openapi.ui.isComponentUnderMouse
import com.intellij.openapi.ui.isFocusAncestor
import com.jetbrains.rd.util.threading.coroutines.launch
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ensureActive
import kotlinx.coroutines.withContext
import java.awt.FlowLayout
import java.awt.Point
import java.awt.Rectangle
@@ -36,12 +44,33 @@ class EditorFloatingToolbar(editor: EditorImpl) : JPanel() {
}, editor.disposable)
}
private fun addFloatingToolbarComponent(editor: EditorImpl, provider: FloatingToolbarProvider) {
if (provider.isApplicable(editor.dataContext)) {
val disposable = FloatingToolbarProvider.EP_NAME.createExtensionDisposable(provider, editor.disposable)
val component = EditorFloatingToolbarComponent(editor, provider, disposable)
addComponent(component, disposable)
provider.register(editor.dataContext, component, disposable)
private fun addFloatingToolbarComponent(
editor: EditorImpl,
provider: FloatingToolbarProvider,
) {
editor.disposable.createLifetime().launch {
val dataContext = withContext(Dispatchers.UiWithModelAccess) {
editor.dataContext
}
val providerApplicable = readAction {
provider.isApplicable(dataContext)
}
if (providerApplicable) {
withContext(Dispatchers.UiWithModelAccess) {
coroutineContext.ensureActive()
val disposable = FloatingToolbarProvider.EP_NAME.createExtensionDisposable(
extension = provider,
parentDisposable = editor.disposable,
)
val component = EditorFloatingToolbarComponent(
editor = editor,
provider = provider,
parentDisposable = disposable,
)
addComponent(component, disposable)
provider.register(dataContext, component, disposable)
}
}
}
}