1 // Copyright 2000-2021 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.
4 import com.intellij.icons.AllIcons
5 import com.intellij.openapi.project.Project
6 import com.intellij.openapi.vcs.FileStatus
7 import com.intellij.openapi.vcs.changes.Change
8 import com.intellij.openapi.vcs.changes.ChangesUtil
9 import com.intellij.openapi.vcs.changes.ChangesViewNodeAction
10 import com.intellij.openapi.vcs.changes.ui.ChangesBrowserNode
11 import com.intellij.openapi.vcs.changes.ui.HoverIcon
12 import git4idea.conflicts.showMergeWindow
13 import git4idea.i18n.GitBundle
14 import git4idea.index.ui.createMergeHandler
15 import git4idea.index.ui.isReversedRoot
16 import git4idea.repo.GitRepositoryManager
18 class GitChangesViewNodeAction(val project: Project) : ChangesViewNodeAction {
19 override fun createNodeHoverIcon(node: ChangesBrowserNode<*>): HoverIcon? {
20 val change = node.userObject as? Change ?: return null
21 if (change.fileStatus != FileStatus.MERGED_WITH_CONFLICTS) return null
23 val path = ChangesUtil.getFilePath(change)
24 val stagingAreaHolder = GitRepositoryManager.getInstance(project).getRepositoryForFileQuick(path)?.stagingAreaHolder
25 if (stagingAreaHolder?.findConflict(path) == null) return null
27 return GitMergeHoverIcon(project)
30 private data class GitMergeHoverIcon(val project: Project)
31 : HoverIcon(AllIcons.Vcs.Merge, GitBundle.message("changes.view.merge.action.text")) {
32 override fun invokeAction(node: ChangesBrowserNode<*>) {
33 val change = node.userObject as? Change ?: return
35 val path = ChangesUtil.getFilePath(change)
36 val stagingAreaHolder = GitRepositoryManager.getInstance(project).getRepositoryForFileQuick(path)?.stagingAreaHolder
37 val conflict = stagingAreaHolder?.findConflict(path) ?: return
39 showMergeWindow(project, createMergeHandler(project), listOf(conflict), project::isReversedRoot)