in plugin-bazel/src/main/kotlin/org/jetbrains/bazel/ui/widgets/tool/window/all/targets/BazelAllTargetsWidgetFactory.kt [55:97]
override suspend fun manage(toolWindow: ToolWindow, toolWindowManager: ToolWindowManager) {
coroutineScope {
launch(Dispatchers.EDT) {
// double-check again
val isBazelProject = toolWindow.project.serviceAsync<BazelProjectProperties>().isBazelProject
toolWindow.setAvailable(isBazelProject)
if (isBazelProject && !toolWindowManager.isStripeButtonShow(toolWindow)) {
// the only way to force adding a stripe button is to show the tool window, due to a platform API limitation
toolWindow.show()
}
}
contentRequested.acquire()
val project = toolWindow.project
val updateRequests = MutableSharedFlow<Unit>(replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST)
val model = BazelTargetsPanelModel(updateRequests)
val actionManager = serviceAsync<ActionManager>()
val targetPanel =
async(Dispatchers.EDT) {
val windowPanel = SimpleToolWindowPanel(true, true)
configureBazelToolWindowToolBar(model, actionManager, windowPanel, project)
val panel = BazelTargetsPanel(project, model)
windowPanel.setContent(panel)
val content = toolWindow.contentManager.getContent(0)!!
val loadingPanel = content.component as JBLoadingPanel
loadingPanel.stopLoading()
content.component = windowPanel
panel
}
val targetUtils = project.serviceAsync<TargetUtils>()
// update immediately, avoid any delays
updateVisibleTargets(targetUtils = targetUtils, project = project, model = model, targetPanel = targetPanel)
merge(targetUtils.targetListUpdated, updateRequests)
.throttle(300)
.collectLatest {
updateVisibleTargets(targetUtils = targetUtils, project = project, model = model, targetPanel = targetPanel)
}
}
}