1 package com.atlassian.theplugin.idea; 2 3 import com.atlassian.theplugin.commons.crucible.api.model.CommitType; 4 import com.atlassian.theplugin.idea.crucible.editor.CommentHighlighter; 5 import com.atlassian.theplugin.idea.crucible.editor.OpenDiffAction; 6 import com.intellij.openapi.diff.DiffContent; 7 import com.intellij.openapi.diff.DiffManager; 8 import com.intellij.openapi.diff.DiffRequest; 9 import com.intellij.openapi.diff.DocumentContent; 10 import com.intellij.openapi.diff.FileContent; 11 import com.intellij.openapi.editor.Document; 12 import com.intellij.openapi.editor.impl.DocumentImpl; 13 import com.intellij.openapi.fileEditor.OpenFileDescriptor; 14 import com.intellij.openapi.fileTypes.FileTypeManager; 15 import com.intellij.openapi.project.Project; 16 import com.intellij.openapi.ui.Messages; 17 import com.intellij.openapi.vfs.VirtualFile; 18 import org.jetbrains.annotations.NotNull; 19 20 public abstract class AbstractOpenDiffToolAction implements OpenDiffAction { 21 private final Document emptyDocument = new DocumentImpl(""); 22 private final Project project; 23 protected final String filename; 24 protected final String fromRevision; 25 protected final String toRevision; 26 27 public AbstractOpenDiffToolAction(final Project project, final String filename, final String fromRevision, 28 final String toRevision) { 29 this.project = project; 30 this.filename = filename; 31 this.fromRevision = fromRevision; 32 this.toRevision = toRevision; 33 } 34 35 protected Project getProject() { 36 return project; 37 } 38 39 @NotNull 40 private DiffContent createDiffContent(@NotNull final Project aProject, @NotNull final VirtualFile virtualFile) { 41 if (!FileTypeManager.getInstance().getFileTypeByFile(virtualFile).isBinary()) { 42 return new FileContent(aProject, virtualFile); 43 } else { 44 return IdeaVersionFacade.getInstance().createBinaryContent(virtualFile); 45 } 46 } 47 48 public void run(OpenFileDescriptor displayFile, VirtualFile referenceFile, final CommitType commitType) { 49 Document displayDocument = emptyDocument; 50 Document referenceDocument = emptyDocument; 51 displayDocument.setReadOnly(true); 52 referenceDocument.setReadOnly(true); 53 DiffContent displayFileContent = null; 54 if (displayFile != null) { 55 displayFileContent = createDiffContent(project, displayFile.getFile()); 56 if (displayFileContent != null) { 57 displayDocument = displayFileContent.getDocument(); 58 } 59 } 60 61 DiffContent referenceFileContent = null; 62 if (referenceFile != null) { 63 referenceFileContent = createDiffContent(project, referenceFile); 64 if (referenceFileContent != null) { 65 referenceDocument = referenceFileContent.getDocument(); 66 } 67 } 68 69 if ((displayFileContent != null && displayFileContent.isBinary()) 70 || (referenceFileContent != null && referenceFileContent.isBinary())) { 71 Messages.showInfoMessage(project, "Files are binary. Diff not available.", "Information"); 72 return; 73 } 74 75 final DocumentContent displayDocumentContentFinal = new DocumentContent(project, displayDocument); 76 final DocumentContent referenceDocumentContentFinal = new DocumentContent(project, referenceDocument); 77 78 if (!displayDocument.equals(emptyDocument)) { 79 displayDocumentContentFinal.getDocument().putUserData(CommentHighlighter.CRUCIBLE_DATA_KEY, true); 80 referenceDocumentContentFinal.getDocument().putUserData(CommentHighlighter.CRUCIBLE_DATA_KEY, false); 81 } else { 82 if (!referenceDocumentContentFinal.equals(emptyDocument)) { 83 referenceDocumentContentFinal.getDocument().putUserData(CommentHighlighter.CRUCIBLE_DATA_KEY, true); 84 displayDocumentContentFinal.getDocument().putUserData(CommentHighlighter.CRUCIBLE_DATA_KEY, false); 85 } 86 } 87 88 DiffRequest request = getDiffRequest(project, referenceDocumentContentFinal, displayDocumentContentFinal); 89 DiffManager.getInstance().getDiffTool().show(request); 90 } 91 92 protected abstract DiffRequest getDiffRequest(final Project aProject, final DocumentContent referenceDoc, 93 final DocumentContent displayDoc); 94 }