34490bf9409f8d4619d105c1fcc404b79e5f1234
[idea/community.git] / plugins / space / src / main / kotlin / com / intellij / space / vcs / review / SpaceReviewToolWindowFactory.kt
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.space.vcs.review
3
4 import com.intellij.openapi.components.service
5 import com.intellij.openapi.project.DumbAware
6 import com.intellij.openapi.project.Project
7 import com.intellij.openapi.wm.ToolWindow
8 import com.intellij.openapi.wm.ToolWindowFactory
9 import com.intellij.openapi.wm.ex.ToolWindowEx
10 import com.intellij.space.components.SpaceWorkspaceComponent
11 import com.intellij.space.vcs.SpaceProjectContext
12 import libraries.coroutines.extra.LifetimeSource
13 import runtime.reactive.mapInit
14
15 internal class SpaceReviewToolWindowFactory : ToolWindowFactory, DumbAware {
16   private val lifetime: LifetimeSource = LifetimeSource()
17
18   override fun init(toolWindow: ToolWindow) {
19     super.init(toolWindow)
20
21     val project = (toolWindow as ToolWindowEx).project
22
23     val workspace = SpaceWorkspaceComponent.getInstance().workspace
24     val spaceProjectContext = SpaceProjectContext.getInstance(project).context
25     val isToolwindowAvailable = lifetime.mapInit(workspace, spaceProjectContext, false) { ws, context->
26       ws ?: return@mapInit false
27       return@mapInit context.isAssociatedWithSpaceRepository
28     }
29
30     isToolwindowAvailable.forEach(lifetime) { isAvailable ->
31       if (isAvailable && !toolWindow.isAvailable) {
32         toolWindow.isShowStripeButton = true
33       }
34
35       toolWindow.isAvailable = isAvailable
36     }
37   }
38
39   override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
40     toolWindow.setToHideOnEmptyContent(true)
41     val spaceCodeReviewTabManager = project.service<SpaceCodeReviewTabManager>()
42     spaceCodeReviewTabManager.showReviews(toolWindow.contentManager)
43   }
44
45   override fun shouldBeAvailable(project: Project): Boolean =
46     SpaceProjectContext.getInstance(project).context.value.isAssociatedWithSpaceRepository
47
48   override fun isDoNotActivateOnStart(): Boolean = true
49
50   companion object {
51     const val ID = "Space Code Reviews"
52   }
53 }