1 // Copyright 2000-2021 JetBrains s.r.o. and contributors. 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.openapi.vcs.changes.ui
4 import com.intellij.ide.actions.ToolWindowEmptyStateAction.rebuildContentUi
5 import com.intellij.ide.actions.ToolWindowEmptyStateAction.setEmptyStateBackground
6 import com.intellij.openapi.actionSystem.ActionGroup
7 import com.intellij.openapi.actionSystem.ActionManager
8 import com.intellij.openapi.actionSystem.ActionToolbar
9 import com.intellij.openapi.project.Project
10 import com.intellij.openapi.vcs.VcsBundle.message
11 import com.intellij.openapi.vcs.changes.ui.ChangesViewContentManager.Companion.COMMIT_TOOLWINDOW_ID
12 import com.intellij.openapi.wm.ToolWindow
13 import com.intellij.openapi.wm.ToolWindowManager
14 import com.intellij.openapi.wm.ex.ToolWindowEx
16 private class ChangesViewToolWindowFactory : VcsToolWindowFactory() {
17 override fun init(window: ToolWindow) {
20 window as ToolWindowEx
21 window.setAdditionalGearActions(ActionManager.getInstance().getAction("LocalChangesView.GearActions") as ActionGroup)
23 setEmptyStateBackground(window)
24 window.emptyText?.setChangesViewEmptyState(window.project)
27 override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
28 super.createToolWindowContent(project, toolWindow)
30 if (toolWindow.contentManager.isEmpty) rebuildContentUi(toolWindow) // to show id label
33 override fun updateState(project: Project, toolWindow: ToolWindow) {
34 super.updateState(project, toolWindow)
35 toolWindow.stripeTitle = project.vcsManager.allActiveVcss.singleOrNull()?.displayName ?: ChangesViewContentManager.TOOLWINDOW_ID
39 private class CommitToolWindowFactory : VcsToolWindowFactory() {
40 override fun init(window: ToolWindow) {
43 window as ToolWindowEx
44 window.setAdditionalGearActions(ActionManager.getInstance().getAction("CommitView.GearActions") as ActionGroup)
46 setEmptyStateBackground(window)
47 window.emptyText?.setCommitViewEmptyState(window.project)
48 window.hideIdLabelIfNotEmptyState()
51 override fun shouldBeAvailable(project: Project): Boolean =
52 project.vcsManager.hasAnyMappings() && project.isCommitToolWindowShown
54 override fun createToolWindowContent(project: Project, toolWindow: ToolWindow) {
55 super.createToolWindowContent(project, toolWindow)
57 if (toolWindow.contentManager.isEmpty) rebuildContentUi(toolWindow) // to show id label
61 internal class SwitchToCommitDialogHint(toolWindow: ToolWindowEx, toolbar: ActionToolbar) : ChangesViewContentManagerListener {
63 private val actionToolbarTooltip =
64 ActionToolbarGotItTooltip("changes.view.toolwindow", message("switch.to.commit.dialog.hint.text"),
65 toolWindow.disposable, toolbar, gearButtonOrToolbar)
67 toolWindow.project.messageBus.connect(actionToolbarTooltip.tooltipDisposable).subscribe(ChangesViewContentManagerListener.TOPIC, this)
70 override fun toolWindowMappingChanged() = actionToolbarTooltip.hideHint(true)
73 fun install(project: Project) {
74 val toolWindow = ToolWindowManager.getInstance(project).getToolWindow(COMMIT_TOOLWINDOW_ID) as? ToolWindowEx ?: return
75 val toolbar = toolWindow.decorator.headerToolbar ?: return
77 SwitchToCommitDialogHint(toolWindow, toolbar)