From f705add8321f5b0645bec9f670dd4bbc57b0d1da Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Thu, 31 Mar 2011 13:08:18 +0400 Subject: [PATCH] IDEA-67301 Line wrap: expand the API --- .../editorActions/AutoHardWrapHandler.java | 6 +++++- .../source/codeStyle/CodeFormatterFacade.java | 5 ++++- platform/platform-api/platform-api.iml | 1 + .../GenericLineWrapPositionStrategy.java | 3 ++- .../editor/LineWrapPositionStrategy.java | 7 ++++--- .../DefaultLineWrapPositionStrategyTest.java | 20 ++++++++++++++++++- .../mapping/SoftWrapApplianceManager.java | 6 ++---- 7 files changed, 37 insertions(+), 11 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AutoHardWrapHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AutoHardWrapHandler.java index b1458e6434f7..93380dba8fbe 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AutoHardWrapHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/editorActions/AutoHardWrapHandler.java @@ -150,7 +150,11 @@ public class AutoHardWrapHandler { new VisualPosition(caretModel.getVisualPosition().line, margin - FormatConstants.RESERVED_LINE_WRAP_WIDTH_IN_COLUMNS) )); - int wrapOffset = strategy.calculateWrapPosition(document.getCharsSequence(), startOffset, endOffset, maxPreferredOffset, true); + int wrapOffset = strategy.calculateWrapPosition(document, startOffset, endOffset, maxPreferredOffset, true); + if (wrapOffset < 0) { + return; + } + WhiteSpaceFormattingStrategy formattingStrategy = WhiteSpaceFormattingStrategyFactory.getStrategy(editor); if (wrapOffset <= startOffset || wrapOffset > maxPreferredOffset || formattingStrategy.check(document.getCharsSequence(), startOffset, wrapOffset) >= wrapOffset) diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java index b765cb3f1a90..3281830d930d 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeFormatterFacade.java @@ -370,8 +370,11 @@ public class CodeFormatterFacade { // We know that current line exceeds right margin if control flow reaches this place, so, wrap it. int wrapOffset = strategy.calculateWrapPosition( - text, Math.max(startLineOffset, startOffsetToUse), Math.min(endLineOffset, endOffsetToUse), preferredWrapPosition, false + document, Math.max(startLineOffset, startOffsetToUse), Math.min(endLineOffset, endOffsetToUse), preferredWrapPosition, false ); + if (wrapOffset < 0) { + continue; + } editor.getCaretModel().moveToOffset(wrapOffset); final DataContext dataContext = DataManager.getInstance().getDataContext(editor.getComponent()); diff --git a/platform/platform-api/platform-api.iml b/platform/platform-api/platform-api.iml index b48b010793c7..8dde337c2b2d 100644 --- a/platform/platform-api/platform-api.iml +++ b/platform/platform-api/platform-api.iml @@ -28,6 +28,7 @@ + diff --git a/platform/platform-api/src/com/intellij/openapi/editor/GenericLineWrapPositionStrategy.java b/platform/platform-api/src/com/intellij/openapi/editor/GenericLineWrapPositionStrategy.java index 49a11039ef65..e2151c99d906 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/GenericLineWrapPositionStrategy.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/GenericLineWrapPositionStrategy.java @@ -41,7 +41,7 @@ public class GenericLineWrapPositionStrategy implements LineWrapPositionStrategy private final Storage myOffset2weight = new Storage(); @Override - public int calculateWrapPosition(@NotNull CharSequence text, + public int calculateWrapPosition(@NotNull Document document, int startOffset, int endOffset, int maxPreferredOffset, @@ -53,6 +53,7 @@ public class GenericLineWrapPositionStrategy implements LineWrapPositionStrategy myOffset2weight.clear(); myOffset2weight.anchor = startOffset; + CharSequence text = document.getCharsSequence(); // Normalization. int maxPreferredOffsetToUse = maxPreferredOffset >= endOffset ? endOffset - 1 : maxPreferredOffset; diff --git a/platform/platform-api/src/com/intellij/openapi/editor/LineWrapPositionStrategy.java b/platform/platform-api/src/com/intellij/openapi/editor/LineWrapPositionStrategy.java index 78d56a2b071c..5463c323c295 100644 --- a/platform/platform-api/src/com/intellij/openapi/editor/LineWrapPositionStrategy.java +++ b/platform/platform-api/src/com/intellij/openapi/editor/LineWrapPositionStrategy.java @@ -32,7 +32,7 @@ public interface LineWrapPositionStrategy { /** * Allows to calculate the most appropriate position to wrap target line. * - * @param text target text holder + * @param document target document which text is being processed * @param startOffset start offset to use with the given text holder (inclusive) * @param endOffset end offset to use with the given text holder (exclusive) * @param maxPreferredOffset this method is expected to do its best to return offset that belongs to @@ -43,9 +43,10 @@ public interface LineWrapPositionStrategy { * (maxPreferredOffset; endOffset] interval in case of inability to * find appropriate offset from (startOffset; maxPreferredOffset] interval * @return offset from (startOffset; endOffset] interval where - * target line should be wrapped + * target line should be wrapped OR -1 if no wrapping should be performed */ int calculateWrapPosition( - @NotNull CharSequence text, int startOffset, int endOffset, int maxPreferredOffset, boolean allowToBeyondMaxPreferredOffset + @NotNull Document document, int startOffset, int endOffset, int maxPreferredOffset, + boolean allowToBeyondMaxPreferredOffset ); } diff --git a/platform/platform-api/testSrc/com/intellij/openapi/editor/DefaultLineWrapPositionStrategyTest.java b/platform/platform-api/testSrc/com/intellij/openapi/editor/DefaultLineWrapPositionStrategyTest.java index ef976fcabb96..756a3521cc0d 100644 --- a/platform/platform-api/testSrc/com/intellij/openapi/editor/DefaultLineWrapPositionStrategyTest.java +++ b/platform/platform-api/testSrc/com/intellij/openapi/editor/DefaultLineWrapPositionStrategyTest.java @@ -15,6 +15,11 @@ */ package com.intellij.openapi.editor; +import org.jetbrains.annotations.NotNull; +import org.jmock.Expectations; +import org.jmock.Mockery; +import org.jmock.integration.junit4.JUnit4Mockery; +import org.jmock.lib.legacy.ClassImposteriser; import org.junit.Before; import org.junit.Test; @@ -29,11 +34,16 @@ public class DefaultLineWrapPositionStrategyTest { private static final String EDGE_MARKER = ""; private static final String WRAP_MARKER = ""; + private Mockery myMockery; private DefaultLineWrapPositionStrategy myStrategy; @Before public void setUp() { myStrategy = new DefaultLineWrapPositionStrategy(); + + myMockery = new JUnit4Mockery() {{ + setImposteriser(ClassImposteriser.INSTANCE); + }}; } @Test @@ -65,11 +75,19 @@ public class DefaultLineWrapPositionStrategyTest { final Context context = new Context(document); context.init(); int actual = myStrategy.calculateWrapPosition( - context.document, 0, context.document.length(), context.edgeIndex, allowToBeyondMaxPreferredOffset + createMockDocument(context.document), 0, context.document.length(), context.edgeIndex, allowToBeyondMaxPreferredOffset ); assertSame(context.wrapIndex, actual); } + private Document createMockDocument(@NotNull final String text) { + final Document result = myMockery.mock(Document.class); + myMockery.checking(new Expectations() {{ + allowing(result).getCharsSequence(); will(returnValue(text)); + }}); + return result; + } + /** * Utility class for parsing and initialising test data. *

diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java index 168866225cb3..a07e84c797a8 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceManager.java @@ -517,12 +517,10 @@ public class SoftWrapApplianceManager implements FoldingListener, DocumentListen myLineWrapPositionStrategy = LanguageLineWrapPositionStrategy.INSTANCE.forEditor(myEditor); } - softWrapOffset = myLineWrapPositionStrategy.calculateWrapPosition( - document.getCharsSequence(), minOffset, maxOffset, preferredOffset, true - ); + softWrapOffset = myLineWrapPositionStrategy.calculateWrapPosition(document, minOffset, maxOffset, preferredOffset, true); } - if (softWrapOffset >= lineData.endLineOffset) { + if (softWrapOffset >= lineData.endLineOffset || softWrapOffset < 0) { return null; }