override suspend fun manage()

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)
        }
    }
  }