merge: remove duplication

This commit is contained in:
Aleksey Pivovarov
2016-03-03 17:49:47 +03:00
parent 043cc83725
commit 1e4f1611a2
5 changed files with 138 additions and 127 deletions
@@ -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));
@@ -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
//
@@ -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
//
@@ -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();
}
}