From 24140e4319c81ff0b3d9213ea5dfac5f28c7e32f Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Mon, 23 May 2011 14:01:19 +0400 Subject: [PATCH] reverted --- .../openapi/editor/ex/util/EditorUtil.java | 2 +- .../openapi/editor/impl/EditorImpl.java | 51 ++++++++----------- .../openapi/editor/impl/IterationState.java | 20 +++----- 3 files changed, 30 insertions(+), 43 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java index 756e4c3df1e7..e254c3789cc0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/ex/util/EditorUtil.java @@ -306,7 +306,7 @@ public class EditorUtil { // hence, we need to perform special calculations to get know that. EditorEx editorImpl = (EditorEx)editor; int offset = start; - IterationState state = new IterationState(editorImpl, start, end, false); + IterationState state = new IterationState(editorImpl, offset, false); int fontType = state.getMergedAttributes().getFontType(); int column = currentColumn[0]; int spaceSize = getSpaceWidth(fontType, editorImpl); 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 d4569dea33d9..9070139e7939 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 @@ -929,25 +929,24 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } } - int textLength = myDocument.getTextLength(); LogicalPosition logicalPosition = visualToLogicalPosition(new VisualPosition(line, 0)); int offset = logicalPositionToOffset(logicalPosition); + int textLength = myDocument.getTextLength(); if (offset >= textLength) return new VisualPosition(line, EditorUtil.columnsNumber(p.x, EditorUtil.getSpaceWidth(Font.PLAIN, this))); // There is a possible case that starting logical line is split by soft-wraps and it's part after the split should be drawn. // We mark that we're under such circumstances then. - boolean activeSoftWrapProcessed = logicalPosition.softWrapLinesOnCurrentLogicalLine <= 0; + boolean activeSoftWrapProcessed = true; + if (logicalPosition.softWrapLinesOnCurrentLogicalLine > 0) { + activeSoftWrapProcessed = false; + } int column = 0; int prevX = 0; CharSequence text = myDocument.getCharsNoThreadCheck(); char c = ' '; - - LogicalPosition endLogicalPosition = visualToLogicalPosition(new VisualPosition(line+1, 0)); - int endOffset = logicalPositionToOffset(endLogicalPosition); - - IterationState state = new IterationState(this, offset, endOffset, false); + IterationState state = new IterationState(this, offset, false); int fontType = state.getMergedAttributes().getFontType(); int spaceSize = EditorUtil.getSpaceWidth(fontType, this); @@ -1246,7 +1245,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi int offset = startOffset; CharSequence text = myDocument.getCharsNoThreadCheck(); int textLength = myDocument.getTextLength(); - IterationState state = new IterationState(this, startOffset, startOffset + length, false); + IterationState state = new IterationState(this, offset, false); int fontType = state.getMergedAttributes().getFontType(); int spaceSize = EditorUtil.getSpaceWidth(fontType, this); @@ -1810,9 +1809,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi int visibleLineNumber = clip.y / lineHeight; VisualPosition visualPosition = xyToVisualPosition(new Point(0, clip.y)); - VisualPosition endVisualPosition = xyToVisualPosition(new Point(0, clip.y+clip.height)); LogicalPosition logicalPosition = visualToLogicalPosition(visualPosition); - LogicalPosition endLogicalPosition = visualToLogicalPosition(endVisualPosition); Point position = new Point(0, visibleLineNumber * lineHeight); if (visualPosition.line == 0 && myPrefixText != null) { @@ -1830,10 +1827,9 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi boolean locateBeforeSoftWrap = !SoftWrapHelper.isCaretAfterSoftWrap(this); int start = logicalPositionToOffset(logicalPosition); - int end = logicalPositionToOffset(endLogicalPosition); getSoftWrapModel().registerSoftWrapsIfNecessary(); - IterationState iterationState = new IterationState(this, start, end, paintSelection()); + IterationState iterationState = new IterationState(this, start, paintSelection()); LineIterator lIterator = createLineIterator(); lIterator.start(start); @@ -2262,10 +2258,8 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi // position is expected to be set to null as an indication that no soft wrap-introduced visual lines should be skipped on // current painting iteration. Ref logicalPosition = new Ref(xyToLogicalPosition(new Point(0, clip.y))); - LogicalPosition endLogicalPosition = xyToLogicalPosition(new Point(0, clip.y + clip.height)); int startLineNumber = logicalPosition.get().line; int start = logicalPositionToOffset(logicalPosition.get()); - int end = logicalPositionToOffset(endLogicalPosition); Point position = new Point(0, visibleLineNumber * lineHeight); if (startLineNumber == 0 && myPrefixText != null) { @@ -2278,7 +2272,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi return; } - IterationState iterationState = new IterationState(this, start, end, paintSelection()); + IterationState iterationState = new IterationState(this, start, paintSelection()); LineIterator lIterator = createLineIterator(); lIterator.start(start); if (lIterator.atEnd()) { @@ -2336,8 +2330,14 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } else { - position.x = drawStringWithSoftWraps(g, chars, start, Math.min(hEnd, lEnd - lIterator.getSeparatorLength()) , position, clip, - effectColor, effectType, fontType, currentColor, logicalPosition); + if (hEnd > lEnd - lIterator.getSeparatorLength()) { + position.x = drawStringWithSoftWraps(g, chars, start, lEnd - lIterator.getSeparatorLength(), position, clip, + effectColor, effectType, fontType, currentColor, logicalPosition); + } + else { + position.x = drawStringWithSoftWraps(g, chars, start, hEnd, position, clip, effectColor, effectType, fontType, + currentColor, logicalPosition); + } } iterationState.advance(); @@ -3054,11 +3054,11 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } int start = myDocument.getLineStartOffset(pos.line); - if (pos.column == 0) return start; int end = myDocument.getLineEndOffset(pos.line); CharSequence text = myDocument.getCharsNoThreadCheck(); + if (pos.column == 0) return start; return EditorUtil.calcOffset(this, text, start, end, pos.column, EditorUtil.getTabSize(this)); } @@ -5518,7 +5518,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } final CharSequence text = myDocument.getCharsNoThreadCheck(); - int documentLength = myDocument.getTextLength(); + int end = myDocument.getTextLength(); int x = 0; boolean lastLineLengthCalculated = false; final int fontSize = myScheme.getEditorFontSize(); @@ -5548,19 +5548,12 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } } - int endLine; - for (endLine=line+1; endLine= state.getEndOffset()) { state.advance(); @@ -5662,7 +5655,7 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi } public int calcColumnNumber(CharSequence text, int start, int offset, int tabSize) { - IterationState state = new IterationState(this, start, start+offset, false); + IterationState state = new IterationState(this, start, false); int fontType = state.getMergedAttributes().getFontType(); int column = 0; int x = 0; 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 1ec2336dd351..93aff891a42e 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 @@ -73,14 +73,11 @@ public final class IterationState { private final EditorEx myEditor; private final Color myReadOnlyColor; - public IterationState(@NotNull EditorEx editor, int start, boolean useCaretAndSelection) { - this(editor, start, editor.getDocument().getTextLength(), useCaretAndSelection); - } - public IterationState(@NotNull EditorEx editor, int start, int end, boolean useCaretAndSelection) { + public IterationState(EditorEx editor, int start, boolean useCaretAndSelection) { ApplicationManager.getApplication().assertReadAccessAllowed(); myDocument = (DocumentEx)editor.getDocument(); myStartOffset = start; - myEnd = end; + myEnd = editor.getDocument().getTextLength(); myEditor = editor; LOG.assertTrue(myStartOffset <= myEnd); @@ -108,10 +105,10 @@ public final class IterationState { myCurrentHighlighters = new ArrayList(); MarkupModelEx editorMarkup = (MarkupModelEx)editor.getMarkupModel(); - myView.init(editorMarkup, start, myEnd); + myView.init(editorMarkup, start); final MarkupModelEx docMarkup = (MarkupModelEx)editor.getDocument().getMarkupModel(editor.getProject()); - myDoc.init(docMarkup, start, myEnd); + myDoc.init(docMarkup, start); myEndOffset = myStartOffset; @@ -122,8 +119,8 @@ public final class IterationState { private RangeHighlighterEx myNextHighlighter = null; private Iterator myIterator; - private void init(@NotNull MarkupModelEx markupModel, int start, int end) { - myIterator = markupModel.overlappingIterator(start, end); + private void init(MarkupModelEx markupModel, int start) { + myIterator = markupModel.overlappingIterator(start, myDocument.getTextLength()); int skipped = 0; while (myIterator.hasNext()) { RangeHighlighterEx highlighter = myIterator.next(); @@ -133,10 +130,7 @@ public final class IterationState { } skipped++; } - if (skipped > Math.min(1000, markupModel.getDocument().getTextLength())) { - int i = 0; - //LOG.error("Inefficient iteration, use 'new IterationState(start, end)' constructor to limit the number of highlighters to iterate"); - } + int i = skipped; } private void advance() {