From 5897600c6372be05e7d256c8e4941185e997fa42 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Fri, 21 Feb 2014 15:13:23 +0400 Subject: [PATCH] Changed the visual representation of PyFileImpl to be more Python module-like (PY-6923) For modules only names are shown (no extensions). For '__init__.py' files representing packages only package names are shown (its parent directories). --- .../jetbrains/python/psi/impl/PyFileImpl.java | 87 ++++++++++++++++++- 1 file changed, 85 insertions(+), 2 deletions(-) diff --git a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java index 1fa4b2101a44..c1aa84c0268b 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java @@ -16,15 +16,19 @@ package com.jetbrains.python.psi.impl; import com.intellij.extapi.psi.PsiFileBase; +import com.intellij.icons.AllIcons; import com.intellij.lang.ASTNode; import com.intellij.lang.Language; +import com.intellij.navigation.ItemPresentation; import com.intellij.openapi.fileTypes.FileType; +import com.intellij.openapi.roots.ProjectFileIndex; import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.stubs.StubElement; -import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiModificationTracker; import com.intellij.psi.util.QualifiedName; @@ -33,11 +37,15 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.MultiMap; import com.intellij.util.indexing.IndexingDataKeys; -import com.jetbrains.python.*; +import com.jetbrains.python.PyElementTypes; +import com.jetbrains.python.PyNames; +import com.jetbrains.python.PythonFileType; +import com.jetbrains.python.PythonLanguage; import com.jetbrains.python.codeInsight.controlflow.ControlFlowCache; import com.jetbrains.python.documentation.DocStringUtil; import com.jetbrains.python.inspections.PythonVisitorFilter; import com.jetbrains.python.psi.*; +import com.jetbrains.python.psi.resolve.QualifiedNameFinder; import com.jetbrains.python.psi.resolve.RatedResolveResult; import com.jetbrains.python.psi.resolve.ResolveImportUtil; import com.jetbrains.python.psi.resolve.VariantsProcessor; @@ -49,6 +57,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.io.File; import java.util.*; public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression { @@ -770,4 +779,78 @@ public class PyFileImpl extends PsiFileBase implements PyFile, PyExpression { } return elementType == PyElementTypes.IMPORT_STATEMENT || elementType == PyElementTypes.FROM_IMPORT_STATEMENT; } + + @Override + public ItemPresentation getPresentation() { + return new ItemPresentation() { + @Override + public String getPresentableText() { + return getModuleName(PyFileImpl.this); + } + + @Override + public String getLocationString() { + final String name = getLocationName(); + return name != null ? "(" + name + ")" : null; + } + + @Override + public Icon getIcon(final boolean open) { + if (PyUtil.isPackage(PyFileImpl.this)) { + return AllIcons.Modules.SourceFolder; + } + return PyFileImpl.this.getIcon(0); + } + + @NotNull + private String getModuleName(@NotNull PyFile file) { + if (PyUtil.isPackage(file)) { + final PsiDirectory dir = file.getContainingDirectory(); + if (dir != null) { + return dir.getName(); + } + } + return FileUtil.getNameWithoutExtension(file.getName()); + } + + @Nullable + private String getLocationName() { + final QualifiedName name = QualifiedNameFinder.findShortestImportableQName(PyFileImpl.this); + if (name != null) { + final QualifiedName prefix = name.removeTail(1); + if (prefix.getComponentCount() > 0) { + return prefix.toString(); + } + } + final String relativePath = getRelativeContainerPath(); + if (relativePath != null) { + return relativePath; + } + final PsiDirectory psiDirectory = getParent(); + if (psiDirectory != null) { + return psiDirectory.getVirtualFile().getPresentableUrl(); + } + return null; + } + + @Nullable + private String getRelativeContainerPath() { + final PsiDirectory psiDirectory = getParent(); + if (psiDirectory != null) { + final VirtualFile virtualFile = getVirtualFile(); + if (virtualFile != null) { + final VirtualFile root = ProjectFileIndex.SERVICE.getInstance(getProject()).getContentRootForFile(virtualFile); + if (root != null) { + final VirtualFile parent = virtualFile.getParent(); + final VirtualFile rootParent = root.getParent(); + if (rootParent != null && parent != null) { + return VfsUtilCore.getRelativePath(parent, rootParent, File.separatorChar); + } + } + } + } + return null; + } + }; + } }