From f58e130218bc03d09e66e6b890ed174da7ce008d Mon Sep 17 00:00:00 2001 From: Julia Beliaeva Date: Sun, 31 Jul 2016 08:12:12 +0300 Subject: [PATCH] [vcs-log] update details & changes later for faster keyboard scrolling When user moves through the table with arrows, each time selection is deleted and than added at a new row. To avoid updating details and changes twice each key press, update them later with expiring condition. --- .../log/ui/frame/CommitSelectionListener.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/CommitSelectionListener.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/CommitSelectionListener.java index 50980ee82d2d..b7e28671f204 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/CommitSelectionListener.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/ui/frame/CommitSelectionListener.java @@ -16,6 +16,7 @@ package com.intellij.vcs.log.ui.frame; import com.google.common.primitives.Ints; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.progress.ProgressIndicator; @@ -36,6 +37,7 @@ public abstract class CommitSelectionListener implements ListSelectionListener { @NotNull private final VcsLogGraphTable myGraphTable; @NotNull private final JBLoadingPanel myLoadingPanel; + @Nullable private ListSelectionEvent myLastEvent; @Nullable private ProgressIndicator myLastRequest; protected CommitSelectionListener(@NotNull VcsLogData data, @NotNull VcsLogGraphTable table, @NotNull JBLoadingPanel panel) { @@ -48,9 +50,14 @@ public abstract class CommitSelectionListener implements ListSelectionListener { public void valueChanged(@Nullable ListSelectionEvent event) { if (event != null && event.getValueIsAdjusting()) return; + myLastEvent = event; if (myLastRequest != null) myLastRequest.cancel(); myLastRequest = null; + ApplicationManager.getApplication().invokeLater(this::processEvent, o -> myLastEvent != event); + } + + public void processEvent() { int rows = myGraphTable.getSelectedRowCount(); if (rows < 1) { myLoadingPanel.stopLoading(); @@ -66,14 +73,14 @@ public abstract class CommitSelectionListener implements ListSelectionListener { List selectionToLoad = getSelectionToLoad(); myLogData.getCommitDetailsGetter() .loadCommitsData(myGraphTable.getModel().convertToCommitIds(selectionToLoad), detailsList -> { - if (myLastRequest == indicator && !(indicator.isCanceled())) { - LOG.assertTrue(selectionToLoad.size() == detailsList.size(), - "Loaded incorrect number of details " + detailsList + " for selection " + selectionToLoad); - myLastRequest = null; - onDetailsLoaded(detailsList); - myLoadingPanel.stopLoading(); - } - }, indicator); + if (myLastRequest == indicator && !(indicator.isCanceled())) { + LOG.assertTrue(selectionToLoad.size() == detailsList.size(), + "Loaded incorrect number of details " + detailsList + " for selection " + selectionToLoad); + myLastRequest = null; + onDetailsLoaded(detailsList); + myLoadingPanel.stopLoading(); + } + }, indicator); } }