From ba7c198b5920218010048dc32dc691de78a2f08c Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Fri, 12 Jan 2018 15:33:49 +0300 Subject: [PATCH] diff: extract installation of line number conversion from FoldingModelSupport --- .../tools/fragmented/UnifiedDiffViewer.java | 11 +++-------- .../diff/tools/simple/SimpleDiffViewer.java | 4 ++++ .../simple/ThreesideTextDiffViewerEx.java | 4 ++++ .../diff/tools/util/FoldingModelSupport.java | 7 +++++-- .../src/com/intellij/diff/util/DiffUtil.java | 18 ++++++++++++++++++ .../changes/patch/tool/ApplyPatchViewer.java | 2 ++ 6 files changed, 36 insertions(+), 10 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java index 697efd9167ac..16d3c31a94b3 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/fragmented/UnifiedDiffViewer.java @@ -378,9 +378,9 @@ public class UnifiedDiffViewer extends ListenerDiffViewerBase { myPanel.addNotification(DiffNotifications.createEqualContents(equalCharsets, equalSeparators)); } - TIntFunction separatorLines = myFoldingModel.getLineNumberConvertor(); - myEditor.getGutterComponentEx().setLineNumberConvertor(mergeConverters(data.getLineConvertor1(), separatorLines), - mergeConverters(data.getLineConvertor2(), separatorLines)); + TIntFunction separatorLineConvertor = myFoldingModel.getLineNumberConvertor(); + myEditor.getGutterComponentEx().setLineNumberConvertor(DiffUtil.mergeLineConverters(data.getLineConvertor1(), separatorLineConvertor), + DiffUtil.mergeLineConverters(data.getLineConvertor2(), separatorLineConvertor)); ApplicationManager.getApplication().runWriteAction(() -> { myDuringOnesideDocumentModification = true; @@ -442,11 +442,6 @@ public class UnifiedDiffViewer extends ListenerDiffViewerBase { return block; } - @Contract("!null, _ -> !null") - private static TIntFunction mergeConverters(@NotNull final TIntFunction convertor, @NotNull final TIntFunction separatorLines) { - return value -> convertor.execute(separatorLines.execute(value)); - } - /* * This convertor returns -1 if exact matching is impossible */ diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java index 78db12014a74..5eaa79a3d9be 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleDiffViewer.java @@ -85,6 +85,10 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer { myTextDiffProvider = DiffUtil.createTextDiffProvider(getProject(), getRequest(), getTextSettings(), this::rediff, this); + for (Side side : Side.values()) { + DiffUtil.installLineConvertor(getEditor(side), myFoldingModel, side.getIndex()); + } + DiffUtil.registerAction(new ReplaceSelectedChangesAction(Side.LEFT, true), myPanel); DiffUtil.registerAction(new AppendSelectedChangesAction(Side.LEFT, true), myPanel); DiffUtil.registerAction(new ReplaceSelectedChangesAction(Side.RIGHT, true), myPanel); diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/ThreesideTextDiffViewerEx.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/ThreesideTextDiffViewerEx.java index 0ef2f8f4b946..23d63a9082d5 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/simple/ThreesideTextDiffViewerEx.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/ThreesideTextDiffViewerEx.java @@ -71,6 +71,10 @@ public abstract class ThreesideTextDiffViewerEx extends ThreesideTextDiffViewer myStatusPanel = new MyStatusPanel(); myFoldingModel = new MyFoldingModel(toObjectArray(getEditors(), EditorEx.class), this); + for (ThreeSide side : ThreeSide.values()) { + DiffUtil.installLineConvertor(getEditor(side), myFoldingModel, side.getIndex()); + } + DiffUtil.registerAction(new PrevConflictAction(), myPanel); DiffUtil.registerAction(new NextConflictAction(), myPanel); } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java b/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java index 5f39ed1c8b0b..0583d3a3cbcd 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/FoldingModelSupport.java @@ -86,10 +86,13 @@ public class FoldingModelSupport { if (myCount > 1) { myEditors[i].getFoldingModel().addListener(new MyFoldingListener(i), disposable); } - myEditors[i].getGutterComponentEx().setLineNumberConvertor(getLineConvertor(i)); } } + public int getCount() { + return myCount; + } + // // Init // @@ -280,7 +283,7 @@ public class FoldingModelSupport { } @NotNull - protected TIntFunction getLineConvertor(final int index) { + public TIntFunction getLineConvertor(final int index) { return value -> { updateLineNumbers(false); for (FoldedBlock folding : getFoldedBlocks()) { // TODO: avoid full scan - it could slowdown painting diff --git a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java index c13d09f1b6d0..a085a637a5d2 100644 --- a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java +++ b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java @@ -32,6 +32,7 @@ import com.intellij.diff.fragments.MergeWordFragment; import com.intellij.diff.impl.DiffSettingsHolder.DiffSettings; import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.diff.tools.util.DiffNotifications; +import com.intellij.diff.tools.util.FoldingModelSupport; import com.intellij.diff.tools.util.base.TextDiffSettingsHolder.TextDiffSettings; import com.intellij.diff.tools.util.base.TextDiffViewerUtil; import com.intellij.diff.tools.util.text.*; @@ -98,6 +99,7 @@ import com.intellij.util.ui.JBInsets; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.UIUtil; import gnu.trove.Equality; +import gnu.trove.TIntFunction; import org.jetbrains.annotations.*; import javax.swing.*; @@ -254,6 +256,22 @@ public class DiffUtil { return true; } + + public static void installLineConvertor(@NotNull EditorEx editor, @NotNull FoldingModelSupport foldingSupport) { + assert foldingSupport.getCount() == 1; + installLineConvertor(editor, foldingSupport, 0); + } + + public static void installLineConvertor(@NotNull EditorEx editor, @NotNull FoldingModelSupport foldingSupport, int editorIndex) { + TIntFunction lineConvertor = foldingSupport.getLineConvertor(editorIndex); + editor.getGutterComponentEx().setLineNumberConvertor(lineConvertor); + } + + @NotNull + public static TIntFunction mergeLineConverters(@NotNull TIntFunction convertor1, @NotNull TIntFunction convertor2) { + return value -> convertor1.execute(convertor2.execute(value)); + } + // // Scrolling // diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/tool/ApplyPatchViewer.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/tool/ApplyPatchViewer.java index 82dbb0503cb4..740b73196bba 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/tool/ApplyPatchViewer.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/tool/ApplyPatchViewer.java @@ -141,6 +141,8 @@ class ApplyPatchViewer implements DataProvider, Disposable { myFoldingModel = new MyFoldingModel(myResultEditor, this); + DiffUtil.installLineConvertor(myResultEditor, myFoldingModel); + new MyFocusOppositePaneAction().install(myPanel); new TextDiffViewerUtil.EditorActionsPopup(createEditorPopupActions()).install(editors);