void (boolean moveCaretFromCollapsedRegion, boolean adjustScrollingPosition) { clearCachedValues(); for (FoldingListener listener : myListeners) { listener.onFoldProcessingEnd(); } myEditor.updateCaretCursor(); myEditor.recalculateSizeAndRepaint(); ((EditorGutterComponentImpl)myEditor.getGutterComponentEx()).updateSize(); myEditor.getGutterComponentEx().repaint(); myEditor.invokeDelayedErrorStripeRepaint(); myEditor.getCaretModel().runBatchCaretOperation(() -> { for (Caret caret : myEditor.getCaretModel().getAllCarets()) { LogicalPosition positionToUse = null; int offsetToUse = -1; SavedCaretPosition savedPosition = caret.getUserData(SAVED_CARET_POSITION); boolean markedForUpdate = caret.getUserData(MARK_FOR_UPDATE) != null; if (ClientId.isLocal(ClientEditorManager.getClientId(myEditor)) && savedPosition != null && savedPosition.isUpToDate(myEditor)) { int savedOffset = myEditor.logicalPositionToOffset(savedPosition.position); FoldRegion collapsedAtSaved = myFoldTree.fetchOutermost(savedOffset); if (collapsedAtSaved == null) { positionToUse = savedPosition.position; } else { offsetToUse = collapsedAtSaved.getPlaceholderText().isEmpty() && !(collapsedAtSaved instanceof CustomFoldRegion) ? collapsedAtSaved.getEndOffset() // old-style rendered docs : collapsedAtSaved.getStartOffset(); } } if ((markedForUpdate || moveCaretFromCollapsedRegion) && caret.isUpToDate()) { if (offsetToUse >= 0) { caret.moveToOffset(offsetToUse); } else if (positionToUse != null) { caret.moveToLogicalPosition(positionToUse); } else { ((CaretImpl)caret).updateVisualPosition(); } } caret.putUserData(SAVED_CARET_POSITION, savedPosition); caret.putUserData(MARK_FOR_UPDATE, null); int selectionStart = caret.getSelectionStart(); int selectionEnd = caret.getSelectionEnd(); if (isOffsetInsideCollapsedRegion(selectionStart) || isOffsetInsideCollapsedRegion(selectionEnd)) { caret.removeSelection(); } else if (caret.hasSelection() && selectionEnd <= myEditor.getDocument().getTextLength()) { caret.setSelection(selectionStart, selectionEnd); } } }); if (adjustScrollingPosition) myScrollingPositionKeeper.restorePosition(true); }