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.GitConflictsUtil.showMergeWindow
13 import git4idea.i18n.GitBundle
14 import git4idea.index.ui.createMergeHandler
15 import git4idea.repo.GitRepositoryManager
17 class GitChangesViewNodeAction(val project: Project) : ChangesViewNodeAction {
18 override fun createNodeHoverIcon(node: ChangesBrowserNode<*>): HoverIcon? {
19 val change = node.userObject as? Change ?: return null
20 if (change.fileStatus != FileStatus.MERGED_WITH_CONFLICTS) return null
22 val path = ChangesUtil.getFilePath(change)
23 val stagingAreaHolder = GitRepositoryManager.getInstance(project).getRepositoryForFileQuick(path)?.stagingAreaHolder
24 if (stagingAreaHolder?.findConflict(path) == null) return null
26 return GitMergeHoverIcon(project)
29 private data class GitMergeHoverIcon(val project: Project)
30 : HoverIcon(AllIcons.Vcs.Merge, GitBundle.message("changes.view.merge.action.text")) {
31 override fun invokeAction(node: ChangesBrowserNode<*>) {
32 val change = node.userObject as? Change ?: return
34 val path = ChangesUtil.getFilePath(change)
35 val stagingAreaHolder = GitRepositoryManager.getInstance(project).getRepositoryForFileQuick(path)?.stagingAreaHolder
36 val conflict = stagingAreaHolder?.findConflict(path) ?: return
38 showMergeWindow(project, createMergeHandler(project), listOf(conflict))