diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapImpl.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapImpl.java index 3667a479137a..c422fd9c0303 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/SoftWrapImpl.java @@ -76,6 +76,22 @@ public class SoftWrapImpl implements SoftWrap { myChange.advance(diff); } + @Override + public int hashCode() { + int result = myChange.hashCode(); + result = 31 * result + myIndentInColumns; + return 31 * result + myIndentInPixels; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SoftWrapImpl that = (SoftWrapImpl)o; + return myIndentInColumns == that.myIndentInColumns && myIndentInPixels == that.myIndentInPixels && myChange.equals(that.myChange); + } + @Override public String toString() { return myChange.toString(); diff --git a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/IncrementalCacheUpdateEvent.java b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/IncrementalCacheUpdateEvent.java index 587cdf390024..679d18d27c2c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/IncrementalCacheUpdateEvent.java +++ b/platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/mapping/IncrementalCacheUpdateEvent.java @@ -172,7 +172,7 @@ class IncrementalCacheUpdateEvent { } private static int getLineStartOffset(int offset, Document document) { - if (offset >= document.getTextLength()) { + if (offset > document.getTextLength()) { return offset; } int lineNumber = document.getLineNumber(offset); 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 0d0e24a5e8d4..da4287a6dd8f 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 @@ -24,6 +24,8 @@ import gnu.trove.TIntProcedure; import java.awt.*; import java.io.IOException; +import java.util.*; +import java.util.List; /** * @author Denis Zhdanov @@ -240,6 +242,19 @@ public class SoftWrapApplianceOnDocumentModificationTest extends AbstractEditorP assertEquals(offset, caretModel.getOffset()); } + public void testBackspaceAtTheEndOfSoftWrappedLine() throws IOException { + // There was a problem that removing text from the last document line that was soft-wrapped removed soft wraps as well. + String text = + "This a long string that is expected to be wrapped in more than one visual line"; + init(150, text); + + List softWrapsBeforeModification = new ArrayList(getSoftWrapModel().getRegisteredSoftWraps()); + assertTrue(softWrapsBeforeModification.size() > 0); + + backspace(); + assertEquals(softWrapsBeforeModification, getSoftWrapModel().getRegisteredSoftWraps()); + } + private static TIntHashSet collectSoftWrapStartOffsets(int documentLine) { TIntHashSet result = new TIntHashSet(); for (SoftWrap softWrap : myEditor.getSoftWrapModel().getSoftWrapsForLine(documentLine)) {