From b0b849795c20f55c2d4d4c396058e4da26281219 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Thu, 19 Nov 2015 16:58:29 +0300 Subject: [PATCH] editor: extract Editor RangeHighlighter filters into separate markup model --- .../com/intellij/openapi/editor/Editor.java | 3 +- .../find/impl/livePreview/LivePreview.java | 2 - .../injected/editor/EditorWindowImpl.java | 8 + .../impl/EditorHyperlinkSupport.java | 3 +- .../intellij/openapi/editor/ex/EditorEx.java | 18 ++ .../openapi/editor/impl/BorderEffect.java | 2 - .../impl/EditorFilteringMarkupModelEx.java | 217 ++++++++++++++++++ .../impl/EditorGutterComponentImpl.java | 7 +- .../openapi/editor/impl/EditorImpl.java | 26 ++- .../editor/impl/EditorMarkupModelImpl.java | 17 +- .../openapi/editor/impl/IterationState.java | 4 +- .../editor/impl/view/EditorPainter.java | 26 +-- .../editor/impl/view/IterationState.java | 5 +- .../util/containers/FilteringIterator.java | 5 + 14 files changed, 286 insertions(+), 57 deletions(-) create mode 100644 platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFilteringMarkupModelEx.java diff --git a/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java b/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java index 87deb52293fc..c5cba0774a71 100644 --- a/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java +++ b/platform/editor-ui-api/src/com/intellij/openapi/editor/Editor.java @@ -98,7 +98,8 @@ public interface Editor extends UserDataHolder { * (for example, highlighters added by "Highlight usages in file"), which are painted in addition * to the highlighters contained in the markup model for the document. *

- * See also {@link com.intellij.openapi.editor.impl.DocumentMarkupModel.forDocument(Document, Project, boolean)}. + * See also {@link com.intellij.openapi.editor.impl.DocumentMarkupModel.forDocument(Document, Project, boolean)} + * {@link com.intellij.openapi.editor.ex.EditorEx#getFilteredDocumentMarkupModel()}. * * @return the markup model instance. */ diff --git a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java index 65329d386a6d..c3bf9c059746 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java +++ b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreview.java @@ -457,8 +457,6 @@ public class LivePreview extends DocumentAdapter implements SearchResults.Search new Processor() { @Override public boolean process(RangeHighlighterEx highlighter) { - if (!highlighter.getEditorFilter().avaliableIn(mySearchResults.getEditor())) return true; - TextAttributes textAttributes = highlighter.getTextAttributes(); if (highlighter.getUserData(SEARCH_MARKER) != null && diff --git a/platform/lang-impl/src/com/intellij/injected/editor/EditorWindowImpl.java b/platform/lang-impl/src/com/intellij/injected/editor/EditorWindowImpl.java index e2563adde45c..9df02e89a905 100644 --- a/platform/lang-impl/src/com/intellij/injected/editor/EditorWindowImpl.java +++ b/platform/lang-impl/src/com/intellij/injected/editor/EditorWindowImpl.java @@ -73,6 +73,7 @@ public class EditorWindowImpl extends UserDataHolderBase implements EditorWindow private static final List allEditors = new WeakList(); private boolean myDisposed; private final MarkupModelWindow myMarkupModelDelegate; + private final MarkupModelWindow myDocumentMarkupModelDelegate; private final FoldingModelWindow myFoldingModelWindow; private final SoftWrapModelWindow mySoftWrapModel; @@ -110,6 +111,7 @@ public class EditorWindowImpl extends UserDataHolderBase implements EditorWindow myCaretModelDelegate = new CaretModelWindow(myDelegate.getCaretModel(), this); mySelectionModelDelegate = new SelectionModelWindow(myDelegate, myDocumentWindow,this); myMarkupModelDelegate = new MarkupModelWindow(myDelegate.getMarkupModel(), myDocumentWindow); + myDocumentMarkupModelDelegate = new MarkupModelWindow(myDelegate.getFilteredDocumentMarkupModel(), myDocumentWindow); myFoldingModelWindow = new FoldingModelWindow(delegate.getFoldingModel(), documentWindow, this); mySoftWrapModel = new SoftWrapModelWindow(this); } @@ -254,6 +256,12 @@ public class EditorWindowImpl extends UserDataHolderBase implements EditorWindow return myMarkupModelDelegate; } + @NotNull + @Override + public MarkupModelEx getFilteredDocumentMarkupModel() { + return myDocumentMarkupModelDelegate; + } + @Override @NotNull public FoldingModelEx getFoldingModel() { diff --git a/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java b/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java index 00aba68c73db..84c043df1e83 100644 --- a/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java +++ b/platform/platform-impl/src/com/intellij/execution/impl/EditorHyperlinkSupport.java @@ -184,8 +184,7 @@ public class EditorHyperlinkSupport { new FilteringProcessor(new Condition() { @Override public boolean value(RangeHighlighterEx rangeHighlighterEx) { - return rangeHighlighterEx.getEditorFilter().avaliableIn(editor) && - HYPERLINK_LAYER == rangeHighlighterEx.getLayer() && + return HYPERLINK_LAYER == rangeHighlighterEx.getLayer() && rangeHighlighterEx.isValid() && getHyperlinkInfo(rangeHighlighterEx) != null; } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEx.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEx.java index 5d635c901f82..281ee6bbbba1 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEx.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/EditorEx.java @@ -21,6 +21,7 @@ import com.intellij.ide.DeleteProvider; import com.intellij.ide.PasteProvider; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.LogicalPosition; import com.intellij.openapi.editor.VisualPosition; @@ -29,6 +30,8 @@ import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.editor.impl.TextDrawingCallback; import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces; import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; @@ -57,6 +60,21 @@ public interface EditorEx extends Editor { @NotNull MarkupModelEx getMarkupModel(); + /** + * Returns the markup model for the underlying Document. + *

+ * This model differs from the one from DocumentMarkupModel#forDocument, + * as it does not contain highlighters that should not be visible in this Editor. + * (for example, debugger breakpoints in a diff viewer editors) + * + * @return the markup model instance. + * @see com.intellij.openapi.editor.markup.MarkupEditorFilter + * @see com.intellij.openapi.editor.impl.EditorImpl#setHighlightingFilter(Condition) + * @see com.intellij.openapi.editor.impl.DocumentMarkupModel#forDocument(Document, Project, boolean) + */ + @NotNull + MarkupModelEx getFilteredDocumentMarkupModel(); + @NotNull EditorGutterComponentEx getGutterComponentEx(); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/BorderEffect.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/BorderEffect.java index ec38b8c6c90e..ae9a89d50b05 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/BorderEffect.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/BorderEffect.java @@ -83,8 +83,6 @@ public class BorderEffect { markupModel.processRangeHighlightersOverlappingWith(myStartOffset, myEndOffset, new Processor() { @Override public boolean process(RangeHighlighterEx rangeHighlighter) { - if (!rangeHighlighter.getEditorFilter().avaliableIn(myEditor)) return true; - TextAttributes textAttributes = rangeHighlighter.getTextAttributes(); if (isBorder(textAttributes)) { paintBorder(rangeHighlighter, textAttributes); 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 new file mode 100644 index 000000000000..4ad32a7dc90d --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorFilteringMarkupModelEx.java @@ -0,0 +1,217 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.editor.impl; + +import com.intellij.openapi.Disposable; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.ex.DisposableIterator; +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; +import com.intellij.openapi.editor.markup.HighlighterTargetArea; +import com.intellij.openapi.editor.markup.RangeHighlighter; +import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Key; +import com.intellij.util.Consumer; +import com.intellij.util.FilteringProcessor; +import com.intellij.util.Processor; +import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.FilteringIterator; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class EditorFilteringMarkupModelEx implements MarkupModelEx { + @NotNull private final EditorEx myEditor; + @NotNull private final MarkupModelEx myDelegate; + + private final Condition IS_AVAILABLE = new Condition() { + @Override + public boolean value(RangeHighlighter highlighter) { + return isAvailable(highlighter); + } + }; + + public EditorFilteringMarkupModelEx(@NotNull EditorEx editor, @NotNull MarkupModelEx delegate) { + myEditor = editor; + myDelegate = delegate; + } + + private boolean isAvailable(@NotNull RangeHighlighter highlighter) { + return highlighter.getEditorFilter().avaliableIn(myEditor); + } + + @Override + public boolean containsHighlighter(@NotNull RangeHighlighter highlighter) { + return isAvailable(highlighter) && myDelegate.containsHighlighter(highlighter); + } + + @Override + public boolean processRangeHighlightersOverlappingWith(int start, int end, @NotNull Processor processor) { + //noinspection unchecked + FilteringProcessor filteringProcessor = new FilteringProcessor(IS_AVAILABLE, processor); + return myDelegate.processRangeHighlightersOverlappingWith(start, end, filteringProcessor); + } + + @Override + public boolean processRangeHighlightersOutside(int start, int end, @NotNull Processor processor) { + //noinspection unchecked + FilteringProcessor filteringProcessor = new FilteringProcessor(IS_AVAILABLE, processor); + return myDelegate.processRangeHighlightersOutside(start, end, filteringProcessor); + } + + @Override + @NotNull + public DisposableIterator overlappingIterator(int startOffset, int endOffset) { + return new MyFilteringIterator(myDelegate.overlappingIterator(startOffset, endOffset)); + } + + @Override + @NotNull + public RangeHighlighter[] getAllHighlighters() { + List list = ContainerUtil.filter(myDelegate.getAllHighlighters(), IS_AVAILABLE); + return list.toArray(new RangeHighlighter[list.size()]); + } + + @Override + public void dispose() { + } + + private class MyFilteringIterator extends FilteringIterator + implements DisposableIterator, IntervalTreeImpl.PeekableIterator { + private DisposableIterator myDelegate; + + public MyFilteringIterator(@NotNull DisposableIterator delegate) { + super(delegate, IS_AVAILABLE); + myDelegate = delegate; + } + + @Override + public void dispose() { + myDelegate.dispose(); + } + } + + // + // Delegated + // + + @Override + @NotNull + public Document getDocument() { + return myDelegate.getDocument(); + } + + @Override + public void addMarkupModelListener(@NotNull Disposable parentDisposable, @NotNull MarkupModelListener listener) { + myDelegate.addMarkupModelListener(parentDisposable, listener); + } + + @Override + public void fireAttributesChanged(@NotNull RangeHighlighterEx segmentHighlighter, boolean renderersChanged) { + myDelegate.fireAttributesChanged(segmentHighlighter, renderersChanged); + } + + @Override + public void fireAfterAdded(@NotNull RangeHighlighterEx segmentHighlighter) { + myDelegate.fireAfterAdded(segmentHighlighter); + } + + @Override + public void fireBeforeRemoved(@NotNull RangeHighlighterEx segmentHighlighter) { + myDelegate.fireBeforeRemoved(segmentHighlighter); + } + + @Override + @Nullable + public RangeHighlighterEx addPersistentLineHighlighter(int lineNumber, int layer, TextAttributes textAttributes) { + return myDelegate.addPersistentLineHighlighter(lineNumber, layer, textAttributes); + } + + @Override + public void addRangeHighlighter(@NotNull RangeHighlighterEx marker, + int start, + int end, + boolean greedyToLeft, + boolean greedyToRight, + int layer) { + myDelegate.addRangeHighlighter(marker, start, end, greedyToLeft, greedyToRight, layer); + } + + @Override + @NotNull + public RangeHighlighter addRangeHighlighter(int startOffset, + int endOffset, + int layer, + @Nullable TextAttributes textAttributes, + @NotNull HighlighterTargetArea targetArea) { + return myDelegate.addRangeHighlighter(startOffset, endOffset, layer, textAttributes, targetArea); + } + + @Override + @NotNull + public RangeHighlighter addLineHighlighter(int line, int layer, @Nullable TextAttributes textAttributes) { + return myDelegate.addLineHighlighter(line, layer, textAttributes); + } + + @Override + @NotNull + public RangeHighlighterEx addRangeHighlighterAndChangeAttributes(int startOffset, + int endOffset, + int layer, + TextAttributes textAttributes, + @NotNull HighlighterTargetArea targetArea, + boolean isPersistent, + Consumer changeAttributesAction) { + return myDelegate.addRangeHighlighterAndChangeAttributes(startOffset, endOffset, layer, textAttributes, targetArea, isPersistent, + changeAttributesAction); + } + + @Override + public void setRangeHighlighterAttributes(@NotNull RangeHighlighter highlighter, @NotNull TextAttributes textAttributes) { + myDelegate.setRangeHighlighterAttributes(highlighter, textAttributes); + } + + @Override + public void changeAttributesInBatch(@NotNull RangeHighlighterEx highlighter, + @NotNull Consumer changeAttributesAction) { + myDelegate.changeAttributesInBatch(highlighter, changeAttributesAction); + } + + @Override + public void removeHighlighter(@NotNull RangeHighlighter rangeHighlighter) { + myDelegate.removeHighlighter(rangeHighlighter); + } + + @Override + public void removeAllHighlighters() { + myDelegate.removeAllHighlighters(); + } + + @Override + @Nullable + public T getUserData(@NotNull Key key) { + return myDelegate.getUserData(key); + } + + @Override + public void putUserData(@NotNull Key key, @Nullable T value) { + myDelegate.putUserData(key, value); + } +} diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java index 96dec29ec675..3953539e7ff2 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorGutterComponentImpl.java @@ -561,9 +561,8 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse private void processRangeHighlighters(int startOffset, int endOffset, @NotNull RangeHighlighterProcessor processor) { Document document = myEditor.getDocument(); - final MarkupModelEx docMarkup = (MarkupModelEx)DocumentMarkupModel.forDocument(document, myEditor.getProject(), true); // we limit highlighters to process to between line starting at startOffset and line ending at endOffset - DisposableIterator docHighlighters = docMarkup.overlappingIterator(startOffset, endOffset); + DisposableIterator docHighlighters = myEditor.getFilteredDocumentMarkupModel().overlappingIterator(startOffset, endOffset); DisposableIterator editorHighlighters = myEditor.getMarkupModel().overlappingIterator(startOffset, endOffset); try { @@ -614,9 +613,7 @@ class EditorGutterComponentImpl extends EditorGutterComponentEx implements Mouse int endLineIndex = lowerHighlighter.getDocument().getLineNumber(endOffset); if (!isValidLine(document, endLineIndex)) continue; - if (lowerHighlighter.getEditorFilter().avaliableIn(myEditor)) { - processor.process(lowerHighlighter); - } + processor.process(lowerHighlighter); } } finally { 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 ee6f90656d2f..4042888e2374 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,6 +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 FoldingModelImpl myFoldingModel; @NotNull private final ScrollingModelImpl myScrollingModel; @NotNull private final CaretModelImpl myCaretModel; @@ -341,8 +343,11 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi putUserData(FORCED_SOFT_WRAPS, Boolean.TRUE); } + MarkupModelEx documentMarkup = (MarkupModelEx)DocumentMarkupModel.forDocument(myDocument, myProject, true); + mySelectionModel = new SelectionModelImpl(this); myMarkupModel = new EditorMarkupModelImpl(this); + myDocumentMarkupModel = new EditorFilteringMarkupModelEx(this, documentMarkup); myFoldingModel = new FoldingModelImpl(this); myCaretModel = new CaretModelImpl(this); mySoftWrapModel = new SoftWrapModelImpl(this); @@ -418,7 +423,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } }; - ((MarkupModelEx)DocumentMarkupModel.forDocument(myDocument, myProject, true)).addMarkupModelListener(myCaretModel, markupModelListener); + getFilteredDocumentMarkupModel().addMarkupModelListener(myCaretModel, markupModelListener); getMarkupModel().addMarkupModelListener(myCaretModel, markupModelListener); myDocument.addDocumentListener(myFoldingModel, myCaretModel); @@ -722,6 +727,12 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi return myMarkupModel; } + @Override + @NotNull + public MarkupModelEx getFilteredDocumentMarkupModel() { + return myDocumentMarkupModel; + } + @Override @NotNull public FoldingModelImpl getFoldingModel() { @@ -2164,14 +2175,13 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi paintRightMargin(g, clip); paintCustomRenderers(g, clipStartOffset, clipEndOffset); - MarkupModelEx docMarkup = (MarkupModelEx)DocumentMarkupModel.forDocument(myDocument, myProject, true); - paintLineMarkersSeparators(g, clip, docMarkup, clipStartOffset, clipEndOffset); + paintLineMarkersSeparators(g, clip, myDocumentMarkupModel, clipStartOffset, clipEndOffset); paintLineMarkersSeparators(g, clip, myMarkupModel, clipStartOffset, clipEndOffset); paintText(g, clip, clipStartPosition, clipStartOffset, clipEndOffset); - paintSegmentHighlightersBorderAndAfterEndOfLine(g, clip, clipStartOffset, clipEndOffset, docMarkup); + paintSegmentHighlightersBorderAndAfterEndOfLine(g, clip, clipStartOffset, clipEndOffset, myDocumentMarkupModel); BorderEffect borderEffect = new BorderEffect(this, g, clipStartOffset, clipEndOffset); borderEffect.paintHighlighters(getHighlighter()); - borderEffect.paintHighlighters(docMarkup); + borderEffect.paintHighlighters(myDocumentMarkupModel); borderEffect.paintHighlighters(myMarkupModel); paintCaretCursor(g); @@ -2187,8 +2197,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi myMarkupModel.processRangeHighlightersOverlappingWith(clipStartOffset, clipEndOffset, new Processor() { @Override public boolean process(@NotNull RangeHighlighterEx highlighter) { - if (!highlighter.getEditorFilter().avaliableIn(EditorImpl.this)) return true; - final CustomHighlighterRenderer customRenderer = highlighter.getCustomRenderer(); if (customRenderer != null && clipStartOffset < highlighter.getEndOffset() && highlighter.getStartOffset() < clipEndOffset) { customRenderer.paint(EditorImpl.this, highlighter, g); @@ -2355,8 +2363,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi Processor paintProcessor = new Processor() { @Override public boolean process(@NotNull RangeHighlighterEx highlighter) { - if (!highlighter.getEditorFilter().avaliableIn(EditorImpl.this)) return true; - paintSegmentHighlighterAfterEndOfLine(g, highlighter, startLine, endLine); return true; } @@ -3286,8 +3292,6 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi markupModel.processRangeHighlightersOverlappingWith(clipStartOffset, clipEndOffset, new Processor() { @Override public boolean process(@NotNull RangeHighlighterEx lineMarker) { - if (!lineMarker.getEditorFilter().avaliableIn(EditorImpl.this)) return true; - paintLineMarkerSeparator(lineMarker, clip, g); return true; } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java index 1485a81f10c7..26cef0ce59da 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorMarkupModelImpl.java @@ -196,7 +196,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark if (IJSwingUtilities.findParentByInterface(myEditor.getComponent(), EditorWindowHolder.class) == null || isVisible || !UISettings.getInstance().SHOW_EDITOR_TOOLTIP) { final Set highlighters = new THashSet(); getNearestHighlighters(this, me.getY(), highlighters); - getNearestHighlighters((MarkupModelEx)DocumentMarkupModel.forDocument(myEditor.getDocument(), getEditor().getProject(), true), me.getY(), highlighters); + getNearestHighlighters(((EditorEx)getEditor()).getFilteredDocumentMarkupModel(), me.getY(), highlighters); if (highlighters.isEmpty()) return false; int y = e.getY(); @@ -221,9 +221,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark me = new MouseEvent(me.getComponent(), me.getID(), me.getWhen(), me.getModifiers(), me.getX(), y, me.getClickCount(), me.isPopupTrigger()); final List highlighters = new ArrayList(); collectRangeHighlighters(this, visualLine, highlighters); - collectRangeHighlighters((MarkupModelEx)DocumentMarkupModel.forDocument(myEditor.getDocument(), getEditor().getProject(), true), - visualLine, - highlighters); + collectRangeHighlighters(myEditor.getFilteredDocumentMarkupModel(), visualLine, highlighters); myEditorFragmentRenderer.update(visualLine, highlighters, me.isAltDown()); myEditorFragmentRenderer.show(myEditor, me.getPoint(), true, ERROR_STRIPE_TOOLTIP_GROUP, createHint(me)); return true; @@ -254,8 +252,6 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark markupModel.processRangeHighlightersOverlappingWith(startOffset, endOffset, new Processor() { @Override public boolean process(@NotNull RangeHighlighterEx highlighter) { - if (!highlighter.getEditorFilter().avaliableIn(myEditor)) return true; - if (highlighter.getErrorStripeMarkColor() != null) { if (highlighter.getStartOffset() < endOffset && highlighter.getEndOffset() > startOffset) { highlighters.add(highlighter); @@ -270,8 +266,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark private RangeHighlighter getNearestRangeHighlighter(@NotNull final MouseEvent e) { List highlighters = new ArrayList(); getNearestHighlighters(this, e.getY(), highlighters); - getNearestHighlighters((MarkupModelEx)DocumentMarkupModel.forDocument(myEditor.getDocument(), myEditor.getProject(), true), e.getY(), - highlighters); + getNearestHighlighters(myEditor.getFilteredDocumentMarkupModel(), e.getY(), highlighters); RangeHighlighter nearestMarker = null; int yPos = 0; for (RangeHighlighter highlighter : highlighters) { @@ -293,8 +288,6 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark markupModel.processRangeHighlightersOverlappingWith(startOffset, endOffset, new Processor() { @Override public boolean process(@NotNull RangeHighlighterEx highlighter) { - if (!highlighter.getEditorFilter().avaliableIn(myEditor)) return true; - if (highlighter.getErrorStripeMarkColor() != null) { ProperTextRange range = offsetsToYPositions(highlighter.getStartOffset(), highlighter.getEndOffset()); if (scrollBarY >= range.getStartOffset() - myMinMarkHeight * 2 && @@ -718,7 +711,7 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark g.clipRect(clip.x, clip.y, clip.width, clip.height); drawMarkup(g, startOffset, endOffset, - (MarkupModelEx)DocumentMarkupModel.forDocument(document, myEditor.getProject(), true), EditorMarkupModelImpl.this); + myEditor.getFilteredDocumentMarkupModel(), EditorMarkupModelImpl.this); g.setClip(oldClip); } @@ -751,8 +744,6 @@ public class EditorMarkupModelImpl extends MarkupModelImpl implements EditorMark ContainerUtil.process(iterator, new Processor() { @Override public boolean process(@NotNull RangeHighlighterEx highlighter) { - if (!highlighter.getEditorFilter().avaliableIn(myEditor)) return true; - Color color = highlighter.getErrorStripeMarkColor(); if (color == null) return true; boolean isThin = highlighter.isThinErrorStripeMark(); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java index 97ccbe922423..bf46c6d14e22 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/IterationState.java @@ -180,7 +180,7 @@ public final class IterationState { MarkupModelEx editorMarkup = editor.getMarkupModel(); myView = new HighlighterSweep(editorMarkup, start, myEnd, useOnlyFullLineHighlighters); - final MarkupModelEx docMarkup = (MarkupModelEx)DocumentMarkupModel.forDocument(editor.getDocument(), editor.getProject(), true); + MarkupModelEx docMarkup = editor.getFilteredDocumentMarkupModel(); myDoc = new HighlighterSweep(docMarkup, start, myEnd, useOnlyFullLineHighlighters); myEndOffset = myStartOffset; @@ -251,7 +251,7 @@ public final class IterationState { if (!highlighter.isValid() || highlighter.isAfterEndOfLine() || highlighter.getTextAttributes() == null) return true; final FoldRegion region = myFoldingModel.getCollapsedRegionAtOffset(highlighter.getAffectedAreaStartOffset()); if (region != null && region == myFoldingModel.getCollapsedRegionAtOffset(highlighter.getAffectedAreaEndOffset())) return true; - return !highlighter.getEditorFilter().avaliableIn(myEditor); + return false; } public void advance() { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java index acd56c9f67f5..e4ee9957915c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/EditorPainter.java @@ -90,7 +90,7 @@ class EditorPainter implements TextDrawingCallback { paintBackground(g, clip, startLine, endLine); paintRightMargin(g, clip); paintCustomRenderers(g, startOffset, endOffset); - MarkupModelEx docMarkup = (MarkupModelEx)DocumentMarkupModel.forDocument(myDocument, myEditor.getProject(), true); + MarkupModelEx docMarkup = myEditor.getFilteredDocumentMarkupModel(); paintLineMarkersSeparators(g, clip, docMarkup, startOffset, endOffset); paintLineMarkersSeparators(g, clip, myEditor.getMarkupModel(), startOffset, endOffset); paintTextWithEffects(g, clip, startLine, endLine); @@ -282,11 +282,9 @@ class EditorPainter implements TextDrawingCallback { myEditor.getMarkupModel().processRangeHighlightersOverlappingWith(startOffset, endOffset, new Processor() { @Override public boolean process(RangeHighlighterEx highlighter) { - if (highlighter.getEditorFilter().avaliableIn(myEditor)) { - CustomHighlighterRenderer customRenderer = highlighter.getCustomRenderer(); - if (customRenderer != null && startOffset < highlighter.getEndOffset() && highlighter.getStartOffset() < endOffset) { - customRenderer.paint(myEditor, highlighter, g); - } + CustomHighlighterRenderer customRenderer = highlighter.getCustomRenderer(); + if (customRenderer != null && startOffset < highlighter.getEndOffset() && highlighter.getStartOffset() < endOffset) { + customRenderer.paint(myEditor, highlighter, g); } return true; } @@ -301,9 +299,7 @@ class EditorPainter implements TextDrawingCallback { markupModel.processRangeHighlightersOverlappingWith(startOffset, endOffset, new Processor() { @Override public boolean process(RangeHighlighterEx highlighter) { - if (highlighter.getEditorFilter().avaliableIn(myEditor)) { - paintLineMarkerSeparator(highlighter, clip, g); - } + paintLineMarkerSeparator(highlighter, clip, g); return true; } }); @@ -535,7 +531,7 @@ class EditorPainter implements TextDrawingCallback { markupModel.processRangeHighlightersOverlappingWith(startOffset, endOffset, new Processor() { @Override public boolean process(RangeHighlighterEx highlighter) { - if (highlighter.getEditorFilter().avaliableIn(myEditor) && highlighter.getStartOffset() >= startOffset) { + if (highlighter.getStartOffset() >= startOffset) { paintHighlighterAfterEndOfLine(g, highlighter); } return true; @@ -584,12 +580,10 @@ class EditorPainter implements TextDrawingCallback { markupModel.processRangeHighlightersOverlappingWith(clipStartOffset, clipEndOffset, new Processor() { @Override public boolean process(RangeHighlighterEx rangeHighlighter) { - if (rangeHighlighter.getEditorFilter().avaliableIn(myEditor)) { - TextAttributes attributes = rangeHighlighter.getTextAttributes(); - if (isBorder(attributes)) { - paintBorderEffect(g, clipDetector, rangeHighlighter.getAffectedAreaStartOffset(), rangeHighlighter.getAffectedAreaEndOffset(), - attributes); - } + TextAttributes attributes = rangeHighlighter.getTextAttributes(); + if (isBorder(attributes)) { + paintBorderEffect(g, clipDetector, rangeHighlighter.getAffectedAreaStartOffset(), rangeHighlighter.getAffectedAreaEndOffset(), + attributes); } return true; } diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/IterationState.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/IterationState.java index b90aef2a21c5..250cd97483ca 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/IterationState.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/view/IterationState.java @@ -21,7 +21,6 @@ import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.colors.EditorColors; import com.intellij.openapi.editor.ex.*; import com.intellij.openapi.editor.highlighter.HighlighterIterator; -import com.intellij.openapi.editor.impl.DocumentMarkupModel; import com.intellij.openapi.editor.markup.EffectType; import com.intellij.openapi.editor.markup.HighlighterLayer; import com.intellij.openapi.editor.markup.HighlighterTargetArea; @@ -187,7 +186,7 @@ public class IterationState { MarkupModelEx editorMarkup = editor.getMarkupModel(); myView = new HighlighterSweep(editorMarkup, start, myEnd, useOnlyFullLineHighlighters); - final MarkupModelEx docMarkup = (MarkupModelEx)DocumentMarkupModel.forDocument(editor.getDocument(), editor.getProject(), true); + MarkupModelEx docMarkup = editor.getFilteredDocumentMarkupModel(); myDoc = new HighlighterSweep(docMarkup, start, myEnd, useOnlyFullLineHighlighters); myEndOffset = myStartOffset; @@ -265,7 +264,7 @@ public class IterationState { final FoldRegion region = myFoldingModel == null ? null : myFoldingModel.getCollapsedRegionAtOffset(highlighter.getAffectedAreaStartOffset()); if (region != null && region == myFoldingModel.getCollapsedRegionAtOffset(highlighter.getAffectedAreaEndOffset())) return true; - return !highlighter.getEditorFilter().avaliableIn(myEditor); + return false; } public void advance() { diff --git a/platform/util/src/com/intellij/util/containers/FilteringIterator.java b/platform/util/src/com/intellij/util/containers/FilteringIterator.java index 1ba470cffe2f..adc57c622474 100644 --- a/platform/util/src/com/intellij/util/containers/FilteringIterator.java +++ b/platform/util/src/com/intellij/util/containers/FilteringIterator.java @@ -98,6 +98,11 @@ public class FilteringIterator implements Iterator { myDelegate.remove(); } + public E peek() { + if (!hasNext()) throw new NoSuchElementException(); + return (E)myCurrent; + } + public static Iterator skipNulls(Iterator iterator) { return create(iterator, NOT_NULL); }