diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java index 6fec6fe5b883..7c41e681024c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/CachingSoftWrapDataMapper.java @@ -285,7 +285,7 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw @Override public void onTabulation(@NotNull EditorPosition position, int widthInColumns) { - CacheEntry cacheEntry = getCacheEntryForVisualLine(position.visualLine, true); + CacheEntry cacheEntry = getCacheEntryForVisualLine(position.visualLine, false); if (cacheEntry == null) { return; } @@ -600,6 +600,7 @@ public class CachingSoftWrapDataMapper implements SoftWrapDataMapper, SoftWrapAw CacheEntry cacheEntry = myCache.get(i); foldedLines += cacheEntry.endFoldedLines - cacheEntry.startFoldedLines; } + visualLines -= foldedLines; if (DEBUG_SOFT_WRAP_PROCESSING) { log(String.format("CachingSoftWrapDataMapper$CacheState.updateByDocumentOffsets(). Collected %d fold lines for cache entry indices " 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 317ac9a5b69c..213b576ab90e 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 @@ -1004,6 +1004,7 @@ public class SoftWrapApplianceManager implements FoldingListener, DocumentListen } int widthInColumns = calculateWidthInColumns(c, widthInPixels, myContext.spaceWidth); if (c == '\t') { + notifyListenersOnVisualLineStart(myContext.lineStartPosition); notifyListenersOnTabulation(widthInColumns); } 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 fe0bdf699b4e..aed21738beb1 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 @@ -178,7 +178,7 @@ public class SoftWrapApplianceOnDocumentModificationTest extends LightPlatformCo // The main idea is to type on a logical line before soft wrap in order to ensure that its offset is correctly shifted back. String text = "line1\n" + - "second line that is rather long to be soft wrapped"; + "second line that is long enough to be soft wrapped"; init(100, text); TIntHashSet offsetsBefore = collectSoftWrapStartOffsets(1); @@ -196,6 +196,30 @@ public class SoftWrapApplianceOnDocumentModificationTest extends LightPlatformCo }); } + public void testSoftWrapAwareMappingAfterLeadingFoldRegionCollapsing() throws IOException { + String text = + "line to fold 1\n" + + "line to fold 2\n" + + "line to fold 3\n" + + "ordinary line 1\n" + + "ordinary line 2\n" + + "ordinary line 3\n" + + "ordinary line 4\n" + + "line that is long enough to be soft wrapped\n" + + "ordinary line 5\n" + + "ordinary line 6\n" + + "ordinary line 7\n" + + "ordinary line 8\n"; + + init(200, text); + LogicalPosition position = myEditor.visualToLogicalPosition(new VisualPosition(8, 0)); + assertSame(7, position.line); // Position from soft-wrapped part of the line + + addFoldRegion(0, text.indexOf("ordinary line 1") - 1, "..."); + toggleFoldRegionState(myEditor.getFoldingModel().getAllFoldRegions()[0], false); + assertSame(7, myEditor.visualToLogicalPosition(new VisualPosition(6, 0)).line); // Check that soft wraps cache is correctly updated + } + //private void init(final int visibleWidth) throws Exception { // configureByFile(PATH + getFileName()); // initCommon(visibleWidth);