IDEA-238791: rearrange nodes

GitOrigin-RevId: 00534e2c70577a2b74de01de7ecb500abad2e600
This commit is contained in:
Sergey Malenkov
2020-05-14 22:45:01 +00:00
committed by intellij-monorepo-bot
parent 0218cec2c9
commit fd94a2e0ff
2 changed files with 37 additions and 20 deletions
@@ -1,22 +1,40 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.analysis.problemsView.toolWindow
internal class FileProblems {
import com.intellij.openapi.vfs.VirtualFile
internal class FileProblems(val file: VirtualFile) {
private val problems = mutableSetOf<Problem>()
private val nodes = mutableMapOf<Problem, ProblemNode>()
private var fileNode: FileNode? = null
fun getNodes(parent: FileNode): Collection<ProblemNode> {
problems.forEach { problem ->
var node = nodes[problem]
if (node == null || parent !== node.parentDescriptor) {
node = ProblemNode(parent, problem)
nodes[problem] = node
}
}
return nodes.values
fun getFileNode(parent: Node): FileNode {
val oldNode = fileNode
if (oldNode?.parentDescriptor === parent) return oldNode
val newNode = FileNode(parent, file)
fileNode = newNode
nodes.clear()
return newNode
}
fun findNode(problem: Problem) = nodes[problem]
private fun getProblemNode(parent: FileNode, problem: Problem): ProblemNode {
val oldNode = nodes[problem]
if (oldNode?.parentDescriptor === parent) return oldNode
val newNode = ProblemNode(parent, problem)
nodes[problem] = newNode
return newNode
}
fun getProblemNodes(): Collection<ProblemNode> {
if (problems.isEmpty()) return emptyList()
val parent = fileNode ?: return emptyList()
return problems.map { getProblemNode(parent, it) }
}
fun findProblemNode(problem: Problem): ProblemNode? {
val parent = fileNode ?: return null
return getProblemNode(parent, problem)
}
fun add(problem: Problem) = problems.add(problem)
@@ -13,24 +13,23 @@ import com.intellij.ui.tree.LeafState
internal class HighlightingFileRoot(panel: ProblemsViewPanel, val file: VirtualFile)
: Root(panel), LeafState.Supplier, MarkupModelListener, Disposable {
private val myProblems = FileProblems()
private val myFileNode = FileNode(this, file)
private val problems = FileProblems(file)
init {
refreshChildren()
}
override fun getChildren(): Collection<Node> {
return listOf(myFileNode)
return synchronized(problems) { listOf(problems.getFileNode(this)) }
}
override fun getChildren(file: VirtualFile): Collection<Node> {
return synchronized(myProblems) { myProblems.getNodes(myFileNode).toList() }
return synchronized(problems) { problems.getProblemNodes() }
}
fun findProblemNode(info: HighlightInfo?): ProblemNode? {
val problem = getProblem(info) ?: return null
return synchronized(myProblems) { myProblems.findNode(problem) }
return synchronized(problems) { problems.findProblemNode(problem) }
}
private fun refreshChildren() {
@@ -45,13 +44,13 @@ internal class HighlightingFileRoot(panel: ProblemsViewPanel, val file: VirtualF
override fun afterAdded(highlighter: RangeHighlighterEx) {
val problem = getProblem(highlighter) ?: return
synchronized(myProblems) { myProblems.add(problem) }
synchronized(problems) { problems.add(problem) }
structureChanged()
}
override fun beforeRemoved(highlighter: RangeHighlighterEx) {
val problem = getProblem(highlighter) ?: return
synchronized(myProblems) { myProblems.remove(problem) }
synchronized(problems) { problems.remove(problem) }
structureChanged()
}
@@ -72,7 +71,7 @@ internal class HighlightingFileRoot(panel: ProblemsViewPanel, val file: VirtualF
return if (info?.description == null) null else HighlightingProblem(info)
}
override fun getProblemsCount() = synchronized(myProblems) { myProblems.count() }
override fun getProblemsCount() = synchronized(problems) { problems.count() }
override fun getProblemsCount(file: VirtualFile, severity: Severity) = synchronized(myProblems) { myProblems.count(severity) }
override fun getProblemsCount(file: VirtualFile, severity: Severity) = synchronized(problems) { problems.count(severity) }
}