mirror of
https://gitflic.ru/project/openide/openide.git
synced 2025-12-16 14:23:28 +07:00
diff: handle 'unified-split' switching for custom tools in combined diff
GitOrigin-RevId: 82039e212960a4376518875eb27b55c6e175a823
This commit is contained in:
committed by
intellij-monorepo-bot
parent
7cb40bcbe2
commit
ca95476cda
@@ -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>
|
||||
7
platform/diff-api/src/com/intellij/diff/DiffToolType.kt
Normal file
7
platform/diff-api/src/com/intellij/diff/DiffToolType.kt
Normal 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
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user