blob: 9efe172f3aa310a5fbb7a5aa94cbbeb67b616427 [file] [log] [blame]
package org.jetbrains.android.resourceManagers;
import com.android.resources.ResourceType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomManager;
import org.jetbrains.android.dom.resources.Item;
import org.jetbrains.android.dom.resources.ResourceElement;
import org.jetbrains.android.util.AndroidCommonUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Eugene.Kudelevsky
*/
public class ValueResourceInfoImpl extends ValueResourceInfoBase {
private final Project myProject;
private final int myOffset;
ValueResourceInfoImpl(@NotNull String name, @NotNull ResourceType type, @NotNull VirtualFile file, @NotNull Project project, int offset) {
super(name, type, file);
myProject = project;
myOffset = offset;
}
@Override
public XmlAttributeValue computeXmlElement() {
final ResourceElement resDomElement = computeDomElement();
return resDomElement != null ? resDomElement.getName().getXmlAttributeValue() : null;
}
@Nullable
public ResourceElement computeDomElement() {
final PsiFile file = PsiManager.getInstance(myProject).findFile(myFile);
if (!(file instanceof XmlFile)) {
return null;
}
final XmlTag tag = PsiTreeUtil.findElementOfClassAtOffset(file, myOffset, XmlTag.class, true);
if (tag == null) {
return null;
}
final DomElement domElement = DomManager.getDomManager(myProject).getDomElement(tag);
if (!(domElement instanceof ResourceElement)) {
return null;
}
final String resType = domElement instanceof Item
? ((Item)domElement).getType().getStringValue()
: AndroidCommonUtils.getResourceTypeByTagName(tag.getName());
if (!myType.getName().equals(resType)) {
return null;
}
final ResourceElement resDomElement = (ResourceElement)domElement;
final String resName = ((ResourceElement)domElement).getName().getStringValue();
return myName.equals(resName) ? resDomElement : null;
}
@Override
protected int getSortingRank() {
return 1;
}
@Override
public int compareTo(@NotNull ValueResourceInfo other) {
int delta = super.compareTo(other);
if (delta != 0) {
return delta;
}
assert other instanceof ValueResourceInfoImpl; // otherwise sorting rank should have ensured non-zero delta
return myOffset - ((ValueResourceInfoImpl)other).myOffset;
}
}