package com.seventh7.mybatis.provider;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import com.intellij.pom.Navigatable;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.xml.DomElement;
import com.intellij.util.xml.DomUtil;
import com.seventh7.mybatis.dom.model.Delete;
import com.seventh7.mybatis.dom.model.GroupTwo;
import com.seventh7.mybatis.dom.model.IdDomElement;
import com.seventh7.mybatis.dom.model.Insert;
import com.seventh7.mybatis.dom.model.Select;
import com.seventh7.mybatis.dom.model.Update;
import com.seventh7.mybatis.util.Icons;
import com.seventh7.mybatis.util.JavaUtils;
import com.seventh7.mybatis.util.MapperUtils;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
/**
* @author yanglin
*/
public class StatementLineMarkerProvider extends SimpleLineMarkerProvider<XmlTag, PsiMethod>{
private static final ImmutableList<Class<? extends GroupTwo>> TARGET_TYPES = ImmutableList.of(
Select.class,
Update.class,
Insert.class,
Delete.class
);
@Override
public boolean isTheElement(@NotNull PsiElement element) {
return element instanceof XmlTag
&& MapperUtils.isElementWithinMybatisFile(element)
&& isTargetType(element);
}
@SuppressWarnings("unchecked")
@NotNull @Override
public Optional<PsiMethod> apply(@NotNull XmlTag from) {
DomElement domElement = DomUtil.getDomElement(from);
return null == domElement ? Optional.<PsiMethod>absent() : JavaUtils.findMethod(from.getProject(), (IdDomElement)domElement);
}
private boolean isTargetType(PsiElement element) {
DomElement domElement = DomUtil.getDomElement(element);
for (Class<?> clazz : TARGET_TYPES) {
if(clazz.isInstance(domElement))
return true;
}
return false;
}
@SuppressWarnings("unchecked")
@NotNull @Override
public Navigatable getNavigatable(@NotNull XmlTag from, @NotNull PsiMethod target) {
return (Navigatable)target.getNavigationElement();
}
@NotNull @Override
public String getTooltip(@NotNull XmlTag from, @NotNull PsiMethod target) {
return "Data access object found - " + target.getContainingClass().getQualifiedName();
}
@NotNull @Override
public Icon getIcon() {
return Icons.STATEMENT_LINE_MARKER_ICON;
}
}