mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
goto file: match against the path from top-level content root (IDEA-162244)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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<PsiElement>
|
||||
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<PsiElement>
|
||||
}
|
||||
|
||||
|
||||
@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,
|
||||
|
||||
@@ -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<PsiFileSyst
|
||||
}
|
||||
|
||||
@Nullable
|
||||
static String getRelativePath(final VirtualFile virtualFile, final Project project) {
|
||||
String url = virtualFile.getPresentableUrl();
|
||||
public static String getRelativePath(final VirtualFile virtualFile, final Project project) {
|
||||
if (project == null) {
|
||||
return url;
|
||||
return virtualFile.getPresentableUrl();
|
||||
}
|
||||
VirtualFile root = ProjectFileIndex.SERVICE.getInstance(project).getContentRootForFile(virtualFile);
|
||||
if (root != null) {
|
||||
return root.getName() + File.separatorChar + VfsUtilCore.getRelativePath(virtualFile, root, File.separatorChar);
|
||||
return getRelativePathFromRoot(virtualFile, root);
|
||||
}
|
||||
|
||||
String url = virtualFile.getPresentableUrl();
|
||||
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());
|
||||
@@ -99,6 +99,11 @@ public class GotoFileCellRenderer extends PsiElementListCellRenderer<PsiFileSyst
|
||||
return url;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
static String getRelativePathFromRoot(@NotNull VirtualFile file, @NotNull VirtualFile root) {
|
||||
return root.getName() + File.separatorChar + VfsUtilCore.getRelativePath(file, root, File.separatorChar);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean customizeNonPsiElementLeftRenderer(ColoredListCellRenderer renderer,
|
||||
JList list,
|
||||
|
||||
@@ -27,11 +27,13 @@ import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.fileTypes.FileType;
|
||||
import com.intellij.openapi.project.DumbAware;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.roots.ProjectFileIndex;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.wm.ex.WindowManagerEx;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiFileSystemItem;
|
||||
import com.intellij.util.containers.JBIterable;
|
||||
import com.intellij.util.indexing.FileBasedIndex;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -132,13 +134,22 @@ public class GotoFileModel extends FilteringGotoByModel<FileType> 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() {
|
||||
|
||||
Reference in New Issue
Block a user