1+ package cc.unitmesh.devti.diff.view
2+
3+ import com.intellij.diff.DiffContentFactory
4+ import com.intellij.diff.DiffManager
5+ import com.intellij.diff.contents.DiffContent
6+ import com.intellij.diff.requests.SimpleDiffRequest
7+ import com.intellij.openapi.components.Service
8+ import com.intellij.openapi.components.service
9+ import com.intellij.openapi.diagnostic.Logger
10+ import com.intellij.openapi.fileTypes.FileTypeManager
11+ import com.intellij.openapi.project.Project
12+ import com.intellij.openapi.vcs.changes.Change
13+ import com.intellij.openapi.vfs.VirtualFileManager
14+ import javax.swing.SwingUtilities
15+
16+ @Service(Service .Level .PROJECT )
17+ class DiffViewerService (private val project : Project ) {
18+
19+ private val logger= Logger .getInstance(DiffViewerService ::class .java)
20+
21+ fun openStandaloneCommitDiffPreview (change : Change ,enableStaging : Boolean = true) {
22+ SwingUtilities .invokeLater {
23+ val standalonePreview= StandaloneEditorTabDiffPreview (project, change, enableStaging, logger)
24+ standalonePreview.performDiffAction()
25+ }
26+ }
27+
28+ fun openStaticFileDiff (filePath : String ,originalContent : String ,modifiedContent : String ) {
29+ val diffFactory= DiffContentFactory .getInstance()
30+ val fileType= FileTypeManager .getInstance().getFileTypeByFileName(filePath)
31+ val fileName= filePath.substringAfterLast(' /' )
32+ val virtualFile= VirtualFileManager .getInstance().findFileByUrl(" file://$filePath " )
33+
34+ val originalDiffContent: DiffContent = if (virtualFile!= null ) {
35+ diffFactory.create(project, originalContent, virtualFile)
36+ }else {
37+ diffFactory.create(project, originalContent, fileType)
38+ }
39+
40+ val modifiedDiffContent: DiffContent = if (virtualFile!= null ) {
41+ diffFactory.create(project, modifiedContent, virtualFile)
42+ }else {
43+ diffFactory.create(project, modifiedContent, fileType)
44+ }
45+
46+ val diffRequest= SimpleDiffRequest (
47+ " Review Code Changes" ,
48+ originalDiffContent,
49+ modifiedDiffContent,
50+ " $fileName (Original)" ,
51+ " $fileName (Augmented)"
52+ )
53+
54+ SwingUtilities .invokeLater {
55+ DiffManager .getInstance().showDiff(project, diffRequest)
56+ }
57+ }
58+
59+ private fun checkFilesMatchIgnoringBom (content1 : String ,content2 : String ):Boolean {
60+ val content1NoBom= content1.removePrefix(" \uFEFF " )
61+ val content2NoBom= content2.removePrefix(" \uFEFF " )
62+ return content1NoBom.length== content2NoBom.length&& content1NoBom== content2NoBom
63+ }
64+
65+ companion object {
66+ fun getInstance (project : Project ):DiffViewerService = project.service()
67+ }
68+ }