diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java index f1fa256ccf09..eb0b89f53c41 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java @@ -55,8 +55,10 @@ import com.intellij.ui.dualView.DualViewColumnInfo; import com.intellij.ui.dualView.TreeTableView; import com.intellij.ui.speedSearch.SpeedSearchUtil; import com.intellij.ui.table.TableView; -import com.intellij.util.*; -import com.intellij.util.concurrency.SequentialTaskExecutor; +import com.intellij.util.ArrayUtil; +import com.intellij.util.Consumer; +import com.intellij.util.PlatformIcons; +import com.intellij.util.TreeItem; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.text.DateFormatUtil; import com.intellij.util.ui.ColumnInfo; @@ -78,8 +80,6 @@ import java.awt.datatransfer.StringSelection; import java.io.IOException; import java.util.*; import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; import static java.util.Comparator.comparing; import static java.util.Comparator.reverseOrder; @@ -88,7 +88,6 @@ import static java.util.Comparator.reverseOrder; * author: lesya */ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton implements EditorColorsListener, CopyProvider { - private static final ExecutorService ourExecutor = SequentialTaskExecutor.createSequentialApplicationPoolExecutor("File History Refresh"); private static final String COMMIT_MESSAGE_TITLE = VcsBundle.message("label.selected.revision.commit.message"); private static final String VCS_HISTORY_POPUP_ACTION_GROUP = "VcsHistoryInternalGroup.Popup"; private static final String VCS_HISTORY_TOOLBAR_ACTION_GROUP = "VcsHistoryInternalGroup.Toolbar"; @@ -172,35 +171,6 @@ public class FileHistoryPanelImpl extends PanelWithActionsAndCloseButton impleme if (isStaticEmbedded) { setIsStaticAndEmbedded(true); } - - int delayMillis = 20_000; - Alarm updateAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD, this); - // todo react to event? - updateAlarm.addRequest(new Runnable() { - Future lastTask; - - public void run() { - if (lastTask != null) { - lastTask.cancel(false); - } - if (myVcs.getProject().isDisposed()) { - return; - } - - updateAlarm.cancelAllRequests(); - if (updateAlarm.isDisposed()) return; - updateAlarm.addRequest(this, delayMillis); - - if (!ApplicationManager.getApplication().isActive()) return; - - lastTask = ourExecutor.submit(() -> { - if (!updateAlarm.isDisposed() && myHistorySession.shouldBeRefreshed()) { - ApplicationManager.getApplication().invokeLater(() -> myRefresherI.refresh(true)); - } - }); - } - }, delayMillis); - init(); chooseView(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryRefresher.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryRefresher.java index 2c51f552d40b..3593dae81d8c 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryRefresher.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryRefresher.java @@ -15,13 +15,19 @@ */ package com.intellij.openapi.vcs.history; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.impl.VcsBackgroundableActions; +import com.intellij.util.Alarm; +import com.intellij.util.concurrency.SequentialTaskExecutor; import com.intellij.vcs.history.VcsHistoryProviderEx; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; + /** * Refreshes file history. * @@ -29,6 +35,7 @@ import org.jetbrains.annotations.Nullable; * @author Kirill Likhodedov */ public class FileHistoryRefresher implements FileHistoryRefresherI { + private static final ExecutorService ourExecutor = SequentialTaskExecutor.createSequentialApplicationPoolExecutor("File History Refresh"); private final FileHistorySessionPartner mySessionPartner; private final VcsHistoryProvider myVcsHistoryProvider; private final FilePath myPath; @@ -58,6 +65,33 @@ public class FileHistoryRefresher implements FileHistoryRefresherI { myVcs = vcs; myStartingRevisionNumber = startingRevisionNumber; mySessionPartner = new FileHistorySessionPartner(vcsHistoryProvider, path, startingRevisionNumber, vcs, this); + + int delayMillis = 20_000; + Alarm updateAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD, mySessionPartner); + updateAlarm.addRequest(new Runnable() { + Future lastTask; + + public void run() { + if (lastTask != null) { + lastTask.cancel(false); + } + if (myVcs.getProject().isDisposed()) { + return; + } + + updateAlarm.cancelAllRequests(); + if (updateAlarm.isDisposed()) return; + updateAlarm.addRequest(this, delayMillis); + + if (!ApplicationManager.getApplication().isActive()) return; + + lastTask = ourExecutor.submit(() -> { + if (!updateAlarm.isDisposed() && mySessionPartner.shouldBeRefreshed()) { + ApplicationManager.getApplication().invokeLater(() -> refresh(true)); + } + }); + } + }, delayMillis); } @NotNull diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistorySessionPartner.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistorySessionPartner.java index d7d8e85ba11a..2bd56e7b051b 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistorySessionPartner.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistorySessionPartner.java @@ -15,11 +15,13 @@ */ package com.intellij.openapi.vcs.history; +import com.intellij.openapi.Disposable; import com.intellij.openapi.VcsInternalDataKeys; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.MessageType; +import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.FilePath; import com.intellij.openapi.vcs.VcsBundle; @@ -34,6 +36,7 @@ import com.intellij.util.BufferedListConsumer; import com.intellij.util.Consumer; import com.intellij.util.ContentUtilEx; import com.intellij.vcsUtil.VcsUtil; +import org.jetbrains.annotations.CalledInBackground; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,7 +45,7 @@ import java.util.List; import static com.intellij.openapi.vcs.history.FileHistoryPanelImpl.sameHistories; -public class FileHistorySessionPartner implements VcsHistorySessionConsumer { +public class FileHistorySessionPartner implements VcsHistorySessionConsumer, Disposable { @NotNull private final AbstractVcs myVcs; @NotNull private final VcsHistoryProvider myVcsHistoryProvider; @@ -81,6 +84,8 @@ public class FileHistorySessionPartner implements VcsHistorySessionConsumer { consumerRunnable.run(); } }; + + Disposer.register(myFileHistoryPanel, this); } @Nullable @@ -93,6 +98,11 @@ public class FileHistorySessionPartner implements VcsHistorySessionConsumer { return component == null ? null : VcsInternalDataKeys.FILE_HISTORY_REFRESHER.getData((DataProvider)component); } + @CalledInBackground + public boolean shouldBeRefreshed() { + return mySession.shouldBeRefreshed(); + } + public void acceptRevision(VcsFileRevision revision) { myLimitHistoryCheck.checkNumber(); myBuffer.consumeOne(revision); @@ -165,4 +175,8 @@ public class FileHistorySessionPartner implements VcsHistorySessionConsumer { myFileHistoryPanel.finishRefresh(); }); } + + @Override + public void dispose() { + } }