package jetbrains.mps.ide.common; /*Generated by MPS */ import org.jetbrains.annotations.Nullable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.project.Project; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import com.intellij.navigation.ChooseByNameContributor; import com.intellij.openapi.extensions.Extensions; import com.intellij.navigation.NavigationItem; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.ITranslator2; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.MPSGoToFileContributor; import jetbrains.mps.internal.collections.runtime.ISelector; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.TextEditor; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.ScrollType; public class FileOpenUtil { public FileOpenUtil() { } @Nullable public static VirtualFile findFile(final Project project, String unitName, final String fileName) { final Wrappers._T<String> fullFileName = new Wrappers._T<String>(unitName.replace(".", "/")); if (!(unitName.endsWith(fileName))) { int lastDot = unitName.lastIndexOf("."); if (lastDot == -1) { fullFileName.value = fileName; } else { fullFileName.value = unitName.substring(0, lastDot).replace(".", "/") + "/" + fileName; } } ChooseByNameContributor[] extensions = Extensions.getExtensions(ChooseByNameContributor.FILE_EP_NAME); Iterable<NavigationItem> found = Sequence.fromIterable(Sequence.fromArray(extensions)).translate(new ITranslator2<ChooseByNameContributor, NavigationItem>() { public Iterable<NavigationItem> translate(ChooseByNameContributor it) { return Sequence.fromArray(it.getItemsByName(fileName, fileName, project, true)); } }); Iterable<VirtualFile> matching = Sequence.fromIterable(found).where(new IWhereFilter<NavigationItem>() { public boolean accept(NavigationItem it) { return it instanceof MPSGoToFileContributor.FileNavigationItem; } }).select(new ISelector<NavigationItem, VirtualFile>() { public VirtualFile select(NavigationItem it) { return ((MPSGoToFileContributor.FileNavigationItem) it).getVirtualFile(); } }).where(new IWhereFilter<VirtualFile>() { public boolean accept(VirtualFile it) { return it.getPath().endsWith(fullFileName.value); } }); if (Sequence.fromIterable(matching).isNotEmpty()) { return Sequence.fromIterable(matching).first(); } return null; } public static void openFile(Project project, VirtualFile file, int lineNumber) { FileEditor[] result = FileEditorManager.getInstance(project).openFile(file, true, true); if (result.length == 1 && result[0] instanceof TextEditor) { TextEditor textEditor = (TextEditor) result[0]; LogicalPosition position = new LogicalPosition(lineNumber - 1, 0); textEditor.getEditor().getCaretModel().moveToLogicalPosition(position); textEditor.getEditor().getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE); } } }