blob: dd56d604f9b67fb6cdc491a6cdbcad2bc1f6a337 [file] [log] [blame]
/*
* 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.SdkConstants;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.ide.projectView.ProjectViewNode;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Queryable;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.ui.SimpleTextAttributes;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.facet.AndroidSourceType;
import org.jetbrains.android.facet.IdeaSourceProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.util.Collection;
import java.util.List;
import java.util.Set;
public class AndroidManifestsGroupNode extends ProjectViewNode<AndroidFacet> implements DirectoryGroupNode {
private static final String MANIFESTS_NODE = "manifests";
@NotNull private final Set<VirtualFile> mySources;
protected AndroidManifestsGroupNode(@NotNull Project project,
@NotNull AndroidFacet facet,
@NotNull ViewSettings viewSettings,
@NotNull Set<VirtualFile> sources) {
super(project, facet, viewSettings);
mySources = sources;
}
@Override
public boolean contains(@NotNull VirtualFile file) {
return mySources.contains(file);
}
@NotNull
@Override
public Collection<? extends AbstractTreeNode> getChildren() {
PsiManager psiManager = PsiManager.getInstance(myProject);
List<AbstractTreeNode> children = Lists.newArrayList();
for (VirtualFile manifest : mySources) {
PsiFile psiFile = psiManager.findFile(manifest);
if (psiFile != null) {
children.add(new AndroidManifestFileNode(myProject, psiFile, getSettings(), getValue()));
}
}
return children;
}
@Override
protected void update(PresentationData presentation) {
presentation.addText(MANIFESTS_NODE, SimpleTextAttributes.REGULAR_ATTRIBUTES);
Icon icon = AndroidSourceType.MANIFEST.getIcon();
if (icon != null) {
presentation.setIcon(icon);
}
presentation.setPresentableText(MANIFESTS_NODE);
}
@Override
public boolean expandOnDoubleClick() {
return false;
}
@Override
public boolean canNavigate() {
return !mySources.isEmpty();
}
@Override
public void navigate(boolean requestFocus) {
VirtualFile fileToOpen = findFileToOpen(mySources);
if (fileToOpen == null) {
return;
}
new OpenFileDescriptor(myProject, fileToOpen).navigate(requestFocus);
}
@Nullable
private VirtualFile findFileToOpen(@NotNull Set<VirtualFile> files) {
VirtualFile bestFile = Iterables.getFirst(files, null);
PsiManager psiManager = PsiManager.getInstance(myProject);
for (VirtualFile f : files) {
PsiFile psiFile = psiManager.findFile(f);
if (psiFile == null) {
continue;
}
IdeaSourceProvider sourceProvider = AndroidManifestFileNode.getSourceProvider(getValue(), psiFile);
if (sourceProvider != null && SdkConstants.FD_MAIN.equals(sourceProvider.getName())) {
bestFile = f;
}
}
return bestFile;
}
@NotNull
@Override
public PsiDirectory[] getDirectories() {
return PsiDirectory.EMPTY_ARRAY;
}
@Nullable
@Override
public Comparable getSortKey() {
return AndroidSourceType.MANIFEST;
}
@Nullable
@Override
public Comparable getTypeSortKey() {
return AndroidSourceType.MANIFEST;
}
@Nullable
@Override
public String toTestString(@Nullable Queryable.PrintInfo printInfo) {
return MANIFESTS_NODE;
}
}