blob: 7f84893ed06342bb556af358f7238011e1bf2a9c [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.android.ide.common.resources.configuration.FolderConfiguration;
import com.android.resources.ResourceConstants;
import com.android.tools.idea.navigator.AndroidProjectViewPane;
import com.google.common.base.Joiner;
import com.intellij.ide.projectView.PresentationData;
import com.intellij.ide.projectView.ViewSettings;
import com.intellij.ide.projectView.impl.nodes.PsiFileNode;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Queryable;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.ui.SimpleTextAttributes;
import com.siyeh.ig.internationalization.CharacterComparisonInspection;
import org.jetbrains.android.facet.AndroidFacet;
import org.jetbrains.android.facet.IdeaSourceProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Comparator;
public class AndroidResFileNode extends PsiFileNode implements Comparable {
private final AndroidFacet myFacet;
public AndroidResFileNode(@NotNull Project project,
@NotNull PsiFile psiFile,
@NotNull ViewSettings settings,
@NotNull AndroidFacet facet) {
super(project, psiFile, settings);
myFacet = facet;
}
@Override
public void update(PresentationData data) {
super.update(data);
String text = data.getPresentableText();
data.addText(text, SimpleTextAttributes.REGULAR_ATTRIBUTES);
data.setPresentableText(text);
String qualifier = getQualifier();
if (qualifier != null) {
data.addText(qualifier, SimpleTextAttributes.GRAY_ATTRIBUTES);
}
}
@Nullable
@Override
public String toTestString(@Nullable Queryable.PrintInfo printInfo) {
PsiFile psiFile = getValue();
String qualifier = getQualifier();
return psiFile.getName() + (qualifier == null ? "" : qualifier);
}
@Nullable
String getQualifier() {
PsiFile resFile = getValue();
if (resFile == null) { // happens if psiFile becomes invalid
return null;
}
PsiDirectory resTypeFolder = resFile.getParent();
if (resTypeFolder == null) { // cannot happen
return null;
}
String folderName = resTypeFolder.getName();
int index = folderName.indexOf(ResourceConstants.RES_QUALIFIER_SEP);
String qualifier = index < 0 ? null : folderName.substring(index + 1);
String providerName = null;
PsiDirectory resFolder = resTypeFolder.getParent();
if (resFolder != null) {
IdeaSourceProvider ideaSourceProvider = findSourceProviderForResFolder(resFolder);
if (ideaSourceProvider != null) {
providerName = ideaSourceProvider.getName();
if (SdkConstants.FD_MAIN.equals(providerName)) {
providerName = null;
}
}
}
if (qualifier == null && providerName == null) {
return null;
}
StringBuilder sb = new StringBuilder(10);
sb.append(" (");
sb.append(Joiner.on(", ").skipNulls().join(qualifier, providerName));
sb.append(')');
return sb.toString();
}
@Nullable
public FolderConfiguration getFolderConfiguration() {
PsiFile psiFile = getValue();
if (psiFile == null) { // happens if psiFile becomes invalid
return null;
}
PsiDirectory folder = psiFile.getParent();
return folder == null ? null : FolderConfiguration.getConfigForFolder(folder.getName());
}
@Nullable
@Override
public Comparable getSortKey() {
return this;
}
@Override
public Comparable getTypeSortKey() {
return this;
}
@Override
public int compareTo(@NotNull Object obj) {
return AndroidResComparator.INSTANCE.compare(this, obj);
}
@Nullable
public String getResName() {
PsiFile f = getValue();
return (f == null || !f.isValid()) ? null : f.getName();
}
@Nullable
private IdeaSourceProvider findSourceProviderForResFolder(@NotNull PsiDirectory resDirectory) {
for (IdeaSourceProvider provider : AndroidProjectViewPane.getSourceProviders(myFacet)) {
if (provider.getResDirectories().contains(resDirectory.getVirtualFile())) {
return provider;
}
}
return null;
}
}