blob: b25e5d4a391a75a1e26d459aacf7a43f69bae401 [file] [log] [blame]
package org.jetbrains.android.dom.wrappers;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiTarget;
import com.intellij.psi.impl.RenameableFakePsiElement;
import com.intellij.psi.xml.XmlAttributeValue;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.android.resourceManagers.ValueResourceInfo;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.io.File;
/**
* @author Eugene.Kudelevsky
*/
public class LazyValueResourceElementWrapper extends RenameableFakePsiElement implements PsiTarget,
Comparable<LazyValueResourceElementWrapper> {
private final ValueResourceInfo myResourceInfo;
private final PsiElement myParent;
public LazyValueResourceElementWrapper(@NotNull ValueResourceInfo resourceInfo, @NotNull PsiElement parent) {
super(parent);
myParent = parent;
myResourceInfo = resourceInfo;
}
@Override
public String getName() {
return myResourceInfo.getName();
}
@Nullable
@Override
public PsiElement setName(@NonNls @NotNull String name) throws IncorrectOperationException {
final XmlAttributeValue element = computeElement();
if (element == null) {
throw new IncorrectOperationException(
"Cannot find resource '" + myResourceInfo.getName() + "' in file " + myResourceInfo.getContainingFile().getPath());
}
return new ValueResourceElementWrapper(element).setName(name);
}
@Override
public ItemPresentation getPresentation() {
return new ItemPresentation() {
@Override
@Nullable
public String getPresentableText() {
final String name = myResourceInfo.getName();
final VirtualFile file = myResourceInfo.getContainingFile();
final VirtualFile dir = file.getParent();
if (dir == null) {
return name;
}
return name + " (..." + File.separatorChar + dir.getName() +
File.separatorChar + file.getName() + ')';
}
@Override
public String getLocationString() {
return null;
}
@Override
public Icon getIcon(boolean open) {
return null;
}
};
}
@Nullable
public XmlAttributeValue computeElement() {
return myResourceInfo.computeXmlElement();
}
@NotNull
@Override
public PsiElement getNavigationElement() {
final XmlAttributeValue element = myResourceInfo.computeXmlElement();
return element != null ? element : myParent;
}
@NotNull
public ValueResourceInfo getResourceInfo() {
return myResourceInfo;
}
@Override
public String getTypeName() {
return "Android Value Resource";
}
@Override
public Icon getIcon() {
return null;
}
@Nullable
public static PsiElement computeLazyElement(PsiElement element) {
if (element instanceof LazyValueResourceElementWrapper) {
element = ((LazyValueResourceElementWrapper)element).computeElement();
}
return element;
}
// Comparator useful for comparing one wrapper for priority sorting without having to actually compute the XML elements
@Override
public int compareTo(@NotNull LazyValueResourceElementWrapper other) {
return myResourceInfo.compareTo(other.myResourceInfo);
}
}