From 1d56f44093f4b65fe3fb5319d9f66ba91285c0f1 Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Fri, 15 Feb 2019 11:14:52 +0300 Subject: [PATCH] Show progress for loading script dependencies even show notification is true when there are more than 3 scripts in queue We are trying to update script dependencies silently when 'Reload script dependencies on file change' is off, but in case when the queue for update is too long we need to make process visible to user and make it cancelable. --- .../AsyncScriptDependenciesLoader.kt | 44 +++++++++++++++---- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt index a2059cca3e8..2d09ddd0650 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/script/dependencies/AsyncScriptDependenciesLoader.kt @@ -96,26 +96,51 @@ class AsyncScriptDependenciesLoader internal constructor(project: Project) : Scr private inner class LoaderBackgroundTask { private val sequenceOfFiles: ConcurrentLinkedQueue = ConcurrentLinkedQueue() + private var forceStop : Boolean = false + private var startedSilently : Boolean = false private var onFinish: (() -> Unit)? = null fun start() { if (shouldShowNotification()) { - BackgroundTaskUtil.executeOnPooledThread(project, Runnable { - loadDependencies(null) - }) + startSilently() } else { - object : Task.Backgroundable(project, "Kotlin: Loading script dependencies...", true) { - override fun run(indicator: ProgressIndicator) { - loadDependencies(indicator) - } - - }.queue() + startWithProgress() } } + private fun restartWithProgress() { + forceStop = true + startWithProgress() + forceStop = false + } + + private fun startSilently() { + startedSilently = true + BackgroundTaskUtil.executeOnPooledThread(project, Runnable { + loadDependencies(EmptyProgressIndicator()) + }) + } + + private fun startWithProgress() { + startedSilently = false + object : Task.Backgroundable(project, "Kotlin: Loading script dependencies...", true) { + override fun run(indicator: ProgressIndicator) { + loadDependencies(indicator) + } + + }.queue() + } + fun addTask(file: VirtualFile) { + if (sequenceOfFiles.contains(file)) return + sequenceOfFiles.add(file) + + // If the queue is longer than 3, show progress and cancel button + if (sequenceOfFiles.size > 3 && startedSilently) { + restartWithProgress() + } } fun addOnFinishTask(task: () -> Unit) { @@ -124,6 +149,7 @@ class AsyncScriptDependenciesLoader internal constructor(project: Project) : Scr private fun loadDependencies(indicator: ProgressIndicator?) { while (true) { + if (forceStop) return if (indicator?.isCanceled == true || sequenceOfFiles.isEmpty()) { lock.write { onFinish?.invoke()