User: rednesto Date: 09 Jul 23 12:28 Revision: b070670f2e3d625bade5adf3d541ccef50be7be7 Summary: Attempt to fix lost userdata before NBT editor is created Fixes minecraft-dev/mcdev-error-report#1062 TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=8618&personal=false Index: src/main/kotlin/nbt/editor/NbtFileEditorProvider.kt =================================================================== --- src/main/kotlin/nbt/editor/NbtFileEditorProvider.kt (revision efa2b72f8dbd37b3ec1b72978567eb5c2d201f49) +++ src/main/kotlin/nbt/editor/NbtFileEditorProvider.kt (revision b070670f2e3d625bade5adf3d541ccef50be7be7) @@ -48,6 +48,7 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiManager import com.intellij.psi.codeStyle.CodeStyleManager +import com.intellij.ui.EditorNotifications import com.intellij.ui.components.JBLoadingPanel import com.intellij.util.IncorrectOperationException import java.awt.BorderLayout @@ -92,6 +93,7 @@ private var editor: FileEditor? = null private val editorCheckedDisposable = Disposer.newCheckedDisposable() private val component = JPanel(BorderLayout()) + private val tempUserData = mutableMapOf() init { val loading = JBLoadingPanel(null, this) @@ -123,10 +125,16 @@ Disposer.dispose(this) return@let } + tempUserData.forEach { (k, v) -> + @Suppress("UNCHECKED_CAST") + editor.putUserData(k as Key, v) + } + tempUserData.clear() invokeLater { component.add(toolbar.panel, BorderLayout.NORTH) component.add(editor.component, BorderLayout.CENTER) } + EditorNotifications.getInstance(project).updateAllNotifications() } // This can be null if the file is too big to be parsed as a psi file @@ -178,12 +186,22 @@ override fun getComponent() = component override fun getPreferredFocusedComponent() = editor.exec { preferredFocusedComponent } - override fun getUserData(key: Key) = editor.exec { getUserData(key) } + override fun getUserData(key: Key): T? { + if (editor == null) { + @Suppress("UNCHECKED_CAST") + return tempUserData[key] as? T + } + return editor.exec { getUserData(key) } + } override fun selectNotify() { editor.exec { selectNotify() } } override fun putUserData(key: Key, value: T?) { + if (editor == null) { + tempUserData[key] = value + return + } editor.exec { putUserData(key, value) } }