From ff84d55b450a55619b28cf35d1cc73ff85d1e670 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 18 Oct 2011 19:50:29 +0200 Subject: [PATCH] Presentation for packages and directories in refactoring preview --- .../psi/impl/file/PsiJavaDirectoryImpl.java | 19 ++++-- .../java/PackagePresentationProvider.java | 29 +++++++++ .../psi/impl/file/PsiPackageImpl.java | 14 +++-- .../navigation/ItemPresentationProviders.java | 9 ++- .../intellij/navigation/NavigationItem.java | 4 +- .../psi/impl/file/PsiDirectoryImpl.java | 15 ++++- .../PsiElement2UsageTargetAdapter.java | 7 +-- .../projectView/impl/ProjectRootsUtil.java | 6 +- .../DirectoryPresentationProvider.java | 60 +++++++++++++++++++ .../usageView/UsageViewNodeTextLocation.java | 13 ++-- .../src/META-INF/LangExtensions.xml | 3 + resources/src/META-INF/IdeaPlugin.xml | 2 + 12 files changed, 156 insertions(+), 25 deletions(-) create mode 100644 java/java-impl/src/com/intellij/psi/presentation/java/PackagePresentationProvider.java create mode 100644 platform/lang-impl/src/com/intellij/navigation/DirectoryPresentationProvider.java diff --git a/java/java-impl/src/com/intellij/psi/impl/file/PsiJavaDirectoryImpl.java b/java/java-impl/src/com/intellij/psi/impl/file/PsiJavaDirectoryImpl.java index b4f2da0072b5..0bd0175a1285 100644 --- a/java/java-impl/src/com/intellij/psi/impl/file/PsiJavaDirectoryImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/file/PsiJavaDirectoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,14 +15,17 @@ */ package com.intellij.psi.impl.file; +import com.intellij.navigation.ItemPresentation; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.fileTypes.StdFileTypes; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.JavaDirectoryService; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiPackage; import com.intellij.psi.impl.PsiManagerImpl; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; @@ -30,13 +33,13 @@ import org.jetbrains.annotations.NotNull; public class PsiJavaDirectoryImpl extends PsiDirectoryImpl { private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.file.PsiJavaDirectoryImpl"); - public PsiJavaDirectoryImpl(PsiManagerImpl manager, VirtualFile file) { + public PsiJavaDirectoryImpl(final PsiManagerImpl manager, final VirtualFile file) { super(manager, file); } + @Override public void checkCreateFile(@NotNull final String name) throws IncorrectOperationException { - FileTypeManager fileTypeManager = FileTypeManager.getInstance(); - FileType type = fileTypeManager.getFileTypeByFileName(name); + final FileType type = FileTypeManager.getInstance().getFileTypeByFileName(name); if (type == StdFileTypes.CLASS) { throw new IncorrectOperationException("Cannot create class-file"); } @@ -44,6 +47,7 @@ public class PsiJavaDirectoryImpl extends PsiDirectoryImpl { super.checkCreateFile(name); } + @Override public PsiElement add(@NotNull final PsiElement element) throws IncorrectOperationException { if (element instanceof PsiClass) { final String name = ((PsiClass)element).getName(); @@ -61,6 +65,7 @@ public class PsiJavaDirectoryImpl extends PsiDirectoryImpl { } } + @Override public void checkAdd(@NotNull final PsiElement element) throws IncorrectOperationException { if (element instanceof PsiClass) { if (((PsiClass)element).getContainingClass() == null) { @@ -74,4 +79,10 @@ public class PsiJavaDirectoryImpl extends PsiDirectoryImpl { super.checkAdd(element); } } + + @Override + public ItemPresentation getPresentation() { + final PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage(this); + return aPackage != null && !StringUtil.isEmpty(aPackage.getName()) ? aPackage.getPresentation() : super.getPresentation(); + } } diff --git a/java/java-impl/src/com/intellij/psi/presentation/java/PackagePresentationProvider.java b/java/java-impl/src/com/intellij/psi/presentation/java/PackagePresentationProvider.java new file mode 100644 index 000000000000..1598e8a0245a --- /dev/null +++ b/java/java-impl/src/com/intellij/psi/presentation/java/PackagePresentationProvider.java @@ -0,0 +1,29 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.psi.presentation.java; + +import com.intellij.ide.projectView.PresentationData; +import com.intellij.navigation.ItemPresentation; +import com.intellij.navigation.ItemPresentationProvider; +import com.intellij.psi.PsiPackage; +import com.intellij.util.PlatformIcons; + +public class PackagePresentationProvider implements ItemPresentationProvider { + @Override + public ItemPresentation getPresentation(final PsiPackage aPackage) { + return new PresentationData(aPackage.getName(), aPackage.getQualifiedName(), PlatformIcons.PACKAGE_OPEN_ICON, PlatformIcons.PACKAGE_ICON, null); + } +} diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/file/PsiPackageImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/file/PsiPackageImpl.java index 412a4d6e785c..b47335d908c2 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/file/PsiPackageImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/file/PsiPackageImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,8 @@ package com.intellij.psi.impl.file; import com.intellij.codeInsight.completion.scope.JavaCompletionHints; import com.intellij.lang.Language; import com.intellij.lang.java.JavaLanguage; +import com.intellij.navigation.ItemPresentation; +import com.intellij.navigation.ItemPresentationProviders; import com.intellij.openapi.ui.Queryable; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFile; @@ -41,12 +43,10 @@ import java.util.List; import java.util.Set; public class PsiPackageImpl extends PsiPackageBase implements PsiPackage, Queryable { - private volatile CachedValue myAnnotationList; private volatile CachedValue> myDirectories; - private volatile Set myPublicClassNamesCache; - private final Object myPublicClassNamesCacheLock = new String("package classnames cache lock"); + private final Object myPublicClassNamesCacheLock = new String("package class names cache lock"); public PsiPackageImpl(PsiManager manager, String qualifiedName) { super(manager, qualifiedName); @@ -254,6 +254,11 @@ public class PsiPackageImpl extends PsiPackageBase implements PsiPackage, Querya return isValid(); } + @Override + public ItemPresentation getPresentation() { + return ItemPresentationProviders.getItemPresentation(this); + } + public void navigate(final boolean requestFocus) { PsiPackageImplementationHelper.getInstance().navigate(this, requestFocus); } @@ -297,5 +302,4 @@ public class PsiPackageImpl extends PsiPackageBase implements PsiPackage, Querya public PsiQualifiedNamedElement getContainer() { return getParentPackage(); } - } diff --git a/platform/core-api/src/com/intellij/navigation/ItemPresentationProviders.java b/platform/core-api/src/com/intellij/navigation/ItemPresentationProviders.java index bab05b1ff836..c3449c449e6f 100644 --- a/platform/core-api/src/com/intellij/navigation/ItemPresentationProviders.java +++ b/platform/core-api/src/com/intellij/navigation/ItemPresentationProviders.java @@ -17,6 +17,7 @@ package com.intellij.navigation; import com.intellij.openapi.util.ClassExtension; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * @author yole @@ -28,11 +29,15 @@ public class ItemPresentationProviders extends ClassExtension ItemPresentationProvider getItemPresentationProvider(@NotNull T element) { - return INSTANCE.forClass(element.getClass()); + @SuppressWarnings({"unchecked", "UnnecessaryLocalVariable"}) final ItemPresentationProvider provider = INSTANCE.forClass(element.getClass()); + return provider; } + @Nullable public static ItemPresentation getItemPresentation(NavigationItem element) { - return getItemPresentationProvider(element).getPresentation(element); + final ItemPresentationProvider provider = getItemPresentationProvider(element); + return provider != null ? provider.getPresentation(element) : null; } } diff --git a/platform/core-api/src/com/intellij/navigation/NavigationItem.java b/platform/core-api/src/com/intellij/navigation/NavigationItem.java index fc5007d2bde4..78e3450678ef 100644 --- a/platform/core-api/src/com/intellij/navigation/NavigationItem.java +++ b/platform/core-api/src/com/intellij/navigation/NavigationItem.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,10 @@ import org.jetbrains.annotations.Nullable; public interface NavigationItem extends Navigatable { NavigationItem[] EMPTY_NAVIGATION_ITEM_ARRAY = new NavigationItem[0]; + @Nullable String getName(); + @Nullable ItemPresentation getPresentation(); } \ No newline at end of file diff --git a/platform/core-impl/src/com/intellij/psi/impl/file/PsiDirectoryImpl.java b/platform/core-impl/src/com/intellij/psi/impl/file/PsiDirectoryImpl.java index f5922c4d07a9..9eb4ec95632d 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/file/PsiDirectoryImpl.java +++ b/platform/core-impl/src/com/intellij/psi/impl/file/PsiDirectoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,8 @@ package com.intellij.psi.impl.file; import com.intellij.ide.util.PsiNavigationSupport; import com.intellij.lang.ASTNode; import com.intellij.lang.Language; +import com.intellij.navigation.ItemPresentation; +import com.intellij.navigation.ItemPresentationProviders; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; @@ -29,7 +31,10 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.*; +import com.intellij.openapi.vfs.NonPhysicalFileSystem; +import com.intellij.openapi.vfs.VfsBundle; +import com.intellij.openapi.vfs.VfsUtilCore; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; import com.intellij.psi.impl.CheckUtil; import com.intellij.psi.impl.PsiElementBase; @@ -546,6 +551,11 @@ public class PsiDirectoryImpl extends PsiElementBase implements PsiDirectory, Qu return false; } + @Override + public ItemPresentation getPresentation() { + return ItemPresentationProviders.getItemPresentation(this); + } + public void navigate(boolean requestFocus) { PsiNavigationSupport.getInstance().navigateToDirectory(this, false); } @@ -558,4 +568,3 @@ public class PsiDirectoryImpl extends PsiElementBase implements PsiDirectory, Qu info.put("fileName", getName()); } } - diff --git a/platform/lang-impl/src/com/intellij/find/findUsages/PsiElement2UsageTargetAdapter.java b/platform/lang-impl/src/com/intellij/find/findUsages/PsiElement2UsageTargetAdapter.java index f956e9c89deb..acb34e4bf76c 100644 --- a/platform/lang-impl/src/com/intellij/find/findUsages/PsiElement2UsageTargetAdapter.java +++ b/platform/lang-impl/src/com/intellij/find/findUsages/PsiElement2UsageTargetAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,14 +19,13 @@ package com.intellij.find.findUsages; import com.intellij.codeInsight.highlighting.HighlightUsagesHandler; import com.intellij.find.FindManager; import com.intellij.find.impl.FindManagerImpl; -import com.intellij.navigation.PsiElementNavigationItem; import com.intellij.navigation.ItemPresentation; import com.intellij.navigation.NavigationItem; +import com.intellij.navigation.PsiElementNavigationItem; import com.intellij.openapi.actionSystem.DataKey; import com.intellij.openapi.actionSystem.DataSink; import com.intellij.openapi.actionSystem.TypeSafeDataProvider; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; @@ -195,7 +194,7 @@ public class PsiElement2UsageTargetAdapter implements PsiElementUsageTarget, Typ final ItemPresentation presentation = ((NavigationItem)element).getPresentation(); myIconOpen = presentation != null ? ComputableIcon.create(presentation, true) : null; myIconClosed = presentation != null ? ComputableIcon.create(presentation, false) : null; - myPresentableText = UsageViewUtil.createNodeText(element); + myPresentableText = presentation != null ? presentation.getPresentableText() : UsageViewUtil.createNodeText(element); if (myIconOpen == null || myIconClosed == null) { if (element instanceof PsiMetaOwner) { final PsiMetaOwner psiMetaOwner = (PsiMetaOwner)element; diff --git a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectRootsUtil.java b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectRootsUtil.java index 10d4b42fb735..0be5330d0ef4 100644 --- a/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectRootsUtil.java +++ b/platform/lang-impl/src/com/intellij/ide/projectView/impl/ProjectRootsUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,6 +46,10 @@ public class ProjectRootsUtil { return projectFileIndex.isInSourceContent(directoryFile); } + public static boolean isInTestSource(final PsiDirectory psiDirectory) { + return isInTestSource(psiDirectory.getVirtualFile(), psiDirectory.getProject()); + } + public static boolean isInTestSource(final VirtualFile directoryFile, final Project project) { final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex(); return projectFileIndex.isInTestSourceContent(directoryFile); diff --git a/platform/lang-impl/src/com/intellij/navigation/DirectoryPresentationProvider.java b/platform/lang-impl/src/com/intellij/navigation/DirectoryPresentationProvider.java new file mode 100644 index 000000000000..df7ede483bfc --- /dev/null +++ b/platform/lang-impl/src/com/intellij/navigation/DirectoryPresentationProvider.java @@ -0,0 +1,60 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.navigation; + +import com.intellij.ide.projectView.PresentationData; +import com.intellij.ide.projectView.impl.ProjectRootsUtil; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDirectory; +import com.intellij.util.PlatformIcons; + +public class DirectoryPresentationProvider implements ItemPresentationProvider { + @Override + public ItemPresentation getPresentation(final PsiDirectory directory) { + final VirtualFile vFile = directory.getVirtualFile(); + final String locationString = vFile.getPath(); + + final Project project = directory.getProject(); + if (vFile.equals(project.getBaseDir())) { + return new PresentationData(project.getName(), locationString, + PlatformIcons.PROJECT_ICON, PlatformIcons.PROJECT_ICON, null); + } + + if (ProjectRootsUtil.isModuleContentRoot(directory)) { + final Module module = ProjectRootManager.getInstance(project).getFileIndex().getModuleForFile(vFile); + assert module != null : directory; + return new PresentationData(module.getName(), locationString, + PlatformIcons.CONTENT_ROOT_ICON_OPEN, PlatformIcons.CONTENT_ROOT_ICON_CLOSED, null); + } + + if (ProjectRootsUtil.isSourceRoot(directory)) { + if (ProjectRootsUtil.isInTestSource(directory)) { + return new PresentationData(directory.getName(), locationString, + PlatformIcons.MODULES_TEST_SOURCE_FOLDER, PlatformIcons.MODULES_TEST_SOURCE_FOLDER, null); + } + else { + return new PresentationData(directory.getName(), locationString, + PlatformIcons.MODULES_SOURCE_FOLDERS_ICON, PlatformIcons.MODULES_SOURCE_FOLDERS_ICON, null); + } + } + + return new PresentationData(directory.getName(), locationString, + PlatformIcons.DIRECTORY_OPEN_ICON, PlatformIcons.DIRECTORY_CLOSED_ICON, null); + } +} diff --git a/platform/lang-impl/src/com/intellij/usageView/UsageViewNodeTextLocation.java b/platform/lang-impl/src/com/intellij/usageView/UsageViewNodeTextLocation.java index 86c3e7850210..5e98a15b3b42 100644 --- a/platform/lang-impl/src/com/intellij/usageView/UsageViewNodeTextLocation.java +++ b/platform/lang-impl/src/com/intellij/usageView/UsageViewNodeTextLocation.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2011 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package com.intellij.usageView; +import com.intellij.lang.Language; import com.intellij.lang.findUsages.FindUsagesProvider; import com.intellij.lang.findUsages.LanguageFindUsages; import com.intellij.psi.ElementDescriptionLocation; @@ -31,8 +32,7 @@ import org.jetbrains.annotations.NotNull; * @author peter */ public class UsageViewNodeTextLocation extends ElementDescriptionLocation { - private UsageViewNodeTextLocation() { - } + private UsageViewNodeTextLocation() { } public static final UsageViewNodeTextLocation INSTANCE = new UsageViewNodeTextLocation(); @@ -52,9 +52,12 @@ public class UsageViewNodeTextLocation extends ElementDescriptionLocation { } if (element instanceof PsiFile) { - return ((PsiFile) element).getName(); + return ((PsiFile)element).getName(); } - FindUsagesProvider provider = LanguageFindUsages.INSTANCE.forLanguage(element.getLanguage()); + + Language language = element.getLanguage(); + FindUsagesProvider provider = LanguageFindUsages.INSTANCE.forLanguage(language); + assert provider != null : "Element: " + element + ", language: " + language; return provider.getNodeText(element, true); } }; diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 1af462c9d7da..db04d3b1fbd1 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -702,4 +702,7 @@ + + diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index 975b550eb29e..75bf9fd2d388 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -1126,6 +1126,8 @@ +