From 9b57811d1c8f428233f778471194ae0c8ce6de37 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Thu, 19 Nov 2015 19:11:05 +0300 Subject: [PATCH] editor: allow to disable RangeHighlighters from DocumentMarkupModel in a single editor --- .../impl/EditorFilteringMarkupModelEx.java | 12 ++++++--- .../openapi/editor/impl/EditorImpl.java | 26 ++++++++++++++++--- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFilteringMarkupModelEx.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFilteringMarkupModelEx.java index 778aafc10be5..a575fdfa786f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFilteringMarkupModelEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFilteringMarkupModelEx.java @@ -18,7 +18,6 @@ package com.intellij.openapi.editor.impl; import com.intellij.openapi.Disposable; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.ex.MarkupIterator; -import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.ex.MarkupModelEx; import com.intellij.openapi.editor.ex.RangeHighlighterEx; import com.intellij.openapi.editor.impl.event.MarkupModelListener; @@ -38,7 +37,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; public class EditorFilteringMarkupModelEx implements MarkupModelEx { - @NotNull private final EditorEx myEditor; + @NotNull private final EditorImpl myEditor; @NotNull private final MarkupModelEx myDelegate; private final Condition IS_AVAILABLE = new Condition() { @@ -48,13 +47,18 @@ public class EditorFilteringMarkupModelEx implements MarkupModelEx { } }; - public EditorFilteringMarkupModelEx(@NotNull EditorEx editor, @NotNull MarkupModelEx delegate) { + public EditorFilteringMarkupModelEx(@NotNull EditorImpl editor, @NotNull MarkupModelEx delegate) { myEditor = editor; myDelegate = delegate; } + @NotNull + public MarkupModelEx getDelegate() { + return myDelegate; + } + private boolean isAvailable(@NotNull RangeHighlighter highlighter) { - return highlighter.getEditorFilter().avaliableIn(myEditor); + return highlighter.getEditorFilter().avaliableIn(myEditor) && myEditor.isHighlighterAvailable(highlighter); } @Override diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java index 4042888e2374..579ca84994dd 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java @@ -191,7 +191,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi private boolean myIsViewer; @NotNull private final SelectionModelImpl mySelectionModel; @NotNull private final EditorMarkupModelImpl myMarkupModel; - @NotNull private final MarkupModelEx myDocumentMarkupModel; + @NotNull private final EditorFilteringMarkupModelEx myDocumentMarkupModel; + @NotNull private final MarkupModelListener myMarkupModelListener; @NotNull private final FoldingModelImpl myFoldingModel; @NotNull private final ScrollingModelImpl myScrollingModel; @@ -274,6 +275,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi private EditorDropHandler myDropHandler; + private Condition myHighlightingFilter; + private char[] myPrefixText; private TextAttributes myPrefixAttributes; private int myPrefixWidthInPixels; @@ -362,7 +365,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi myConnection.subscribe(DocumentBulkUpdateListener.TOPIC, new EditorDocumentBulkUpdateAdapter()); } - MarkupModelListener markupModelListener = new MarkupModelListener() { + myMarkupModelListener = new MarkupModelListener() { private boolean areRenderersInvolved(@NotNull RangeHighlighterEx highlighter) { return highlighter.getCustomRenderer() != null || highlighter.getGutterIconRenderer() != null || @@ -423,8 +426,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } }; - getFilteredDocumentMarkupModel().addMarkupModelListener(myCaretModel, markupModelListener); - getMarkupModel().addMarkupModelListener(myCaretModel, markupModelListener); + getFilteredDocumentMarkupModel().addMarkupModelListener(myCaretModel, myMarkupModelListener); + getMarkupModel().addMarkupModelListener(myCaretModel, myMarkupModelListener); myDocument.addDocumentListener(myFoldingModel, myCaretModel); myDocument.addDocumentListener(myCaretModel, myCaretModel); @@ -5482,6 +5485,21 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi myDropHandler = dropHandler; } + public void setHighlightingFilter(@Nullable Condition filter) { + if (myHighlightingFilter == filter) return; + Condition oldFilter = myHighlightingFilter; + myHighlightingFilter = filter; + + for (RangeHighlighter highlighter : myDocumentMarkupModel.getDelegate().getAllHighlighters()) { + boolean oldAvailable = oldFilter == null || oldFilter.value(highlighter); + boolean newAvailable = filter == null || filter.value(highlighter); + if (oldAvailable != newAvailable) myMarkupModelListener.attributesChanged((RangeHighlighterEx)highlighter, true); + } + } + + public boolean isHighlighterAvailable(@NotNull RangeHighlighter highlighter) { + return myHighlightingFilter == null || myHighlightingFilter.value(highlighter); + } private static class MyInputMethodHandleSwingThreadWrapper implements InputMethodRequests { private final InputMethodRequests myDelegate;