void (@NotNull PointInfo pointInfo) { GutterIconRenderer renderer = pointInfo.renderer; if (myCalculatingInBackground == renderer && !myBackgroundIndicator.isCanceled()) return; // not yet calculated myCalculatingInBackground = renderer; myBackgroundIndicator.cancel(); myBackgroundIndicator = new ProgressIndicatorBase(); myBackgroundIndicator.setModalityProgress(null); Point point = pointInfo.iconCenterPosition; Balloon.Position relativePosition = pointInfo.renderersInLine > 1 && pointInfo.rendererPosition == 0 ? Balloon.Position.below : Balloon.Position.atRight; AtomicReference<@NlsContexts.Tooltip String> tooltip = new AtomicReference<>(); ProgressManager.getInstance().runProcessWithProgressAsynchronously( new Task.Backgroundable(myEditor.getProject(), IdeBundle.message("progress.title.constructing.tooltip")) { @Override public void run(@NotNull ProgressIndicator indicator) { Callable<@NlsContexts.Tooltip String> callable = () -> renderer.getTooltipText(); tooltip.set(ReadAction.nonBlocking(callable).wrapProgress(indicator).executeSynchronously()); } @Override public void onSuccess() { showToolTip(tooltip.get(), point, relativePosition); } }, myBackgroundIndicator); }