From f2a6d145e0ce87f38b6de045abc6f7cd5c09ae14 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Sun, 22 Jul 2012 14:56:27 +0400 Subject: [PATCH] [diff/merge] IDEA-59513 scroll to the first conflicting change after applying "all non-conflicting changes" Let LineBlocks#getBeginnings return only applied changes, and use this method to scroll in the merge tool to ignore applied changes when scrolling to the first change. --- .../ui/ApplyNonConflicts.java | 10 +++++- .../impl/incrementalMerge/ui/MergePanel2.java | 4 +-- .../diff/impl/splitter/LineBlocks.java | 33 ++++++++++++++----- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/ApplyNonConflicts.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/ApplyNonConflicts.java index 8316b865e9cf..3449f490415b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/ApplyNonConflicts.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/ApplyNonConflicts.java @@ -22,17 +22,22 @@ import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.diff.DiffBundle; import com.intellij.openapi.diff.impl.incrementalMerge.Change; import com.intellij.openapi.diff.impl.incrementalMerge.MergeList; +import com.intellij.openapi.diff.impl.util.DiffPanelOuterComponent; import com.intellij.openapi.project.DumbAware; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.FilteringIterator; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ApplyNonConflicts extends AnAction implements DumbAware { - public ApplyNonConflicts() { + @Nullable private final DiffPanelOuterComponent myDiffPanel; + + public ApplyNonConflicts(@Nullable DiffPanelOuterComponent diffPanel) { super(DiffBundle.message("merge.dialog.apply.all.non.conflicting.changes.action.name"), null, AllIcons.Diff.ApplyNotConflicts); + myDiffPanel = diffPanel; } public void actionPerformed(AnActionEvent e) { @@ -41,6 +46,9 @@ public class ApplyNonConflicts extends AnAction implements DumbAware { for (Change change : notConflicts) { Change.apply(change, MergeList.BRANCH_SIDE); } + if (myDiffPanel != null) { + myDiffPanel.requestScrollEditors(); + } } public void update(AnActionEvent e) { diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/MergePanel2.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/MergePanel2.java index d7015c24be79..bfe6fea6f4e8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/MergePanel2.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/MergePanel2.java @@ -145,7 +145,7 @@ public class MergePanel2 implements DiffViewer { toolbar.addAction(new OpenPartialDiffAction(1, 2, AllIcons.Diff.RightDiff)); toolbar.addAction(new OpenPartialDiffAction(0, 2, AllIcons.Diff.BranchDiff)); toolbar.addSeparator(); - toolbar.addAction(new ApplyNonConflicts()); + toolbar.addAction(new ApplyNonConflicts(myPanel)); toolbar.addSeparator(); toolbar.addAction(new MergeToolSettingsAction(getEditors())); } @@ -414,7 +414,7 @@ public class MergePanel2 implements DiffViewer { private int[] getPrimaryBeginnings(DiffDividerPaint paint) { FragmentSide primarySide = paint.getLeftSide(); LOG.assertTrue(getEditor(1) == paint.getSides().getEditor(primarySide)); - return paint.getSides().getLineBlocks().getBeginnings(primarySide); + return paint.getSides().getLineBlocks().getBeginnings(primarySide, true); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/splitter/LineBlocks.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/splitter/LineBlocks.java index ad7ea57443f1..22ce1f403eb8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/splitter/LineBlocks.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/splitter/LineBlocks.java @@ -22,7 +22,7 @@ import com.intellij.openapi.diff.impl.highlighting.FragmentSide; import com.intellij.openapi.diff.impl.incrementalMerge.Change; import com.intellij.openapi.diff.impl.incrementalMerge.ChangeList; import com.intellij.openapi.diff.impl.util.TextDiffType; -import com.intellij.util.containers.IntArrayList; +import com.intellij.util.ArrayUtil; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -61,16 +61,33 @@ public class LineBlocks { return getBeginnings(FragmentSide.SIDE1).length; } + /** + * Get beginnings of all the changes from the specified side. + * @param side Side of the changes. + */ public int[] getBeginnings(FragmentSide side) { - IntArrayList result = new IntArrayList(getIntervals(side).length); + return getBeginnings(side, false); + } + + /** + * Get beginnings of the changes from the specified side. + * @param side Side of the changes. + * @param unappliedOnly If true - only unapplied changes will be considered, if false - all changes (both applied and not applied). + */ + public int[] getBeginnings(FragmentSide side, boolean unappliedOnly) { + List result = new ArrayList(myDiffs.size()); int previousBeginning = Integer.MIN_VALUE; - Interval[] sideIntervals = getIntervals(side); - for (Interval sideInterval : sideIntervals) { - int start = sideInterval.getStart(); - if (start != previousBeginning) result.add(start); - previousBeginning = start; + + for (Diff diff : myDiffs) { + if (!unappliedOnly || !diff.getDiffType().isApplied()) { + Interval interval = diff.getInterval(side); + int start = interval.getStart(); + if (start != previousBeginning) result.add(start); + previousBeginning = start; + } } - return result.toArray(); + + return ArrayUtil.toIntArray(result); } static int getMaxStartedIndex(Interval[] intervals, int start) {