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.project.ProjectHelper;
import jetbrains.mps.openapi.navigation.ProjectPaneNavigator;
import jetbrains.mps.fileTypes.MPSFileTypesManager;
import org.jetbrains.mps.openapi.model.SModelReference;
import jetbrains.mps.smodel.ModelAccessHelper;
import jetbrains.mps.util.Computable;
import org.jetbrains.mps.openapi.model.SModel;
import jetbrains.mps.smodel.SModelFileTracker;
import jetbrains.mps.ide.vfs.VirtualFileUtils;
import org.jetbrains.mps.openapi.module.SModuleReference;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.smodel.ModuleFileTracker;
import com.intellij.openapi.actionSystem.Presentation;
public class ShowInLogicalView extends AbstractVcsAction {
public ShowInLogicalView() {
}
@Override
protected void actionPerformed(VcsContext e) {
final Project project = e.getProject();
final VirtualFile selectedFile = getSelectedFile(e);
final jetbrains.mps.project.Project mpsProject = ProjectHelper.fromIdeaProject(project);
if (selectedFile == null || mpsProject == null) {
return;
}
ProjectPaneNavigator ppn = new ProjectPaneNavigator(mpsProject);
if (MPSFileTypesManager.isModelFile(selectedFile)) {
SModelReference model = new ModelAccessHelper(mpsProject.getModelAccess()).runReadAction(new Computable<SModelReference>() {
@Override
public SModelReference compute() {
SModel m = SModelFileTracker.getInstance(mpsProject.getRepository()).findModel(VirtualFileUtils.toIFile(selectedFile));
return (m == null ? null : m.getReference());
}
});
if (model != null) {
ppn.select(model);
}
} else
if (MPSFileTypesManager.isModuleFile(selectedFile)) {
// FIXME why on earth we obtain model access here? ProjectPaneSelectInTarget does the same without model access.
SModuleReference module = new ModelAccessHelper(mpsProject.getModelAccess()).runReadAction(new Computable<SModuleReference>() {
@Override
public SModuleReference compute() {
SModule m = ModuleFileTracker.getInstance(mpsProject.getRepository()).getModuleByFile(VirtualFileUtils.toIFile(selectedFile));
return (m == null ? null : m.getModuleReference());
}
});
if (module != null) {
// I have no idea why we focus module only, and do not focus on models, but it's the way it used to be for years
ppn.shallFocus(true);
ppn.select(module);
}
}
}
private VirtualFile getSelectedFile(VcsContext e) {
VirtualFile[] selectedFiles = e.getSelectedFiles();
if (selectedFiles.length == 0) {
return null;
}
return selectedFiles[0];
}
@Override
protected void update(VcsContext vcsContext, Presentation presentation) {
VirtualFile selectedFile = getSelectedFile(vcsContext);
presentation.setEnabled(MPSFileTypesManager.isModelFile(selectedFile) || MPSFileTypesManager.isModuleFile(selectedFile));
}
}