diff --git a/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameHddTest.groovy b/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameHddTest.groovy index bcaa3b83a49a..275f629d98a0 100644 --- a/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameHddTest.groovy +++ b/java/java-tests/testSrc/com/intellij/navigation/ChooseByNameHddTest.groovy @@ -64,6 +64,17 @@ class ChooseByNameHddTest extends JavaCodeInsightFixtureTestCase { popup.close(false) } + void "test paths relative to topmost module"() { + PsiTestUtil.addModule(project, StdModuleTypes.JAVA, 'm1', myFixture.tempDirFixture.findOrCreateDir("foo")) + PsiTestUtil.addModule(project, StdModuleTypes.JAVA, 'm2', myFixture.tempDirFixture.findOrCreateDir("foo/bar")) + def file = myFixture.addFileToProject('foo/bar/goo/doo.txt', '') + def popup = ReadAction.compute { ChooseByNamePopup.createPopup(project, new GotoFileModel(project), file) } + assert ChooseByNameTest.calcPopupElements(popup, "doo", false) == [file] + assert ChooseByNameTest.calcPopupElements(popup, "goo/doo", false) == [file] + assert ChooseByNameTest.calcPopupElements(popup, "bar/goo/doo", false) == [file] + assert ChooseByNameTest.calcPopupElements(popup, "foo/bar/goo/doo", false) == [file] + } + @Override protected boolean runInDispatchThread() { return false diff --git a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywherePsiRenderer.java b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywherePsiRenderer.java index 719d8ad52c8f..ece3c662a409 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywherePsiRenderer.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywherePsiRenderer.java @@ -17,14 +17,12 @@ package com.intellij.ide.actions; import com.intellij.ide.util.PlatformModuleRendererFactory; import com.intellij.ide.util.PsiElementListCellRenderer; +import com.intellij.ide.util.gotoByName.GotoFileCellRenderer; import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.NavigationItem; import com.intellij.openapi.editor.markup.TextAttributes; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.util.Iconable; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; @@ -35,7 +33,6 @@ import com.intellij.ui.ColoredListCellRenderer; import com.intellij.ui.JBColor; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.ui.FilePathSplittingPolicy; -import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; @@ -82,7 +79,7 @@ class SearchEverywherePsiRenderer extends PsiElementListCellRenderer final PsiDirectory psiDirectory = parent instanceof PsiDirectory ? (PsiDirectory)parent : null; VirtualFile virtualFile = psiDirectory == null ? null : psiDirectory.getVirtualFile(); if (virtualFile == null) return null; - final String relativePath = getRelativePath(virtualFile, element.getProject()); + String relativePath = GotoFileCellRenderer.getRelativePath(virtualFile, element.getProject()); if (relativePath == null) return "( " + File.separator + " )"; int width = myList.getWidth(); if (width == 0) width += 800; @@ -124,30 +121,6 @@ class SearchEverywherePsiRenderer extends PsiElementListCellRenderer } - @Nullable - String getRelativePath(final VirtualFile virtualFile, final Project project) { - String url = virtualFile.getPresentableUrl(); - if (project == null) { - return url; - } - VirtualFile root = ProjectFileIndex.SERVICE.getInstance(project).getContentRootForFile(virtualFile); - if (root != null) { - return root.getName() + File.separatorChar + VfsUtilCore.getRelativePath(virtualFile, root, File.separatorChar); - } - - final VirtualFile baseDir = project.getBaseDir(); - if (baseDir != null) { - //noinspection ConstantConditions - final String projectHomeUrl = baseDir.getPresentableUrl(); - if (url.startsWith(projectHomeUrl)) { - final String cont = url.substring(projectHomeUrl.length()); - if (cont.isEmpty()) return null; - url = "..." + cont; - } - } - return url; - } - @Override protected boolean customizeNonPsiElementLeftRenderer(ColoredListCellRenderer renderer, JList list, diff --git a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileCellRenderer.java b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileCellRenderer.java index b00aa5640e37..44553eeae99e 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileCellRenderer.java +++ b/platform/lang-impl/src/com/intellij/ide/util/gotoByName/GotoFileCellRenderer.java @@ -33,6 +33,7 @@ import com.intellij.ui.ColoredListCellRenderer; import com.intellij.ui.JBColor; import com.intellij.ui.SimpleTextAttributes; import com.intellij.util.ui.FilePathSplittingPolicy; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -76,19 +77,18 @@ public class GotoFileCellRenderer extends PsiElementListCellRenderer implements Dum @Nullable public String getFullName(final Object element) { if (element instanceof PsiFileSystemItem) { - final VirtualFile virtualFile = ((PsiFileSystemItem)element).getVirtualFile(); - return virtualFile != null ? GotoFileCellRenderer.getRelativePath(virtualFile, myProject) : null; + VirtualFile file = ((PsiFileSystemItem)element).getVirtualFile(); + VirtualFile root = getTopLevelRoot(file); + return root != null ? GotoFileCellRenderer.getRelativePathFromRoot(file, root) : null; } return getElementName(element); } + private VirtualFile getTopLevelRoot(VirtualFile file) { + return JBIterable.generate(getContentRoot(file), r -> getContentRoot(r.getParent())).last(); + } + + private VirtualFile getContentRoot(@Nullable VirtualFile file) { + return file == null ? null : ProjectFileIndex.SERVICE.getInstance(myProject).getContentRootForFile(file); + } + @Override @NotNull public String[] getSeparators() {