Changeset 227:b74b74ce5c7d
- Timestamp:
- 05/19/08 16:30:33
(4 months ago)
- Author:
- Frank Benoit <benoit@tionex.de>
- branch:
- default
- Message:
reworked TextLayout?
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r214 |
r227 |
|
| 37 | 37 | import dwt.dwthelper.System; |
|---|
| 38 | 38 | |
|---|
| | 39 | |
|---|
| 39 | 40 | /** |
|---|
| 40 | 41 | * <code>TextLayout</code> is a graphic object that represents |
|---|
| … | … | |
| 53 | 54 | */ |
|---|
| 54 | 55 | public final class TextLayout : Resource { |
|---|
| | 56 | |
|---|
| 55 | 57 | alias Resource.init_ init_; |
|---|
| | 58 | |
|---|
| | 59 | /++ |
|---|
| | 60 | DWT doku |
|---|
| | 61 | The styles has at minimum 2 member, each with a start. The last element is the end marker. |
|---|
| | 62 | ++/ |
|---|
| | 63 | |
|---|
| | 64 | invariant{ |
|---|
| | 65 | assert( stylesCount >= 2 ); |
|---|
| | 66 | assert( stylesCount <= styles.length ); |
|---|
| | 67 | assert( styles[stylesCount-1] ); |
|---|
| | 68 | assert( styles[stylesCount-1].start is text.length ); |
|---|
| | 69 | } |
|---|
| 56 | 70 | |
|---|
| 57 | 71 | Font font; |
|---|
| … | … | |
| 1384 | 1398 | checkLayout(); |
|---|
| 1385 | 1399 | computeRuns(null); |
|---|
| 1386 | | int length_ = text.length; |
|---|
| 1387 | | if (length_ is 0) return new Rectangle(0, 0, 0, 0); |
|---|
| | 1400 | int length = text.length; |
|---|
| | 1401 | if (length is 0) return new Rectangle(0, 0, 0, 0); |
|---|
| 1388 | 1402 | if (start > end) return new Rectangle(0, 0, 0, 0); |
|---|
| 1389 | | start = Math.min(Math.max(0, start), length_ - 1); |
|---|
| 1390 | | end = Math.min(Math.max(0, end), length_ - 1); |
|---|
| | 1403 | start = Math.min(Math.max(0, start), length - 1); |
|---|
| | 1404 | end = Math.min(Math.max(0, end), length - 1); |
|---|
| 1391 | 1405 | start = translateOffset(start); |
|---|
| 1392 | 1406 | end = translateOffset(end); |
|---|
| … | … | |
| 1541 | 1555 | checkLayout(); |
|---|
| 1542 | 1556 | computeRuns(null); |
|---|
| 1543 | | int length_ = text.length; |
|---|
| 1544 | | if (!(0 <= offset && offset <= length_)) DWT.error(DWT.ERROR_INVALID_RANGE); |
|---|
| | 1557 | int length = text.length; |
|---|
| | 1558 | if (!(0 <= offset && offset <= length)) DWT.error(DWT.ERROR_INVALID_RANGE); |
|---|
| 1545 | 1559 | offset = translateOffset(offset); |
|---|
| 1546 | 1560 | for (int i=1; i<allRuns.length; i++) { |
|---|
| … | … | |
| 1640 | 1654 | checkLayout(); |
|---|
| 1641 | 1655 | computeRuns(null); |
|---|
| 1642 | | int length_ = text.length; |
|---|
| 1643 | | if (!(0 <= offset && offset <= length_)) DWT.error(DWT.ERROR_INVALID_RANGE); |
|---|
| | 1656 | int length = text.length; |
|---|
| | 1657 | if (!(0 <= offset && offset <= length)) DWT.error(DWT.ERROR_INVALID_RANGE); |
|---|
| 1644 | 1658 | offset = translateOffset(offset); |
|---|
| 1645 | 1659 | for (int line=0; line<runs.length; line++) { |
|---|
| … | … | |
| 1738 | 1752 | checkLayout(); |
|---|
| 1739 | 1753 | computeRuns(null); |
|---|
| 1740 | | int length_ = text.length; |
|---|
| 1741 | | if (!(0 <= offset && offset <= length_)) DWT.error(DWT.ERROR_INVALID_RANGE); |
|---|
| 1742 | | length_ = segmentsText.length; |
|---|
| | 1754 | int length = text.length; |
|---|
| | 1755 | if (!(0 <= offset && offset <= length)) DWT.error(DWT.ERROR_INVALID_RANGE); |
|---|
| | 1756 | length = segmentsText.length; |
|---|
| 1743 | 1757 | offset = translateOffset(offset); |
|---|
| 1744 | 1758 | int line; |
|---|
| … | … | |
| 1747 | 1761 | } |
|---|
| 1748 | 1762 | line = Math.min(line, runs.length - 1); |
|---|
| 1749 | | if (offset is length_) { |
|---|
| | 1763 | if (offset is length) { |
|---|
| 1750 | 1764 | return new Point(getLineIndent(line) + lineWidth[line], lineY[line]); |
|---|
| 1751 | 1765 | } |
|---|
| … | … | |
| 1765 | 1779 | width = metrics.width * (offset - run.start + (trailing ? 1 : 0)); |
|---|
| 1766 | 1780 | } else if (run.tab) { |
|---|
| 1767 | | width = (trailing || (offset is length_)) ? run.width : 0; |
|---|
| | 1781 | width = (trailing || (offset is length)) ? run.width : 0; |
|---|
| 1768 | 1782 | } else { |
|---|
| 1769 | 1783 | int runOffset = offset - run.start; |
|---|
| … | … | |
| 1807 | 1821 | int _getOffset(int offset, int movement, bool forward) { |
|---|
| 1808 | 1822 | computeRuns(null); |
|---|
| 1809 | | int length_ = text.length; |
|---|
| 1810 | | if (!(0 <= offset && offset <= length_)) DWT.error(DWT.ERROR_INVALID_RANGE); |
|---|
| 1811 | | if (forward && offset is length_) return length_; |
|---|
| | 1823 | int length = text.length; |
|---|
| | 1824 | if (!(0 <= offset && offset <= length)) DWT.error(DWT.ERROR_INVALID_RANGE); |
|---|
| | 1825 | if (forward && offset is length) return length; |
|---|
| 1812 | 1826 | if (!forward && offset is 0) return 0; |
|---|
| 1813 | 1827 | int step = forward ? 1 : -1; |
|---|
| 1814 | 1828 | if ((movement & DWT.MOVEMENT_CHAR) !is 0) return offset + step; |
|---|
| 1815 | | length_ = segmentsText.length; |
|---|
| | 1829 | length = segmentsText.length; |
|---|
| 1816 | 1830 | offset = translateOffset(offset); |
|---|
| 1817 | | SCRIPT_LOGATTR* logAttr; |
|---|
| 1818 | | SCRIPT_PROPERTIES* properties; |
|---|
| | 1831 | SCRIPT_LOGATTR* logAttr = new SCRIPT_LOGATTR(); |
|---|
| | 1832 | SCRIPT_PROPERTIES* properties = new SCRIPT_PROPERTIES(); |
|---|
| 1819 | 1833 | int i = forward ? 0 : allRuns.length - 1; |
|---|
| 1820 | 1834 | offset = validadeOffset(offset, step); |
|---|
| … | … | |
| 1824 | 1838 | if (run.lineBreak && !run.softBreak) return untranslateOffset(run.start); |
|---|
| 1825 | 1839 | if (run.tab) return untranslateOffset(run.start); |
|---|
| 1826 | | properties = device.scripts[run.analysis.eScript]; |
|---|
| | 1840 | OS.MoveMemory(properties, device.scripts[run.analysis.eScript], SCRIPT_PROPERTIES.sizeof); |
|---|
| 1827 | 1841 | bool isComplex = properties.fNeedsCaretInfo || properties.fNeedsWordBreaking; |
|---|
| 1828 | 1842 | if (isComplex) breakRun(run); |
|---|
| 1829 | 1843 | while (run.start <= offset && offset < run.start + run.length) { |
|---|
| 1830 | 1844 | if (isComplex) { |
|---|
| 1831 | | logAttr = run.psla + (offset - run.start); |
|---|
| | 1845 | OS.MoveMemory(logAttr, run.psla + (offset - run.start), SCRIPT_LOGATTR.sizeof); |
|---|
| 1832 | 1846 | } |
|---|
| 1833 | 1847 | switch (movement) { |
|---|
| … | … | |
| 1873 | 1887 | } |
|---|
| 1874 | 1888 | i += step; |
|---|
| 1875 | | } while (0 <= i && i < allRuns.length - 1 && 0 <= offset && offset < length_); |
|---|
| | 1889 | } while (0 <= i && i < allRuns.length - 1 && 0 <= offset && offset < length); |
|---|
| 1876 | 1890 | return forward ? text.length : 0; |
|---|
| 1877 | 1891 | } |
|---|
| … | … | |
| 2126 | 2140 | public TextStyle getStyle (int offset) { |
|---|
| 2127 | 2141 | checkLayout(); |
|---|
| 2128 | | int length_ = text.length; |
|---|
| 2129 | | if (!(0 <= offset && offset < length_)) DWT.error(DWT.ERROR_INVALID_RANGE); |
|---|
| | 2142 | int length = text.length; |
|---|
| | 2143 | if (!(0 <= offset && offset < length)) DWT.error(DWT.ERROR_INVALID_RANGE); |
|---|
| 2130 | 2144 | for (int i=1; i<stylesCount; i++) { |
|---|
| 2131 | 2145 | if (styles[i].start > offset) { |
|---|
| … | … | |
| 2229 | 2243 | StyleItem[] itemize () { |
|---|
| 2230 | 2244 | segmentsText = getSegmentsText(); |
|---|
| 2231 | | int length_ = segmentsText.length; |
|---|
| | 2245 | int length = segmentsText.length; |
|---|
| 2232 | 2246 | SCRIPT_CONTROL scriptControl; |
|---|
| 2233 | 2247 | SCRIPT_STATE scriptState; |
|---|
| 2234 | | final int MAX_ITEM = length_ + 1; |
|---|
| | 2248 | final int MAX_ITEM = length + 1; |
|---|
| 2235 | 2249 | |
|---|
| 2236 | 2250 | if ((orientation & DWT.RIGHT_TO_LEFT) !is 0) { |
|---|
| … | … | |
| 2273 | 2287 | item.style = styles[styleIndex].style; |
|---|
| 2274 | 2288 | runs[count++] = item; |
|---|
| 2275 | | *scriptItem = items[itemIndex]; |
|---|
| | 2289 | OS.MoveMemory(scriptItem, (cast(void*)items) + itemIndex * SCRIPT_ITEM.sizeof, SCRIPT_ITEM.sizeof); |
|---|
| 2276 | 2290 | item.analysis = scriptItem.a; |
|---|
| 2277 | 2291 | if (linkBefore) { |
|---|
| … | … | |
| 2280 | 2294 | } |
|---|
| 2281 | 2295 | //scriptItem.a = new SCRIPT_ANALYSIS(); |
|---|
| 2282 | | *scriptItem = items[ itemIndex + 1]; |
|---|
| | 2296 | OS.MoveMemory(scriptItem, (cast(void*)items) + (itemIndex + 1) * SCRIPT_ITEM.sizeof, SCRIPT_ITEM.sizeof); |
|---|
| 2283 | 2297 | int itemLimit = scriptItem.iCharPos; |
|---|
| 2284 | 2298 | int styleLimit = translateOffset(styles[styleIndex + 1].start); |
|---|
| … | … | |
| 2303 | 2317 | StyleItem item = new StyleItem(); |
|---|
| 2304 | 2318 | item.start = end; |
|---|
| 2305 | | *scriptItem = items[ itemCount ]; |
|---|
| | 2319 | OS.MoveMemory(scriptItem, (cast(void*)items) + itemCount * SCRIPT_ITEM.sizeof, SCRIPT_ITEM.sizeof); |
|---|
| 2306 | 2320 | item.analysis = scriptItem.a; |
|---|
| 2307 | 2321 | runs[count++] = item; |
|---|
| … | … | |
| 2589 | 2603 | public void setStyle (TextStyle style, int start, int end) { |
|---|
| 2590 | 2604 | checkLayout(); |
|---|
| 2591 | | int length_ = text.length; |
|---|
| 2592 | | if (length_ is 0) return; |
|---|
| | 2605 | int length = text.length; |
|---|
| | 2606 | if (length is 0) return; |
|---|
| 2593 | 2607 | if (start > end) return; |
|---|
| 2594 | | start = Math.min(Math.max(0, start), length_ - 1); |
|---|
| 2595 | | end = Math.min(Math.max(0, end), length_ - 1); |
|---|
| | 2608 | start = Math.min(Math.max(0, start), length - 1); |
|---|
| | 2609 | end = Math.min(Math.max(0, end), length - 1); |
|---|
| 2596 | 2610 | int low = -1; |
|---|
| 2597 | 2611 | int high = stylesCount; |
|---|
| … | … | |
| 2610 | 2624 | if (item.style is null) return; |
|---|
| 2611 | 2625 | } else { |
|---|
| 2612 | | if (style ==/*eq*/ item.style) return; |
|---|
| | 2626 | if (style.opEquals(item.style)) return; |
|---|
| 2613 | 2627 | } |
|---|
| 2614 | 2628 | } |
|---|
| … | … | |
| 2710 | 2724 | //PORTING_CHANGE: allow null argument |
|---|
| 2711 | 2725 | //if (text is null) DWT.error(DWT.ERROR_NULL_ARGUMENT); |
|---|
| 2712 | | if (text==/*eq*/this.text) return; |
|---|
| | 2726 | if (text.equals(this.text)) return; |
|---|
| 2713 | 2727 | freeRuns(); |
|---|
| 2714 | 2728 | this.text = text; |
|---|
| … | … | |
| 3001 | 3015 | int nSegments = segments.length; |
|---|
| 3002 | 3016 | if (nSegments <= 1) return offset; |
|---|
| 3003 | | int length_ = text.length; |
|---|
| 3004 | | if (length_ is 0) return offset; |
|---|
| | 3017 | int length = text.length; |
|---|
| | 3018 | if (length is 0) return offset; |
|---|
| 3005 | 3019 | if (nSegments is 2) { |
|---|
| 3006 | | if (segments[0] is 0 && segments[1] is length_) return offset; |
|---|
| | 3020 | if (segments[0] is 0 && segments[1] is length) return offset; |
|---|
| 3007 | 3021 | } |
|---|
| 3008 | 3022 | for (int i = 0; i < nSegments && offset - i >= segments[i]; i++) { |
|---|
| … | … | |
| 3016 | 3030 | int nSegments = segments.length; |
|---|
| 3017 | 3031 | if (nSegments <= 1) return offset; |
|---|
| 3018 | | int length_ = text.length; |
|---|
| 3019 | | if (length_ is 0) return offset; |
|---|
| | 3032 | int length = text.length; |
|---|
| | 3033 | if (length is 0) return offset; |
|---|
| 3020 | 3034 | if (nSegments is 2) { |
|---|
| 3021 | | if (segments[0] is 0 && segments[1] is length_) return offset; |
|---|
| | 3035 | if (segments[0] is 0 && segments[1] is length) return offset; |
|---|
| 3022 | 3036 | } |
|---|
| 3023 | 3037 | for (int i = 0; i < nSegments && offset > segments[i]; i++) { |
|---|