boolean (@NotNull MouseEvent e) { ThreadingAssertions.assertEventDispatchThread(); LightweightHint currentHint = getCurrentHint(); if (currentHint != null && (myKeepHint || myMouseMovementTracker.isMovingTowards(e, getBoundsOnScreen(currentHint)))) { return true; } int visualLine = getVisualLineByEvent(e); myLastVisualLine = visualLine; Rectangle area = myEditor.getScrollingModel().getVisibleArea(); int visualY = myEditor.visualLineToY(visualLine); boolean isVisible = myWheelAccumulator == 0 && area.contains(area.x, visualY); if (!isVisible && UISettings.getInstance().getShowEditorToolTip() && !UIUtil.uiParents(myEditor.getComponent(), false).filter(EditorWindowHolder.class).isEmpty()) { float rowRatio = (float)visualLine / (myEditor.getVisibleLineCount() - 1); int y = myRowAdjuster != 0 ? (int)(rowRatio * myEditor.getVerticalScrollBar().getHeight()) : e.getY() + 1; List<RangeHighlighterEx> highlighters = new ArrayList<>(); collectRangeHighlighters(this, visualLine, highlighters); collectRangeHighlighters(myEditor.getFilteredDocumentMarkupModel(), visualLine, highlighters); myEditorFragmentRenderer.show(visualLine, highlighters, e.isAltDown(), createHint(e.getComponent(), new Point(0,y))); return true; } Set<RangeHighlighter> highlighters = getNearestHighlighters(e.getY() + 1); if (highlighters.isEmpty()) { return false; } int y; RangeHighlighter nearest = getNearestRangeHighlighter(e); if (nearest == null) { y = e.getY(); } else { ProperTextRange range = offsetsToYPositions(nearest.getStartOffset(), nearest.getEndOffset()); int eachStartY = range.getStartOffset(); int eachEndY = range.getEndOffset(); y = eachStartY + (eachEndY - eachStartY) / 2; } if (currentHint != null && y == myCurrentHintAnchorY) { return true; } ReadAction.nonBlocking(()->myTooltipRendererProvider.calcTooltipRenderer(highlighters)) .expireWhen(() -> myEditor.isDisposed()) .finishOnUiThread(ModalityState.nonModal(), bigRenderer -> { if (bigRenderer != null) { LightweightHint hint = showTooltip(bigRenderer, createHint(e.getComponent(), new Point(0, y+1)).setForcePopup(true)); myCurrentHint = new WeakReference<>(hint); myCurrentHintAnchorY = y; myKeepHint = false; myMouseMovementTracker.reset(); } }) .submit(AppExecutorUtil.getAppExecutorService()); return true; }