diff --git a/java/debugger/impl/resources/META-INF/java-debugger.xml b/java/debugger/impl/resources/META-INF/java-debugger.xml
index 53be02677186..2193a6a2e27c 100644
--- a/java/debugger/impl/resources/META-INF/java-debugger.xml
+++ b/java/debugger/impl/resources/META-INF/java-debugger.xml
@@ -388,6 +388,7 @@
+
diff --git a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XThreadsView.kt b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XThreadsView.kt
index 5dd86df0f49a..cfe20e0196b4 100644
--- a/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XThreadsView.kt
+++ b/platform/xdebugger-impl/src/com/intellij/xdebugger/impl/frame/XThreadsView.kt
@@ -8,7 +8,6 @@ import com.intellij.platform.debugger.impl.rpc.XDebugSessionApi
import com.intellij.platform.debugger.impl.shared.proxy.XDebugSessionProxy
import com.intellij.platform.debugger.impl.ui.DebuggerUIUtilShared
import com.intellij.ui.AutoScrollToSourceHandler
-import com.intellij.ui.SimpleColoredComponent
import com.intellij.ui.SimpleTextAttributes
import com.intellij.util.concurrency.annotations.RequiresEdt
import com.intellij.xdebugger.XDebugSession
@@ -35,6 +34,7 @@ import kotlinx.coroutines.withContext
import org.jetbrains.annotations.ApiStatus
import java.awt.Component
import java.awt.event.HierarchyEvent
+import javax.swing.Icon
import javax.swing.JPanel
@OptIn(FlowPreview::class)
@@ -145,6 +145,7 @@ class XThreadsView(project: Project, session: XDebugSessionProxy) : XDebugView()
override fun computeChildren(node: XCompositeNode) {
val container = object : XSuspendContext.XExecutionStackGroupContainer {
override fun errorOccurred(errorMessage: String) {
+ node.setMessage(errorMessage)
}
override fun addExecutionStack(executionStacks: List, last: Boolean) {
@@ -190,45 +191,52 @@ class XThreadsView(project: Project, session: XDebugSessionProxy) : XDebugView()
override fun addStackFrames(stackFrames: List, last: Boolean) {
val children = XValueChildrenList()
- stackFrames.forEach { children.add("", FrameValue(executionStack,it)) }
+ stackFrames.forEach { children.add("", FrameValue(executionStack,it, session)) }
node.addChildren(children, last)
}
})
}
override fun computePresentation(node: XValueNode, place: XValuePlace) {
- node.setPresentation(executionStack.icon, XRegularValuePresentation(executionStack.displayName, null, ""), true)
- }
-
- private fun XCompositeNode.setMessage(text: String) {
- // remove temporary loading message nodes
- addChildren(XValueChildrenList.EMPTY, true)
- setMessage(text, null, SimpleTextAttributes.GRAYED_ATTRIBUTES, null)
+ node.setEmptyValuePresentation(executionStack.icon)
}
}
- class FrameValue(val executionStack: XExecutionStack, val frame : XStackFrame) : XValue() {
+ class FrameValue(val executionStack: XExecutionStack, val frame : XStackFrame, private val session: XDebugSessionProxy) : XValue() {
override fun computePresentation(node: XValueNode, place: XValuePlace) {
- val component = SimpleColoredComponent()
- frame.customizeTextPresentation(component)
- node.setPresentation(component.icon, object : XValuePresentation() {
- override fun getSeparator(): @NlsSafe String = ""
- override fun renderValue(renderer: XValueTextRenderer) {
- val i = component.iterator()
- while (i.hasNext()) {
- i.next()
- val text = i.fragment
- when (i.textAttributes) {
- SimpleTextAttributes.GRAYED_ATTRIBUTES -> renderer.renderComment(text)
- SimpleTextAttributes.ERROR_ATTRIBUTES -> renderer.renderError(text)
- SimpleTextAttributes.REGULAR_ATTRIBUTES -> renderer.renderValue(text)
+ session.coroutineScope.launch {
+ frame.customizePresentation().collectLatest { presentation ->
+ node.setPresentation(presentation.icon, object : XValuePresentation() {
+ override fun getSeparator(): @NlsSafe String = ""
+ override fun renderValue(renderer: XValueTextRenderer) {
+ val fragments = presentation.fragments
+ fragments.forEach { (text, attr) ->
+ when(attr) {
+ SimpleTextAttributes.GRAYED_ATTRIBUTES,
+ SimpleTextAttributes.GRAY_ATTRIBUTES,
+ SimpleTextAttributes.GRAY_ITALIC_ATTRIBUTES,
+ -> renderer.renderComment(text)
+ SimpleTextAttributes.ERROR_ATTRIBUTES -> renderer.renderError(text)
+ else -> renderer.renderValue(text)
+ }
+ }
}
- }
+ }, false)
}
- }, false)
+ }
}
}
class XThreadsRootNode(tree: XDebuggerTree, session: XDebugSessionProxy) :
XValueContainerNode(tree, null, false, ThreadsContainer(session))
}
+
+private fun XCompositeNode.setMessage(text: String) {
+ // remove temporary loading message nodes
+ addChildren(XValueChildrenList.EMPTY, true)
+ setMessage(text, null, SimpleTextAttributes.GRAYED_ATTRIBUTES, null)
+}
+
+private fun XValueNode.setEmptyValuePresentation(icon: Icon?) {
+ setPresentation(icon, XRegularValuePresentation("", null, ""), true)
+}
\ No newline at end of file