Mercurial > projects > dwt-win
comparison 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 |
comparison
equal
deleted
inserted
replaced
212:ab60f3309436 | 213:36f5cb12e1a2 |
---|---|
31 import dwt.graphics.Font; | 31 import dwt.graphics.Font; |
32 import dwt.graphics.GC; | 32 import dwt.graphics.GC; |
33 import dwt.graphics.Image; | 33 import dwt.graphics.Image; |
34 import dwt.graphics.Point; | 34 import dwt.graphics.Point; |
35 import dwt.graphics.Rectangle; | 35 import dwt.graphics.Rectangle; |
36 import dwt.graphics.TextLayout; | |
36 import dwt.widgets.Canvas; | 37 import dwt.widgets.Canvas; |
37 import dwt.widgets.Composite; | 38 import dwt.widgets.Composite; |
38 import dwt.widgets.Control; | 39 import dwt.widgets.Control; |
39 import dwt.widgets.Display; | 40 import dwt.widgets.Display; |
40 | 41 |
795 int l = t.length; | 796 int l = t.length; |
796 int max = l/2; | 797 int max = l/2; |
797 int min = 0; | 798 int min = 0; |
798 int mid = (max+min)/2 - 1; | 799 int mid = (max+min)/2 - 1; |
799 if (mid <= 0) return t; | 800 if (mid <= 0) return t; |
801 TextLayout layout = new TextLayout (getDisplay()); | |
802 layout.setText(t); | |
803 mid = validateOffset(layout, mid); | |
800 while (min < mid && mid < max) { | 804 while (min < mid && mid < max) { |
801 String s1 = t[0 .. mid].dup; | 805 String s1 = t[0 .. mid].dup; |
802 String s2 = t[l-mid .. l].dup; | 806 String s2 = t.substring(validateOffset(layout, l-mid), l); |
803 int l1 = gc.textExtent(s1, DRAW_FLAGS).x; | 807 int l1 = gc.textExtent(s1, DRAW_FLAGS).x; |
804 int l2 = gc.textExtent(s2, DRAW_FLAGS).x; | 808 int l2 = gc.textExtent(s2, DRAW_FLAGS).x; |
805 if (l1+w+l2 > width) { | 809 if (l1+w+l2 > width) { |
806 max = mid; | 810 max = mid; |
807 mid = (max+min)/2; | 811 mid = validateOffset(layout, (max+min)/2); |
808 } else if (l1+w+l2 < width) { | 812 } else if (l1+w+l2 < width) { |
809 min = mid; | 813 min = mid; |
810 mid = (max+min)/2; | 814 mid = validateOffset(layout, (max+min)/2); |
811 } else { | 815 } else { |
812 min = max; | 816 min = max; |
813 } | 817 } |
814 } | 818 } |
815 if (mid is 0) return t; | 819 String result = mid is 0 ? t : t.substring(0, mid) ~ ELLIPSIS ~ t.substring(validateOffset(layout, l-mid), l); |
816 return t[ 0 .. mid ] ~ ELLIPSIS ~ t[ l-mid .. l ]; | 820 layout.dispose(); |
817 } | 821 return result; |
818 | 822 } |
823 int validateOffset(TextLayout layout, int offset) { | |
824 int nextOffset = layout.getNextOffset(offset, DWT.MOVEMENT_CLUSTER); | |
825 if (nextOffset !is offset) return layout.getPreviousOffset(nextOffset, DWT.MOVEMENT_CLUSTER); | |
826 return offset; | |
827 } | |
819 private String[] splitString(String text) { | 828 private String[] splitString(String text) { |
820 String[] lines = new String[1]; | 829 String[] lines = new String[1]; |
821 int start = 0, pos; | 830 int start = 0, pos; |
822 do { | 831 do { |
823 pos = tango.text.Util.locate( text, '\n', start); | 832 pos = tango.text.Util.locate( text, '\n', start); |