IDEA-53596 Soft wrap for editors
authorDenis Zhdanov <Denis.Zhdanov@jetbrains.com>
Tue, 10 Aug 2010 08:39:23 +0000 (12:39 +0400)
committerDenis Zhdanov <Denis.Zhdanov@jetbrains.com>
Tue, 10 Aug 2010 08:40:07 +0000 (12:40 +0400)
1. Soft wrap appliance point selection algorithm is corrected;
2. Visual position -> (x; y) mapping is corrected in a way to consider 'before soft wrap' sign;

platform/platform-impl/src/com/intellij/openapi/editor/impl/EditorImpl.java
platform/platform-impl/src/com/intellij/openapi/editor/impl/softwrap/DefaultSoftWrapApplianceManager.java

index 663ac91f62adb6688987a296bfdb1fa82eee58e9..90778c6723a0eeb37554979019d99b7eb93565bb 100644 (file)
@@ -1124,6 +1124,15 @@ public final class EditorImpl extends UserDataHolderBase implements EditorEx, Hi
         state.advance();
         fontType = state.getMergedAttributes().getFontType();
       }
+      // We need to consider 'before soft wrap drawing'.
+      TextChange softWrap = getSoftWrapModel().getSoftWrap(offset);
+      if (softWrap != null) {
+        column++;
+        x += getSoftWrapModel().getMinDrawingWidthInPixels(SoftWrapDrawingType.BEFORE_SOFT_WRAP_LINE_FEED);
+        if (column >= length) {
+          break;
+        }
+      }
 
       FoldRegion region = state.getCurrentFold();
 
index ae37f75e8c83275e7a619d3b38bd1c232fbba7c9..d3583b094aa7349969ef874ae6ef90c53b119912 100644 (file)
@@ -220,12 +220,13 @@ public class DefaultSoftWrapApplianceManager implements SoftWrapApplianceManager
     TIntArrayList result = new TIntArrayList();
 
     // Find offsets where soft wraps should be applied for the logical line in case of no indent usage.
-    int x = myPainter.getMinDrawingWidth(SoftWrapDrawingType.BEFORE_SOFT_WRAP_LINE_FEED);
+    int x = 0;
+    int beforeSoftWrapDrawingWidth = myPainter.getMinDrawingWidth(SoftWrapDrawingType.BEFORE_SOFT_WRAP_LINE_FEED);
     int prevSoftWrapOffset = start;
     CharBuffer buffer = CharBuffer.wrap(text);
     for (int i = start; i < end; i++) {
       int symbolWidth = myTextRepresentationHelper.textWidth(buffer, i, i + 1, fontType, x);
-      if (x + symbolWidth >= myVisibleAreaWidth) {
+      if (x + symbolWidth + beforeSoftWrapDrawingWidth >= myVisibleAreaWidth) {
         int offset = calculateSoftWrapOffset(text, i, prevSoftWrapOffset, end);
         if (offset >= end || offset <= prevSoftWrapOffset) {
           // There is no way to insert soft wrap.