correctly update RC icon on enter/exit dumb mode (move set call from IconDeferrer handler)

This commit is contained in:
Vladimir Krivosheev
2017-04-24 15:31:52 +02:00
parent 8f5910802b
commit deac4f03dc
2 changed files with 49 additions and 41 deletions
@@ -123,6 +123,7 @@ open class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persi
private val schemeManagerProvider = SchemeManagerIprProvider("configuration")
@Suppress("LeakingThis")
private val workspaceSchemeManager = SchemeManagerFactory.getInstance(project).create("workspace", RunConfigurationSchemeManager(this, false), streamProvider = schemeManagerProvider, autoSave = false)
internal var projectSchemeManager: SchemeManager<RunnerAndConfigurationSettingsImpl>? = null
@@ -853,20 +854,16 @@ open class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persi
}
override fun getConfigurationIcon(settings: RunnerAndConfigurationSettings, withLiveIndicator: Boolean): Icon {
val uniqueID = settings.uniqueID
val selectedConfiguration = selectedConfiguration
val selectedId = if (selectedConfiguration != null) selectedConfiguration.uniqueID else ""
if (selectedId == uniqueID) {
iconCache.checkValidity(uniqueID)
val uniqueId = settings.uniqueID
if (selectedConfiguration?.uniqueID == uniqueId) {
iconCache.checkValidity(uniqueId)
}
var icon = iconCache.get(uniqueID, settings, project)
var icon = iconCache.get(uniqueId, settings, project)
if (withLiveIndicator) {
val runningDescriptors = ExecutionManagerImpl.getInstance(project).getRunningDescriptors { it === settings }
if (runningDescriptors.size == 1) {
icon = ExecutionUtil.getLiveIndicator(icon)
}
if (runningDescriptors.size > 1) {
icon = IconUtil.addText(icon, runningDescriptors.size.toString())
when {
runningDescriptors.size == 1 -> icon = ExecutionUtil.getLiveIndicator(icon)
runningDescriptors.size > 1 -> icon = IconUtil.addText(icon, runningDescriptors.size.toString())
}
}
return icon
@@ -1108,6 +1105,7 @@ open class RunManagerImpl(internal val project: Project) : RunManagerEx(), Persi
settings.schemeManager?.removeScheme(settings as RunnerAndConfigurationSettingsImpl)
recentlyUsedTemporaries.remove(settings)
removed.add(settings)
iconCache.remove(settings.uniqueID)
}
else {
var isChanged = false
@@ -40,51 +40,61 @@ class TimedIconCache {
fun remove(id: String) {
lock.write {
idToIcon.remove(id)
iconCheckTimes.remove(id)
iconCalcTime.remove(id)
}
}
fun get(id: String, settings: RunnerAndConfigurationSettings, project: Project): Icon {
return lock.read { idToIcon.get(id) } ?: IconDeferrer.getInstance().deferAutoUpdatable(settings.configuration?.icon, project.hashCode() xor settings.hashCode()) { param ->
if (project.isDisposed) {
return@deferAutoUpdatable null
return lock.read { idToIcon.get(id) } ?: lock.write {
idToIcon.get(id)?.let {
return it
}
lock.write {
iconCalcTime.remove(id)
}
val startTime = System.currentTimeMillis()
var icon: Icon
if (DumbService.isDumb(project) && !Registry.`is`("dumb.aware.run.configurations")) {
icon = IconLoader.getDisabledIcon(ProgramRunnerUtil.getRawIcon(settings))!!
if (settings.isTemporary) {
icon = ProgramRunnerUtil.getTemporaryIcon(icon)
val icon = IconDeferrer.getInstance().deferAutoUpdatable(settings.configuration.icon, project.hashCode() xor settings.hashCode()) {
if (project.isDisposed) {
return@deferAutoUpdatable null
}
}
else {
try {
DumbService.getInstance(project).isAlternativeResolveEnabled = true
settings.checkSettings()
icon = ProgramRunnerUtil.getConfigurationIcon(settings, false)
lock.write {
iconCalcTime.remove(id)
}
catch (e: IndexNotReadyException) {
icon = ProgramRunnerUtil.getConfigurationIcon(settings, !Registry.`is`("dumb.aware.run.configurations"))
val startTime = System.currentTimeMillis()
var icon: Icon
if (DumbService.isDumb(project) && !Registry.`is`("dumb.aware.run.configurations")) {
icon = IconLoader.getDisabledIcon(ProgramRunnerUtil.getRawIcon(settings))!!
if (settings.isTemporary) {
icon = ProgramRunnerUtil.getTemporaryIcon(icon)
}
}
catch (ignored: RuntimeConfigurationException) {
icon = ProgramRunnerUtil.getConfigurationIcon(settings, true)
else {
try {
DumbService.getInstance(project).isAlternativeResolveEnabled = true
settings.checkSettings()
icon = ProgramRunnerUtil.getConfigurationIcon(settings, false)
}
catch (e: IndexNotReadyException) {
icon = ProgramRunnerUtil.getConfigurationIcon(settings, !Registry.`is`("dumb.aware.run.configurations"))
}
catch (ignored: RuntimeConfigurationException) {
icon = ProgramRunnerUtil.getConfigurationIcon(settings, true)
}
finally {
DumbService.getInstance(project).isAlternativeResolveEnabled = false
}
}
finally {
DumbService.getInstance(project).isAlternativeResolveEnabled = false
lock.write {
iconCalcTime.put(id, System.currentTimeMillis() - startTime)
}
}
lock.write {
iconCalcTime.put(id, System.currentTimeMillis() - startTime)
set(id, icon)
icon
}
set(id, icon)
icon
}
}