void (@NotNull Project project, @NotNull Editor editor, @NotNull HighlightInfo info, @Nullable Runnable postNavigateRunnable) { int oldOffset = editor.getCaretModel().getOffset(); int offset = getNavigationPositionFor(info, editor.getDocument()); int endOffset = info.getActualEndOffset(); ScrollingModel scrollingModel = editor.getScrollingModel(); if (offset != oldOffset) { ScrollType scrollType = offset > oldOffset ? ScrollType.CENTER_DOWN : ScrollType.CENTER_UP; editor.getSelectionModel().removeSelection(); editor.getCaretModel().removeSecondaryCarets(); editor.getCaretModel().moveToOffset(offset); scrollingModel.scrollToCaret(scrollType); FoldRegion regionAtOffset = editor.getFoldingModel().getCollapsedRegionAtOffset(offset); if (regionAtOffset != null) editor.getFoldingModel().runBatchFoldingOperation(() -> regionAtOffset.setExpanded(true)); } scrollingModel.runActionOnScrollingFinished( () -> { int maxOffset = editor.getDocument().getTextLength() - 1; if (maxOffset == -1) return; scrollingModel.scrollTo(editor.offsetToLogicalPosition(Math.min(maxOffset, endOffset)), ScrollType.MAKE_VISIBLE); scrollingModel.scrollTo(editor.offsetToLogicalPosition(Math.min(maxOffset, offset)), ScrollType.MAKE_VISIBLE); if (postNavigateRunnable != null) { postNavigateRunnable.run(); } } ); IdeDocumentHistory.getInstance(project).includeCurrentCommandAsNavigation(); RangeHighlighterEx highlighter = info.getHighlighter(); if (highlighter != null) selectHighlighterIfVisible(project, highlighter); }