diff: allow to set custom line numbers for DocumentContent

This commit is contained in:
Aleksey Pivovarov
2018-01-12 19:23:23 +03:00
parent ba7c198b59
commit 9bbf418e78
11 changed files with 54 additions and 18 deletions
@@ -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
@@ -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
*/
@@ -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);
@@ -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);
@@ -58,6 +58,8 @@ public abstract class OnesideTextDiffViewer extends OnesideDiffViewer<TextEditor
myEditorSettingsAction.applyDefaults();
new MyOpenInEditorWithMouseAction().install(getEditors());
DiffUtil.installLineConvertor(getEditor(), getContent());
}
@Override
@@ -38,7 +38,6 @@ import com.intellij.openapi.editor.event.DocumentEvent;
import com.intellij.openapi.editor.event.VisibleAreaEvent;
import com.intellij.openapi.editor.event.VisibleAreaListener;
import com.intellij.openapi.editor.ex.EditorEx;
import com.intellij.openapi.editor.ex.EditorMarkupModel;
import com.intellij.openapi.util.Pair;
import com.intellij.pom.Navigatable;
import com.intellij.util.containers.ContainerUtil;
@@ -73,6 +72,10 @@ public abstract class ThreesideTextDiffViewer extends ThreesideDiffViewer<TextEd
myEditableEditors = TextDiffViewerUtil.getEditableEditors(getEditors());
TextDiffViewerUtil.checkDifferentDocuments(myRequest);
for (ThreeSide side : ThreeSide.values()) {
DiffUtil.installLineConvertor(getEditor(side), getContent(side));
}
}
@Override
@@ -82,6 +82,10 @@ public abstract class TwosideTextDiffViewer extends TwosideDiffViewer<TextEditor
if (editable1 ^ editable2) {
ProxyUndoRedoAction.register(getProject(), editable1 ? getEditor1() : getEditor2(), myPanel);
}
for (Side side : Side.values()) {
DiffUtil.installLineConvertor(getEditor(side), getContent(side));
}
}
@Override
@@ -30,6 +30,7 @@ import com.intellij.openapi.vcs.FilePath;
import com.intellij.openapi.vcs.history.VcsRevisionNumber;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import gnu.trove.TIntFunction;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -41,6 +42,7 @@ public interface DiffUserDataKeysEx extends DiffUserDataKeys {
// DiffContent
//
Key<TIntFunction> LINE_NUMBER_CONVERTOR = Key.create("Diff.LineNumberConvertor"); // Document line -> line number in Editor gutter
Key<Pair<FilePath, VcsRevisionNumber>> REVISION_INFO = Key.create("Diff.RevisionInfo");
Key<String> FILE_NAME = Key.create("Diff.FileName");
@@ -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));
}
@@ -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);
@@ -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;
}