package jetbrains.mps.vcs.actions;
/*Generated by MPS */
import com.intellij.openapi.vcs.actions.AbstractVcsAction;
import com.intellij.openapi.vcs.actions.VcsContext;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import jetbrains.mps.ide.projectPane.fileSystem.FileViewProjectPane;
import org.jetbrains.annotations.Nullable;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.actionSystem.Presentation;
import java.util.List;
import org.jetbrains.annotations.NotNull;
/*package*/ abstract class AbstractShowInFileView extends AbstractVcsAction {
/*package*/ AbstractShowInFileView() {
}
@Override
protected void actionPerformed(VcsContext e) {
final Project project = e.getProject();
VirtualFile selectedFile = calculateSelectedFile(e);
if (selectedFile != null) {
assert project != null;
FileViewProjectPane view = getView(project);
view.selectNode(selectedFile, true);
}
}
@Nullable
private VirtualFile calculateSelectedFile(VcsContext e) {
VirtualFile[] selectedFiles = e.getSelectedFiles();
if (selectedFiles.length == 0) {
return null;
}
if (selectedFiles.length == 1) {
return selectedFiles[0];
}
return VfsUtil.getCommonAncestors(selectedFiles)[0];
}
protected abstract FileViewProjectPane getView(Project project);
@Override
protected void update(VcsContext vcsContext, Presentation presentation) {
if (vcsContext.getProject() == null) {
presentation.setEnabled(false);
return;
}
List<VirtualFile> baseDirs = getRoots(vcsContext);
VirtualFile selectedFile = calculateSelectedFile(vcsContext);
if (selectedFile != null) {
for (VirtualFile baseDir : baseDirs) {
if (canScroll(baseDir, selectedFile)) {
presentation.setEnabled(true);
return;
}
}
}
presentation.setEnabled(false);
}
protected abstract List<VirtualFile> getRoots(VcsContext vcsContext);
private boolean canScroll(VirtualFile baseDir, @NotNull VirtualFile selectedFile) {
if (baseDir != null) {
return VfsUtil.isAncestor(baseDir, selectedFile, false);
}
return false;
}
}