com.android.tools.idea.navigator.nodes.AndroidResFolderNode.java Source code

Java tutorial

Introduction

Here is the source code for com.android.tools.idea.navigator.nodes.AndroidResFolderNode.java

Source

/*
 * 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.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;

    }
}