diff dwt/custom/CLabel.d @ 213:36f5cb12e1a2

Update to SWT 3.4M7
author Frank Benoit <benoit@tionex.de>
date Sat, 17 May 2008 17:34:28 +0200
parents ab60f3309436
children fd9c62a2998e
line wrap: on
line diff
--- a/dwt/custom/CLabel.d	Mon May 05 00:12:38 2008 +0200
+++ b/dwt/custom/CLabel.d	Sat May 17 17:34:28 2008 +0200
@@ -33,6 +33,7 @@
 import dwt.graphics.Image;
 import dwt.graphics.Point;
 import dwt.graphics.Rectangle;
+import dwt.graphics.TextLayout;
 import dwt.widgets.Canvas;
 import dwt.widgets.Composite;
 import dwt.widgets.Control;
@@ -797,25 +798,33 @@
     int min = 0;
     int mid = (max+min)/2 - 1;
     if (mid <= 0) return t;
+    TextLayout layout = new TextLayout (getDisplay());
+    layout.setText(t);
+    mid = validateOffset(layout, mid);
     while (min < mid && mid < max) {
         String s1 = t[0 .. mid].dup;
-        String s2 = t[l-mid .. l].dup;
+        String s2 = t.substring(validateOffset(layout, l-mid), l);
         int l1 = gc.textExtent(s1, DRAW_FLAGS).x;
         int l2 = gc.textExtent(s2, DRAW_FLAGS).x;
         if (l1+w+l2 > width) {
             max = mid;
-            mid = (max+min)/2;
+            mid = validateOffset(layout, (max+min)/2);
         } else if (l1+w+l2 < width) {
             min = mid;
-            mid = (max+min)/2;
+            mid = validateOffset(layout, (max+min)/2);
         } else {
             min = max;
         }
     }
-    if (mid is 0) return t;
-    return t[ 0 .. mid ] ~ ELLIPSIS ~ t[ l-mid .. l ];
+    String result = mid is 0 ? t : t.substring(0, mid) ~ ELLIPSIS ~ t.substring(validateOffset(layout, l-mid), l);
+    layout.dispose();
+    return result;
 }
-
+int validateOffset(TextLayout layout, int offset) {
+    int nextOffset = layout.getNextOffset(offset, DWT.MOVEMENT_CLUSTER);
+    if (nextOffset !is offset) return layout.getPreviousOffset(nextOffset, DWT.MOVEMENT_CLUSTER);
+    return offset;
+}
 private String[] splitString(String text) {
     String[] lines = new String[1];
     int start = 0, pos;