diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc index ad1e8b0be..db7044d1b 100644 --- a/CHANGELOG.adoc +++ b/CHANGELOG.adoc @@ -11,6 +11,7 @@ This document provides a high-level view of the changes introduced by release. - Fix class cast exception when parsing Antora information (#1422) - Fix regex problem when `idseparator` contains regex special characters (#1423) +- Workaround for EDT error message when reopening a project (#1424) === 0.39.3 diff --git a/src/main/java/org/asciidoc/intellij/ui/SplitTextEditorProvider.java b/src/main/java/org/asciidoc/intellij/ui/SplitTextEditorProvider.java index aa14d9036..aa00970e9 100644 --- a/src/main/java/org/asciidoc/intellij/ui/SplitTextEditorProvider.java +++ b/src/main/java/org/asciidoc/intellij/ui/SplitTextEditorProvider.java @@ -1,5 +1,6 @@ package org.asciidoc.intellij.ui; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.fileEditor.AsyncFileEditorProvider; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorPolicy; @@ -12,6 +13,8 @@ import org.jdom.Element; import org.jetbrains.annotations.NotNull; +import java.util.concurrent.atomic.AtomicReference; + public abstract class SplitTextEditorProvider implements AsyncFileEditorProvider, DumbAware { private static final String FIRST_EDITOR = "first_editor"; @@ -58,8 +61,19 @@ public Builder createEditorAsync(@NotNull final Project project, @NotNull final return new Builder() { @Override - public FileEditor build() { - return createSplitEditor(firstBuilder.build(), secondBuilder.build()); + public @NotNull FileEditor build() { + if (!ApplicationManager.getApplication().isDispatchThread()) { + // FileEditorManagerImpl$dumbModeFinished$fileToNewProviders will call this in a background thread + // EditorImpl wants to be called from EDT only, let's switch to EDT for this. + // This is a known problem: https://youtrack.jetbrains.com/issue/IDEA-318259 in 2023.2 and will be fixed in 2023.3 + AtomicReference editor = new AtomicReference<>(); + ApplicationManager.getApplication().invokeAndWait(() -> { + editor.set(createSplitEditor(firstBuilder.build(), secondBuilder.build())); + }); + return editor.get(); + } else { + return createSplitEditor(firstBuilder.build(), secondBuilder.build()); + } } }; }