diff: extract installation of line number conversion from FoldingModelSupport

This commit is contained in:
Aleksey Pivovarov
2018-01-12 19:23:23 +03:00
parent aa1f16770c
commit ba7c198b59
6 changed files with 36 additions and 10 deletions
@@ -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
*/
@@ -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);
@@ -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);
}
@@ -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
@@ -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
//
@@ -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);