From 1e4f1611a2e2d47140d05f5dd78bc80d20526476 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Fri, 26 Feb 2016 18:18:05 +0300 Subject: [PATCH] merge: remove duplication --- .../intellij/diff/merge/TextMergeChange.java | 80 ++++------------- .../simple/SimpleThreesideDiffChange.java | 88 ++++++++---------- .../simple/SimpleThreesideDiffViewer.java | 4 +- .../tools/simple/ThreesideDiffChangeBase.java | 90 +++++++++++++++++-- .../diff/impl/settings/DiffPreviewPanel.java | 3 +- 5 files changed, 138 insertions(+), 127 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/merge/TextMergeChange.java b/platform/diff-impl/src/com/intellij/diff/merge/TextMergeChange.java index 423a842ecca7..508f3666906d 100644 --- a/platform/diff-impl/src/com/intellij/diff/merge/TextMergeChange.java +++ b/platform/diff-impl/src/com/intellij/diff/merge/TextMergeChange.java @@ -46,8 +46,6 @@ public class TextMergeChange extends ThreesideDiffChangeBase { @NotNull private final TextMergeViewer myMergeViewer; @NotNull private final TextMergeViewer.MyThreesideViewer myViewer; - @NotNull private final List myHighlighters = new ArrayList(); - @NotNull private final List myInnerHighlighters = new ArrayList(); @NotNull private final List myOperations = new ArrayList(); @@ -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 getInnerFragments() { + return myInnerFragments; + } + @CalledInAwt public void setInnerFragments(@Nullable List 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)); diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java index 16d15988998e..80e7017b5224 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffChange.java @@ -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 myEditors; @NotNull private final MergeLineFragment myFragment; - @NotNull private final List myHighlighters = new ArrayList(); - 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 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 getInnerFragments() { + return myFragment.getInnerFragments(); + } + // // Shift // diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffViewer.java index b199875c4bb0..641666bbb94b 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/SimpleThreesideDiffViewer.java @@ -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(); } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/simple/ThreesideDiffChangeBase.java b/platform/diff-impl/src/com/intellij/diff/tools/simple/ThreesideDiffChangeBase.java index da7d8ad81f7b..5ca68920725c 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/simple/ThreesideDiffChangeBase.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/simple/ThreesideDiffChangeBase.java @@ -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 myHighlighters = new ArrayList(); + @NotNull protected final List myInnerHighlighters = new ArrayList(); public ThreesideDiffChangeBase(@NotNull MergeLineFragment fragment, @NotNull List 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 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 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 // diff --git a/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffPreviewPanel.java b/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffPreviewPanel.java index 9827bbe738bb..52dd7633cb08 100644 --- a/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffPreviewPanel.java +++ b/platform/lang-impl/src/com/intellij/openapi/diff/impl/settings/DiffPreviewPanel.java @@ -87,8 +87,7 @@ public class DiffPreviewPanel implements PreviewPanel { public void updateView() { List changes = myViewer.getChanges(); for (SimpleThreesideDiffChange change : changes) { - change.destroyHighlighter(); - change.installHighlighter(); + change.reinstallHighlighters(); } }