View Javadoc

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  }