package org.jetbrains.android.projectView; import com.android.resources.ResourceFolderType; import com.intellij.ide.projectView.TreeStructureProvider; import com.intellij.ide.projectView.ViewSettings; import com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode; import com.intellij.ide.util.treeView.AbstractTreeNode; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleUtil; import com.intellij.psi.PsiDirectory; import com.intellij.util.containers.HashMap; import org.jetbrains.android.facet.AndroidFacet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; /** * @author yole */ public class ResourceMergerTreeStructureProvider implements TreeStructureProvider { @NotNull @Override public Collection<AbstractTreeNode> modify(@NotNull AbstractTreeNode parent, @NotNull Collection<AbstractTreeNode> children, ViewSettings settings) { if (!ApplicationManager.getApplication().isInternal()) { return children; } if (parent instanceof PsiDirectoryNode) { PsiDirectory directory = ((PsiDirectoryNode)parent).getValue(); if (!directory.getName().equals("res")) { return children; } Module module = ModuleUtil.findModuleForPsiElement(directory); AndroidFacet facet = AndroidFacet.getInstance(module); if (facet == null) { return children; } return mergeResourceDirectories(children, settings); } return children; } private static Collection<AbstractTreeNode> mergeResourceDirectories(Collection<AbstractTreeNode> children, ViewSettings settings) { List<AbstractTreeNode> result = new ArrayList<AbstractTreeNode>(); Map<ResourceFolderType, ResourceDirectoryNode> resourceDirectories = new HashMap<ResourceFolderType, ResourceDirectoryNode>(); for (AbstractTreeNode child : children) { if (!(child instanceof PsiDirectoryNode)) { result.add(child); continue; } PsiDirectoryNode directoryNode = (PsiDirectoryNode)child; PsiDirectory directory = directoryNode.getValue(); ResourceFolderType type = ResourceFolderType.getFolderType(directory.getName()); if (type == null) { result.add(child); continue; } ResourceDirectoryNode node = resourceDirectories.get(type); if (node == null || !directory.getName().contains("-")) { node = new ResourceDirectoryNode(directoryNode.getProject(), directoryNode, settings); resourceDirectories.put(type, node); } } for (ResourceDirectoryNode node : resourceDirectories.values()) { node.collectChildren(); result.add(node); } return result; } @Nullable @Override public Object getData(Collection<AbstractTreeNode> selected, String dataName) { return null; //To change body of implemented methods use File | Settings | File Templates. } }