package com.seventh7.mybatis.provider; import com.google.common.base.Function; import com.google.common.collect.Collections2; import com.intellij.codeInsight.daemon.RelatedItemLineMarkerInfo; import com.intellij.codeInsight.daemon.RelatedItemLineMarkerProvider; import com.intellij.codeInsight.navigation.NavigationGutterIconBuilder; import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiNameIdentifierOwner; import com.intellij.psi.xml.XmlTag; import com.intellij.util.CommonProcessors; import com.intellij.util.xml.DomElement; import com.seventh7.mybatis.dom.model.IdDomElement; import com.seventh7.mybatis.service.JavaService; import com.seventh7.mybatis.util.Icons; import com.seventh7.mybatis.util.JavaUtils; import org.jetbrains.annotations.NotNull; import java.util.Collection; /** * @author yanglin */ public class MapperLineMarkerProvider extends RelatedItemLineMarkerProvider { private static final Function<DomElement, XmlTag> FUN = new Function<DomElement, XmlTag>() { @Override public XmlTag apply(DomElement domElement) { return domElement.getXmlTag(); } }; @Override protected void collectNavigationMarkers(@NotNull PsiElement element, Collection<? super RelatedItemLineMarkerInfo> result) { if (element instanceof PsiNameIdentifierOwner && JavaUtils.isElementWithinInterface(element)) { CommonProcessors.CollectProcessor<IdDomElement> processor = new CommonProcessors.CollectProcessor<IdDomElement>(); JavaService.getInstance(element.getProject()).process(element, processor); Collection<IdDomElement> results = processor.getResults(); if (!results.isEmpty()) { NavigationGutterIconBuilder<PsiElement> builder = NavigationGutterIconBuilder.create(Icons.MAPPER_LINE_MARKER_ICON) .setAlignment(GutterIconRenderer.Alignment.CENTER) .setTargets(Collections2.transform(results, FUN)) .setTooltipTitle("Navigation to target in mapper xml"); result.add(builder.createLineMarkerInfo(((PsiNameIdentifierOwner) element).getNameIdentifier())); } } } }