From 67363429eb04c636941147f6c487c9a95afda742 Mon Sep 17 00:00:00 2001 From: Deepika Udayagiri Date: Wed, 3 Jul 2024 18:27:45 +0530 Subject: [PATCH] Corrected TextLayout to produce right number of lines when '\r\n' sequence comes. Fixes #184 --- .../org/eclipse/swt/graphics/TextLayout.java | 38 +++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/TextLayout.java b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/TextLayout.java index 095ceffb07c..4e633a9c993 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/TextLayout.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/win32/org/eclipse/swt/graphics/TextLayout.java @@ -42,8 +42,8 @@ */ public final class TextLayout extends Resource { Font font; - String text, segmentsText; - int lineSpacingInPoints; + String text, segmentsText, originalText; + int lineSpacingInPoints, previousCountNextLine = 0, previousEnd = -1; int ascent, descent; int alignment; int wrapWidth; @@ -2952,8 +2952,11 @@ StyleItem[] merge (long items, int itemCount) { linkBefore = false; } char ch = segmentsText.charAt(start); + if(ch == '\r') { + ch = segmentsText.charAt(start+1); + } switch (ch) { - case '\r': + //case '\r': case '\n': item.lineBreak = true; break; @@ -3448,6 +3451,28 @@ public void setVerticalIndent (int verticalIndent) { */ public void setStyle (TextStyle style, int start, int end) { checkLayout(); + int countNextLine = 0, noStyleCountNextLine = 0, loop = 0; + if (previousEnd < 0) + loop = previousEnd+1; + else + loop = previousEnd; + for(int i = loop; i < end; i++) { + if(originalText.charAt(i) == '\r' && originalText.charAt(i+1) =='\n') + { + countNextLine++; + if(i < start) + noStyleCountNextLine++; + } + } + previousCountNextLine = previousCountNextLine + countNextLine; + if(start == 0 || previousEnd < 0) { + start = start - noStyleCountNextLine; + } + else { + start = start - previousCountNextLine; + } + previousEnd = end; + end = end - previousCountNextLine; int length = text.length(); if (length == 0) return; if (start > end) return; @@ -3564,6 +3589,13 @@ public void setTabs (int[] tabs) { */ public void setText (String text) { checkLayout(); + + this.originalText = text; + String[] strings = text.split("\r"); + text = ""; + for(int i = 0; i < strings.length; i++) + text += strings[i]; + if (text == null) SWT.error(SWT.ERROR_NULL_ARGUMENT); if (text.equals(this.text)) return; freeRuns();