blob: 452475e4daafce227e684376ea8f8623e1aeaa8d [file] [log] [blame]
package org.jetbrains.android.augment;
import com.android.resources.ResourceType;
import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import org.jetbrains.android.resourceManagers.ResourceManager;
import org.jetbrains.android.resourceManagers.SystemResourceManager;
import org.jetbrains.android.sdk.AndroidPlatform;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidInternalRClass extends AndroidLightClassBase {
private static final Key<Sdk> ANDROID_INTERNAL_R = Key.create("ANDROID_INTERNAL_R");
private final PsiFile myFile;
private final ResourceManager mySystemResourceManager;
private final PsiClass[] myInnerClasses;
public AndroidInternalRClass(@NotNull PsiManager psiManager, @NotNull AndroidPlatform platform, Sdk sdk) {
super(psiManager);
myFile = PsiFileFactory.getInstance(myManager.getProject()).createFileFromText("R.java", JavaFileType.INSTANCE, "");
myFile.getViewProvider().getVirtualFile().putUserData(ANDROID_INTERNAL_R, sdk);
mySystemResourceManager = new SystemResourceManager(psiManager.getProject(), platform, false);
final ResourceType[] types = ResourceType.values();
myInnerClasses = new PsiClass[types.length];
for (int i = 0; i < types.length; i++) {
myInnerClasses[i] = new MyInnerClass(types[i].getName());
}
}
@Override
public String toString() {
return "AndroidInternalRClass";
}
@Nullable
@Override
public String getQualifiedName() {
return AndroidPsiElementFinder.INTERNAL_R_CLASS_QNAME;
}
@Override
public String getName() {
return "R";
}
@Nullable
@Override
public PsiClass getContainingClass() {
return null;
}
@Nullable
@Override
public PsiFile getContainingFile() {
return myFile;
}
@NotNull
@Override
public PsiClass[] getInnerClasses() {
return myInnerClasses;
}
@Override
public PsiClass findInnerClassByName(@NonNls String name, boolean checkBases) {
for (PsiClass aClass : getInnerClasses()) {
if (name.equals(aClass.getName())) {
return aClass;
}
}
return null;
}
private class MyInnerClass extends ResourceTypeClassBase {
public MyInnerClass(String name) {
super(AndroidInternalRClass.this, name);
}
@NotNull
@Override
protected PsiField[] doGetFields() {
return buildResourceFields(mySystemResourceManager, false, myName, AndroidInternalRClass.this);
}
}
public static boolean isAndroidInternalR(@NotNull VirtualFile file, @NotNull Sdk sdk) {
return sdk.equals(file.getUserData(ANDROID_INTERNAL_R));
}
}