mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
merge: remove duplication
This commit is contained in:
@@ -46,8 +46,6 @@ public class TextMergeChange extends ThreesideDiffChangeBase {
|
||||
|
||||
@NotNull private final TextMergeViewer myMergeViewer;
|
||||
@NotNull private final TextMergeViewer.MyThreesideViewer myViewer;
|
||||
@NotNull private final List<RangeHighlighter> myHighlighters = new ArrayList<RangeHighlighter>();
|
||||
@NotNull private final List<RangeHighlighter> myInnerHighlighters = new ArrayList<RangeHighlighter>();
|
||||
|
||||
@NotNull private final List<MyGutterOperation> myOperations = new ArrayList<MyGutterOperation>();
|
||||
|
||||
@@ -72,8 +70,7 @@ public class TextMergeChange extends ThreesideDiffChangeBase {
|
||||
myStartLine = myFragment.getStartLine(ThreeSide.BASE);
|
||||
myEndLine = myFragment.getEndLine(ThreeSide.BASE);
|
||||
|
||||
installHighlighter();
|
||||
installOperations();
|
||||
doReinstallHighlighter();
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
@@ -83,40 +80,6 @@ public class TextMergeChange extends ThreesideDiffChangeBase {
|
||||
destroyInnerHighlighter();
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
private void installHighlighter() {
|
||||
assert myHighlighters.isEmpty();
|
||||
|
||||
createHighlighter(ThreeSide.BASE);
|
||||
if (getType().isLeftChange()) createHighlighter(ThreeSide.LEFT);
|
||||
if (getType().isRightChange()) createHighlighter(ThreeSide.RIGHT);
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
private void installInnerHighlighter() {
|
||||
assert myInnerHighlighters.isEmpty();
|
||||
|
||||
createInnerHighlighter(ThreeSide.BASE);
|
||||
if (getType().isLeftChange()) createInnerHighlighter(ThreeSide.LEFT);
|
||||
if (getType().isRightChange()) createInnerHighlighter(ThreeSide.RIGHT);
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
private void destroyHighlighter() {
|
||||
for (RangeHighlighter highlighter : myHighlighters) {
|
||||
highlighter.dispose();
|
||||
}
|
||||
myHighlighters.clear();
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
private void destroyInnerHighlighter() {
|
||||
for (RangeHighlighter highlighter : myInnerHighlighters) {
|
||||
highlighter.dispose();
|
||||
}
|
||||
myInnerHighlighters.clear();
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
public void doReinstallHighlighter() {
|
||||
destroyHighlighter();
|
||||
@@ -128,33 +91,6 @@ public class TextMergeChange extends ThreesideDiffChangeBase {
|
||||
myViewer.repaintDividers();
|
||||
}
|
||||
|
||||
private void createHighlighter(@NotNull ThreeSide side) {
|
||||
Editor editor = side.select(myViewer.getEditors());
|
||||
|
||||
TextDiffType type = getDiffType();
|
||||
boolean resolved = isResolved(side);
|
||||
int startLine = getStartLine(side);
|
||||
int endLine = getEndLine(side);
|
||||
|
||||
boolean ignored = !resolved && myInnerFragments != null;
|
||||
boolean shouldHideWithoutLineNumbers = side == ThreeSide.BASE && !isChange(Side.LEFT) && isChange(Side.RIGHT);
|
||||
myHighlighters.addAll(DiffDrawUtil.createHighlighter(editor, startLine, endLine, type, ignored, resolved, shouldHideWithoutLineNumbers));
|
||||
myHighlighters.addAll(DiffDrawUtil.createLineMarker(editor, startLine, endLine, type, resolved));
|
||||
}
|
||||
|
||||
private void createInnerHighlighter(@NotNull ThreeSide side) {
|
||||
if (isResolved(side)) return;
|
||||
if (myInnerFragments == null) return;
|
||||
|
||||
Editor editor = myViewer.getEditor(side);
|
||||
int start = DiffUtil.getLinesRange(editor.getDocument(), getStartLine(side), getEndLine(side)).getStartOffset();
|
||||
for (MergeWordFragment fragment : myInnerFragments) {
|
||||
int innerStart = start + fragment.getStartOffset(side);
|
||||
int innerEnd = start + fragment.getEndOffset(side);
|
||||
myInnerHighlighters.addAll(DiffDrawUtil.createInlineHighlighter(editor, innerStart, innerEnd, getDiffType()));
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Getters
|
||||
//
|
||||
@@ -197,6 +133,7 @@ public class TextMergeChange extends ThreesideDiffChangeBase {
|
||||
myOnesideAppliedConflict = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isResolved(@NotNull ThreeSide side) {
|
||||
switch (side) {
|
||||
case LEFT:
|
||||
@@ -238,6 +175,18 @@ public class TextMergeChange extends ThreesideDiffChangeBase {
|
||||
myEndLine = value;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected Editor getEditor(@NotNull ThreeSide side) {
|
||||
return myViewer.getEditor(side);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
protected List<MergeWordFragment> getInnerFragments() {
|
||||
return myInnerFragments;
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
public void setInnerFragments(@Nullable List<MergeWordFragment> innerFragments) {
|
||||
if (myInnerFragments == null && innerFragments == null) return;
|
||||
@@ -279,6 +228,7 @@ public class TextMergeChange extends ThreesideDiffChangeBase {
|
||||
// Gutter actions
|
||||
//
|
||||
|
||||
@CalledInAwt
|
||||
private void installOperations() {
|
||||
ContainerUtil.addIfNotNull(myOperations, createOperation(ThreeSide.LEFT, OperationType.APPLY));
|
||||
ContainerUtil.addIfNotNull(myOperations, createOperation(ThreeSide.LEFT, OperationType.IGNORE));
|
||||
|
||||
+35
-53
@@ -18,21 +18,20 @@ package com.intellij.diff.tools.simple;
|
||||
import com.intellij.diff.comparison.ComparisonPolicy;
|
||||
import com.intellij.diff.fragments.MergeLineFragment;
|
||||
import com.intellij.diff.fragments.MergeWordFragment;
|
||||
import com.intellij.diff.util.*;
|
||||
import com.intellij.diff.util.DiffUtil;
|
||||
import com.intellij.diff.util.ThreeSide;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.ex.EditorEx;
|
||||
import com.intellij.openapi.editor.markup.RangeHighlighter;
|
||||
import org.jetbrains.annotations.CalledInAwt;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SimpleThreesideDiffChange extends ThreesideDiffChangeBase {
|
||||
@NotNull private final List<? extends EditorEx> myEditors;
|
||||
@NotNull private final MergeLineFragment myFragment;
|
||||
|
||||
@NotNull private final List<RangeHighlighter> myHighlighters = new ArrayList<RangeHighlighter>();
|
||||
|
||||
private int[] myLineStartShifts = new int[3];
|
||||
private int[] myLineEndShifts = new int[3];
|
||||
|
||||
@@ -43,56 +42,22 @@ public class SimpleThreesideDiffChange extends ThreesideDiffChangeBase {
|
||||
myEditors = editors;
|
||||
myFragment = fragment;
|
||||
|
||||
reinstallHighlighters();
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
public void destroy() {
|
||||
destroyHighlighter();
|
||||
destroyInnerHighlighter();
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
public void reinstallHighlighters() {
|
||||
destroyHighlighter();
|
||||
installHighlighter();
|
||||
}
|
||||
|
||||
public void installHighlighter() {
|
||||
assert myHighlighters.isEmpty();
|
||||
|
||||
createHighlighter(ThreeSide.BASE);
|
||||
if (getType().isLeftChange()) createHighlighter(ThreeSide.LEFT);
|
||||
if (getType().isRightChange()) createHighlighter(ThreeSide.RIGHT);
|
||||
|
||||
createInnerHighlighter(ThreeSide.BASE);
|
||||
if (getType().isLeftChange()) createInnerHighlighter(ThreeSide.LEFT);
|
||||
if (getType().isRightChange()) createInnerHighlighter(ThreeSide.RIGHT);
|
||||
}
|
||||
|
||||
public void destroyHighlighter() {
|
||||
for (RangeHighlighter highlighter : myHighlighters) {
|
||||
highlighter.dispose();
|
||||
}
|
||||
myHighlighters.clear();
|
||||
}
|
||||
|
||||
//
|
||||
// Highlighting
|
||||
//
|
||||
|
||||
private void createHighlighter(@NotNull ThreeSide side) {
|
||||
Editor editor = side.select(myEditors);
|
||||
|
||||
TextDiffType type = getDiffType();
|
||||
int startLine = getStartLine(side);
|
||||
int endLine = getEndLine(side);
|
||||
|
||||
boolean ignored = myFragment.getInnerFragments() != null;
|
||||
boolean shouldHideWithoutLineNumbers = side == ThreeSide.BASE && !isChange(Side.LEFT) && isChange(Side.RIGHT);
|
||||
myHighlighters.addAll(DiffDrawUtil.createHighlighter(editor, startLine, endLine, type, ignored, false, shouldHideWithoutLineNumbers));
|
||||
myHighlighters.addAll(DiffDrawUtil.createLineMarker(editor, startLine, endLine, type, false));
|
||||
}
|
||||
|
||||
private void createInnerHighlighter(@NotNull ThreeSide side) {
|
||||
List<MergeWordFragment> innerFragments = myFragment.getInnerFragments();
|
||||
if (innerFragments == null) return;
|
||||
|
||||
Editor editor = side.select(myEditors);
|
||||
int start = DiffUtil.getLinesRange(editor.getDocument(), getStartLine(side), getEndLine(side)).getStartOffset();
|
||||
for (MergeWordFragment fragment : innerFragments) {
|
||||
int innerStart = start + fragment.getStartOffset(side);
|
||||
int innerEnd = start + fragment.getEndOffset(side);
|
||||
myHighlighters.addAll(DiffDrawUtil.createInlineHighlighter(editor, innerStart, innerEnd, getDiffType()));
|
||||
}
|
||||
destroyInnerHighlighter();
|
||||
installInnerHighlighter();
|
||||
}
|
||||
|
||||
//
|
||||
@@ -109,6 +74,23 @@ public class SimpleThreesideDiffChange extends ThreesideDiffChangeBase {
|
||||
return myFragment.getEndLine(side) + side.select(myLineEndShifts);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isResolved(@NotNull ThreeSide side) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
protected Editor getEditor(@NotNull ThreeSide side) {
|
||||
return side.select(myEditors);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
protected List<MergeWordFragment> getInnerFragments() {
|
||||
return myFragment.getInnerFragments();
|
||||
}
|
||||
|
||||
//
|
||||
// Shift
|
||||
//
|
||||
|
||||
+2
-2
@@ -222,12 +222,12 @@ public class SimpleThreesideDiffViewer extends ThreesideTextDiffViewerEx {
|
||||
protected void destroyChangedBlocks() {
|
||||
super.destroyChangedBlocks();
|
||||
for (SimpleThreesideDiffChange change : myDiffChanges) {
|
||||
change.destroyHighlighter();
|
||||
change.destroy();
|
||||
}
|
||||
myDiffChanges.clear();
|
||||
|
||||
for (SimpleThreesideDiffChange change : myInvalidDiffChanges) {
|
||||
change.destroyHighlighter();
|
||||
change.destroy();
|
||||
}
|
||||
myInvalidDiffChanges.clear();
|
||||
}
|
||||
|
||||
@@ -18,20 +18,26 @@ package com.intellij.diff.tools.simple;
|
||||
import com.intellij.diff.comparison.ComparisonManager;
|
||||
import com.intellij.diff.comparison.ComparisonPolicy;
|
||||
import com.intellij.diff.fragments.MergeLineFragment;
|
||||
import com.intellij.diff.util.DiffUtil;
|
||||
import com.intellij.diff.util.Side;
|
||||
import com.intellij.diff.util.TextDiffType;
|
||||
import com.intellij.diff.util.ThreeSide;
|
||||
import com.intellij.diff.fragments.MergeWordFragment;
|
||||
import com.intellij.diff.util.*;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.editor.ex.EditorEx;
|
||||
import com.intellij.openapi.editor.markup.RangeHighlighter;
|
||||
import com.intellij.util.Function;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import org.jetbrains.annotations.CalledInAwt;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class ThreesideDiffChangeBase {
|
||||
@NotNull private ConflictType myType;
|
||||
@NotNull private final ConflictType myType;
|
||||
|
||||
@NotNull protected final List<RangeHighlighter> myHighlighters = new ArrayList<RangeHighlighter>();
|
||||
@NotNull protected final List<RangeHighlighter> myInnerHighlighters = new ArrayList<RangeHighlighter>();
|
||||
|
||||
public ThreesideDiffChangeBase(@NotNull MergeLineFragment fragment,
|
||||
@NotNull List<? extends EditorEx> editors,
|
||||
@@ -45,6 +51,40 @@ public abstract class ThreesideDiffChangeBase {
|
||||
myType = calcType(fragment, documents, policy);
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
protected void installHighlighter() {
|
||||
assert myHighlighters.isEmpty();
|
||||
|
||||
createHighlighter(ThreeSide.BASE);
|
||||
if (getType().isLeftChange()) createHighlighter(ThreeSide.LEFT);
|
||||
if (getType().isRightChange()) createHighlighter(ThreeSide.RIGHT);
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
protected void installInnerHighlighter() {
|
||||
assert myInnerHighlighters.isEmpty();
|
||||
|
||||
createInnerHighlighter(ThreeSide.BASE);
|
||||
if (getType().isLeftChange()) createInnerHighlighter(ThreeSide.LEFT);
|
||||
if (getType().isRightChange()) createInnerHighlighter(ThreeSide.RIGHT);
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
protected void destroyHighlighter() {
|
||||
for (RangeHighlighter highlighter : myHighlighters) {
|
||||
highlighter.dispose();
|
||||
}
|
||||
myHighlighters.clear();
|
||||
}
|
||||
|
||||
@CalledInAwt
|
||||
protected void destroyInnerHighlighter() {
|
||||
for (RangeHighlighter highlighter : myInnerHighlighters) {
|
||||
highlighter.dispose();
|
||||
}
|
||||
myInnerHighlighters.clear();
|
||||
}
|
||||
|
||||
//
|
||||
// Getters
|
||||
//
|
||||
@@ -53,6 +93,14 @@ public abstract class ThreesideDiffChangeBase {
|
||||
|
||||
public abstract int getEndLine(@NotNull ThreeSide side);
|
||||
|
||||
protected abstract boolean isResolved(@NotNull ThreeSide side);
|
||||
|
||||
@NotNull
|
||||
protected abstract Editor getEditor(@NotNull ThreeSide side);
|
||||
|
||||
@Nullable
|
||||
protected abstract List<MergeWordFragment> getInnerFragments();
|
||||
|
||||
@NotNull
|
||||
public TextDiffType getDiffType() {
|
||||
return myType.getDiffType();
|
||||
@@ -158,6 +206,38 @@ public abstract class ThreesideDiffChangeBase {
|
||||
return fragment.getStartLine(side) == fragment.getEndLine(side);
|
||||
}
|
||||
|
||||
//
|
||||
// Highlighters
|
||||
//
|
||||
|
||||
protected void createHighlighter(@NotNull ThreeSide side) {
|
||||
Editor editor = getEditor(side);
|
||||
|
||||
TextDiffType type = getDiffType();
|
||||
int startLine = getStartLine(side);
|
||||
int endLine = getEndLine(side);
|
||||
|
||||
boolean resolved = isResolved(side);
|
||||
boolean ignored = !resolved && getInnerFragments() != null;
|
||||
boolean shouldHideWithoutLineNumbers = side == ThreeSide.BASE && !isChange(Side.LEFT) && isChange(Side.RIGHT);
|
||||
myHighlighters.addAll(DiffDrawUtil.createHighlighter(editor, startLine, endLine, type, ignored, resolved, shouldHideWithoutLineNumbers));
|
||||
myHighlighters.addAll(DiffDrawUtil.createLineMarker(editor, startLine, endLine, type, resolved));
|
||||
}
|
||||
|
||||
protected void createInnerHighlighter(@NotNull ThreeSide side) {
|
||||
List<MergeWordFragment> innerFragments = getInnerFragments();
|
||||
if (isResolved(side)) return;
|
||||
if (innerFragments == null) return;
|
||||
|
||||
Editor editor = getEditor(side);
|
||||
int start = DiffUtil.getLinesRange(editor.getDocument(), getStartLine(side), getEndLine(side)).getStartOffset();
|
||||
for (MergeWordFragment fragment : innerFragments) {
|
||||
int innerStart = start + fragment.getStartOffset(side);
|
||||
int innerEnd = start + fragment.getEndOffset(side);
|
||||
myInnerHighlighters.addAll(DiffDrawUtil.createInlineHighlighter(editor, innerStart, innerEnd, getDiffType()));
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Helpers
|
||||
//
|
||||
|
||||
+1
-2
@@ -87,8 +87,7 @@ public class DiffPreviewPanel implements PreviewPanel {
|
||||
public void updateView() {
|
||||
List<SimpleThreesideDiffChange> changes = myViewer.getChanges();
|
||||
for (SimpleThreesideDiffChange change : changes) {
|
||||
change.destroyHighlighter();
|
||||
change.installHighlighter();
|
||||
change.reinstallHighlighters();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user