blob: 54d32dbc3cca14da5b31533ddd082f9d997426f7 [file] [log] [blame]
package org.jetbrains.plugins.javaFX.fxml.refs;
import com.intellij.codeInsight.daemon.QuickFixActionRegistrar;
import com.intellij.codeInsight.quickfix.UnresolvedReferenceQuickFixProvider;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.impl.source.xml.TagNameReference;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
/**
* User: anna
* Date: 1/8/13
*/
public class JavaFxTagNameReference extends TagNameReference{
private static final Logger LOGGER = Logger.getInstance("#" + JavaFxTagNameReference.class.getName());
public JavaFxTagNameReference(ASTNode element, boolean startTagFlag) {
super(element, startTagFlag);
}
@Override
public TextRange getRangeInElement() {
final TextRange rangeInElement = super.getRangeInElement();
final XmlTag tagElement = getTagElement();
if (tagElement != null) {
final String tagElementName = tagElement.getName();
final int dotIdx = tagElementName.indexOf(".");
final int startOffset = rangeInElement.getStartOffset();
if (dotIdx > -1 && startOffset + dotIdx + 2 < rangeInElement.getEndOffset()) {
return new TextRange(startOffset + dotIdx + 1, rangeInElement.getEndOffset());
}
}
return rangeInElement;
}
@Override
public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException {
if (element instanceof PsiClass) {
final String qualifiedName = ((PsiClass)element).getQualifiedName();
if (qualifiedName != null) {
final String shortName = StringUtil.getShortName(qualifiedName);
final XmlTag tagElement = getTagElement();
if (tagElement != null) {
final String oldTagName = tagElement.getName();
if (oldTagName.contains(".")) {
return tagElement.setName(qualifiedName);
}
return tagElement.setName(shortName);
}
return getElement();
}
}
return super.bindToElement(element);
}
public static class JavaFxUnresolvedTagRefsProvider extends UnresolvedReferenceQuickFixProvider<JavaFxTagNameReference> {
@Override
public void registerFixes(@NotNull JavaFxTagNameReference ref, @NotNull QuickFixActionRegistrar registrar) {
XmlTag element = ref.getTagElement();
if (element != null) {
registrar.register(new JavaFxImportClassFix(ref, element) {
@Override
protected XmlTag getTagElement(JavaFxTagNameReference ref) {
return ref.getTagElement();
}
});
}
}
@NotNull
@Override
public Class<JavaFxTagNameReference> getReferenceClass() {
return JavaFxTagNameReference.class;
}
}
}