/* * Copyright (C) 2014 The Android Open Source Project * * 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.android.tools.idea.navigator.nodes; import com.android.resources.ResourceFolderType; import com.android.tools.idea.navigator.AndroidProjectTreeBuilder; import com.android.tools.idea.navigator.AndroidProjectViewPane; import com.google.common.collect.HashMultimap; import com.google.common.collect.Lists; import com.intellij.ide.projectView.ViewSettings; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDirectory; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.android.facet.AndroidSourceType; import org.jetbrains.android.facet.IdeaSourceProvider; import org.jetbrains.annotations.NotNull; import java.util.Collection; import java.util.List; import java.util.Set; public class AndroidResFolderNode extends AndroidSourceTypeNode { public AndroidResFolderNode(@NotNull Project project, @NotNull AndroidFacet facet, @NotNull ViewSettings viewSettings, @NotNull Set<VirtualFile> sourceRoots, @NotNull AndroidProjectViewPane projectViewPane) { super(project, facet, viewSettings, AndroidSourceType.RES, sourceRoots, projectViewPane); } /** * Returns the children of the res folder. Rather than showing the existing directory hierarchy, this merges together * all the folders by their {@link com.android.resources.ResourceFolderType}. */ @NotNull @Override public Collection<? extends AbstractTreeNode> getChildren() { // collect all res folders from all source providers List<PsiDirectory> resFolders = Lists.newArrayList(); for (PsiDirectory directory : getSourceDirectories()) { resFolders.addAll(Lists.newArrayList(directory.getSubdirectories())); } // group all the res folders by their folder type HashMultimap<ResourceFolderType, PsiDirectory> foldersByResourceType = HashMultimap.create(); for (PsiDirectory resFolder : resFolders) { ResourceFolderType type = ResourceFolderType.getFolderType(resFolder.getName()); if (type == null) { // skip unknown folder types inside res continue; } foldersByResourceType.put(type, resFolder); } // create a node for each res folder type that actually has some resources AndroidProjectTreeBuilder treeBuilder = (AndroidProjectTreeBuilder)myProjectViewPane.getTreeBuilder(); List<AbstractTreeNode> children = Lists.newArrayListWithExpectedSize(foldersByResourceType.size()); for (ResourceFolderType type : foldersByResourceType.keySet()) { Set<PsiDirectory> folders = foldersByResourceType.get(type); final AndroidResFolderTypeNode androidResFolderTypeNode = new AndroidResFolderTypeNode(myProject, getValue(), Lists.newArrayList(folders), getSettings(), type, myProjectViewPane); children.add(androidResFolderTypeNode); // Inform the tree builder of the node that this particular virtual file maps to for (PsiDirectory folder : folders) { treeBuilder.createMapping(folder.getVirtualFile(), androidResFolderTypeNode); } } return children; } }