mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
diff: allow to set custom line numbers for DocumentContent
This commit is contained in:
@@ -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);
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+4
-1
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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);
|
||||
|
||||
|
||||
+3
-3
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user