diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index 2d4a9c356af1..e778d7074210 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -658,6 +658,10 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo final int oldLineCount = document.getLineCount(); final boolean isAtEndOfDocument = myEditor.getCaretModel().getOffset() == document.getTextLength(); boolean cycleUsed = myBuffer.isUseCyclicBuffer() && document.getTextLength() + text.length() > myBuffer.getCyclicBufferSize(); + if (cycleUsed) { + clearHyperlinkAndFoldings(); + } + CommandProcessor.getInstance().executeCommand(myProject, new Runnable() { @Override public void run() { @@ -707,7 +711,6 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo myPsiDisposedCheck.performCheck(); final int newLineCount = document.getLineCount(); if (cycleUsed) { - clearHyperlinkAndFoldings(); if (!myInSpareTimeUpdate) { myInSpareTimeUpdate = true; final EditorNotificationPanel comp = new EditorNotificationPanel() { @@ -721,7 +724,6 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo @Override public void run() { try { - myHyperlinks.clearHyperlinks(); clearHyperlinkAndFoldings(); highlightHyperlinksAndFoldings(0, document.getLineCount() - 1); } @@ -743,15 +745,18 @@ public class ConsoleViewImpl extends JPanel implements ConsoleView, ObservableCo } private void clearHyperlinkAndFoldings() { - for (Iterator it = myHyperlinks.getHyperlinks().keySet().iterator(); it.hasNext();) { - if (!it.next().isValid()) { - it.remove(); - } - } + myHyperlinks.clearHyperlinks(); + myEditor.getMarkupModel().removeAllHighlighters(); myPendingFoldRegions.clear(); myFolding.clear(); myFoldingAlarm.cancelAllRequests(); + myEditor.getFoldingModel().runBatchFoldingOperation(new Runnable() { + @Override + public void run() { + myEditor.getFoldingModel().clearFoldRegions(); + } + }); cancelHeavyAlarm(); } diff --git a/platform/lang-impl/src/com/intellij/injected/editor/FoldingModelWindow.java b/platform/lang-impl/src/com/intellij/injected/editor/FoldingModelWindow.java index f5476fa93ed9..5af9fab1d267 100644 --- a/platform/lang-impl/src/com/intellij/injected/editor/FoldingModelWindow.java +++ b/platform/lang-impl/src/com/intellij/injected/editor/FoldingModelWindow.java @@ -176,4 +176,9 @@ public class FoldingModelWindow implements FoldingModelEx{ public void rebuild() { myDelegate.rebuild(); } + + @Override + public void clearFoldRegions() { + myDelegate.clearFoldRegions(); + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/FoldingModelEx.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/FoldingModelEx.java index ca884ef2e91d..8925ef35c988 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/FoldingModelEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/FoldingModelEx.java @@ -51,5 +51,7 @@ public interface FoldingModelEx extends FoldingModel { boolean removeListener(@NotNull FoldingListener listener); + void clearFoldRegions(); + void rebuild(); } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java index 1d24154c9285..6e9c2f75ee7c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/FoldingModelImpl.java @@ -287,6 +287,19 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentList } public void dispose() { + doClearFoldRegions(); + } + + @Override + public void clearFoldRegions() { + if (!myIsBatchFoldingProcessing) { + LOG.error("Fold regions must be added or removed inside batchFoldProcessing() only."); + return; + } + doClearFoldRegions(); + } + + public void doClearFoldRegions() { myGroups.clear(); myFoldTree.clear(); }