combined-diff: introduce combined diff search context

GitOrigin-RevId: d40a90186e996294614011b685a5d38d8f4ecb0d
This commit is contained in:
Dmitry Zhuravlev
2024-02-06 11:04:21 +01:00
committed by intellij-monorepo-bot
parent 80157bdc77
commit 0b33929f5b
5 changed files with 34 additions and 16 deletions

View File

@@ -10,6 +10,7 @@ import com.intellij.diff.impl.DiffRequestProcessor.getToolOrderFromSettings
import com.intellij.diff.impl.DiffSettingsHolder.DiffSettings
import com.intellij.diff.impl.ui.DiffToolChooser
import com.intellij.diff.requests.DiffRequest
import com.intellij.diff.tools.combined.search.CombinedDiffSearchContext
import com.intellij.diff.tools.combined.search.CombinedDiffSearchController
import com.intellij.diff.tools.util.DiffDataKeys
import com.intellij.diff.util.DiffUserDataKeys
@@ -88,8 +89,7 @@ class CombinedDiffMainUI(private val model: CombinedDiffModel, private val goToC
}
}
var searchController: CombinedDiffSearchController? = null
private set
private var searchController: CombinedDiffSearchController? = null
init {
Touchbar.setActions(mainPanel, touchbarActionGroup)
@@ -159,6 +159,11 @@ class CombinedDiffMainUI(private val model: CombinedDiffModel, private val goToC
topPanel.repaint()
}
@RequiresEdt
fun updateSearch(context: CombinedDiffSearchContext) {
searchController?.update(context)
}
@RequiresEdt
fun closeSearch() {
searchController = null

View File

@@ -6,6 +6,7 @@ import com.intellij.diff.EditorDiffViewer
import com.intellij.diff.FrameDiffTool
import com.intellij.diff.FrameDiffTool.DiffViewer
import com.intellij.diff.impl.ui.DiffInfo
import com.intellij.diff.tools.combined.search.CombinedDiffSearchContext
import com.intellij.diff.tools.fragmented.UnifiedDiffViewer
import com.intellij.diff.tools.simple.SimpleDiffViewer
import com.intellij.diff.tools.util.DiffDataKeys
@@ -445,7 +446,7 @@ class CombinedDiffViewer(
}
private fun updateSearch() {
getMainUI().searchController?.update(editorsOrdered)
getMainUI().updateSearch(createSearchContext())
}
private val foldingModels: List<FoldingModelSupport>
@@ -529,12 +530,17 @@ class CombinedDiffViewer(
}
}
fun createSearchContext(): CombinedDiffSearchContext {
return CombinedDiffSearchContext(blockState.iterateBlocks()
.asSequence()
.mapNotNull { id -> diffViewers[id]?.editors }
.map(CombinedDiffSearchContext::EditorHolder)
.toList())
}
internal val editors: List<Editor>
get() = diffViewers.values.flatMap { it.editors }
val editorsOrdered: List<List<Editor>>
get() = blockState.iterateBlocks().asSequence().mapNotNull { id -> diffViewers[id]?.editors}.toList()
private inner class FocusListener(disposable: Disposable) : FocusAdapter(), FocusChangeListener {
init {
(EditorFactory.getInstance().eventMulticaster as? EditorEventMulticasterEx)?.addFocusChangeListener(this, disposable)
@@ -771,4 +777,4 @@ private fun Rectangle.intersects(bb: BlockBounds): Boolean =
interface BlockListener : EventListener {
fun blocksHidden(blockIds: Collection<CombinedBlockId>)
fun blocksVisible(blockIds: Collection<CombinedBlockId>)
}
}

View File

@@ -23,5 +23,14 @@ interface CombinedDiffSearchController {
val searchComponent: JComponent
fun update(editors: List<List<Editor>>)
fun update(context: CombinedDiffSearchContext)
}
class CombinedDiffSearchContext(val holders: List<EditorHolder>) {
/**
* Holder, which contains ordered editors
*
* @see [com.intellij.diff.EditorDiffViewer]
*/
class EditorHolder(val editors: List<Editor>)
}

View File

@@ -3,6 +3,8 @@ package com.intellij.openapi.diff.impl.combined.search
import com.intellij.diff.tools.combined.CombinedDiffViewer
import com.intellij.diff.tools.combined.currentEditor
import com.intellij.diff.tools.combined.search.CombinedDiffSearchContext
import com.intellij.diff.tools.combined.search.CombinedDiffSearchContext.EditorHolder
import com.intellij.diff.tools.combined.search.CombinedDiffSearchController
import com.intellij.diff.tools.combined.search.CombinedDiffSearchProvider
import com.intellij.openapi.diff.DiffBundle
@@ -35,14 +37,14 @@ class CombinedDiffSearchProviderImpl(private val project: Project) : CombinedDif
.also { it.addListener(this) }
init {
session.update(viewer.editorsOrdered, currentEditor)
session.update(viewer.createSearchContext().holders, EditorHolder::editors, currentEditor)
}
override val searchComponent: JComponent
get() = session.component
override fun update(editors: List<List<Editor>>) {
session.update(editors)
override fun update(context: CombinedDiffSearchContext) {
session.update(context.holders, EditorHolder::editors)
}
override fun onSearch(forward: Boolean, editor: Editor) {

View File

@@ -109,11 +109,7 @@ internal class CombinedEditorSearchSession(private val project: Project,
listeners.addListener(listener, disposable)
}
fun update(editors: List<List<Editor>>, currentEditor: Editor = this.currentEditor) {
update(editors, { it }, currentEditor)
}
private fun <EditorHolder> update(items: List<EditorHolder>, mapper: (EditorHolder) -> List<Editor>, currentEditor: Editor) {
fun <EditorHolder> update(items: List<EditorHolder>, mapper: (EditorHolder) -> List<Editor>, currentEditor: Editor = this.currentEditor) {
val update = holders.isNotEmpty()
holders.forEach(EditorSearchSessionHolder::disposeLivePreview)