diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/BaseSingleTaskController.kt b/platform/vcs-log/impl/src/com/intellij/vcs/log/BaseSingleTaskController.kt index cfa28e19f015..a63f4458e998 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/BaseSingleTaskController.kt +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/BaseSingleTaskController.kt @@ -42,7 +42,7 @@ abstract class BaseSingleTaskController(name: String, resultCon } } - protected open fun createProgressIndicator() = EmptyProgressIndicator() + protected open fun createProgressIndicator(): ProgressIndicator = EmptyProgressIndicator() abstract fun process(requests: List, previousResult: Result?): Result } diff --git a/plugins/git4idea/resources/messages/GitBundle.properties b/plugins/git4idea/resources/messages/GitBundle.properties index 76c64c0a4bf3..2a9805538cb0 100644 --- a/plugins/git4idea/resources/messages/GitBundle.properties +++ b/plugins/git4idea/resources/messages/GitBundle.properties @@ -563,6 +563,7 @@ stage.tree.node.unstaged=Not staged for commit stage.tree.node.unmerged=Unmerged stage.tree.node.untracked=Untracked stage.tree.node.ignored=Ignored +stage.loading.status=Loading changes... branches.selected.branches.updated.title=Selected {0,choice,1#branch|2#branches} Updated branches.update.failed=Update Failed diff --git a/plugins/git4idea/src/git4idea/index/GitStageTracker.kt b/plugins/git4idea/src/git4idea/index/GitStageTracker.kt index 2533b76280bf..0e53b28c91aa 100644 --- a/plugins/git4idea/src/git4idea/index/GitStageTracker.kt +++ b/plugins/git4idea/src/git4idea/index/GitStageTracker.kt @@ -2,6 +2,8 @@ package git4idea.index import com.intellij.openapi.Disposable +import com.intellij.openapi.progress.ProgressIndicator +import com.intellij.openapi.progress.util.ProgressIndicatorBase import com.intellij.openapi.project.Project import com.intellij.openapi.vcs.FilePath import com.intellij.openapi.vcs.ProjectLevelVcsManager @@ -19,7 +21,6 @@ import com.intellij.vcs.log.runInEdt import git4idea.GitVcs import git4idea.repo.GitRepositoryManager import git4idea.repo.GitUntrackedFilesHolder -import org.jetbrains.annotations.NotNull import java.util.* import kotlin.collections.HashSet @@ -27,6 +28,9 @@ class GitStageTracker(val project: Project) : Disposable { private val eventDispatcher = EventDispatcher.create(GitStageTrackerListener::class.java) private val singleTaskController = MySingleTaskController() + var isRefreshInProgress = false + private set + @Volatile var state: State = State(emptyMap()) @@ -63,7 +67,7 @@ class GitStageTracker(val project: Project) : Disposable { scheduleUpdateRoots(gitRoots()) } - private fun scheduleUpdateRoots(roots: List<@NotNull VirtualFile>): Boolean { + private fun scheduleUpdateRoots(roots: List): Boolean { if (roots.isNotEmpty()) { singleTaskController.request(Request(roots)) return true @@ -121,9 +125,31 @@ class GitStageTracker(val project: Project) : Disposable { val newState = State(gitState) return previousState?.updatedWith(newState) ?: newState } + + override fun createProgressIndicator(): ProgressIndicator = MyProgressIndicator() + } + + private inner class MyProgressIndicator : ProgressIndicatorBase() { + override fun start() { + super.start() + runInEdt(this@GitStageTracker) { + isRefreshInProgress = true + eventDispatcher.multicaster.progressStarted() + } + } + + override fun stop() { + super.stop() + runInEdt(this@GitStageTracker) { + eventDispatcher.multicaster.progressStopped() + isRefreshInProgress = false + } + } } } interface GitStageTrackerListener : EventListener { fun update() + fun progressStarted() = Unit + fun progressStopped() = Unit } \ No newline at end of file diff --git a/plugins/git4idea/src/git4idea/index/ui/GitStagePanel.kt b/plugins/git4idea/src/git4idea/index/ui/GitStagePanel.kt index 38ab1449473a..cc6a85841a8d 100644 --- a/plugins/git4idea/src/git4idea/index/ui/GitStagePanel.kt +++ b/plugins/git4idea/src/git4idea/index/ui/GitStagePanel.kt @@ -3,12 +3,15 @@ package git4idea.index.ui import com.intellij.openapi.Disposable import com.intellij.openapi.actionSystem.* +import com.intellij.openapi.progress.util.ProgressWindow import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.openapi.vcs.changes.ui.ChangesTree import com.intellij.openapi.vcs.changes.ui.TreeActionsToolbarPanel import com.intellij.ui.ScrollPaneFactory import com.intellij.ui.SideBorder +import com.intellij.vcs.log.ui.frame.ProgressStripe +import git4idea.i18n.GitBundle import git4idea.index.GitStageTracker import git4idea.index.GitStageTrackerListener import java.awt.BorderLayout @@ -21,6 +24,7 @@ internal class GitStagePanel(private val tracker: GitStageTracker, disposablePar private val project = tracker.project private val tree: GitStageTree + private val progressStripe: ProgressStripe private val state: GitStageTracker.State get() = tracker.state @@ -38,10 +42,15 @@ internal class GitStagePanel(private val tracker: GitStageTracker, disposablePar toolbar.setTargetComponent(tree) val scrolledTree = ScrollPaneFactory.createScrollPane(tree, SideBorder.TOP) + progressStripe = ProgressStripe(scrolledTree, this, ProgressWindow.DEFAULT_PROGRESS_DIALOG_POSTPONE_TIME_MILLIS) add(toolbar.component, BorderLayout.NORTH) - add(scrolledTree, BorderLayout.CENTER) + add(progressStripe, BorderLayout.CENTER) tracker.addListener(MyGitStageTrackerListener(), this) + if (tracker.isRefreshInProgress) { + tree.setEmptyText(GitBundle.message("stage.loading.status")) + progressStripe.startLoadingImmediately() + } tracker.scheduleUpdateAll() Disposer.register(disposableParent, this) @@ -68,5 +77,15 @@ internal class GitStagePanel(private val tracker: GitStageTracker, disposablePar override fun update() { this@GitStagePanel.update() } + + override fun progressStarted() { + tree.setEmptyText(GitBundle.message("stage.loading.status")) + progressStripe.startLoading() + } + + override fun progressStopped() { + progressStripe.stopLoading() + tree.setEmptyText("") + } } } \ No newline at end of file