diff: add annotate action to diff viewers
[idea/community.git] / platform / diff-impl / src / com / intellij / diff / actions / CompareFileWithEditorAction.java
1 /*
2  * Copyright 2000-2015 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.diff.actions;
17
18 import com.intellij.diff.DiffRequestFactory;
19 import com.intellij.diff.contents.DiffContent;
20 import com.intellij.diff.contents.DocumentContent;
21 import com.intellij.diff.requests.ContentDiffRequest;
22 import com.intellij.diff.requests.DiffRequest;
23 import com.intellij.diff.util.DiffUserDataKeys;
24 import com.intellij.diff.util.Side;
25 import com.intellij.openapi.actionSystem.AnActionEvent;
26 import com.intellij.openapi.actionSystem.CommonDataKeys;
27 import com.intellij.openapi.editor.Editor;
28 import com.intellij.openapi.editor.EditorFactory;
29 import com.intellij.openapi.fileEditor.FileEditorManager;
30 import com.intellij.openapi.project.Project;
31 import com.intellij.openapi.util.Pair;
32 import com.intellij.openapi.vfs.VirtualFile;
33 import org.jetbrains.annotations.NotNull;
34 import org.jetbrains.annotations.Nullable;
35
36 public class CompareFileWithEditorAction extends BaseShowDiffAction {
37   @Override
38   protected boolean isAvailable(@NotNull AnActionEvent e) {
39     VirtualFile selectedFile = getSelectedFile(e);
40     if (selectedFile == null) {
41       return false;
42     }
43
44     VirtualFile currentFile = getEditingFile(e);
45     if (currentFile == null) {
46       return false;
47     }
48
49     if (!canCompare(selectedFile, currentFile)) {
50       return false;
51     }
52
53     return true;
54   }
55
56   @Nullable
57   private static VirtualFile getSelectedFile(@NotNull AnActionEvent e) {
58     VirtualFile[] array = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY);
59     if (array == null || array.length != 1 || array[0].isDirectory()) {
60       return null;
61     }
62
63     return array[0];
64   }
65
66   @Nullable
67   private static VirtualFile getEditingFile(@NotNull AnActionEvent e) {
68     Project project = e.getProject();
69     if (project == null) return null;
70
71     VirtualFile[] selectedFiles = FileEditorManager.getInstance(project).getSelectedFiles();
72     if (selectedFiles.length == 0) return null;
73
74     return selectedFiles[0];
75   }
76
77   private static boolean canCompare(@NotNull VirtualFile file1, @NotNull VirtualFile file2) {
78     return file1.isValid() && file2.isValid() && !file1.equals(file2);
79   }
80
81   @Nullable
82   @Override
83   protected DiffRequest getDiffRequest(@NotNull AnActionEvent e) {
84     Project project = e.getProject();
85
86     VirtualFile selectedFile = getSelectedFile(e);
87     VirtualFile currentFile = getEditingFile(e);
88
89     assert selectedFile != null && currentFile != null;
90
91     ContentDiffRequest request = DiffRequestFactory.getInstance().createFromFiles(project, selectedFile, currentFile);
92
93     DiffContent editorContent = request.getContents().get(1);
94     if (editorContent instanceof DocumentContent) {
95       Editor[] editors = EditorFactory.getInstance().getEditors(((DocumentContent)editorContent).getDocument());
96       if (editors.length != 0) {
97         request.putUserData(DiffUserDataKeys.SCROLL_TO_LINE, Pair.create(Side.RIGHT, editors[0].getCaretModel().getLogicalPosition().line));
98       }
99     }
100
101     return request;
102   }
103 }