From e7cb7f66ced7106044bc8b8294f5104ff05d0c34 Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Mon, 13 Dec 2010 12:07:17 +0300 Subject: [PATCH] IDEA-62830 AE at com.intellij.openapi.editor.impl.softwrap.mapping.SoftWrapApplianceManager.a 1. Ensuring that collapsed fold region may be soft wrapped all the time; 2. Corresponding test is added; --- .../mapping/SoftWrapApplianceManager.java | 22 ++++++++++++++----- ...apApplianceOnDocumentModificationTest.java | 15 +++++++++++++ 2 files changed, 31 insertions(+), 6 deletions(-) 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 1e1f076c5044..6c6da2a5a619 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 @@ -249,9 +249,14 @@ public class SoftWrapApplianceManager implements FoldingListener, DocumentListen myContext.logicalLineData.update(foldRegion.getStartOffset()); SoftWrap softWrap = registerSoftWrap( - myContext.softWrapStartOffset, myContext.tokenStartOffset, myContext.tokenStartOffset, myContext.getSpaceWidth(), myContext.logicalLineData + myContext.softWrapStartOffset, myContext.tokenStartOffset, myContext.tokenStartOffset, myContext.getSpaceWidth(), + myContext.logicalLineData ); - assert softWrap != null; // We expect that it's always possible to wrap collapsed fold region placeholder text + if (softWrap == null) { + // If we're here that means that we can't find appropriate soft wrap offset before the fold region. + // However, we expect that it's always possible to wrap collapsed fold region placeholder text + softWrap = registerSoftWrap(myContext.tokenStartOffset, myContext.getSpaceWidth(), myContext.logicalLineData); + } myContext.softWrapStartOffset = softWrap.getStart(); if (softWrap.getStart() < myContext.tokenStartOffset) { revertListeners(softWrap.getStart(), myContext.currentPosition.visualLine); @@ -524,19 +529,24 @@ public class SoftWrapApplianceManager implements FoldingListener, DocumentListen return null; } + return registerSoftWrap(softWrapOffset, spaceSize, lineData); + } + + @NotNull + private SoftWrap registerSoftWrap(int offset, int spaceSize, LogicalLineData lineData) { int indentInColumns = 0; int indentInPixels = myPainter.getMinDrawingWidth(SoftWrapDrawingType.AFTER_SOFT_WRAP); if (myCustomIndentUsedLastTime) { indentInColumns = myCustomIndentValueUsedLastTime + lineData.indentInColumns; indentInPixels += lineData.indentInPixels + (myCustomIndentValueUsedLastTime * spaceSize); } - SoftWrapImpl softWrap = new SoftWrapImpl( - new TextChangeImpl("\n" + StringUtil.repeatSymbol(' ', indentInColumns), softWrapOffset, softWrapOffset), + SoftWrapImpl result = new SoftWrapImpl( + new TextChangeImpl("\n" + StringUtil.repeatSymbol(' ', indentInColumns), offset, offset), indentInColumns + 1/* for 'after soft wrap' drawing */, indentInPixels ); - myStorage.storeOrReplace(softWrap, true); - return softWrap; + myStorage.storeOrReplace(result, true); + return result; } /** diff --git a/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceOnDocumentModificationTest.java b/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceOnDocumentModificationTest.java index 3f1faa390fbb..f051b7849536 100644 --- a/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceOnDocumentModificationTest.java +++ b/platform/platform-impl/testSrc/com/intellij/openapi/editor/impl/softwrap/mapping/SoftWrapApplianceOnDocumentModificationTest.java @@ -420,6 +420,21 @@ public class SoftWrapApplianceOnDocumentModificationTest extends AbstractEditorP assertEquals(startOffset, myEditor.logicalPositionToOffset(myEditor.visualToLogicalPosition(new VisualPosition(2, 0)))); } + public void testFoldRegionThatStartsAtLineEnd() throws IOException { + String text = + "line1\n" + + "line2\n" + + "line3\n" + + "line4\n" + + "line5"; + + init(30, text); + int start = text.indexOf("line3") - 1; + addCollapsedFoldRegion(start, text.length(), "..."); + assertEquals(1, getSoftWrapModel().getRegisteredSoftWraps().size()); + assertEquals(start, getSoftWrapModel().getRegisteredSoftWraps().get(0).getStart()); + } + public void testHomeProcessing() throws IOException { String text = "class Test {\n" +