package com.seventh7.mybatis.provider; import com.google.common.base.Optional; import com.intellij.codeHighlighting.Pass; import com.intellij.codeInsight.daemon.GutterIconNavigationHandler; import com.intellij.codeInsight.daemon.LineMarkerInfo; import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.pom.Navigatable; import com.intellij.psi.PsiElement; import com.intellij.util.Function; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.event.MouseEvent; import java.util.Collection; import java.util.List; import javax.swing.*; /** * @author yanglin */ public abstract class SimpleLineMarkerProvider<F extends PsiElement, T> extends MarkerProviderAdaptor { @Override public void collectSlowLineMarkers(@NotNull List<PsiElement> elements, @NotNull Collection<LineMarkerInfo> result) { } @SuppressWarnings("unchecked") @Nullable @Override public LineMarkerInfo getLineMarkerInfo(@NotNull PsiElement element) { if (!isTheElement(element)) return null; Optional<T> processResult = apply((F)element); return processResult.isPresent() ? new LineMarkerInfo<F>( (F)element, element.getTextRange(), getIcon(), Pass.UPDATE_ALL, getTooltipProvider(processResult.get()), getNavigationHandler(processResult.get()), GutterIconRenderer.Alignment.CENTER ) : null; } private Function<F, String> getTooltipProvider(final T target) { return new Function<F, String>() { @Override public String fun(F from) { return getTooltip(from, target); } }; } private GutterIconNavigationHandler<F> getNavigationHandler(final T target) { return new GutterIconNavigationHandler<F>() { @Override public void navigate(MouseEvent e, F from) { getNavigatable(from, target).navigate(true); } }; } public abstract boolean isTheElement(@NotNull PsiElement element); @NotNull public abstract Optional<T> apply(@NotNull F from); @NotNull public abstract Navigatable getNavigatable(@NotNull F from, @NotNull T target); @NotNull public abstract String getTooltip(@NotNull F from, @NotNull T target); @NotNull public abstract Icon getIcon(); }