vcs: disable "annotate selected/previous revision" in modal context
[idea/community.git] / platform / vcs-impl / src / com / intellij / openapi / vcs / actions / AnnotateRevisionAction.java
1 package com.intellij.openapi.vcs.actions;
2
3 import com.intellij.openapi.actionSystem.AnActionEvent;
4 import com.intellij.openapi.actionSystem.PlatformDataKeys;
5 import com.intellij.openapi.fileTypes.FileType;
6 import com.intellij.openapi.project.DumbAware;
7 import com.intellij.openapi.vcs.AbstractVcs;
8 import com.intellij.openapi.vcs.FilePath;
9 import com.intellij.openapi.vcs.annotate.FileAnnotation;
10 import com.intellij.openapi.vcs.annotate.UpToDateLineNumberListener;
11 import com.intellij.openapi.vcs.history.VcsFileRevision;
12 import com.intellij.openapi.vcs.history.VcsFileRevisionEx;
13 import com.intellij.openapi.vcs.vfs.VcsFileSystem;
14 import com.intellij.openapi.vcs.vfs.VcsVirtualFile;
15 import com.intellij.openapi.vfs.VirtualFile;
16 import com.intellij.vcsUtil.VcsUtil;
17 import org.jetbrains.annotations.NotNull;
18 import org.jetbrains.annotations.Nullable;
19
20 import javax.swing.*;
21 import java.util.List;
22
23 abstract class AnnotateRevisionAction extends AnnotateRevisionActionBase implements DumbAware, UpToDateLineNumberListener {
24   @NotNull private final FileAnnotation myAnnotation;
25   @NotNull private final AbstractVcs myVcs;
26
27   private int currentLine;
28
29   public AnnotateRevisionAction(@Nullable String text, @Nullable String description, @Nullable Icon icon,
30                                 @NotNull FileAnnotation annotation, @NotNull AbstractVcs vcs) {
31     super(text, description, icon);
32     myAnnotation = annotation;
33     myVcs = vcs;
34   }
35
36   @Override
37   public void update(@NotNull AnActionEvent e) {
38     if (Boolean.TRUE.equals(e.getData(PlatformDataKeys.IS_MODAL_CONTEXT))) {
39       e.getPresentation().setEnabledAndVisible(false);
40       return;
41     }
42
43     if (getRevisions() == null) {
44       e.getPresentation().setEnabledAndVisible(false);
45       return;
46     }
47     e.getPresentation().setVisible(true);
48
49     super.update(e);
50   }
51
52   @Nullable
53   protected abstract List<VcsFileRevision> getRevisions();
54
55   @Nullable
56   protected AbstractVcs getVcs(@NotNull AnActionEvent e) {
57     return myVcs;
58   }
59
60   @Nullable
61   @Override
62   protected VirtualFile getFile(@NotNull AnActionEvent e) {
63     VcsFileRevision revision = getFileRevision(e);
64     if (revision == null) return null;
65
66     final FileType currentFileType = myAnnotation.getFile().getFileType();
67     FilePath filePath =
68       (revision instanceof VcsFileRevisionEx ? ((VcsFileRevisionEx)revision).getPath() : VcsUtil.getFilePath(myAnnotation.getFile()));
69     return new VcsVirtualFile(filePath.getPath(), revision, VcsFileSystem.getInstance()) {
70       @NotNull
71       @Override
72       public FileType getFileType() {
73         FileType type = super.getFileType();
74         return type.isBinary() ? currentFileType : type;
75       }
76     };
77   }
78
79   @Nullable
80   @Override
81   protected VcsFileRevision getFileRevision(@NotNull AnActionEvent e) {
82     List<VcsFileRevision> revisions = getRevisions();
83     assert getRevisions() != null;
84
85     if (currentLine < 0 || currentLine >= revisions.size()) return null;
86     return revisions.get(currentLine);
87   }
88
89   @Override
90   public void consume(Integer integer) {
91     currentLine = integer;
92   }
93 }