From 71e54401449789761c940c18e00aa38e9da734d4 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 12 Mar 2014 15:43:27 +0400 Subject: [PATCH 1/3] Don't show python-skeletons in Python SDK libraries inside project tree structure Since python-skeletons isn't really a library directory available at run time, it makes sense not to show it as a library directory at least. --- .../jetbrains/python/projectView/PyTreeStructureProvider.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java b/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java index cb9e2577e1f8..a2aa7fdc1aea 100644 --- a/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java +++ b/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java @@ -28,6 +28,7 @@ import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; +import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil; import com.jetbrains.python.psi.PyDocStringOwner; import com.jetbrains.python.psi.PyFile; import com.jetbrains.python.psi.PyFunction; @@ -70,6 +71,9 @@ public class PyTreeStructureProvider implements SelectableTreeStructureProvider, for (AbstractTreeNode child : children) { if (child instanceof PsiDirectoryNode) { PsiDirectory directory = ((PsiDirectoryNode)child).getValue(); + if (directory.getVirtualFile().equals(PyUserSkeletonsUtil.getUserSkeletonsDirectory())) { + continue; + } PsiDirectory dirParent = directory.getParent(); if (dirParent != null && dirParent.getName().equals(PythonSdkType.SKELETON_DIR_NAME)) { continue; From bb02dfcd9704644a9025d4ed9a341457a1a9abef Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 13 Mar 2014 12:05:09 +0400 Subject: [PATCH 2/3] Extracted getPythonSdk(AbstractTreeNode) --- .../projectView/PyTreeStructureProvider.java | 56 +++++++++++++------ 1 file changed, 38 insertions(+), 18 deletions(-) diff --git a/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java b/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java index a2aa7fdc1aea..0cd596e4070b 100644 --- a/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java +++ b/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java @@ -17,11 +17,14 @@ package com.jetbrains.python.projectView; import com.intellij.ide.projectView.SelectableTreeStructureProvider; import com.intellij.ide.projectView.ViewSettings; +import com.intellij.ide.projectView.impl.nodes.NamedLibraryElement; import com.intellij.ide.projectView.impl.nodes.NamedLibraryElementNode; import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; import com.intellij.ide.projectView.impl.nodes.PsiFileNode; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.projectRoots.SdkTypeId; import com.intellij.openapi.roots.JdkOrderEntry; import com.intellij.openapi.roots.LibraryOrSdkOrderEntry; import com.intellij.psi.PsiDirectory; @@ -34,6 +37,7 @@ import com.jetbrains.python.psi.PyFile; import com.jetbrains.python.psi.PyFunction; import com.jetbrains.python.sdk.PythonSdkType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -46,8 +50,9 @@ public class PyTreeStructureProvider implements SelectableTreeStructureProvider, @NotNull @Override public Collection modify(@NotNull AbstractTreeNode parent, @NotNull Collection children, ViewSettings settings) { - if (parent instanceof NamedLibraryElementNode) { - return hideSkeletons((NamedLibraryElementNode)parent, children); + final Sdk sdk = getPythonSdk(parent); + if (sdk != null) { + return hideSkeletons(children); } if (settings.isShowMembers()) { List newChildren = new ArrayList(); @@ -64,26 +69,41 @@ public class PyTreeStructureProvider implements SelectableTreeStructureProvider, return children; } - protected Collection hideSkeletons(NamedLibraryElementNode parent, Collection children) { - LibraryOrSdkOrderEntry orderEntry = parent.getValue().getOrderEntry(); - if (orderEntry instanceof JdkOrderEntry) { - List newChildren = new ArrayList(); - for (AbstractTreeNode child : children) { - if (child instanceof PsiDirectoryNode) { - PsiDirectory directory = ((PsiDirectoryNode)child).getValue(); - if (directory.getVirtualFile().equals(PyUserSkeletonsUtil.getUserSkeletonsDirectory())) { - continue; - } - PsiDirectory dirParent = directory.getParent(); - if (dirParent != null && dirParent.getName().equals(PythonSdkType.SKELETON_DIR_NAME)) { - continue; + @Nullable + private static Sdk getPythonSdk(@NotNull AbstractTreeNode node) { + if (node instanceof NamedLibraryElementNode) { + final NamedLibraryElement value = ((NamedLibraryElementNode)node).getValue(); + if (value != null) { + final LibraryOrSdkOrderEntry entry = value.getOrderEntry(); + if (entry instanceof JdkOrderEntry) { + final Sdk sdk = ((JdkOrderEntry)entry).getJdk(); + final SdkTypeId type = sdk.getSdkType(); + if (type instanceof PythonSdkType) { + return sdk; } } - newChildren.add(child); } - return newChildren; } - return children; + return null; + } + + @NotNull + private static Collection hideSkeletons(@NotNull Collection children) { + List newChildren = new ArrayList(); + for (AbstractTreeNode child : children) { + if (child instanceof PsiDirectoryNode) { + PsiDirectory directory = ((PsiDirectoryNode)child).getValue(); + if (directory.getVirtualFile().equals(PyUserSkeletonsUtil.getUserSkeletonsDirectory())) { + continue; + } + PsiDirectory dirParent = directory.getParent(); + if (dirParent != null && dirParent.getName().equals(PythonSdkType.SKELETON_DIR_NAME)) { + continue; + } + } + newChildren.add(child); + } + return newChildren; } @Override From 61f6205442ec10125fdccfc69bd4f8a297c6d617 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 13 Mar 2014 15:19:01 +0400 Subject: [PATCH 3/3] Show skeletons as "Binary Skeletons" and "Extended Defitions" inside Python SDK in project tree (PY-12407) --- .../python/projectView/PySkeletonsNode.java | 54 +++++++++++++++++++ .../projectView/PyTreeStructureProvider.java | 17 ++++-- .../projectView/PyUserSkeletonsNode.java | 53 ++++++++++++++++++ 3 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 python/src/com/jetbrains/python/projectView/PySkeletonsNode.java create mode 100644 python/src/com/jetbrains/python/projectView/PyUserSkeletonsNode.java diff --git a/python/src/com/jetbrains/python/projectView/PySkeletonsNode.java b/python/src/com/jetbrains/python/projectView/PySkeletonsNode.java new file mode 100644 index 000000000000..4bdab7626057 --- /dev/null +++ b/python/src/com/jetbrains/python/projectView/PySkeletonsNode.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2014 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.jetbrains.python.projectView; + +import com.intellij.ide.projectView.PresentationData; +import com.intellij.ide.projectView.ViewSettings; +import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiManager; +import com.intellij.util.PlatformIcons; +import com.jetbrains.python.sdk.PythonSdkType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author vlan + */ +public class PySkeletonsNode extends PsiDirectoryNode { + private PySkeletonsNode(Project project, PsiDirectory value, ViewSettings viewSettings) { + super(project, value, viewSettings); + } + + @Override + protected void updateImpl(PresentationData data) { + data.setPresentableText("Binary Skeletons"); + data.setIcon(PlatformIcons.LIBRARY_ICON); + } + + @Nullable + public static PySkeletonsNode create(@NotNull Project project, @NotNull Sdk sdk, ViewSettings settings) { + final VirtualFile skeletonsVirtualFile = PythonSdkType.findSkeletonsDir(sdk); + if (skeletonsVirtualFile != null) { + final PsiDirectory skeletonsDirectory = PsiManager.getInstance(project).findDirectory(skeletonsVirtualFile); + return new PySkeletonsNode(project, skeletonsDirectory, settings); + } + return null; + } +} diff --git a/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java b/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java index 0cd596e4070b..7b711a3923e6 100644 --- a/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java +++ b/python/src/com/jetbrains/python/projectView/PyTreeStructureProvider.java @@ -23,6 +23,7 @@ import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; import com.intellij.ide.projectView.impl.nodes.PsiFileNode; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.project.DumbAware; +import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.projectRoots.SdkTypeId; import com.intellij.openapi.roots.JdkOrderEntry; @@ -50,15 +51,25 @@ public class PyTreeStructureProvider implements SelectableTreeStructureProvider, @NotNull @Override public Collection modify(@NotNull AbstractTreeNode parent, @NotNull Collection children, ViewSettings settings) { + final Project project = parent.getProject(); final Sdk sdk = getPythonSdk(parent); - if (sdk != null) { - return hideSkeletons(children); + if (sdk != null && project != null) { + final Collection newChildren = hideSkeletons(children); + final PySkeletonsNode skeletonsNode = PySkeletonsNode.create(project, sdk, settings); + if (skeletonsNode != null) { + newChildren.add(skeletonsNode); + } + final PyUserSkeletonsNode userSkeletonsNode = PyUserSkeletonsNode.create(project, settings); + if (userSkeletonsNode != null) { + newChildren.add(userSkeletonsNode); + } + return newChildren; } if (settings.isShowMembers()) { List newChildren = new ArrayList(); for (AbstractTreeNode child : children) { if (child instanceof PsiFileNode && ((PsiFileNode)child).getValue() instanceof PyFile) { - newChildren.add(new PyFileNode(parent.getProject(), ((PsiFileNode)child).getValue(), settings)); + newChildren.add(new PyFileNode(project, ((PsiFileNode)child).getValue(), settings)); } else { newChildren.add(child); diff --git a/python/src/com/jetbrains/python/projectView/PyUserSkeletonsNode.java b/python/src/com/jetbrains/python/projectView/PyUserSkeletonsNode.java new file mode 100644 index 000000000000..cff419ca4ac2 --- /dev/null +++ b/python/src/com/jetbrains/python/projectView/PyUserSkeletonsNode.java @@ -0,0 +1,53 @@ +/* + * Copyright 2000-2014 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.jetbrains.python.projectView; + +import com.intellij.ide.projectView.PresentationData; +import com.intellij.ide.projectView.ViewSettings; +import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiManager; +import com.intellij.util.PlatformIcons; +import com.jetbrains.python.codeInsight.userSkeletons.PyUserSkeletonsUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author vlan + */ +public class PyUserSkeletonsNode extends PsiDirectoryNode { + private PyUserSkeletonsNode(Project project, PsiDirectory value, ViewSettings viewSettings) { + super(project, value, viewSettings); + } + + @Override + protected void updateImpl(PresentationData data) { + data.setPresentableText("Extended Definitions"); + data.setIcon(PlatformIcons.LIBRARY_ICON); + } + + @Nullable + public static PyUserSkeletonsNode create(@NotNull Project project, ViewSettings viewSettings) { + final VirtualFile userSkeletonsVirtualFile = PyUserSkeletonsUtil.getUserSkeletonsDirectory(); + if (userSkeletonsVirtualFile != null) { + final PsiDirectory userSkeletonsDirectory = PsiManager.getInstance(project).findDirectory(userSkeletonsVirtualFile); + return new PyUserSkeletonsNode(project, userSkeletonsDirectory, viewSettings); + } + return null; + } +}