Mercurial > projects > dwt-win
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;