diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java index 89f77c38ed6c..4b5658a86550 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/DetailsPanel.java @@ -48,6 +48,8 @@ import com.intellij.vcs.log.ui.VcsLogColorManager; import com.intellij.vcs.log.ui.frame.CommitPresentationUtil.CommitPresentation; import com.intellij.vcs.log.ui.table.CommitSelectionListener; import com.intellij.vcs.log.ui.table.VcsLogGraphTable; +import com.intellij.vcs.log.util.TroveUtil; +import gnu.trove.TIntHashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -75,7 +77,7 @@ public class DetailsPanel extends JPanel implements EditorColorsListener, Dispos @NotNull private final VcsLogColorManager myColorManager; @NotNull private List mySelection = ContainerUtil.emptyList(); - @NotNull private Set myCommitDetails = Collections.emptySet(); + @NotNull private TIntHashSet myCommitIds = new TIntHashSet(); @Nullable private ProgressIndicator myResolveIndicator = null; public DetailsPanel(@NotNull VcsLogData logData, @@ -254,11 +256,11 @@ public class DetailsPanel extends JPanel implements EditorColorsListener, Dispos unResolvedHashes)); setPresentations(ids, presentations); - Set newCommitDetails = ContainerUtil.newHashSet(detailsList); - if (!ContainerUtil.intersects(myCommitDetails, newCommitDetails)) { + TIntHashSet newCommitDetails = TroveUtil.map2IntSet(detailsList, c -> myLogData.getStorage().getCommitIndex(c.getId(), c.getRoot())); + if (!TroveUtil.intersects(myCommitIds, newCommitDetails)) { myScrollPane.getVerticalScrollBar().setValue(0); } - myCommitDetails = newCommitDetails; + myCommitIds = newCommitDetails; List currentSelection = mySelection; resolveHashes(ids, presentations, unResolvedHashes, o -> currentSelection != mySelection); @@ -316,7 +318,7 @@ public class DetailsPanel extends JPanel implements EditorColorsListener, Dispos myEmptyText.setText(text); myMainContentPanel.removeAll(); mySelection = ContainerUtil.emptyList(); - myCommitDetails = Collections.emptySet(); + myCommitIds = new TIntHashSet(); } } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/util/TroveUtil.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/util/TroveUtil.java index 97a35d2a70b2..45141bb2d049 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/util/TroveUtil.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/util/TroveUtil.java @@ -23,11 +23,9 @@ import gnu.trove.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.function.IntFunction; +import java.util.function.ToIntFunction; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -74,6 +72,18 @@ public class TroveUtil { return createJavaSet(result); } + public static boolean intersects(@NotNull TIntHashSet set1, @NotNull TIntHashSet set2) { + if (set1.size() <= set2.size()) { + return !set1.forEach(value -> { + if (set2.contains(value)) { + return false; + } + return true; + }); + } + return intersects(set2, set1); + } + @Nullable private static TIntHashSet intersect(@Nullable TIntHashSet set1, @Nullable TIntHashSet set2) { if (set1 == null) return set2; @@ -128,6 +138,15 @@ public class TroveUtil { return stream(set).mapToObj(function).collect(Collectors.toList()); } + @NotNull + public static TIntHashSet map2IntSet(@NotNull Collection set, @NotNull ToIntFunction function) { + TIntHashSet result = new TIntHashSet(); + for (T t : set) { + result.add(function.applyAsInt(t)); + } + return result; + } + public static void processBatches(@NotNull IntStream stream, int batchSize, @NotNull ThrowableConsumer consumer)