From 9bbf418e7833ca9a8f532faf21afb5056dfd5d29 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Fri, 12 Jan 2018 16:11:11 +0300 Subject: [PATCH] diff: allow to set custom line numbers for DocumentContent --- .../intellij/diff/DiffContentFactoryImpl.java | 2 +- .../tools/fragmented/UnifiedDiffViewer.java | 15 ++++++++-- .../diff/tools/simple/SimpleDiffViewer.java | 2 +- .../simple/ThreesideTextDiffViewerEx.java | 2 +- .../util/side/OnesideTextDiffViewer.java | 2 ++ .../util/side/ThreesideTextDiffViewer.java | 5 +++- .../util/side/TwosideTextDiffViewer.java | 4 +++ .../diff/util/DiffUserDataKeysEx.java | 2 ++ .../src/com/intellij/diff/util/DiffUtil.java | 28 +++++++++++++++---- .../editor/ex/EditorGutterComponentEx.java | 4 +-- .../impl/EditorGutterComponentImpl.java | 6 ++-- 11 files changed, 54 insertions(+), 18 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java b/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java index dfcb11d54c10..a824f749782a 100644 --- a/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java +++ b/platform/diff-impl/src/com/intellij/diff/DiffContentFactoryImpl.java @@ -198,7 +198,7 @@ public class DiffContentFactoryImpl extends DiffContentFactoryEx { @Override public DocumentContent createFragment(@Nullable Project project, @NotNull Document document, @NotNull TextRange range) { DocumentContent content = create(project, document); - return new DocumentFragmentContent(project, content, range); + return createFragment(project, content, range); } @NotNull 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 16d3c31a94b3..eacad2854a28 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,12 @@ public class UnifiedDiffViewer extends ListenerDiffViewerBase { myPanel.addNotification(DiffNotifications.createEqualContents(equalCharsets, equalSeparators)); } - TIntFunction separatorLineConvertor = myFoldingModel.getLineNumberConvertor(); - myEditor.getGutterComponentEx().setLineNumberConvertor(DiffUtil.mergeLineConverters(data.getLineConvertor1(), separatorLineConvertor), - DiffUtil.mergeLineConverters(data.getLineConvertor2(), separatorLineConvertor)); + TIntFunction foldingLineConvertor = myFoldingModel.getLineNumberConvertor(); + TIntFunction contentConvertor1 = DiffUtil.getContentLineConvertor(getContent1()); + TIntFunction contentConvertor2 = DiffUtil.getContentLineConvertor(getContent2()); + myEditor.getGutterComponentEx().setLineNumberConvertor( + mergeLineConverters(contentConvertor1, data.getLineConvertor1(), foldingLineConvertor), + mergeLineConverters(contentConvertor2, data.getLineConvertor2(), foldingLineConvertor)); ApplicationManager.getApplication().runWriteAction(() -> { myDuringOnesideDocumentModification = true; @@ -442,6 +445,12 @@ public class UnifiedDiffViewer extends ListenerDiffViewerBase { return block; } + private static TIntFunction mergeLineConverters(@Nullable TIntFunction contentConvertor, + @NotNull TIntFunction unifiedConvertor, + @NotNull TIntFunction foldingConvertor) { + return DiffUtil.mergeLineConverters(DiffUtil.mergeLineConverters(contentConvertor, unifiedConvertor), foldingConvertor); + } + /* * 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 5eaa79a3d9be..30c40b2d0d7f 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 @@ -86,7 +86,7 @@ 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.installLineConvertor(getEditor(side), getContent(side), myFoldingModel, side.getIndex()); } DiffUtil.registerAction(new ReplaceSelectedChangesAction(Side.LEFT, 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 23d63a9082d5..e0eccb41bf4a 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 @@ -72,7 +72,7 @@ public abstract class ThreesideTextDiffViewerEx extends ThreesideTextDiffViewer myFoldingModel = new MyFoldingModel(toObjectArray(getEditors(), EditorEx.class), this); for (ThreeSide side : ThreeSide.values()) { - DiffUtil.installLineConvertor(getEditor(side), myFoldingModel, side.getIndex()); + DiffUtil.installLineConvertor(getEditor(side), getContent(side), myFoldingModel, side.getIndex()); } DiffUtil.registerAction(new PrevConflictAction(), myPanel); diff --git a/platform/diff-impl/src/com/intellij/diff/tools/util/side/OnesideTextDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/util/side/OnesideTextDiffViewer.java index 704ecd51fda6..7d3a02219e60 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/util/side/OnesideTextDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/util/side/OnesideTextDiffViewer.java @@ -58,6 +58,8 @@ public abstract class OnesideTextDiffViewer extends OnesideDiffViewer LINE_NUMBER_CONVERTOR = Key.create("Diff.LineNumberConvertor"); // Document line -> line number in Editor gutter Key> REVISION_INFO = Key.create("Diff.RevisionInfo"); Key FILE_NAME = Key.create("Diff.FileName"); 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 a085a637a5d2..ce7806fe0263 100644 --- a/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java +++ b/platform/diff-impl/src/com/intellij/diff/util/DiffUtil.java @@ -259,16 +259,32 @@ public class DiffUtil { public static void installLineConvertor(@NotNull EditorEx editor, @NotNull FoldingModelSupport foldingSupport) { assert foldingSupport.getCount() == 1; - installLineConvertor(editor, foldingSupport, 0); + TIntFunction foldingLineConvertor = foldingSupport.getLineConvertor(0); + editor.getGutterComponentEx().setLineNumberConvertor(foldingLineConvertor); } - public static void installLineConvertor(@NotNull EditorEx editor, @NotNull FoldingModelSupport foldingSupport, int editorIndex) { - TIntFunction lineConvertor = foldingSupport.getLineConvertor(editorIndex); - editor.getGutterComponentEx().setLineNumberConvertor(lineConvertor); + public static void installLineConvertor(@NotNull EditorEx editor, @NotNull DocumentContent content) { + TIntFunction contentLineConvertor = getContentLineConvertor(content); + editor.getGutterComponentEx().setLineNumberConvertor(contentLineConvertor); } - @NotNull - public static TIntFunction mergeLineConverters(@NotNull TIntFunction convertor1, @NotNull TIntFunction convertor2) { + public static void installLineConvertor(@NotNull EditorEx editor, @NotNull DocumentContent content, + @NotNull FoldingModelSupport foldingSupport, int editorIndex) { + TIntFunction contentLineConvertor = getContentLineConvertor(content); + TIntFunction foldingLineConvertor = foldingSupport.getLineConvertor(editorIndex); + editor.getGutterComponentEx().setLineNumberConvertor(mergeLineConverters(contentLineConvertor, foldingLineConvertor)); + } + + @Nullable + public static TIntFunction getContentLineConvertor(@NotNull DocumentContent content) { + return content.getUserData(DiffUserDataKeysEx.LINE_NUMBER_CONVERTOR); + } + + @Nullable + public static TIntFunction mergeLineConverters(@Nullable TIntFunction convertor1, @Nullable TIntFunction convertor2) { + if (convertor1 == null && convertor2 == null) return null; + if (convertor1 == null) return convertor2; + if (convertor2 == null) return convertor1; return value -> convertor1.execute(convertor2.execute(value)); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorGutterComponentEx.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorGutterComponentEx.java index 9672597457e1..7a73f17ec784 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorGutterComponentEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorGutterComponentEx.java @@ -49,9 +49,9 @@ public abstract class EditorGutterComponentEx extends JComponent implements Edit @Nullable public abstract Point getCenterPoint(GutterIconRenderer renderer); - public abstract void setLineNumberConvertor(@NotNull TIntFunction lineNumberConvertor); + public abstract void setLineNumberConvertor(@Nullable TIntFunction lineNumberConvertor); - public abstract void setLineNumberConvertor(@NotNull TIntFunction lineNumberConvertor1, @Nullable TIntFunction lineNumberConvertor2); + public abstract void setLineNumberConvertor(@Nullable TIntFunction lineNumberConvertor1, @Nullable TIntFunction lineNumberConvertor2); public abstract void setShowDefaultGutterPopup(boolean show); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java index c8ba9e100977..eed57f894907 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java @@ -1750,13 +1750,13 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse } @Override - public void setLineNumberConvertor(@NotNull TIntFunction lineNumberConvertor) { + public void setLineNumberConvertor(@Nullable TIntFunction lineNumberConvertor) { setLineNumberConvertor(lineNumberConvertor, null); } @Override - public void setLineNumberConvertor(@NotNull TIntFunction lineNumberConvertor1, @Nullable TIntFunction lineNumberConvertor2) { - myLineNumberConvertor = lineNumberConvertor1; + public void setLineNumberConvertor(@Nullable TIntFunction lineNumberConvertor1, @Nullable TIntFunction lineNumberConvertor2) { + myLineNumberConvertor = lineNumberConvertor1 != null ? lineNumberConvertor1 : value -> value; myAdditionalLineNumberConvertor = lineNumberConvertor2; }