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 b7eb190ba3b0..423a842ecca7 100644 --- a/platform/diff-impl/src/com/intellij/diff/merge/TextMergeChange.java +++ b/platform/diff-impl/src/com/intellij/diff/merge/TextMergeChange.java @@ -73,11 +73,13 @@ public class TextMergeChange extends ThreesideDiffChangeBase { myEndLine = myFragment.getEndLine(ThreeSide.BASE); installHighlighter(); + installOperations(); } @CalledInAwt public void destroy() { destroyHighlighter(); + destroyOperations(); destroyInnerHighlighter(); } @@ -88,8 +90,6 @@ public class TextMergeChange extends ThreesideDiffChangeBase { createHighlighter(ThreeSide.BASE); if (getType().isLeftChange()) createHighlighter(ThreeSide.LEFT); if (getType().isRightChange()) createHighlighter(ThreeSide.RIGHT); - - doInstallActionHighlighters(); } @CalledInAwt @@ -107,11 +107,6 @@ public class TextMergeChange extends ThreesideDiffChangeBase { highlighter.dispose(); } myHighlighters.clear(); - - for (MyGutterOperation operation : myOperations) { - operation.dispose(); - } - myOperations.clear(); } @CalledInAwt @@ -127,6 +122,9 @@ public class TextMergeChange extends ThreesideDiffChangeBase { destroyHighlighter(); installHighlighter(); + destroyOperations(); + installOperations(); + myViewer.repaintDividers(); } @@ -281,13 +279,21 @@ public class TextMergeChange extends ThreesideDiffChangeBase { // Gutter actions // - private void doInstallActionHighlighters() { + private void installOperations() { ContainerUtil.addIfNotNull(myOperations, createOperation(ThreeSide.LEFT, OperationType.APPLY)); ContainerUtil.addIfNotNull(myOperations, createOperation(ThreeSide.LEFT, OperationType.IGNORE)); ContainerUtil.addIfNotNull(myOperations, createOperation(ThreeSide.RIGHT, OperationType.APPLY)); ContainerUtil.addIfNotNull(myOperations, createOperation(ThreeSide.RIGHT, OperationType.IGNORE)); } + @CalledInAwt + private void destroyOperations() { + for (MyGutterOperation operation : myOperations) { + operation.dispose(); + } + myOperations.clear(); + } + @Nullable private MyGutterOperation createOperation(@NotNull ThreeSide side, @NotNull OperationType type) { if (isResolved(side)) return null; 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 3aa66e6652fa..16d15988998e 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 @@ -52,6 +52,10 @@ public class SimpleThreesideDiffChange extends ThreesideDiffChangeBase { 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() { @@ -69,22 +73,25 @@ public class SimpleThreesideDiffChange extends ThreesideDiffChangeBase { Editor editor = side.select(myEditors); TextDiffType type = getDiffType(); - int startLine = myFragment.getStartLine(side); - int endLine = myFragment.getEndLine(side); - boolean hasInner = myFragment.getInnerFragments() != null; - - int start = DiffUtil.getLinesRange(editor.getDocument(), startLine, endLine).getStartOffset(); + 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, hasInner, false, shouldHideWithoutLineNumbers)); + myHighlighters.addAll(DiffDrawUtil.createHighlighter(editor, startLine, endLine, type, ignored, false, shouldHideWithoutLineNumbers)); myHighlighters.addAll(DiffDrawUtil.createLineMarker(editor, startLine, endLine, type, false)); + } - if (hasInner) { - for (MergeWordFragment innerFragment : myFragment.getInnerFragments()) { - int startOffset = innerFragment.getStartOffset(side); - int endOffset = innerFragment.getEndOffset(side); - myHighlighters.addAll(DiffDrawUtil.createInlineHighlighter(editor, start + startOffset, start + endOffset, type)); - } + 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())); } }