diff: handle 'unified-split' switching for custom tools in combined diff

GitOrigin-RevId: 82039e212960a4376518875eb27b55c6e175a823
This commit is contained in:
Aleksey Pivovarov
2023-10-14 07:10:39 +02:00
committed by intellij-monorepo-bot
parent 7cb40bcbe2
commit ca95476cda
6 changed files with 43 additions and 21 deletions

View File

@@ -16,5 +16,6 @@
<orderEntry type="module" module-name="intellij.platform.editor" />
<orderEntry type="module" module-name="intellij.platform.analysis" />
<orderEntry type="module" module-name="intellij.platform.projectModel" />
<orderEntry type="library" name="kotlin-stdlib" level="project" />
</component>
</module>

View File

@@ -0,0 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.diff
interface DiffToolType {
object Default : DiffToolType
object Unified : DiffToolType
}

View File

@@ -25,6 +25,10 @@ public interface FrameDiffTool extends DiffTool {
@NotNull
DiffViewer createComponent(@NotNull DiffContext context, @NotNull DiffRequest request);
default @NotNull DiffToolType getToolType() {
return DiffToolType.Default.INSTANCE;
}
interface DiffViewer extends Disposable {
@NotNull
JComponent getComponent();

View File

@@ -5,7 +5,6 @@ import com.intellij.diff.*
import com.intellij.diff.impl.DiffRequestProcessor
import com.intellij.diff.impl.DiffSettingsHolder
import com.intellij.diff.requests.DiffRequest
import com.intellij.diff.tools.fragmented.UnifiedDiffTool
import com.intellij.diff.util.DiffUserDataKeys
import com.intellij.diff.util.DiffUserDataKeysEx
import com.intellij.diff.util.DiffUtil
@@ -111,22 +110,21 @@ abstract class CombinedDiffComponentFactory(val model: CombinedDiffModel) {
private fun buildBlockContent(mainUi: CombinedDiffMainUI,
context: DiffContext,
request: DiffRequest,
blockId: CombinedBlockId,
needTakeTool: (FrameDiffTool) -> Boolean = { true }): CombinedDiffBlockContent? {
blockId: CombinedBlockId): CombinedDiffBlockContent? {
val diffSettings = DiffSettingsHolder.DiffSettings.getSettings(context.getUserData(DiffUserDataKeys.PLACE))
val diffTools = DiffManagerEx.getInstance().diffTools
request.putUserData(DiffUserDataKeys.ALIGNED_TWO_SIDED_DIFF, true)
context.getUserData(DiffUserDataKeysEx.SCROLL_TO_CHANGE)?.let { request.putUserData(DiffUserDataKeysEx.SCROLL_TO_CHANGE, it) }
val frameDiffTool =
if (mainUi.isUnified() && UnifiedDiffTool.INSTANCE.canShow(context, request)) {
UnifiedDiffTool.INSTANCE
}
else {
getDiffToolsExceptUnified(context, diffSettings, diffTools, request, needTakeTool)
}
val orderedDiffTools = getOrderedDiffTools(diffSettings, diffTools, mainUi.isUnified())
val childViewer = frameDiffTool
val diffTool = orderedDiffTools
.filter { it.canShow(context, request) }
.toList()
.let(DiffUtil::filterSuppressedTools)
.firstOrNull()
val childViewer = diffTool
?.let { findSubstitutor(it, context, request) }
?.createComponent(context, request)
?: return null
@@ -144,16 +142,16 @@ abstract class CombinedDiffComponentFactory(val model: CombinedDiffModel) {
return DiffUtil.findToolSubstitutor(tool, context, request) as? FrameDiffTool ?: tool
}
private fun getDiffToolsExceptUnified(context: DiffContext,
diffSettings: DiffSettingsHolder.DiffSettings,
diffTools: List<DiffTool>,
request: DiffRequest,
needTakeTool: (FrameDiffTool) -> Boolean): FrameDiffTool? {
return DiffRequestProcessor.getToolOrderFromSettings(diffSettings, diffTools)
.asSequence().filterIsInstance<FrameDiffTool>()
.filter { needTakeTool(it) && it !is UnifiedDiffTool && it.canShow(context, request) }
.toList().let(DiffUtil::filterSuppressedTools).firstOrNull()
private fun getOrderedDiffTools(diffSettings: DiffSettingsHolder.DiffSettings,
diffTools: List<DiffTool>,
isUnifiedView: Boolean): List<FrameDiffTool> {
return DiffRequestProcessor.getToolOrderFromSettings(diffSettings, diffTools).asSequence()
.filterIsInstance<FrameDiffTool>()
.sortedBy {
val isUnifiedTool: Boolean = it.toolType == DiffToolType.Unified
if (isUnifiedView == isUnifiedTool) -1 else 0
}
.toList()
}
private fun notifyDiffViewerCreated(viewer: FrameDiffTool.DiffViewer, context: DiffContext, request: DiffRequest) {

View File

@@ -16,6 +16,7 @@
package com.intellij.diff.tools.fragmented;
import com.intellij.diff.DiffContext;
import com.intellij.diff.DiffToolType;
import com.intellij.diff.FrameDiffTool;
import com.intellij.diff.requests.DiffRequest;
import com.intellij.diff.tools.simple.SimpleOnesideDiffViewer;
@@ -43,4 +44,9 @@ public class UnifiedDiffTool implements FrameDiffTool {
public String getName() {
return DiffBundle.message("unified.viewer");
}
@Override
public @NotNull DiffToolType getToolType() {
return DiffToolType.Unified.INSTANCE;
}
}

View File

@@ -3,6 +3,7 @@ package com.intellij.openapi.vcs.changes.actions.diff.lst;
import com.intellij.diff.DiffContext;
import com.intellij.diff.DiffTool;
import com.intellij.diff.DiffToolType;
import com.intellij.diff.FrameDiffTool;
import com.intellij.diff.impl.DiffToolSubstitutor;
import com.intellij.diff.requests.DiffRequest;
@@ -38,6 +39,11 @@ public final class LocalChangeListDiffTool {
public DiffViewer createComponent(@NotNull DiffContext context, @NotNull DiffRequest request) {
return new UnifiedLocalChangeListDiffViewer(context, (LocalChangeListDiffRequest)request);
}
@Override
public @NotNull DiffToolType getToolType() {
return DiffToolType.Unified.INSTANCE;
}
}
private static abstract class Base implements FrameDiffTool, DiffToolSubstitutor {