package com.intellij.codeInsight.preview; import com.intellij.codeInsight.hint.HintManager; import com.intellij.codeInsight.hint.HintManagerImpl; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.extensions.Extensions; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.ui.LightweightHint; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import static com.intellij.codeInsight.hint.HintManagerImpl.getHintPosition; public class ElementPreviewHintProvider implements ElementPreviewProvider { private static final Logger LOG = Logger.getInstance(ElementPreviewHintProvider.class); private static final int HINT_HIDE_FLAGS = HintManager.HIDE_BY_ANY_KEY | HintManager.HIDE_BY_OTHER_HINT | HintManager.HIDE_BY_SCROLLING | HintManager.HIDE_BY_TEXT_CHANGE | HintManager.HIDE_IF_OUT_OF_EDITOR; @Nullable private LightweightHint hint; @Override public boolean isSupportedFile(@NotNull PsiFile psiFile) { for (PreviewHintProvider hintProvider : Extensions.getExtensions(PreviewHintProvider.EP_NAME)) { if (hintProvider.isSupportedFile(psiFile)) { return true; } } return false; } @Override public void show(@NotNull PsiElement element, @NotNull Editor editor, @NotNull Point point, boolean keyTriggered) { LightweightHint newHint = getHint(element); hideCurrentHintIfAny(); if (newHint == null) { return; } hint = newHint; HintManagerImpl.getInstanceImpl().showEditorHint(newHint, editor, getHintPosition(newHint, editor, editor.xyToLogicalPosition(point), HintManager.RIGHT_UNDER), HINT_HIDE_FLAGS, 0, false); } private void hideCurrentHintIfAny() { if (hint != null) { hint.hide(); hint = null; } } @Override public void hide(@Nullable PsiElement element, @NotNull Editor editor) { hideCurrentHintIfAny(); } @Nullable private static LightweightHint getHint(@NotNull PsiElement element) { for (PreviewHintProvider hintProvider : Extensions.getExtensions(PreviewHintProvider.EP_NAME)) { JComponent preview; try { preview = hintProvider.getPreviewComponent(element); } catch (Exception e) { LOG.error(e); continue; } if (preview != null) { return new LightweightHint(preview); } } return null; } }