diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LexerEditorHighlighter.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LexerEditorHighlighter.java index 2efae3125f19..d75684585e82 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LexerEditorHighlighter.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/LexerEditorHighlighter.java @@ -28,6 +28,7 @@ import com.intellij.openapi.editor.ex.PrioritizedDocumentListener; import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.editor.highlighter.HighlighterClient; import com.intellij.openapi.editor.highlighter.HighlighterIterator; +import com.intellij.openapi.editor.impl.EditorDocumentPriorities; import com.intellij.openapi.editor.markup.TextAttributes; import com.intellij.openapi.fileTypes.PlainSyntaxHighlighter; import com.intellij.openapi.fileTypes.SyntaxHighlighter; @@ -264,7 +265,7 @@ public class LexerEditorHighlighter implements EditorHighlighter, PrioritizedDoc } public int getPriority() { - return 2; + return EditorDocumentPriorities.LEXER_EDITOR; } private static boolean segmentsEqual(SegmentArrayWithData a1, int idx1, SegmentArrayWithData a2, int idx2, final int offsetShift) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java index c991bdc175cd..6e035dd55605 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/CaretModelImpl.java @@ -512,7 +512,7 @@ public class CaretModelImpl implements CaretModel, PrioritizedDocumentListener, } public int getPriority() { - return 3; + return EditorDocumentPriorities.CARET_MODEL; } private void setCurrentLogicalCaret(LogicalPosition position) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorDocumentPriorities.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorDocumentPriorities.java new file mode 100644 index 000000000000..438075dea8c7 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorDocumentPriorities.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2010 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.editor.ex.PrioritizedDocumentListener; + +/** + * Holds values to use for common {@link PrioritizedDocumentListener prioritized document listeners} used within standard IntelliJ + * editor. + * + * @author Denis Zhdanov + * @since Sep 13, 2010 2:30:48 PM + */ +public class EditorDocumentPriorities { + + public static final int SOFT_WRAP_MODEL = 40; + + /** + * Assuming that range marker listeners work only with document offsets and don't perform document dimension mappings like + * {@code 'logical position -> visual position'}, {@code 'offset -> logical position'} etc. + */ + public static final int RANGE_MARKER = 60; + public static final int FOLD_MODEL = 80; + public static final int LEXER_EDITOR = 100; + public static final int CARET_MODEL = 120; + public static final int SELECTION_MODEL = 140; + public static final int EDITOR_DOCUMENT_ADAPTER = 160; + + private EditorDocumentPriorities() { + } +} 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 7fb3e2731731..1b408bddd3f1 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 @@ -4804,7 +4804,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } public int getPriority() { - return 5; + return EditorDocumentPriorities.EDITOR_DOCUMENT_ADAPTER; } } 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 d2c2d2e04d7b..80007783c2d3 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 @@ -437,7 +437,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedDocumentList } public int getPriority() { - return 1; + return EditorDocumentPriorities.FOLD_MODEL; } public FoldRegion createFoldRegion(int startOffset, int endOffset, @NotNull String placeholder, FoldingGroup group) { diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java index 8a64ac045816..06b9cb095817 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/RangeMarkerTree.java @@ -55,7 +55,7 @@ public class RangeMarkerTree extends IntervalTreeImpl 0) { + // if (text.charAt(cacheEntry.startOffset - 1) != '\n' && myStorage.getSoftWrap(cacheEntry.startOffset) == null) { + // assert false; + // } + // } + // if (cacheEntry.endOffset < document.getTextLength()) { + // if (text.charAt(cacheEntry.endOffset) != '\n' && myStorage.getSoftWrap(cacheEntry.endOffset) == null) { + // assert false; + // } + // } + //} } /** @@ -405,9 +433,11 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw int offsetsDiff = (myAfterChangeState.endOffset - myAfterChangeState.startOffset) - (myBeforeChangeState.endOffset - myBeforeChangeState.startOffset); - int cacheIndex = myAfterChangeState.endCacheEntryIndex; - for (int i = cacheIndex + 1; i < myCache.size(); i++) { - CacheEntry cacheEntry = myCache.get(i); + if (myNotAffectedByUpdateTailCacheEntries.isEmpty()) { + return; + } + + for (CacheEntry cacheEntry : myNotAffectedByUpdateTailCacheEntries) { cacheEntry.visualLine += visualLinesDiff; cacheEntry.startLogicalLine += logicalLinesDiff; cacheEntry.endLogicalLine += logicalLinesDiff; @@ -418,11 +448,12 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw cacheEntry.endFoldedLines += foldedLinesDiff; } - if (offsetsDiff == 0) { + int offset = myNotAffectedByUpdateTailCacheEntries.get(0).startOffset + 1/* in order to exclude soft wrap from previous line if any*/; + if (offsetsDiff == 0 || offset >= myEditor.getDocument().getTextLength()) { return; } - int softWrapIndex = myStorage.getSoftWrapIndex(myCache.get(cacheIndex).startOffset); + int softWrapIndex = myStorage.getSoftWrapIndex(offset); if (softWrapIndex < 0) { softWrapIndex = -softWrapIndex - 1; }