/usr/include/wx-3.0/wx/richtext/richtextbuffer.h is in wx3.0-headers 3.0.0-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 | /////////////////////////////////////////////////////////////////////////////
// Name: wx/richtext/richtextbuffer.h
// Purpose: Buffer for wxRichTextCtrl
// Author: Julian Smart
// Modified by:
// Created: 2005-09-30
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_RICHTEXTBUFFER_H_
#define _WX_RICHTEXTBUFFER_H_
/*
Data structures
===============
Data is represented by a hierarchy of objects, all derived from
wxRichTextObject.
The top of the hierarchy is the buffer, a kind of wxRichTextParagraphLayoutBox.
These boxes will allow flexible placement of text boxes on a page, but
for now there is a single box representing the document, and this box is
a wxRichTextParagraphLayoutBox which contains further wxRichTextParagraph
objects, each of which can include text and images.
Each object maintains a range (start and end position) measured
from the start of the main parent box.
A paragraph object knows its range, and a text fragment knows its range
too. So, a character or image in a page has a position relative to the
start of the document, and a character in an embedded text box has
a position relative to that text box. For now, we will not be dealing with
embedded objects but it's something to bear in mind for later.
Note that internally, a range (5,5) represents a range of one character.
In the public wx[Rich]TextCtrl API, this would be passed to e.g. SetSelection
as (5,6). A paragraph with one character might have an internal range of (0, 1)
since the end of the paragraph takes up one position.
Layout
======
When Layout is called on an object, it is given a size which the object
must limit itself to, or one or more flexible directions (vertical
or horizontal). So for example a centered paragraph is given the page
width to play with (minus any margins), but can extend indefinitely
in the vertical direction. The implementation of Layout can then
cache the calculated size and position within the parent.
*/
/*!
* Includes
*/
#include "wx/defs.h"
#if wxUSE_RICHTEXT
#include "wx/list.h"
#include "wx/textctrl.h"
#include "wx/bitmap.h"
#include "wx/image.h"
#include "wx/cmdproc.h"
#include "wx/txtstrm.h"
#include "wx/variant.h"
#include "wx/position.h"
#if wxUSE_DATAOBJ
#include "wx/dataobj.h"
#endif
// Compatibility
//#define wxRichTextAttr wxTextAttr
#define wxTextAttrEx wxTextAttr
// Setting wxRICHTEXT_USE_OWN_CARET to 1 implements a
// caret reliably without using wxClientDC in case there
// are platform-specific problems with the generic caret.
#if defined(__WXGTK__) || defined(__WXMAC__)
#define wxRICHTEXT_USE_OWN_CARET 1
#else
#define wxRICHTEXT_USE_OWN_CARET 0
#endif
// Switch off for binary compatibility, on for faster drawing
// Note: this seems to be buggy (overzealous use of extents) so
// don't use for now
#define wxRICHTEXT_USE_OPTIMIZED_LINE_DRAWING 0
// The following two symbols determine whether an output implementation
// is present. To switch the relevant one on, set wxRICHTEXT_USE_XMLDOCUMENT_OUTPUT in
// richtextxml.cpp. By default, the faster direct output implementation is used.
// Include the wxXmlDocument implementation for output
#define wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT 1
// Include the faster, direct implementation for output
#define wxRICHTEXT_HAVE_DIRECT_OUTPUT 1
/**
The line break character that can be embedded in content.
*/
extern WXDLLIMPEXP_RICHTEXT const wxChar wxRichTextLineBreakChar;
/**
File types in wxRichText context.
*/
enum wxRichTextFileType
{
wxRICHTEXT_TYPE_ANY = 0,
wxRICHTEXT_TYPE_TEXT,
wxRICHTEXT_TYPE_XML,
wxRICHTEXT_TYPE_HTML,
wxRICHTEXT_TYPE_RTF,
wxRICHTEXT_TYPE_PDF
};
/*
* Forward declarations
*/
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCtrl;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextObject;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextImage;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextPlainText;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCacheObject;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextObjectList;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextLine;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextParagraph;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextFileHandler;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextDrawingHandler;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextField;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextFieldType;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextStyleSheet;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextListStyleDefinition;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextEvent;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextRenderer;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextBuffer;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextXMLHandler;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextParagraphLayoutBox;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextImageBlock;
class WXDLLIMPEXP_FWD_XML wxXmlNode;
class wxRichTextFloatCollector;
class WXDLLIMPEXP_FWD_BASE wxDataInputStream;
class WXDLLIMPEXP_FWD_BASE wxDataOutputStream;
/**
Flags determining the available space, passed to Layout.
*/
#define wxRICHTEXT_FIXED_WIDTH 0x01
#define wxRICHTEXT_FIXED_HEIGHT 0x02
#define wxRICHTEXT_VARIABLE_WIDTH 0x04
#define wxRICHTEXT_VARIABLE_HEIGHT 0x08
// Only lay out the part of the buffer that lies within
// the rect passed to Layout.
#define wxRICHTEXT_LAYOUT_SPECIFIED_RECT 0x10
/**
Flags to pass to Draw
*/
// Ignore paragraph cache optimization, e.g. for printing purposes
// where one line may be drawn higher (on the next page) compared
// with the previous line
#define wxRICHTEXT_DRAW_IGNORE_CACHE 0x01
#define wxRICHTEXT_DRAW_SELECTED 0x02
#define wxRICHTEXT_DRAW_PRINT 0x04
#define wxRICHTEXT_DRAW_GUIDELINES 0x08
/**
Flags returned from hit-testing, or passed to hit-test function.
*/
enum wxRichTextHitTestFlags
{
// The point was not on this object
wxRICHTEXT_HITTEST_NONE = 0x01,
// The point was before the position returned from HitTest
wxRICHTEXT_HITTEST_BEFORE = 0x02,
// The point was after the position returned from HitTest
wxRICHTEXT_HITTEST_AFTER = 0x04,
// The point was on the position returned from HitTest
wxRICHTEXT_HITTEST_ON = 0x08,
// The point was on space outside content
wxRICHTEXT_HITTEST_OUTSIDE = 0x10,
// Only do hit-testing at the current level (don't traverse into top-level objects)
wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS = 0x20,
// Ignore floating objects
wxRICHTEXT_HITTEST_NO_FLOATING_OBJECTS = 0x40,
// Don't recurse into objects marked as atomic
wxRICHTEXT_HITTEST_HONOUR_ATOMIC = 0x80
};
/**
Flags for GetRangeSize.
*/
#define wxRICHTEXT_FORMATTED 0x01
#define wxRICHTEXT_UNFORMATTED 0x02
#define wxRICHTEXT_CACHE_SIZE 0x04
#define wxRICHTEXT_HEIGHT_ONLY 0x08
/**
Flags for SetStyle/SetListStyle.
*/
#define wxRICHTEXT_SETSTYLE_NONE 0x00
// Specifies that this operation should be undoable
#define wxRICHTEXT_SETSTYLE_WITH_UNDO 0x01
// Specifies that the style should not be applied if the
// combined style at this point is already the style in question.
#define wxRICHTEXT_SETSTYLE_OPTIMIZE 0x02
// Specifies that the style should only be applied to paragraphs,
// and not the content. This allows content styling to be
// preserved independently from that of e.g. a named paragraph style.
#define wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY 0x04
// Specifies that the style should only be applied to characters,
// and not the paragraph. This allows content styling to be
// preserved independently from that of e.g. a named paragraph style.
#define wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY 0x08
// For SetListStyle only: specifies starting from the given number, otherwise
// deduces number from existing attributes
#define wxRICHTEXT_SETSTYLE_RENUMBER 0x10
// For SetListStyle only: specifies the list level for all paragraphs, otherwise
// the current indentation will be used
#define wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL 0x20
// Resets the existing style before applying the new style
#define wxRICHTEXT_SETSTYLE_RESET 0x40
// Removes the given style instead of applying it
#define wxRICHTEXT_SETSTYLE_REMOVE 0x80
/**
Flags for SetProperties.
*/
#define wxRICHTEXT_SETPROPERTIES_NONE 0x00
// Specifies that this operation should be undoable
#define wxRICHTEXT_SETPROPERTIES_WITH_UNDO 0x01
// Specifies that the properties should only be applied to paragraphs,
// and not the content.
#define wxRICHTEXT_SETPROPERTIES_PARAGRAPHS_ONLY 0x02
// Specifies that the properties should only be applied to characters,
// and not the paragraph.
#define wxRICHTEXT_SETPROPERTIES_CHARACTERS_ONLY 0x04
// Resets the existing properties before applying the new properties.
#define wxRICHTEXT_SETPROPERTIES_RESET 0x08
// Removes the given properties instead of applying them.
#define wxRICHTEXT_SETPROPERTIES_REMOVE 0x10
/**
Flags for object insertion.
*/
#define wxRICHTEXT_INSERT_NONE 0x00
#define wxRICHTEXT_INSERT_WITH_PREVIOUS_PARAGRAPH_STYLE 0x01
#define wxRICHTEXT_INSERT_INTERACTIVE 0x02
// A special flag telling the buffer to keep the first paragraph style
// as-is, when deleting a paragraph marker. In future we might pass a
// flag to InsertFragment and DeleteRange to indicate the appropriate mode.
#define wxTEXT_ATTR_KEEP_FIRST_PARA_STYLE 0x20000000
/**
Default superscript/subscript font multiplication factor.
*/
#define wxSCRIPT_MUL_FACTOR 1.5
/**
The type for wxTextAttrDimension flags.
*/
typedef unsigned short wxTextAttrDimensionFlags;
/**
Miscellaneous text box flags
*/
enum wxTextBoxAttrFlags
{
wxTEXT_BOX_ATTR_FLOAT = 0x00000001,
wxTEXT_BOX_ATTR_CLEAR = 0x00000002,
wxTEXT_BOX_ATTR_COLLAPSE_BORDERS = 0x00000004,
wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT = 0x00000008,
wxTEXT_BOX_ATTR_BOX_STYLE_NAME = 0x00000010
};
/**
Whether a value is present, used in dimension flags.
*/
enum wxTextAttrValueFlags
{
wxTEXT_ATTR_VALUE_VALID = 0x1000,
wxTEXT_ATTR_VALUE_VALID_MASK = 0x1000
};
/**
Units, included in the dimension value.
*/
enum wxTextAttrUnits
{
wxTEXT_ATTR_UNITS_TENTHS_MM = 0x0001,
wxTEXT_ATTR_UNITS_PIXELS = 0x0002,
wxTEXT_ATTR_UNITS_PERCENTAGE = 0x0004,
wxTEXT_ATTR_UNITS_POINTS = 0x0008,
wxTEXT_ATTR_UNITS_HUNDREDTHS_POINT = 0x0100,
wxTEXT_ATTR_UNITS_MASK = 0x010F
};
/**
Position alternatives, included in the dimension flags.
*/
enum wxTextBoxAttrPosition
{
wxTEXT_BOX_ATTR_POSITION_STATIC = 0x0000, // Default is static, i.e. as per normal layout
wxTEXT_BOX_ATTR_POSITION_RELATIVE = 0x0010, // Relative to the relevant edge
wxTEXT_BOX_ATTR_POSITION_ABSOLUTE = 0x0020, // Relative to the parent
wxTEXT_BOX_ATTR_POSITION_FIXED = 0x0040, // Relative to the top-level window
wxTEXT_BOX_ATTR_POSITION_MASK = 0x00F0
};
/**
@class wxTextAttrDimension
A class representing a rich text dimension, including units and position.
@library{wxrichtext}
@category{richtext}
@see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimensions
*/
class WXDLLIMPEXP_RICHTEXT wxTextAttrDimension
{
public:
/**
Default constructor.
*/
wxTextAttrDimension() { Reset(); }
/**
Constructor taking value and units flag.
*/
wxTextAttrDimension(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { m_value = value; m_flags = units|wxTEXT_ATTR_VALUE_VALID; }
/**
Resets the dimension value and flags.
*/
void Reset() { m_value = 0; m_flags = 0; }
/**
Partial equality test. If @a weakTest is @true, attributes of this object do not
have to be present if those attributes of @a dim are present. If @a weakTest is
@false, the function will fail if an attribute is present in @a dim but not
in this object.
*/
bool EqPartial(const wxTextAttrDimension& dim, bool weakTest = true) const;
/** Apply the dimension, but not those identical to @a compareWith if present.
*/
bool Apply(const wxTextAttrDimension& dim, const wxTextAttrDimension* compareWith = NULL);
/** Collects the attributes that are common to a range of content, building up a note of
which attributes are absent in some objects and which clash in some objects.
*/
void CollectCommonAttributes(const wxTextAttrDimension& attr, wxTextAttrDimension& clashingAttr, wxTextAttrDimension& absentAttr);
/**
Equality operator.
*/
bool operator==(const wxTextAttrDimension& dim) const { return m_value == dim.m_value && m_flags == dim.m_flags; }
/**
Returns the integer value of the dimension.
*/
int GetValue() const { return m_value; }
/**
Returns the floating-pointing value of the dimension in mm.
*/
float GetValueMM() const { return float(m_value) / 10.0; }
/**
Sets the value of the dimension in mm.
*/
void SetValueMM(float value) { m_value = (int) ((value * 10.0) + 0.5); m_flags |= wxTEXT_ATTR_VALUE_VALID; }
/**
Sets the integer value of the dimension.
*/
void SetValue(int value) { m_value = value; m_flags |= wxTEXT_ATTR_VALUE_VALID; }
/**
Sets the integer value of the dimension, passing dimension flags.
*/
void SetValue(int value, wxTextAttrDimensionFlags flags) { SetValue(value); m_flags = flags; }
/**
Sets the integer value and units.
*/
void SetValue(int value, wxTextAttrUnits units) { m_value = value; m_flags = units | wxTEXT_ATTR_VALUE_VALID; }
/**
Sets the dimension.
*/
void SetValue(const wxTextAttrDimension& dim) { (*this) = dim; }
/**
Gets the units of the dimension.
*/
wxTextAttrUnits GetUnits() const { return (wxTextAttrUnits) (m_flags & wxTEXT_ATTR_UNITS_MASK); }
/**
Sets the units of the dimension.
*/
void SetUnits(wxTextAttrUnits units) { m_flags &= ~wxTEXT_ATTR_UNITS_MASK; m_flags |= units; }
/**
Gets the position flags.
*/
wxTextBoxAttrPosition GetPosition() const { return (wxTextBoxAttrPosition) (m_flags & wxTEXT_BOX_ATTR_POSITION_MASK); }
/**
Sets the position flags.
*/
void SetPosition(wxTextBoxAttrPosition pos) { m_flags &= ~wxTEXT_BOX_ATTR_POSITION_MASK; m_flags |= pos; }
/**
Returns @true if the dimension is valid.
*/
bool IsValid() const { return (m_flags & wxTEXT_ATTR_VALUE_VALID) != 0; }
/**
Sets the valid flag.
*/
void SetValid(bool b) { m_flags &= ~wxTEXT_ATTR_VALUE_VALID_MASK; m_flags |= (b ? wxTEXT_ATTR_VALUE_VALID : 0); }
/**
Gets the dimension flags.
*/
wxTextAttrDimensionFlags GetFlags() const { return m_flags; }
/**
Sets the dimension flags.
*/
void SetFlags(wxTextAttrDimensionFlags flags) { m_flags = flags; }
int m_value;
wxTextAttrDimensionFlags m_flags;
};
/**
@class wxTextAttrDimensions
A class for left, right, top and bottom dimensions.
@library{wxrichtext}
@category{richtext}
@see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension
*/
class WXDLLIMPEXP_RICHTEXT wxTextAttrDimensions
{
public:
/**
Default constructor.
*/
wxTextAttrDimensions() {}
/**
Resets the value and flags for all dimensions.
*/
void Reset() { m_left.Reset(); m_top.Reset(); m_right.Reset(); m_bottom.Reset(); }
/**
Equality operator.
*/
bool operator==(const wxTextAttrDimensions& dims) const { return m_left == dims.m_left && m_top == dims.m_top && m_right == dims.m_right && m_bottom == dims.m_bottom; }
/**
Partial equality test. If @a weakTest is @true, attributes of this object do not
have to be present if those attributes of @a dim sare present. If @a weakTest is
@false, the function will fail if an attribute is present in @a dims but not
in this object.
*/
bool EqPartial(const wxTextAttrDimensions& dims, bool weakTest = true) const;
/**
Apply to 'this', but not if the same as @a compareWith.
*/
bool Apply(const wxTextAttrDimensions& dims, const wxTextAttrDimensions* compareWith = NULL);
/**
Collects the attributes that are common to a range of content, building up a note of
which attributes are absent in some objects and which clash in some objects.
*/
void CollectCommonAttributes(const wxTextAttrDimensions& attr, wxTextAttrDimensions& clashingAttr, wxTextAttrDimensions& absentAttr);
/**
Remove specified attributes from this object.
*/
bool RemoveStyle(const wxTextAttrDimensions& attr);
/**
Gets the left dimension.
*/
const wxTextAttrDimension& GetLeft() const { return m_left; }
wxTextAttrDimension& GetLeft() { return m_left; }
/**
Gets the right dimension.
*/
const wxTextAttrDimension& GetRight() const { return m_right; }
wxTextAttrDimension& GetRight() { return m_right; }
/**
Gets the top dimension.
*/
const wxTextAttrDimension& GetTop() const { return m_top; }
wxTextAttrDimension& GetTop() { return m_top; }
/**
Gets the bottom dimension.
*/
const wxTextAttrDimension& GetBottom() const { return m_bottom; }
wxTextAttrDimension& GetBottom() { return m_bottom; }
/**
Are all dimensions valid?
*/
bool IsValid() const { return m_left.IsValid() && m_top.IsValid() && m_right.IsValid() && m_bottom.IsValid(); }
wxTextAttrDimension m_left;
wxTextAttrDimension m_top;
wxTextAttrDimension m_right;
wxTextAttrDimension m_bottom;
};
/**
@class wxTextAttrSize
A class for representing width and height.
@library{wxrichtext}
@category{richtext}
@see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension
*/
class WXDLLIMPEXP_RICHTEXT wxTextAttrSize
{
public:
/**
Default constructor.
*/
wxTextAttrSize() {}
/**
Resets the width and height dimensions.
*/
void Reset() { m_width.Reset(); m_height.Reset(); }
/**
Equality operator.
*/
bool operator==(const wxTextAttrSize& size) const { return m_width == size.m_width && m_height == size.m_height ; }
/**
Partial equality test. If @a weakTest is @true, attributes of this object do not
have to be present if those attributes of @a size are present. If @a weakTest is
@false, the function will fail if an attribute is present in @a size but not
in this object.
*/
bool EqPartial(const wxTextAttrSize& size, bool weakTest = true) const;
/**
Apply to this object, but not if the same as @a compareWith.
*/
bool Apply(const wxTextAttrSize& dims, const wxTextAttrSize* compareWith = NULL);
/**
Collects the attributes that are common to a range of content, building up a note of
which attributes are absent in some objects and which clash in some objects.
*/
void CollectCommonAttributes(const wxTextAttrSize& attr, wxTextAttrSize& clashingAttr, wxTextAttrSize& absentAttr);
/**
Removes the specified attributes from this object.
*/
bool RemoveStyle(const wxTextAttrSize& attr);
/**
Returns the width.
*/
wxTextAttrDimension& GetWidth() { return m_width; }
const wxTextAttrDimension& GetWidth() const { return m_width; }
/**
Sets the width.
*/
void SetWidth(int value, wxTextAttrDimensionFlags flags) { m_width.SetValue(value, flags); }
/**
Sets the width.
*/
void SetWidth(int value, wxTextAttrUnits units) { m_width.SetValue(value, units); }
/**
Sets the width.
*/
void SetWidth(const wxTextAttrDimension& dim) { m_width.SetValue(dim); }
/**
Gets the height.
*/
wxTextAttrDimension& GetHeight() { return m_height; }
const wxTextAttrDimension& GetHeight() const { return m_height; }
/**
Sets the height.
*/
void SetHeight(int value, wxTextAttrDimensionFlags flags) { m_height.SetValue(value, flags); }
/**
Sets the height.
*/
void SetHeight(int value, wxTextAttrUnits units) { m_height.SetValue(value, units); }
/**
Sets the height.
*/
void SetHeight(const wxTextAttrDimension& dim) { m_height.SetValue(dim); }
/**
Is the size valid?
*/
bool IsValid() const { return m_width.IsValid() && m_height.IsValid(); }
wxTextAttrDimension m_width;
wxTextAttrDimension m_height;
};
/**
@class wxTextAttrDimensionConverter
A class to make it easier to convert dimensions.
@library{wxrichtext}
@category{richtext}
@see wxRichTextAttr, wxRichTextCtrl, wxTextAttrDimension
*/
class WXDLLIMPEXP_RICHTEXT wxTextAttrDimensionConverter
{
public:
/**
Constructor.
*/
wxTextAttrDimensionConverter(wxDC& dc, double scale = 1.0, const wxSize& parentSize = wxDefaultSize);
/**
Constructor.
*/
wxTextAttrDimensionConverter(int ppi, double scale = 1.0, const wxSize& parentSize = wxDefaultSize);
/**
Gets the pixel size for the given dimension.
*/
int GetPixels(const wxTextAttrDimension& dim, int direction = wxHORIZONTAL) const;
/**
Gets the mm size for the given dimension.
*/
int GetTenthsMM(const wxTextAttrDimension& dim) const;
/**
Converts tenths of a mm to pixels.
*/
int ConvertTenthsMMToPixels(int units) const;
/**
Converts pixels to tenths of a mm.
*/
int ConvertPixelsToTenthsMM(int pixels) const;
/**
Sets the scale factor.
*/
void SetScale(double scale) { m_scale = scale; }
/**
Returns the scale factor.
*/
double GetScale() const { return m_scale; }
/**
Sets the ppi.
*/
void SetPPI(int ppi) { m_ppi = ppi; }
/**
Returns the ppi.
*/
int GetPPI() const { return m_ppi; }
/**
Sets the parent size.
*/
void SetParentSize(const wxSize& parentSize) { m_parentSize = parentSize; }
/**
Returns the parent size.
*/
const wxSize& GetParentSize() const { return m_parentSize; }
int m_ppi;
double m_scale;
wxSize m_parentSize;
};
/**
Border styles, used with wxTextAttrBorder.
*/
enum wxTextAttrBorderStyle
{
wxTEXT_BOX_ATTR_BORDER_NONE = 0,
wxTEXT_BOX_ATTR_BORDER_SOLID = 1,
wxTEXT_BOX_ATTR_BORDER_DOTTED = 2,
wxTEXT_BOX_ATTR_BORDER_DASHED = 3,
wxTEXT_BOX_ATTR_BORDER_DOUBLE = 4,
wxTEXT_BOX_ATTR_BORDER_GROOVE = 5,
wxTEXT_BOX_ATTR_BORDER_RIDGE = 6,
wxTEXT_BOX_ATTR_BORDER_INSET = 7,
wxTEXT_BOX_ATTR_BORDER_OUTSET = 8
};
/**
Border style presence flags, used with wxTextAttrBorder.
*/
enum wxTextAttrBorderFlags
{
wxTEXT_BOX_ATTR_BORDER_STYLE = 0x0001,
wxTEXT_BOX_ATTR_BORDER_COLOUR = 0x0002
};
/**
Border width symbols for qualitative widths, used with wxTextAttrBorder.
*/
enum wxTextAttrBorderWidth
{
wxTEXT_BOX_ATTR_BORDER_THIN = -1,
wxTEXT_BOX_ATTR_BORDER_MEDIUM = -2,
wxTEXT_BOX_ATTR_BORDER_THICK = -3
};
/**
Float styles.
*/
enum wxTextBoxAttrFloatStyle
{
wxTEXT_BOX_ATTR_FLOAT_NONE = 0,
wxTEXT_BOX_ATTR_FLOAT_LEFT = 1,
wxTEXT_BOX_ATTR_FLOAT_RIGHT = 2
};
/**
Clear styles.
*/
enum wxTextBoxAttrClearStyle
{
wxTEXT_BOX_ATTR_CLEAR_NONE = 0,
wxTEXT_BOX_ATTR_CLEAR_LEFT = 1,
wxTEXT_BOX_ATTR_CLEAR_RIGHT = 2,
wxTEXT_BOX_ATTR_CLEAR_BOTH = 3
};
/**
Collapse mode styles. TODO: can they be switched on per side?
*/
enum wxTextBoxAttrCollapseMode
{
wxTEXT_BOX_ATTR_COLLAPSE_NONE = 0,
wxTEXT_BOX_ATTR_COLLAPSE_FULL = 1
};
/**
Vertical alignment values.
*/
enum wxTextBoxAttrVerticalAlignment
{
wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_NONE = 0,
wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_TOP = 1,
wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_CENTRE = 2,
wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT_BOTTOM = 3
};
/**
@class wxTextAttrBorder
A class representing a rich text object border.
@library{wxrichtext}
@category{richtext}
@see wxRichTextAttr, wxRichTextCtrl, wxRichTextAttrBorders
*/
class WXDLLIMPEXP_RICHTEXT wxTextAttrBorder
{
public:
/**
Default constructor.
*/
wxTextAttrBorder() { Reset(); }
/**
Equality operator.
*/
bool operator==(const wxTextAttrBorder& border) const
{
return m_flags == border.m_flags && m_borderStyle == border.m_borderStyle &&
m_borderColour == border.m_borderColour && m_borderWidth == border.m_borderWidth;
}
/**
Resets the border style, colour, width and flags.
*/
void Reset() { m_borderStyle = 0; m_borderColour = 0; m_flags = 0; m_borderWidth.Reset(); }
/**
Partial equality test. If @a weakTest is @true, attributes of this object do not
have to be present if those attributes of @a border are present. If @a weakTest is
@false, the function will fail if an attribute is present in @a border but not
in this object.
*/
bool EqPartial(const wxTextAttrBorder& border, bool weakTest = true) const;
/**
Applies the border to this object, but not if the same as @a compareWith.
*/
bool Apply(const wxTextAttrBorder& border, const wxTextAttrBorder* compareWith = NULL);
/**
Removes the specified attributes from this object.
*/
bool RemoveStyle(const wxTextAttrBorder& attr);
/**
Collects the attributes that are common to a range of content, building up a note of
which attributes are absent in some objects and which clash in some objects.
*/
void CollectCommonAttributes(const wxTextAttrBorder& attr, wxTextAttrBorder& clashingAttr, wxTextAttrBorder& absentAttr);
/**
Sets the border style.
*/
void SetStyle(int style) { m_borderStyle = style; m_flags |= wxTEXT_BOX_ATTR_BORDER_STYLE; }
/**
Gets the border style.
*/
int GetStyle() const { return m_borderStyle; }
/**
Sets the border colour.
*/
void SetColour(unsigned long colour) { m_borderColour = colour; m_flags |= wxTEXT_BOX_ATTR_BORDER_COLOUR; }
/**
Sets the border colour.
*/
void SetColour(const wxColour& colour) { m_borderColour = colour.GetRGB(); m_flags |= wxTEXT_BOX_ATTR_BORDER_COLOUR; }
/**
Gets the colour as a long.
*/
unsigned long GetColourLong() const { return m_borderColour; }
/**
Gets the colour.
*/
wxColour GetColour() const { return wxColour(m_borderColour); }
/**
Gets the border width.
*/
wxTextAttrDimension& GetWidth() { return m_borderWidth; }
const wxTextAttrDimension& GetWidth() const { return m_borderWidth; }
/**
Sets the border width.
*/
void SetWidth(const wxTextAttrDimension& width) { m_borderWidth = width; }
/**
Sets the border width.
*/
void SetWidth(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { SetWidth(wxTextAttrDimension(value, units)); }
/**
True if the border has a valid style.
*/
bool HasStyle() const { return (m_flags & wxTEXT_BOX_ATTR_BORDER_STYLE) != 0; }
/**
True if the border has a valid colour.
*/
bool HasColour() const { return (m_flags & wxTEXT_BOX_ATTR_BORDER_COLOUR) != 0; }
/**
True if the border has a valid width.
*/
bool HasWidth() const { return m_borderWidth.IsValid(); }
/**
True if the border is valid.
*/
bool IsValid() const { return HasWidth(); }
/**
Set the valid flag for this border.
*/
void MakeValid() { m_borderWidth.SetValid(true); }
/**
True if the border has no attributes set.
*/
bool IsDefault() const { return (m_flags == 0); }
/**
Returns the border flags.
*/
int GetFlags() const { return m_flags; }
/**
Sets the border flags.
*/
void SetFlags(int flags) { m_flags = flags; }
/**
Adds a border flag.
*/
void AddFlag(int flag) { m_flags |= flag; }
/**
Removes a border flag.
*/
void RemoveFlag(int flag) { m_flags &= ~flag; }
int m_borderStyle;
unsigned long m_borderColour;
wxTextAttrDimension m_borderWidth;
int m_flags;
};
/**
@class wxTextAttrBorders
A class representing a rich text object's borders.
@library{wxrichtext}
@category{richtext}
@see wxRichTextAttr, wxRichTextCtrl, wxRichTextAttrBorder
*/
class WXDLLIMPEXP_RICHTEXT wxTextAttrBorders
{
public:
/**
Default constructor.
*/
wxTextAttrBorders() { }
/**
Equality operator.
*/
bool operator==(const wxTextAttrBorders& borders) const
{
return m_left == borders.m_left && m_right == borders.m_right &&
m_top == borders.m_top && m_bottom == borders.m_bottom;
}
/**
Sets the style of all borders.
*/
void SetStyle(int style);
/**
Sets colour of all borders.
*/
void SetColour(unsigned long colour);
/**
Sets the colour for all borders.
*/
void SetColour(const wxColour& colour);
/**
Sets the width of all borders.
*/
void SetWidth(const wxTextAttrDimension& width);
/**
Sets the width of all borders.
*/
void SetWidth(int value, wxTextAttrUnits units = wxTEXT_ATTR_UNITS_TENTHS_MM) { SetWidth(wxTextAttrDimension(value, units)); }
/**
Resets all borders.
*/
void Reset() { m_left.Reset(); m_right.Reset(); m_top.Reset(); m_bottom.Reset(); }
/**
Partial equality test. If @a weakTest is @true, attributes of this object do not
have to be present if those attributes of @a borders are present. If @a weakTest is
@false, the function will fail if an attribute is present in @a borders but not
in this object.
*/
bool EqPartial(const wxTextAttrBorders& borders, bool weakTest = true) const;
/**
Applies border to this object, but not if the same as @a compareWith.
*/
bool Apply(const wxTextAttrBorders& borders, const wxTextAttrBorders* compareWith = NULL);
/**
Removes the specified attributes from this object.
*/
bool RemoveStyle(const wxTextAttrBorders& attr);
/**
Collects the attributes that are common to a range of content, building up a note of
which attributes are absent in some objects and which clash in some objects.
*/
void CollectCommonAttributes(const wxTextAttrBorders& attr, wxTextAttrBorders& clashingAttr, wxTextAttrBorders& absentAttr);
/**
Returns @true if at least one border is valid.
*/
bool IsValid() const { return m_left.IsValid() || m_right.IsValid() || m_top.IsValid() || m_bottom.IsValid(); }
/**
Returns @true if no border attributes were set.
*/
bool IsDefault() const { return m_left.IsDefault() && m_right.IsDefault() && m_top.IsDefault() && m_bottom.IsDefault(); }
/**
Returns the left border.
*/
const wxTextAttrBorder& GetLeft() const { return m_left; }
wxTextAttrBorder& GetLeft() { return m_left; }
/**
Returns the right border.
*/
const wxTextAttrBorder& GetRight() const { return m_right; }
wxTextAttrBorder& GetRight() { return m_right; }
/**
Returns the top border.
*/
const wxTextAttrBorder& GetTop() const { return m_top; }
wxTextAttrBorder& GetTop() { return m_top; }
/**
Returns the bottom border.
*/
const wxTextAttrBorder& GetBottom() const { return m_bottom; }
wxTextAttrBorder& GetBottom() { return m_bottom; }
wxTextAttrBorder m_left, m_right, m_top, m_bottom;
};
/**
@class wxTextBoxAttr
A class representing the box attributes of a rich text object.
@library{wxrichtext}
@category{richtext}
@see wxRichTextAttr, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxTextBoxAttr
{
public:
/**
Default constructor.
*/
wxTextBoxAttr() { Init(); }
/**
Copy constructor.
*/
wxTextBoxAttr(const wxTextBoxAttr& attr) { Init(); (*this) = attr; }
/**
Initialises this object.
*/
void Init() { Reset(); }
/**
Resets this object.
*/
void Reset();
// Copy. Unnecessary since we let it do a binary copy
//void Copy(const wxTextBoxAttr& attr);
// Assignment
//void operator= (const wxTextBoxAttr& attr);
/**
Equality test.
*/
bool operator== (const wxTextBoxAttr& attr) const;
/**
Partial equality test, ignoring unset attributes. If @a weakTest is @true, attributes of this object do not
have to be present if those attributes of @a attr are present. If @a weakTest is
@false, the function will fail if an attribute is present in @a attr but not
in this object.
*/
bool EqPartial(const wxTextBoxAttr& attr, bool weakTest = true) const;
/**
Merges the given attributes. If @a compareWith is non-NULL, then it will be used
to mask out those attributes that are the same in style and @a compareWith, for
situations where we don't want to explicitly set inherited attributes.
*/
bool Apply(const wxTextBoxAttr& style, const wxTextBoxAttr* compareWith = NULL);
/**
Collects the attributes that are common to a range of content, building up a note of
which attributes are absent in some objects and which clash in some objects.
*/
void CollectCommonAttributes(const wxTextBoxAttr& attr, wxTextBoxAttr& clashingAttr, wxTextBoxAttr& absentAttr);
/**
Removes the specified attributes from this object.
*/
bool RemoveStyle(const wxTextBoxAttr& attr);
/**
Sets the flags.
*/
void SetFlags(int flags) { m_flags = flags; }
/**
Returns the flags.
*/
int GetFlags() const { return m_flags; }
/**
Is this flag present?
*/
bool HasFlag(wxTextBoxAttrFlags flag) const { return (m_flags & flag) != 0; }
/**
Removes this flag.
*/
void RemoveFlag(wxTextBoxAttrFlags flag) { m_flags &= ~flag; }
/**
Adds this flag.
*/
void AddFlag(wxTextBoxAttrFlags flag) { m_flags |= flag; }
/**
Returns @true if no attributes are set.
*/
bool IsDefault() const;
/**
Returns the float mode.
*/
wxTextBoxAttrFloatStyle GetFloatMode() const { return m_floatMode; }
/**
Sets the float mode.
*/
void SetFloatMode(wxTextBoxAttrFloatStyle mode) { m_floatMode = mode; m_flags |= wxTEXT_BOX_ATTR_FLOAT; }
/**
Returns @true if float mode is active.
*/
bool HasFloatMode() const { return HasFlag(wxTEXT_BOX_ATTR_FLOAT); }
/**
Returns @true if this object is floating.
*/
bool IsFloating() const { return HasFloatMode() && GetFloatMode() != wxTEXT_BOX_ATTR_FLOAT_NONE; }
/**
Returns the clear mode - whether to wrap text after object. Currently unimplemented.
*/
wxTextBoxAttrClearStyle GetClearMode() const { return m_clearMode; }
/**
Set the clear mode. Currently unimplemented.
*/
void SetClearMode(wxTextBoxAttrClearStyle mode) { m_clearMode = mode; m_flags |= wxTEXT_BOX_ATTR_CLEAR; }
/**
Returns @true if we have a clear flag.
*/
bool HasClearMode() const { return HasFlag(wxTEXT_BOX_ATTR_CLEAR); }
/**
Returns the collapse mode - whether to collapse borders.
*/
wxTextBoxAttrCollapseMode GetCollapseBorders() const { return m_collapseMode; }
/**
Sets the collapse mode - whether to collapse borders.
*/
void SetCollapseBorders(wxTextBoxAttrCollapseMode collapse) { m_collapseMode = collapse; m_flags |= wxTEXT_BOX_ATTR_COLLAPSE_BORDERS; }
/**
Returns @true if the collapse borders flag is present.
*/
bool HasCollapseBorders() const { return HasFlag(wxTEXT_BOX_ATTR_COLLAPSE_BORDERS); }
/**
Returns the vertical alignment.
*/
wxTextBoxAttrVerticalAlignment GetVerticalAlignment() const { return m_verticalAlignment; }
/**
Sets the vertical alignment.
*/
void SetVerticalAlignment(wxTextBoxAttrVerticalAlignment verticalAlignment) { m_verticalAlignment = verticalAlignment; m_flags |= wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT; }
/**
Returns @true if a vertical alignment flag is present.
*/
bool HasVerticalAlignment() const { return HasFlag(wxTEXT_BOX_ATTR_VERTICAL_ALIGNMENT); }
/**
Returns the margin values.
*/
wxTextAttrDimensions& GetMargins() { return m_margins; }
const wxTextAttrDimensions& GetMargins() const { return m_margins; }
/**
Returns the left margin.
*/
wxTextAttrDimension& GetLeftMargin() { return m_margins.m_left; }
const wxTextAttrDimension& GetLeftMargin() const { return m_margins.m_left; }
/**
Returns the right margin.
*/
wxTextAttrDimension& GetRightMargin() { return m_margins.m_right; }
const wxTextAttrDimension& GetRightMargin() const { return m_margins.m_right; }
/**
Returns the top margin.
*/
wxTextAttrDimension& GetTopMargin() { return m_margins.m_top; }
const wxTextAttrDimension& GetTopMargin() const { return m_margins.m_top; }
/**
Returns the bottom margin.
*/
wxTextAttrDimension& GetBottomMargin() { return m_margins.m_bottom; }
const wxTextAttrDimension& GetBottomMargin() const { return m_margins.m_bottom; }
/**
Returns the position.
*/
wxTextAttrDimensions& GetPosition() { return m_position; }
const wxTextAttrDimensions& GetPosition() const { return m_position; }
/**
Returns the left position.
*/
wxTextAttrDimension& GetLeft() { return m_position.m_left; }
const wxTextAttrDimension& GetLeft() const { return m_position.m_left; }
/**
Returns the right position.
*/
wxTextAttrDimension& GetRight() { return m_position.m_right; }
const wxTextAttrDimension& GetRight() const { return m_position.m_right; }
/**
Returns the top position.
*/
wxTextAttrDimension& GetTop() { return m_position.m_top; }
const wxTextAttrDimension& GetTop() const { return m_position.m_top; }
/**
Returns the bottom position.
*/
wxTextAttrDimension& GetBottom() { return m_position.m_bottom; }
const wxTextAttrDimension& GetBottom() const { return m_position.m_bottom; }
/**
Returns the padding values.
*/
wxTextAttrDimensions& GetPadding() { return m_padding; }
const wxTextAttrDimensions& GetPadding() const { return m_padding; }
/**
Returns the left padding value.
*/
wxTextAttrDimension& GetLeftPadding() { return m_padding.m_left; }
const wxTextAttrDimension& GetLeftPadding() const { return m_padding.m_left; }
/**
Returns the right padding value.
*/
wxTextAttrDimension& GetRightPadding() { return m_padding.m_right; }
const wxTextAttrDimension& GetRightPadding() const { return m_padding.m_right; }
/**
Returns the top padding value.
*/
wxTextAttrDimension& GetTopPadding() { return m_padding.m_top; }
const wxTextAttrDimension& GetTopPadding() const { return m_padding.m_top; }
/**
Returns the bottom padding value.
*/
wxTextAttrDimension& GetBottomPadding() { return m_padding.m_bottom; }
const wxTextAttrDimension& GetBottomPadding() const { return m_padding.m_bottom; }
/**
Returns the borders.
*/
wxTextAttrBorders& GetBorder() { return m_border; }
const wxTextAttrBorders& GetBorder() const { return m_border; }
/**
Returns the left border.
*/
wxTextAttrBorder& GetLeftBorder() { return m_border.m_left; }
const wxTextAttrBorder& GetLeftBorder() const { return m_border.m_left; }
/**
Returns the top border.
*/
wxTextAttrBorder& GetTopBorder() { return m_border.m_top; }
const wxTextAttrBorder& GetTopBorder() const { return m_border.m_top; }
/**
Returns the right border.
*/
wxTextAttrBorder& GetRightBorder() { return m_border.m_right; }
const wxTextAttrBorder& GetRightBorder() const { return m_border.m_right; }
/**
Returns the bottom border.
*/
wxTextAttrBorder& GetBottomBorder() { return m_border.m_bottom; }
const wxTextAttrBorder& GetBottomBorder() const { return m_border.m_bottom; }
/**
Returns the outline.
*/
wxTextAttrBorders& GetOutline() { return m_outline; }
const wxTextAttrBorders& GetOutline() const { return m_outline; }
/**
Returns the left outline.
*/
wxTextAttrBorder& GetLeftOutline() { return m_outline.m_left; }
const wxTextAttrBorder& GetLeftOutline() const { return m_outline.m_left; }
/**
Returns the top outline.
*/
wxTextAttrBorder& GetTopOutline() { return m_outline.m_top; }
const wxTextAttrBorder& GetTopOutline() const { return m_outline.m_top; }
/**
Returns the right outline.
*/
wxTextAttrBorder& GetRightOutline() { return m_outline.m_right; }
const wxTextAttrBorder& GetRightOutline() const { return m_outline.m_right; }
/**
Returns the bottom outline.
*/
wxTextAttrBorder& GetBottomOutline() { return m_outline.m_bottom; }
const wxTextAttrBorder& GetBottomOutline() const { return m_outline.m_bottom; }
/**
Returns the object size.
*/
wxTextAttrSize& GetSize() { return m_size; }
const wxTextAttrSize& GetSize() const { return m_size; }
/**
Returns the object minimum size.
*/
wxTextAttrSize& GetMinSize() { return m_minSize; }
const wxTextAttrSize& GetMinSize() const { return m_minSize; }
/**
Returns the object maximum size.
*/
wxTextAttrSize& GetMaxSize() { return m_maxSize; }
const wxTextAttrSize& GetMaxSize() const { return m_maxSize; }
/**
Sets the object size.
*/
void SetSize(const wxTextAttrSize& sz) { m_size = sz; }
/**
Sets the object minimum size.
*/
void SetMinSize(const wxTextAttrSize& sz) { m_minSize = sz; }
/**
Sets the object maximum size.
*/
void SetMaxSize(const wxTextAttrSize& sz) { m_maxSize = sz; }
/**
Returns the object width.
*/
wxTextAttrDimension& GetWidth() { return m_size.m_width; }
const wxTextAttrDimension& GetWidth() const { return m_size.m_width; }
/**
Returns the object height.
*/
wxTextAttrDimension& GetHeight() { return m_size.m_height; }
const wxTextAttrDimension& GetHeight() const { return m_size.m_height; }
/**
Returns the box style name.
*/
const wxString& GetBoxStyleName() const { return m_boxStyleName; }
/**
Sets the box style name.
*/
void SetBoxStyleName(const wxString& name) { m_boxStyleName = name; AddFlag(wxTEXT_BOX_ATTR_BOX_STYLE_NAME); }
/**
Returns @true if the box style name is present.
*/
bool HasBoxStyleName() const { return HasFlag(wxTEXT_BOX_ATTR_BOX_STYLE_NAME); }
public:
int m_flags;
wxTextAttrDimensions m_margins;
wxTextAttrDimensions m_padding;
wxTextAttrDimensions m_position;
wxTextAttrSize m_size;
wxTextAttrSize m_minSize;
wxTextAttrSize m_maxSize;
wxTextAttrBorders m_border;
wxTextAttrBorders m_outline;
wxTextBoxAttrFloatStyle m_floatMode;
wxTextBoxAttrClearStyle m_clearMode;
wxTextBoxAttrCollapseMode m_collapseMode;
wxTextBoxAttrVerticalAlignment m_verticalAlignment;
wxString m_boxStyleName;
};
/**
@class wxRichTextAttr
A class representing enhanced attributes for rich text objects.
This adds a wxTextBoxAttr member to the basic wxTextAttr class.
@library{wxrichtext}
@category{richtext}
@see wxRichTextAttr, wxTextBoxAttr, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextAttr: public wxTextAttr
{
public:
/**
Constructor taking a wxTextAttr.
*/
wxRichTextAttr(const wxTextAttr& attr) { wxTextAttr::Copy(attr); }
/**
Copy constructor.
*/
wxRichTextAttr(const wxRichTextAttr& attr): wxTextAttr() { Copy(attr); }
/**
Default constructor.
*/
wxRichTextAttr() {}
/**
Copy function.
*/
void Copy(const wxRichTextAttr& attr);
/**
Assignment operator.
*/
void operator=(const wxRichTextAttr& attr) { Copy(attr); }
/**
Assignment operator.
*/
void operator=(const wxTextAttr& attr) { wxTextAttr::Copy(attr); }
/**
Equality test.
*/
bool operator==(const wxRichTextAttr& attr) const;
/**
Partial equality test. If @a weakTest is @true, attributes of this object do not
have to be present if those attributes of @a attr are present. If @a weakTest is
@false, the function will fail if an attribute is present in @a attr but not
in this object.
*/
bool EqPartial(const wxRichTextAttr& attr, bool weakTest = true) const;
/**
Merges the given attributes. If @a compareWith
is non-NULL, then it will be used to mask out those attributes that are the same in style
and @a compareWith, for situations where we don't want to explicitly set inherited attributes.
*/
bool Apply(const wxRichTextAttr& style, const wxRichTextAttr* compareWith = NULL);
/**
Collects the attributes that are common to a range of content, building up a note of
which attributes are absent in some objects and which clash in some objects.
*/
void CollectCommonAttributes(const wxRichTextAttr& attr, wxRichTextAttr& clashingAttr, wxRichTextAttr& absentAttr);
/**
Removes the specified attributes from this object.
*/
bool RemoveStyle(const wxRichTextAttr& attr);
/**
Returns the text box attributes.
*/
wxTextBoxAttr& GetTextBoxAttr() { return m_textBoxAttr; }
const wxTextBoxAttr& GetTextBoxAttr() const { return m_textBoxAttr; }
/**
Set the text box attributes.
*/
void SetTextBoxAttr(const wxTextBoxAttr& attr) { m_textBoxAttr = attr; }
/**
Returns @true if no attributes are set.
*/
bool IsDefault() const { return (GetFlags() == 0) && m_textBoxAttr.IsDefault(); }
wxTextBoxAttr m_textBoxAttr;
};
WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRichTextAttr, wxRichTextAttrArray, WXDLLIMPEXP_RICHTEXT);
WX_DECLARE_USER_EXPORTED_OBJARRAY(wxVariant, wxRichTextVariantArray, WXDLLIMPEXP_RICHTEXT);
WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRect, wxRichTextRectArray, WXDLLIMPEXP_RICHTEXT);
/**
@class wxRichTextProperties
A simple property class using wxVariants. This is used to give each rich text object the
ability to store custom properties that can be used by the application.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextObject, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextProperties: public wxObject
{
DECLARE_DYNAMIC_CLASS(wxRichTextProperties)
public:
/**
Default constructor.
*/
wxRichTextProperties() {}
/**
Copy constructor.
*/
wxRichTextProperties(const wxRichTextProperties& props): wxObject() { Copy(props); }
/**
Assignment operator.
*/
void operator=(const wxRichTextProperties& props) { Copy(props); }
/**
Equality operator.
*/
bool operator==(const wxRichTextProperties& props) const;
/**
Copies from @a props.
*/
void Copy(const wxRichTextProperties& props) { m_properties = props.m_properties; }
/**
Returns the variant at the given index.
*/
const wxVariant& operator[](size_t idx) const { return m_properties[idx]; }
/**
Returns the variant at the given index.
*/
wxVariant& operator[](size_t idx) { return m_properties[idx]; }
/**
Clears the properties.
*/
void Clear() { m_properties.Clear(); }
/**
Returns the array of variants implementing the properties.
*/
const wxRichTextVariantArray& GetProperties() const { return m_properties; }
/**
Returns the array of variants implementing the properties.
*/
wxRichTextVariantArray& GetProperties() { return m_properties; }
/**
Sets the array of variants.
*/
void SetProperties(const wxRichTextVariantArray& props) { m_properties = props; }
/**
Returns all the property names.
*/
wxArrayString GetPropertyNames() const;
/**
Returns a count of the properties.
*/
size_t GetCount() const { return m_properties.GetCount(); }
/**
Returns @true if the given property is found.
*/
bool HasProperty(const wxString& name) const { return Find(name) != -1; }
/**
Finds the given property.
*/
int Find(const wxString& name) const;
/**
Removes the given property.
*/
bool Remove(const wxString& name);
/**
Gets the property variant by name.
*/
const wxVariant& GetProperty(const wxString& name) const;
/**
Finds or creates a property with the given name, returning a pointer to the variant.
*/
wxVariant* FindOrCreateProperty(const wxString& name);
/**
Gets the value of the named property as a string.
*/
wxString GetPropertyString(const wxString& name) const;
/**
Gets the value of the named property as a long integer.
*/
long GetPropertyLong(const wxString& name) const;
/**
Gets the value of the named property as a boolean.
*/
bool GetPropertyBool(const wxString& name) const;
/**
Gets the value of the named property as a double.
*/
double GetPropertyDouble(const wxString& name) const;
/**
Sets the property by passing a variant which contains a name and value.
*/
void SetProperty(const wxVariant& variant);
/**
Sets a property by name and variant.
*/
void SetProperty(const wxString& name, const wxVariant& variant);
/**
Sets a property by name and string value.
*/
void SetProperty(const wxString& name, const wxString& value);
/**
Sets a property by name and wxChar* value.
*/
void SetProperty(const wxString& name, const wxChar* value) { SetProperty(name, wxString(value)); }
/**
Sets property by name and long integer value.
*/
void SetProperty(const wxString& name, long value);
/**
Sets property by name and double value.
*/
void SetProperty(const wxString& name, double value);
/**
Sets property by name and boolean value.
*/
void SetProperty(const wxString& name, bool value);
/**
Removes the given properties from these properties.
*/
void RemoveProperties(const wxRichTextProperties& properties);
/**
Merges the given properties with these properties.
*/
void MergeProperties(const wxRichTextProperties& properties);
protected:
wxRichTextVariantArray m_properties;
};
/**
@class wxRichTextFontTable
Manages quick access to a pool of fonts for rendering rich text.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextFontTable: public wxObject
{
public:
/**
Default constructor.
*/
wxRichTextFontTable();
/**
Copy constructor.
*/
wxRichTextFontTable(const wxRichTextFontTable& table);
virtual ~wxRichTextFontTable();
/**
Returns @true if the font table is valid.
*/
bool IsOk() const { return m_refData != NULL; }
/**
Finds a font for the given attribute object.
*/
wxFont FindFont(const wxRichTextAttr& fontSpec);
/**
Clears the font table.
*/
void Clear();
/**
Assignment operator.
*/
void operator= (const wxRichTextFontTable& table);
/**
Equality operator.
*/
bool operator == (const wxRichTextFontTable& table) const;
/**
Inequality operator.
*/
bool operator != (const wxRichTextFontTable& table) const { return !(*this == table); }
/**
Set the font scale factor.
*/
void SetFontScale(double fontScale);
protected:
double m_fontScale;
DECLARE_DYNAMIC_CLASS(wxRichTextFontTable)
};
/**
@class wxRichTextRange
This stores beginning and end positions for a range of data.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextRange
{
public:
// Constructors
/**
Default constructor.
*/
wxRichTextRange() { m_start = 0; m_end = 0; }
/**
Constructor taking start and end positions.
*/
wxRichTextRange(long start, long end) { m_start = start; m_end = end; }
/**
Copy constructor.
*/
wxRichTextRange(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; }
~wxRichTextRange() {}
/**
Assigns @a range to this range.
*/
void operator =(const wxRichTextRange& range) { m_start = range.m_start; m_end = range.m_end; }
/**
Equality operator. Returns @true if @a range is the same as this range.
*/
bool operator ==(const wxRichTextRange& range) const { return (m_start == range.m_start && m_end == range.m_end); }
/**
Inequality operator.
*/
bool operator !=(const wxRichTextRange& range) const { return (m_start != range.m_start || m_end != range.m_end); }
/**
Subtracts a range from this range.
*/
wxRichTextRange operator -(const wxRichTextRange& range) const { return wxRichTextRange(m_start - range.m_start, m_end - range.m_end); }
/**
Adds a range to this range.
*/
wxRichTextRange operator +(const wxRichTextRange& range) const { return wxRichTextRange(m_start + range.m_start, m_end + range.m_end); }
/**
Sets the range start and end positions.
*/
void SetRange(long start, long end) { m_start = start; m_end = end; }
/**
Sets the start position.
*/
void SetStart(long start) { m_start = start; }
/**
Returns the start position.
*/
long GetStart() const { return m_start; }
/**
Sets the end position.
*/
void SetEnd(long end) { m_end = end; }
/**
Gets the end position.
*/
long GetEnd() const { return m_end; }
/**
Returns true if this range is completely outside @a range.
*/
bool IsOutside(const wxRichTextRange& range) const { return range.m_start > m_end || range.m_end < m_start; }
/**
Returns true if this range is completely within @a range.
*/
bool IsWithin(const wxRichTextRange& range) const { return m_start >= range.m_start && m_end <= range.m_end; }
/**
Returns true if @a pos was within the range. Does not match if the range is empty.
*/
bool Contains(long pos) const { return pos >= m_start && pos <= m_end ; }
/**
Limit this range to be within @a range.
*/
bool LimitTo(const wxRichTextRange& range) ;
/**
Gets the length of the range.
*/
long GetLength() const { return m_end - m_start + 1; }
/**
Swaps the start and end.
*/
void Swap() { long tmp = m_start; m_start = m_end; m_end = tmp; }
/**
Converts the API-standard range, whose end is one past the last character in
the range, to the internal form, which uses the first and last character
positions of the range. In other words, one is subtracted from the end position.
(n, n) is the range of a single character.
*/
wxRichTextRange ToInternal() const { return wxRichTextRange(m_start, m_end-1); }
/**
Converts the internal range, which uses the first and last character positions
of the range, to the API-standard range, whose end is one past the last
character in the range. In other words, one is added to the end position.
(n, n+1) is the range of a single character.
*/
wxRichTextRange FromInternal() const { return wxRichTextRange(m_start, m_end+1); }
protected:
long m_start;
long m_end;
};
WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRichTextRange, wxRichTextRangeArray, WXDLLIMPEXP_RICHTEXT);
#define wxRICHTEXT_ALL wxRichTextRange(-2, -2)
#define wxRICHTEXT_NONE wxRichTextRange(-1, -1)
#define wxRICHTEXT_NO_SELECTION wxRichTextRange(-2, -2)
/**
@class wxRichTextSelection
Stores selection information. The selection does not have to be contiguous, though currently non-contiguous
selections are only supported for a range of table cells (a geometric block of cells can consist
of a set of non-contiguous positions).
The selection consists of an array of ranges, and the container that is the context for the selection. It
follows that a single selection object can only represent ranges with the same parent container.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextSelection
{
public:
/**
Copy constructor.
*/
wxRichTextSelection(const wxRichTextSelection& sel) { Copy(sel); }
/**
Creates a selection from a range and a container.
*/
wxRichTextSelection(const wxRichTextRange& range, wxRichTextParagraphLayoutBox* container) { m_ranges.Add(range); m_container = container; }
/**
Default constructor.
*/
wxRichTextSelection() { Reset(); }
/**
Resets the selection.
*/
void Reset() { m_ranges.Clear(); m_container = NULL; }
/**
Sets the selection.
*/
void Set(const wxRichTextRange& range, wxRichTextParagraphLayoutBox* container)
{ m_ranges.Clear(); m_ranges.Add(range); m_container = container; }
/**
Adds a range to the selection.
*/
void Add(const wxRichTextRange& range)
{ m_ranges.Add(range); }
/**
Sets the selections from an array of ranges and a container object.
*/
void Set(const wxRichTextRangeArray& ranges, wxRichTextParagraphLayoutBox* container)
{ m_ranges = ranges; m_container = container; }
/**
Copies from @a sel.
*/
void Copy(const wxRichTextSelection& sel)
{ m_ranges = sel.m_ranges; m_container = sel.m_container; }
/**
Assignment operator.
*/
void operator=(const wxRichTextSelection& sel) { Copy(sel); }
/**
Equality operator.
*/
bool operator==(const wxRichTextSelection& sel) const;
/**
Index operator.
*/
wxRichTextRange operator[](size_t i) const { return GetRange(i); }
/**
Returns the selection ranges.
*/
wxRichTextRangeArray& GetRanges() { return m_ranges; }
/**
Returns the selection ranges.
*/
const wxRichTextRangeArray& GetRanges() const { return m_ranges; }
/**
Sets the selection ranges.
*/
void SetRanges(const wxRichTextRangeArray& ranges) { m_ranges = ranges; }
/**
Returns the number of ranges in the selection.
*/
size_t GetCount() const { return m_ranges.GetCount(); }
/**
Returns the range at the given index.
*/
wxRichTextRange GetRange(size_t i) const { return m_ranges[i]; }
/**
Returns the first range if there is one, otherwise wxRICHTEXT_NO_SELECTION.
*/
wxRichTextRange GetRange() const { return (m_ranges.GetCount() > 0) ? (m_ranges[0]) : wxRICHTEXT_NO_SELECTION; }
/**
Sets a single range.
*/
void SetRange(const wxRichTextRange& range) { m_ranges.Clear(); m_ranges.Add(range); }
/**
Returns the container for which the selection is valid.
*/
wxRichTextParagraphLayoutBox* GetContainer() const { return m_container; }
/**
Sets the container for which the selection is valid.
*/
void SetContainer(wxRichTextParagraphLayoutBox* container) { m_container = container; }
/**
Returns @true if the selection is valid.
*/
bool IsValid() const { return m_ranges.GetCount() > 0 && GetContainer(); }
/**
Returns the selection appropriate to the specified object, if any; returns an empty array if none
at the level of the object's container.
*/
wxRichTextRangeArray GetSelectionForObject(wxRichTextObject* obj) const;
/**
Returns @true if the given position is within the selection.
*/
bool WithinSelection(long pos, wxRichTextObject* obj) const;
/**
Returns @true if the given position is within the selection.
*/
bool WithinSelection(long pos) const { return WithinSelection(pos, m_ranges); }
/**
Returns @true if the given position is within the selection range.
*/
static bool WithinSelection(long pos, const wxRichTextRangeArray& ranges);
/**
Returns @true if the given range is within the selection range.
*/
static bool WithinSelection(const wxRichTextRange& range, const wxRichTextRangeArray& ranges);
wxRichTextRangeArray m_ranges;
wxRichTextParagraphLayoutBox* m_container;
};
/**
@class wxRichTextDrawingContext
A class for passing information to drawing and measuring functions.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextDrawingContext: public wxObject
{
DECLARE_CLASS(wxRichTextDrawingContext)
public:
/**
Pass the buffer to the context so the context can retrieve information
such as virtual attributes.
*/
wxRichTextDrawingContext(wxRichTextBuffer* buffer);
void Init() { m_buffer = NULL; m_enableVirtualAttributes = true; }
/**
Does this object have virtual attributes?
Virtual attributes can be provided for visual cues without
affecting the actual styling.
*/
bool HasVirtualAttributes(wxRichTextObject* obj) const;
/**
Returns the virtual attributes for this object.
Virtual attributes can be provided for visual cues without
affecting the actual styling.
*/
wxRichTextAttr GetVirtualAttributes(wxRichTextObject* obj) const;
/**
Applies any virtual attributes relevant to this object.
*/
bool ApplyVirtualAttributes(wxRichTextAttr& attr, wxRichTextObject* obj) const;
/**
Gets the count for mixed virtual attributes for individual positions within the object.
For example, individual characters within a text object may require special highlighting.
*/
int GetVirtualSubobjectAttributesCount(wxRichTextObject* obj) const;
/**
Gets the mixed virtual attributes for individual positions within the object.
For example, individual characters within a text object may require special highlighting.
The function is passed the count returned by GetVirtualSubobjectAttributesCount.
*/
int GetVirtualSubobjectAttributes(wxRichTextObject* obj, wxArrayInt& positions, wxRichTextAttrArray& attributes) const;
/**
Do we have virtual text for this object? Virtual text allows an application
to replace characters in an object for editing and display purposes, for example
for highlighting special characters.
*/
bool HasVirtualText(const wxRichTextPlainText* obj) const;
/**
Gets the virtual text for this object.
*/
bool GetVirtualText(const wxRichTextPlainText* obj, wxString& text) const;
/**
Enables virtual attribute processing.
*/
void EnableVirtualAttributes(bool b) { m_enableVirtualAttributes = b; }
/**
Returns @true if virtual attribute processing is enabled.
*/
bool GetVirtualAttributesEnabled() const { return m_enableVirtualAttributes; }
wxRichTextBuffer* m_buffer;
bool m_enableVirtualAttributes;
};
/**
@class wxRichTextObject
This is the base for drawable rich text objects.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextObject: public wxObject
{
DECLARE_CLASS(wxRichTextObject)
public:
/**
Constructor, taking an optional parent pointer.
*/
wxRichTextObject(wxRichTextObject* parent = NULL);
virtual ~wxRichTextObject();
// Overridables
/**
Draw the item, within the given range. Some objects may ignore the range (for
example paragraphs) while others must obey it (lines, to implement wrapping)
*/
virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style) = 0;
/**
Lay the item out at the specified position with the given size constraint.
Layout must set the cached size. @rect is the available space for the object,
and @a parentRect is the container that is used to determine a relative size
or position (for example if a text box must be 50% of the parent text box).
*/
virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style) = 0;
/**
Hit-testing: returns a flag indicating hit test details, plus
information about position. @a contextObj is returned to specify what object
position is relevant to, since otherwise there's an ambiguity.
@ obj might not be a child of @a contextObj, since we may be referring to the container itself
if we have no hit on a child - for example if we click outside an object.
The function puts the position in @a textPosition if one is found.
@a pt is in logical units (a zero y position is at the beginning of the buffer).
Pass wxRICHTEXT_HITTEST_NO_NESTED_OBJECTS if you only want to consider objects
directly under the object you are calling HitTest on. Otherwise, it will recurse
and potentially find a nested object.
@return One of the ::wxRichTextHitTestFlags values.
*/
virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
/**
Finds the absolute position and row height for the given character position.
*/
virtual bool FindPosition(wxDC& WXUNUSED(dc), wxRichTextDrawingContext& WXUNUSED(context), long WXUNUSED(index), wxPoint& WXUNUSED(pt), int* WXUNUSED(height), bool WXUNUSED(forceLineStart)) { return false; }
/**
Returns the best size, i.e. the ideal starting size for this object irrespective
of available space. For a short text string, it will be the size that exactly encloses
the text. For a longer string, it might use the parent width for example.
*/
virtual wxSize GetBestSize() const { return m_size; }
/**
Returns the object size for the given range. Returns @false if the range
is invalid for this object.
*/
virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const = 0;
/**
Do a split from @a pos, returning an object containing the second part, and setting
the first part in 'this'.
*/
virtual wxRichTextObject* DoSplit(long WXUNUSED(pos)) { return NULL; }
/**
Calculates the range of the object. By default, guess that the object is 1 unit long.
*/
virtual void CalculateRange(long start, long& end) { end = start ; m_range.SetRange(start, end); }
/**
Deletes the given range.
*/
virtual bool DeleteRange(const wxRichTextRange& WXUNUSED(range)) { return false; }
/**
Returns @true if the object is empty.
*/
virtual bool IsEmpty() const { return false; }
/**
Returns @true if this class of object is floatable.
*/
virtual bool IsFloatable() const { return false; }
/**
Returns @true if this object is currently floating.
*/
virtual bool IsFloating() const { return GetAttributes().GetTextBoxAttr().IsFloating(); }
/**
Returns the floating direction.
*/
virtual int GetFloatDirection() const { return GetAttributes().GetTextBoxAttr().GetFloatMode(); }
/**
Returns any text in this object for the given range.
*/
virtual wxString GetTextForRange(const wxRichTextRange& WXUNUSED(range)) const { return wxEmptyString; }
/**
Returns @true if this object can merge itself with the given one.
*/
virtual bool CanMerge(wxRichTextObject* WXUNUSED(object), wxRichTextDrawingContext& WXUNUSED(context)) const { return false; }
/**
Returns @true if this object merged itself with the given one.
The calling code will then delete the given object.
*/
virtual bool Merge(wxRichTextObject* WXUNUSED(object), wxRichTextDrawingContext& WXUNUSED(context)) { return false; }
/**
JACS
Returns @true if this object can potentially be split, by virtue of having
different virtual attributes for individual sub-objects.
*/
virtual bool CanSplit(wxRichTextDrawingContext& WXUNUSED(context)) const { return false; }
/**
Returns the final object in the split objects if this object was split due to differences between sub-object virtual attributes.
Returns itself if it was not split.
*/
virtual wxRichTextObject* Split(wxRichTextDrawingContext& WXUNUSED(context)) { return this; }
/**
Dump object data to the given output stream for debugging.
*/
virtual void Dump(wxTextOutputStream& stream);
/**
Returns @true if we can edit the object's properties via a GUI.
*/
virtual bool CanEditProperties() const { return false; }
/**
Edits the object's properties via a GUI.
*/
virtual bool EditProperties(wxWindow* WXUNUSED(parent), wxRichTextBuffer* WXUNUSED(buffer)) { return false; }
/**
Returns the label to be used for the properties context menu item.
*/
virtual wxString GetPropertiesMenuLabel() const { return wxEmptyString; }
/**
Returns @true if objects of this class can accept the focus, i.e. a call to SetFocusObject
is possible. For example, containers supporting text, such as a text box object, can accept the focus,
but a table can't (set the focus to individual cells instead).
*/
virtual bool AcceptsFocus() const { return false; }
#if wxUSE_XML
/**
Imports this object from XML.
*/
virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
#endif
#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
/**
Exports this object directly to the given stream, bypassing the creation of a wxXmlNode hierarchy.
This method is considerably faster than creating a tree first. However, both versions of ExportXML must be
implemented so that if the tree method is made efficient in the future, we can deprecate the
more verbose direct output method. Compiled only if wxRICHTEXT_HAVE_DIRECT_OUTPUT is defined (on by default).
*/
virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
#endif
#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
/**
Exports this object to the given parent node, usually creating at least one child node.
This method is less efficient than the direct-to-stream method but is retained to allow for
switching to this method if we make it more efficient. Compiled only if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT is defined
(on by default).
*/
virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
#endif
/**
Returns @true if this object takes note of paragraph attributes (text and image objects don't).
*/
virtual bool UsesParagraphAttributes() const { return true; }
/**
Returns the XML node name of this object. This must be overridden for wxXmlNode-base XML export to work.
*/
virtual wxString GetXMLNodeName() const { return wxT("unknown"); }
/**
Invalidates the object at the given range. With no argument, invalidates the whole object.
*/
virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
/**
Returns @true if this object can handle the selections of its children, fOr example a table.
Required for composite selection handling to work.
*/
virtual bool HandlesChildSelections() const { return false; }
/**
Returns a selection object specifying the selections between start and end character positions.
For example, a table would deduce what cells (of range length 1) are selected when dragging across the table.
*/
virtual wxRichTextSelection GetSelection(long WXUNUSED(start), long WXUNUSED(end)) const { return wxRichTextSelection(); }
// Accessors
/**
Gets the cached object size as calculated by Layout.
*/
virtual wxSize GetCachedSize() const { return m_size; }
/**
Sets the cached object size as calculated by Layout.
*/
virtual void SetCachedSize(const wxSize& sz) { m_size = sz; }
/**
Gets the maximum object size as calculated by Layout. This allows
us to fit an object to its contents or allocate extra space if required.
*/
virtual wxSize GetMaxSize() const { return m_maxSize; }
/**
Sets the maximum object size as calculated by Layout. This allows
us to fit an object to its contents or allocate extra space if required.
*/
virtual void SetMaxSize(const wxSize& sz) { m_maxSize = sz; }
/**
Gets the minimum object size as calculated by Layout. This allows
us to constrain an object to its absolute minimum size if necessary.
*/
virtual wxSize GetMinSize() const { return m_minSize; }
/**
Sets the minimum object size as calculated by Layout. This allows
us to constrain an object to its absolute minimum size if necessary.
*/
virtual void SetMinSize(const wxSize& sz) { m_minSize = sz; }
/**
Gets the 'natural' size for an object. For an image, it would be the
image size.
*/
virtual wxTextAttrSize GetNaturalSize() const { return wxTextAttrSize(); }
/**
Returns the object position in pixels.
*/
virtual wxPoint GetPosition() const { return m_pos; }
/**
Sets the object position in pixels.
*/
virtual void SetPosition(const wxPoint& pos) { m_pos = pos; }
/**
Returns the absolute object position, by traversing up the child/parent hierarchy.
TODO: may not be needed, if all object positions are in fact relative to the
top of the coordinate space.
*/
virtual wxPoint GetAbsolutePosition() const;
/**
Returns the rectangle enclosing the object.
*/
virtual wxRect GetRect() const { return wxRect(GetPosition(), GetCachedSize()); }
/**
Sets the object's range within its container.
*/
void SetRange(const wxRichTextRange& range) { m_range = range; }
/**
Returns the object's range.
*/
const wxRichTextRange& GetRange() const { return m_range; }
/**
Returns the object's range.
*/
wxRichTextRange& GetRange() { return m_range; }
/**
Set the object's own range, for a top-level object with its own position space.
*/
void SetOwnRange(const wxRichTextRange& range) { m_ownRange = range; }
/**
Returns the object's own range (valid if top-level).
*/
const wxRichTextRange& GetOwnRange() const { return m_ownRange; }
/**
Returns the object's own range (valid if top-level).
*/
wxRichTextRange& GetOwnRange() { return m_ownRange; }
/**
Returns the object's own range only if a top-level object.
*/
wxRichTextRange GetOwnRangeIfTopLevel() const { return IsTopLevel() ? m_ownRange : m_range; }
/**
Returns @true if this object is composite.
*/
virtual bool IsComposite() const { return false; }
/**
Returns @true if no user editing can be done inside the object. This returns @true for simple objects,
@false for most composite objects, but @true for fields, which if composite, should not be user-edited.
*/
virtual bool IsAtomic() const { return true; }
/**
Returns a pointer to the parent object.
*/
virtual wxRichTextObject* GetParent() const { return m_parent; }
/**
Sets the pointer to the parent object.
*/
virtual void SetParent(wxRichTextObject* parent) { m_parent = parent; }
/**
Returns the top-level container of this object.
May return itself if it's a container; use GetParentContainer to return
a different container.
*/
virtual wxRichTextParagraphLayoutBox* GetContainer() const;
/**
Returns the top-level container of this object.
Returns a different container than itself, unless there's no parent, in which case it will return NULL.
*/
virtual wxRichTextParagraphLayoutBox* GetParentContainer() const { return GetParent() ? GetParent()->GetContainer() : GetContainer(); }
/**
Set the margin around the object, in pixels.
*/
virtual void SetMargins(int margin);
/**
Set the margin around the object, in pixels.
*/
virtual void SetMargins(int leftMargin, int rightMargin, int topMargin, int bottomMargin);
/**
Returns the left margin of the object, in pixels.
*/
virtual int GetLeftMargin() const;
/**
Returns the right margin of the object, in pixels.
*/
virtual int GetRightMargin() const;
/**
Returns the top margin of the object, in pixels.
*/
virtual int GetTopMargin() const;
/**
Returns the bottom margin of the object, in pixels.
*/
virtual int GetBottomMargin() const;
/**
Calculates the available content space in the given rectangle, given the
margins, border and padding specified in the object's attributes.
*/
virtual wxRect GetAvailableContentArea(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& outerRect) const;
/**
Lays out the object first with a given amount of space, and then if no width was specified in attr,
lays out the object again using the minimum size. @a availableParentSpace is the maximum space
for the object, whereas @a availableContainerSpace is the container with which relative positions and
sizes should be computed. For example, a text box whose space has already been constrained
in a previous layout pass to @a availableParentSpace, but should have a width of 50% of @a availableContainerSpace.
(If these two rects were the same, a 2nd pass could see the object getting too small.)
*/
virtual bool LayoutToBestSize(wxDC& dc, wxRichTextDrawingContext& context, wxRichTextBuffer* buffer,
const wxRichTextAttr& parentAttr, const wxRichTextAttr& attr,
const wxRect& availableParentSpace, const wxRect& availableContainerSpace, int style);
/**
Adjusts the attributes for virtual attribute provision, collapsed borders, etc.
*/
virtual bool AdjustAttributes(wxRichTextAttr& attr, wxRichTextDrawingContext& context);
/**
Sets the object's attributes.
*/
void SetAttributes(const wxRichTextAttr& attr) { m_attributes = attr; }
/**
Returns the object's attributes.
*/
const wxRichTextAttr& GetAttributes() const { return m_attributes; }
/**
Returns the object's attributes.
*/
wxRichTextAttr& GetAttributes() { return m_attributes; }
/**
Returns the object's properties.
*/
wxRichTextProperties& GetProperties() { return m_properties; }
/**
Returns the object's properties.
*/
const wxRichTextProperties& GetProperties() const { return m_properties; }
/**
Sets the object's properties.
*/
void SetProperties(const wxRichTextProperties& props) { m_properties = props; }
/**
Sets the stored descent value.
*/
void SetDescent(int descent) { m_descent = descent; }
/**
Returns the stored descent value.
*/
int GetDescent() const { return m_descent; }
/**
Returns the containing buffer.
*/
wxRichTextBuffer* GetBuffer() const;
/**
Sets the identifying name for this object as a property using the "name" key.
*/
void SetName(const wxString& name) { m_properties.SetProperty(wxT("name"), name); }
/**
Returns the identifying name for this object from the properties, using the "name" key.
*/
wxString GetName() const { return m_properties.GetPropertyString(wxT("name")); }
/**
Returns @true if this object is top-level, i.e. contains its own paragraphs, such as a text box.
*/
virtual bool IsTopLevel() const { return false; }
/**
Returns @true if the object will be shown, @false otherwise.
*/
bool IsShown() const { return m_show; }
// Operations
/**
Call to show or hide this object. This function does not cause the content to be
laid out or redrawn.
*/
virtual void Show(bool show) { m_show = show; }
/**
Clones the object.
*/
virtual wxRichTextObject* Clone() const { return NULL; }
/**
Copies the object.
*/
void Copy(const wxRichTextObject& obj);
/**
Reference-counting allows us to use the same object in multiple
lists (not yet used).
*/
void Reference() { m_refCount ++; }
/**
Reference-counting allows us to use the same object in multiple
lists (not yet used).
*/
void Dereference();
/**
Moves the object recursively, by adding the offset from old to new.
*/
virtual void Move(const wxPoint& pt);
/**
Converts units in tenths of a millimetre to device units.
*/
int ConvertTenthsMMToPixels(wxDC& dc, int units) const;
/**
Converts units in tenths of a millimetre to device units.
*/
static int ConvertTenthsMMToPixels(int ppi, int units, double scale = 1.0);
/**
Convert units in pixels to tenths of a millimetre.
*/
int ConvertPixelsToTenthsMM(wxDC& dc, int pixels) const;
/**
Convert units in pixels to tenths of a millimetre.
*/
static int ConvertPixelsToTenthsMM(int ppi, int pixels, double scale = 1.0);
/**
Draws the borders and background for the given rectangle and attributes.
@a boxRect is taken to be the outer margin box, not the box around the content.
*/
static bool DrawBoxAttributes(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, const wxRect& boxRect, int flags = 0, wxRichTextObject* obj = NULL);
/**
Draws a border.
*/
static bool DrawBorder(wxDC& dc, wxRichTextBuffer* buffer, const wxTextAttrBorders& attr, const wxRect& rect, int flags = 0);
/**
Returns the various rectangles of the box model in pixels. You can either specify @a contentRect (inner)
or @a marginRect (outer), and the other must be the default rectangle (no width or height).
Note that the outline doesn't affect the position of the rectangle, it's drawn in whatever space
is available.
*/
static bool GetBoxRects(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, wxRect& marginRect, wxRect& borderRect, wxRect& contentRect, wxRect& paddingRect, wxRect& outlineRect);
/**
Returns the total margin for the object in pixels, taking into account margin, padding and border size.
*/
static bool GetTotalMargin(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& attr, int& leftMargin, int& rightMargin,
int& topMargin, int& bottomMargin);
/**
Returns the rectangle which the child has available to it given restrictions specified in the
child attribute, e.g. 50% width of the parent, 400 pixels, x position 20% of the parent, etc.
availableContainerSpace might be a parent that the cell has to compute its width relative to.
E.g. a cell that's 50% of its parent.
*/
static wxRect AdjustAvailableSpace(wxDC& dc, wxRichTextBuffer* buffer, const wxRichTextAttr& parentAttr, const wxRichTextAttr& childAttr,
const wxRect& availableParentSpace, const wxRect& availableContainerSpace);
protected:
wxSize m_size;
wxSize m_maxSize;
wxSize m_minSize;
wxPoint m_pos;
int m_descent; // Descent for this object (if any)
int m_refCount;
bool m_show;
wxRichTextObject* m_parent;
// The range of this object (start position to end position)
wxRichTextRange m_range;
// The internal range of this object, if it's a top-level object with its own range space
wxRichTextRange m_ownRange;
// Attributes
wxRichTextAttr m_attributes;
// Properties
wxRichTextProperties m_properties;
};
WX_DECLARE_LIST_WITH_DECL( wxRichTextObject, wxRichTextObjectList, class WXDLLIMPEXP_RICHTEXT );
/**
@class wxRichTextCompositeObject
Objects of this class can contain other objects.
@library{wxrichtext}
@category{richtext}
@see wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextCompositeObject: public wxRichTextObject
{
DECLARE_CLASS(wxRichTextCompositeObject)
public:
// Constructors
wxRichTextCompositeObject(wxRichTextObject* parent = NULL);
virtual ~wxRichTextCompositeObject();
// Overridables
virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart);
virtual void CalculateRange(long start, long& end);
virtual bool DeleteRange(const wxRichTextRange& range);
virtual wxString GetTextForRange(const wxRichTextRange& range) const;
virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const;
virtual void Dump(wxTextOutputStream& stream);
virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
// Accessors
/**
Returns the children.
*/
wxRichTextObjectList& GetChildren() { return m_children; }
/**
Returns the children.
*/
const wxRichTextObjectList& GetChildren() const { return m_children; }
/**
Returns the number of children.
*/
size_t GetChildCount() const ;
/**
Returns the nth child.
*/
wxRichTextObject* GetChild(size_t n) const ;
/**
Returns @true if this object is composite.
*/
virtual bool IsComposite() const { return true; }
/**
Returns @true if no user editing can be done inside the object. This returns @true for simple objects,
@false for most composite objects, but @true for fields, which if composite, should not be user-edited.
*/
virtual bool IsAtomic() const { return false; }
/**
Returns true if the buffer is empty.
*/
virtual bool IsEmpty() const { return GetChildCount() == 0; }
/**
Returns the child object at the given character position.
*/
virtual wxRichTextObject* GetChildAtPosition(long pos) const;
// Operations
void Copy(const wxRichTextCompositeObject& obj);
void operator= (const wxRichTextCompositeObject& obj) { Copy(obj); }
/**
Appends a child, returning the position.
*/
size_t AppendChild(wxRichTextObject* child) ;
/**
Inserts the child in front of the given object, or at the beginning.
*/
bool InsertChild(wxRichTextObject* child, wxRichTextObject* inFrontOf) ;
/**
Removes and optionally deletes the specified child.
*/
bool RemoveChild(wxRichTextObject* child, bool deleteChild = false) ;
/**
Deletes all the children.
*/
bool DeleteChildren() ;
/**
Recursively merges all pieces that can be merged.
*/
bool Defragment(wxRichTextDrawingContext& context, const wxRichTextRange& range = wxRICHTEXT_ALL);
/**
Moves the object recursively, by adding the offset from old to new.
*/
virtual void Move(const wxPoint& pt);
protected:
wxRichTextObjectList m_children;
};
/**
@class wxRichTextParagraphLayoutBox
This class knows how to lay out paragraphs.
@library{wxrichtext}
@category{richtext}
@see wxRichTextCompositeObject, wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextParagraphLayoutBox: public wxRichTextCompositeObject
{
DECLARE_DYNAMIC_CLASS(wxRichTextParagraphLayoutBox)
public:
// Constructors
wxRichTextParagraphLayoutBox(wxRichTextObject* parent = NULL);
wxRichTextParagraphLayoutBox(const wxRichTextParagraphLayoutBox& obj): wxRichTextCompositeObject() { Init(); Copy(obj); }
~wxRichTextParagraphLayoutBox();
// Overridables
virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const;
virtual bool DeleteRange(const wxRichTextRange& range);
virtual wxString GetTextForRange(const wxRichTextRange& range) const;
#if wxUSE_XML
virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
#endif
#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
#endif
#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
#endif
virtual wxString GetXMLNodeName() const { return wxT("paragraphlayout"); }
virtual bool AcceptsFocus() const { return true; }
// Accessors
/**
Associates a control with the buffer, for operations that for example require refreshing the window.
*/
void SetRichTextCtrl(wxRichTextCtrl* ctrl) { m_ctrl = ctrl; }
/**
Returns the associated control.
*/
wxRichTextCtrl* GetRichTextCtrl() const { return m_ctrl; }
/**
Sets a flag indicating whether the last paragraph is partial or complete.
*/
void SetPartialParagraph(bool partialPara) { m_partialParagraph = partialPara; }
/**
Returns a flag indicating whether the last paragraph is partial or complete.
*/
bool GetPartialParagraph() const { return m_partialParagraph; }
/**
Returns the style sheet associated with the overall buffer.
*/
virtual wxRichTextStyleSheet* GetStyleSheet() const;
virtual bool IsTopLevel() const { return true; }
// Operations
/**
Submits a command to insert paragraphs.
*/
bool InsertParagraphsWithUndo(wxRichTextBuffer* buffer, long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags = 0);
/**
Submits a command to insert the given text.
*/
bool InsertTextWithUndo(wxRichTextBuffer* buffer, long pos, const wxString& text, wxRichTextCtrl* ctrl, int flags = 0);
/**
Submits a command to insert the given text.
*/
bool InsertNewlineWithUndo(wxRichTextBuffer* buffer, long pos, wxRichTextCtrl* ctrl, int flags = 0);
/**
Submits a command to insert the given image.
*/
bool InsertImageWithUndo(wxRichTextBuffer* buffer, long pos, const wxRichTextImageBlock& imageBlock,
wxRichTextCtrl* ctrl, int flags, const wxRichTextAttr& textAttr);
/**
Submits a command to insert the given field. Field data can be included in properties.
@see wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard
*/
wxRichTextField* InsertFieldWithUndo(wxRichTextBuffer* buffer, long pos, const wxString& fieldType,
const wxRichTextProperties& properties,
wxRichTextCtrl* ctrl, int flags,
const wxRichTextAttr& textAttr);
/**
Returns the style that is appropriate for a new paragraph at this position.
If the previous paragraph has a paragraph style name, looks up the next-paragraph
style.
*/
wxRichTextAttr GetStyleForNewParagraph(wxRichTextBuffer* buffer, long pos, bool caretPosition = false, bool lookUpNewParaStyle=false) const;
/**
Inserts an object.
*/
wxRichTextObject* InsertObjectWithUndo(wxRichTextBuffer* buffer, long pos, wxRichTextObject *object, wxRichTextCtrl* ctrl, int flags = 0);
/**
Submits a command to delete this range.
*/
bool DeleteRangeWithUndo(const wxRichTextRange& range, wxRichTextCtrl* ctrl, wxRichTextBuffer* buffer);
/**
Draws the floating objects in this buffer.
*/
void DrawFloats(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
/**
Moves an anchored object to another paragraph.
*/
void MoveAnchoredObjectToParagraph(wxRichTextParagraph* from, wxRichTextParagraph* to, wxRichTextObject* obj);
/**
Initializes the object.
*/
void Init();
/**
Clears all the children.
*/
virtual void Clear();
/**
Clears and initializes with one blank paragraph.
*/
virtual void Reset();
/**
Convenience function to add a paragraph of text.
*/
virtual wxRichTextRange AddParagraph(const wxString& text, wxRichTextAttr* paraStyle = NULL);
/**
Convenience function to add an image.
*/
virtual wxRichTextRange AddImage(const wxImage& image, wxRichTextAttr* paraStyle = NULL);
/**
Adds multiple paragraphs, based on newlines.
*/
virtual wxRichTextRange AddParagraphs(const wxString& text, wxRichTextAttr* paraStyle = NULL);
/**
Returns the line at the given position. If @a caretPosition is true, the position is
a caret position, which is normally a smaller number.
*/
virtual wxRichTextLine* GetLineAtPosition(long pos, bool caretPosition = false) const;
/**
Returns the line at the given y pixel position, or the last line.
*/
virtual wxRichTextLine* GetLineAtYPosition(int y) const;
/**
Returns the paragraph at the given character or caret position.
*/
virtual wxRichTextParagraph* GetParagraphAtPosition(long pos, bool caretPosition = false) const;
/**
Returns the line size at the given position.
*/
virtual wxSize GetLineSizeAtPosition(long pos, bool caretPosition = false) const;
/**
Given a position, returns the number of the visible line (potentially many to a paragraph),
starting from zero at the start of the buffer. We also have to pass a bool (@a startOfLine)
that indicates whether the caret is being shown at the end of the previous line or at the start
of the next, since the caret can be shown at two visible positions for the same underlying
position.
*/
virtual long GetVisibleLineNumber(long pos, bool caretPosition = false, bool startOfLine = false) const;
/**
Given a line number, returns the corresponding wxRichTextLine object.
*/
virtual wxRichTextLine* GetLineForVisibleLineNumber(long lineNumber) const;
/**
Returns the leaf object in a paragraph at this position.
*/
virtual wxRichTextObject* GetLeafObjectAtPosition(long position) const;
/**
Returns the paragraph by number.
*/
virtual wxRichTextParagraph* GetParagraphAtLine(long paragraphNumber) const;
/**
Returns the paragraph for a given line.
*/
virtual wxRichTextParagraph* GetParagraphForLine(wxRichTextLine* line) const;
/**
Returns the length of the paragraph.
*/
virtual int GetParagraphLength(long paragraphNumber) const;
/**
Returns the number of paragraphs.
*/
virtual int GetParagraphCount() const { return static_cast<int>(GetChildCount()); }
/**
Returns the number of visible lines.
*/
virtual int GetLineCount() const;
/**
Returns the text of the paragraph.
*/
virtual wxString GetParagraphText(long paragraphNumber) const;
/**
Converts zero-based line column and paragraph number to a position.
*/
virtual long XYToPosition(long x, long y) const;
/**
Converts a zero-based position to line column and paragraph number.
*/
virtual bool PositionToXY(long pos, long* x, long* y) const;
/**
Sets the attributes for the given range. Pass flags to determine how the
attributes are set.
The end point of range is specified as the last character position of the span
of text. So, for example, to set the style for a character at position 5,
use the range (5,5).
This differs from the wxRichTextCtrl API, where you would specify (5,6).
@a flags may contain a bit list of the following values:
- wxRICHTEXT_SETSTYLE_NONE: no style flag.
- wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this operation should be
undoable.
- wxRICHTEXT_SETSTYLE_OPTIMIZE: specifies that the style should not be applied
if the combined style at this point is already the style in question.
- wxRICHTEXT_SETSTYLE_PARAGRAPHS_ONLY: specifies that the style should only be
applied to paragraphs, and not the content.
This allows content styling to be preserved independently from that
of e.g. a named paragraph style.
- wxRICHTEXT_SETSTYLE_CHARACTERS_ONLY: specifies that the style should only be
applied to characters, and not the paragraph.
This allows content styling to be preserved independently from that
of e.g. a named paragraph style.
- wxRICHTEXT_SETSTYLE_RESET: resets (clears) the existing style before applying
the new style.
- wxRICHTEXT_SETSTYLE_REMOVE: removes the specified style.
Only the style flags are used in this operation.
*/
virtual bool SetStyle(const wxRichTextRange& range, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
/**
Sets the attributes for the given object only, for example the box attributes for a text box.
*/
virtual void SetStyle(wxRichTextObject *obj, const wxRichTextAttr& textAttr, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
/**
Returns the combined text attributes for this position.
This function gets the @e uncombined style - that is, the attributes associated
with the paragraph or character content, and not necessarily the combined
attributes you see on the screen. To get the combined attributes, use GetStyle().
If you specify (any) paragraph attribute in @e style's flags, this function
will fetch the paragraph attributes.
Otherwise, it will return the character attributes.
*/
virtual bool GetStyle(long position, wxRichTextAttr& style);
/**
Returns the content (uncombined) attributes for this position.
*/
virtual bool GetUncombinedStyle(long position, wxRichTextAttr& style);
/**
Implementation helper for GetStyle. If combineStyles is true, combine base, paragraph and
context attributes.
*/
virtual bool DoGetStyle(long position, wxRichTextAttr& style, bool combineStyles = true);
/**
This function gets a style representing the common, combined attributes in the
given range.
Attributes which have different values within the specified range will not be
included the style flags.
The function is used to get the attributes to display in the formatting dialog:
the user can edit the attributes common to the selection, and optionally specify the
values of further attributes to be applied uniformly.
To apply the edited attributes, you can use SetStyle() specifying
the wxRICHTEXT_SETSTYLE_OPTIMIZE flag, which will only apply attributes that
are different from the @e combined attributes within the range.
So, the user edits the effective, displayed attributes for the range,
but his choice won't be applied unnecessarily to content. As an example,
say the style for a paragraph specifies bold, but the paragraph text doesn't
specify a weight.
The combined style is bold, and this is what the user will see on-screen and
in the formatting dialog. The user now specifies red text, in addition to bold.
When applying with SetStyle(), the content font weight attributes won't be
changed to bold because this is already specified by the paragraph.
However the text colour attributes @e will be changed to show red.
*/
virtual bool GetStyleForRange(const wxRichTextRange& range, wxRichTextAttr& style);
/**
Combines @a style with @a currentStyle for the purpose of summarising the attributes of a range of
content.
*/
bool CollectStyle(wxRichTextAttr& currentStyle, const wxRichTextAttr& style, wxRichTextAttr& clashingAttr, wxRichTextAttr& absentAttr);
//@{
/**
Sets the list attributes for the given range, passing flags to determine how
the attributes are set.
Either the style definition or the name of the style definition (in the current
sheet) can be passed.
@a flags is a bit list of the following:
- wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
- wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
@a startFrom, otherwise existing attributes are used.
- wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
as the level for all paragraphs, otherwise the current indentation will be used.
@see NumberList(), PromoteList(), ClearListStyle().
*/
virtual bool SetListStyle(const wxRichTextRange& range, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
virtual bool SetListStyle(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
//@}
/**
Clears the list style from the given range, clearing list-related attributes
and applying any named paragraph style associated with each paragraph.
@a flags is a bit list of the following:
- wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
@see SetListStyle(), PromoteList(), NumberList()
*/
virtual bool ClearListStyle(const wxRichTextRange& range, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
//@{
/**
Numbers the paragraphs in the given range.
Pass flags to determine how the attributes are set.
Either the style definition or the name of the style definition (in the current
sheet) can be passed.
@a flags is a bit list of the following:
- wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
- wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
@a startFrom, otherwise existing attributes are used.
- wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
as the level for all paragraphs, otherwise the current indentation will be used.
@a def can be NULL to indicate that the existing list style should be used.
@see SetListStyle(), PromoteList(), ClearListStyle()
*/
virtual bool NumberList(const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
virtual bool NumberList(const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
//@}
//@{
/**
Promotes the list items within the given range.
A positive @a promoteBy produces a smaller indent, and a negative number
produces a larger indent. Pass flags to determine how the attributes are set.
Either the style definition or the name of the style definition (in the current
sheet) can be passed.
@a flags is a bit list of the following:
- wxRICHTEXT_SETSTYLE_WITH_UNDO: specifies that this command will be undoable.
- wxRICHTEXT_SETSTYLE_RENUMBER: specifies that numbering should start from
@a startFrom, otherwise existing attributes are used.
- wxRICHTEXT_SETSTYLE_SPECIFY_LEVEL: specifies that @a listLevel should be used
as the level for all paragraphs, otherwise the current indentation will be used.
@see SetListStyle(), SetListStyle(), ClearListStyle()
*/
virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, wxRichTextListStyleDefinition* def = NULL, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1);
virtual bool PromoteList(int promoteBy, const wxRichTextRange& range, const wxString& defName, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int specifiedLevel = -1);
//@}
/**
Helper for NumberList and PromoteList, that does renumbering and promotion simultaneously
@a def can be NULL/empty to indicate that the existing list style should be used.
*/
virtual bool DoNumberList(const wxRichTextRange& range, const wxRichTextRange& promotionRange, int promoteBy, wxRichTextListStyleDefinition* def, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO, int startFrom = 1, int specifiedLevel = -1);
/**
Fills in the attributes for numbering a paragraph after previousParagraph.
*/
virtual bool FindNextParagraphNumber(wxRichTextParagraph* previousParagraph, wxRichTextAttr& attr) const;
/**
Sets the properties for the given range, passing flags to determine how the
attributes are set. You can merge properties or replace them.
The end point of range is specified as the last character position of the span
of text, plus one. So, for example, to set the properties for a character at
position 5, use the range (5,6).
@a flags may contain a bit list of the following values:
- wxRICHTEXT_SETPROPERTIES_NONE: no flag.
- wxRICHTEXT_SETPROPERTIES_WITH_UNDO: specifies that this operation should be
undoable.
- wxRICHTEXT_SETPROPERTIES_PARAGRAPHS_ONLY: specifies that the properties should only be
applied to paragraphs, and not the content.
- wxRICHTEXT_SETPROPERTIES_CHARACTERS_ONLY: specifies that the properties should only be
applied to characters, and not the paragraph.
- wxRICHTEXT_SETPROPERTIES_RESET: resets (clears) the existing properties before applying
the new properties.
- wxRICHTEXT_SETPROPERTIES_REMOVE: removes the specified properties.
*/
virtual bool SetProperties(const wxRichTextRange& range, const wxRichTextProperties& properties, int flags = wxRICHTEXT_SETPROPERTIES_WITH_UNDO);
/**
Sets with undo the properties for the given object.
*/
virtual bool SetObjectPropertiesWithUndo(wxRichTextObject& obj, const wxRichTextProperties& properties, wxRichTextObject* objToSet = NULL);
/**
Test if this whole range has character attributes of the specified kind. If any
of the attributes are different within the range, the test fails. You
can use this to implement, for example, bold button updating. style must have
flags indicating which attributes are of interest.
*/
virtual bool HasCharacterAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const;
/**
Test if this whole range has paragraph attributes of the specified kind. If any
of the attributes are different within the range, the test fails. You
can use this to implement, for example, centering button updating. style must have
flags indicating which attributes are of interest.
*/
virtual bool HasParagraphAttributes(const wxRichTextRange& range, const wxRichTextAttr& style) const;
virtual wxRichTextObject* Clone() const { return new wxRichTextParagraphLayoutBox(*this); }
/**
Prepares the content just before insertion (or after buffer reset).
Currently is only called if undo mode is on.
*/
virtual void PrepareContent(wxRichTextParagraphLayoutBox& container);
/**
Insert fragment into this box at the given position. If partialParagraph is true,
it is assumed that the last (or only) paragraph is just a piece of data with no paragraph
marker.
*/
virtual bool InsertFragment(long position, wxRichTextParagraphLayoutBox& fragment);
/**
Make a copy of the fragment corresponding to the given range, putting it in @a fragment.
*/
virtual bool CopyFragment(const wxRichTextRange& range, wxRichTextParagraphLayoutBox& fragment);
/**
Apply the style sheet to the buffer, for example if the styles have changed.
*/
virtual bool ApplyStyleSheet(wxRichTextStyleSheet* styleSheet);
void Copy(const wxRichTextParagraphLayoutBox& obj);
void operator= (const wxRichTextParagraphLayoutBox& obj) { Copy(obj); }
/**
Calculate ranges.
*/
virtual void UpdateRanges();
/**
Get all the text.
*/
virtual wxString GetText() const;
/**
Sets the default style, affecting the style currently being applied
(for example, setting the default style to bold will cause subsequently
inserted text to be bold).
This is not cumulative - setting the default style will replace the previous
default style.
Setting it to a default attribute object makes new content take on the 'basic' style.
*/
virtual bool SetDefaultStyle(const wxRichTextAttr& style);
/**
Returns the current default style, affecting the style currently being applied
(for example, setting the default style to bold will cause subsequently
inserted text to be bold).
*/
virtual const wxRichTextAttr& GetDefaultStyle() const { return m_defaultAttributes; }
/**
Sets the basic (overall) style. This is the style of the whole
buffer before further styles are applied, unlike the default style, which
only affects the style currently being applied (for example, setting the default
style to bold will cause subsequently inserted text to be bold).
*/
virtual void SetBasicStyle(const wxRichTextAttr& style) { m_attributes = style; }
/**
Returns the basic (overall) style.
This is the style of the whole buffer before further styles are applied,
unlike the default style, which only affects the style currently being
applied (for example, setting the default style to bold will cause
subsequently inserted text to be bold).
*/
virtual const wxRichTextAttr& GetBasicStyle() const { return m_attributes; }
/**
Invalidates the buffer. With no argument, invalidates whole buffer.
*/
virtual void Invalidate(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
/**
Do the (in)validation for this object only.
*/
virtual void DoInvalidate(const wxRichTextRange& invalidRange);
/**
Do the (in)validation both up and down the hierarchy.
*/
virtual void InvalidateHierarchy(const wxRichTextRange& invalidRange = wxRICHTEXT_ALL);
/**
Gather information about floating objects. If untilObj is non-NULL,
will stop getting information if the current object is this, since we
will collect the rest later.
*/
virtual bool UpdateFloatingObjects(const wxRect& availableRect, wxRichTextObject* untilObj = NULL);
/**
Get invalid range, rounding to entire paragraphs if argument is true.
*/
wxRichTextRange GetInvalidRange(bool wholeParagraphs = false) const;
/**
Returns @true if this object needs layout.
*/
bool IsDirty() const { return m_invalidRange != wxRICHTEXT_NONE; }
/**
Returns the wxRichTextFloatCollector of this object.
*/
wxRichTextFloatCollector* GetFloatCollector() { return m_floatCollector; }
/**
Returns the number of floating objects at this level.
*/
int GetFloatingObjectCount() const;
/**
Returns a list of floating objects.
*/
bool GetFloatingObjects(wxRichTextObjectList& objects) const;
protected:
wxRichTextCtrl* m_ctrl;
wxRichTextAttr m_defaultAttributes;
// The invalidated range that will need full layout
wxRichTextRange m_invalidRange;
// Is the last paragraph partial or complete?
bool m_partialParagraph;
// The floating layout state
wxRichTextFloatCollector* m_floatCollector;
};
/**
@class wxRichTextBox
This class implements a floating or inline text box, containing paragraphs.
@library{wxrichtext}
@category{richtext}
@see wxRichTextParagraphLayoutBox, wxRichTextObject, wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextBox: public wxRichTextParagraphLayoutBox
{
DECLARE_DYNAMIC_CLASS(wxRichTextBox)
public:
// Constructors
/**
Default constructor; optionally pass the parent object.
*/
wxRichTextBox(wxRichTextObject* parent = NULL);
/**
Copy constructor.
*/
wxRichTextBox(const wxRichTextBox& obj): wxRichTextParagraphLayoutBox() { Copy(obj); }
// Overridables
virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
virtual wxString GetXMLNodeName() const { return wxT("textbox"); }
virtual bool CanEditProperties() const { return true; }
virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
virtual wxString GetPropertiesMenuLabel() const { return wxGetTranslation("&Box"); }
// Accessors
// Operations
virtual wxRichTextObject* Clone() const { return new wxRichTextBox(*this); }
void Copy(const wxRichTextBox& obj);
protected:
};
/**
@class wxRichTextField
This class implements the general concept of a field, an object that represents
additional functionality such as a footnote, a bookmark, a page number, a table
of contents, and so on. Extra information (such as a bookmark name) can be stored
in the object properties.
Drawing, layout, and property editing is delegated to classes derived
from wxRichTextFieldType, such as instances of wxRichTextFieldTypeStandard; this makes
the use of fields an efficient method of introducing extra functionality, since
most of the information required to draw a field (such as a bitmap) is kept centrally
in a single field type definition.
The FieldType property, accessed by SetFieldType/GetFieldType, is used to retrieve
the field type definition. So be careful not to overwrite this property.
wxRichTextField is derived from wxRichTextParagraphLayoutBox, which means that it
can contain its own read-only content, refreshed when the application calls the UpdateField
function. Whether a field is treated as a composite or a single graphic is determined
by the field type definition. If using wxRichTextFieldTypeStandard, passing the display
type wxRICHTEXT_FIELD_STYLE_COMPOSITE to the field type definition causes the field
to behave like a composite; the other display styles display a simple graphic.
When implementing a composite field, you will still need to derive from wxRichTextFieldTypeStandard
or wxRichTextFieldType, if only to implement UpdateField to refresh the field content
appropriately. wxRichTextFieldTypeStandard is only one possible implementation, but
covers common needs especially for simple, static fields using text or a bitmap.
Register field types on application initialisation with the static function
wxRichTextBuffer::AddFieldType. They will be deleted automatically on
application exit.
An application can write a field to a control with wxRichTextCtrl::WriteField,
taking a field type, the properties for the field, and optional attributes.
@library{wxrichtext}
@category{richtext}
@see wxRichTextFieldTypeStandard, wxRichTextFieldType, wxRichTextParagraphLayoutBox, wxRichTextProperties, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextField: public wxRichTextParagraphLayoutBox
{
DECLARE_DYNAMIC_CLASS(wxRichTextField)
public:
// Constructors
/**
Default constructor; optionally pass the parent object.
*/
wxRichTextField(const wxString& fieldType = wxEmptyString, wxRichTextObject* parent = NULL);
/**
Copy constructor.
*/
wxRichTextField(const wxRichTextField& obj): wxRichTextParagraphLayoutBox() { Copy(obj); }
// Overridables
virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const;
virtual wxString GetXMLNodeName() const { return wxT("field"); }
virtual bool CanEditProperties() const;
virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
virtual wxString GetPropertiesMenuLabel() const;
virtual bool AcceptsFocus() const { return false; }
virtual void CalculateRange(long start, long& end);
/**
If a field has children, we don't want the user to be able to edit it.
*/
virtual bool IsAtomic() const { return true; }
virtual bool IsEmpty() const { return false; }
virtual bool IsTopLevel() const;
// Accessors
void SetFieldType(const wxString& fieldType) { GetProperties().SetProperty(wxT("FieldType"), fieldType); }
wxString GetFieldType() const { return GetProperties().GetPropertyString(wxT("FieldType")); }
// Operations
/**
Update the field; delegated to the associated field type. This would typically expand the field to its value,
if this is a dynamically changing and/or composite field.
*/
virtual bool UpdateField(wxRichTextBuffer* buffer);
virtual wxRichTextObject* Clone() const { return new wxRichTextField(*this); }
void Copy(const wxRichTextField& obj);
protected:
};
/**
@class wxRichTextFieldType
The base class for custom field types. Each type definition handles one
field type. Override functions to provide drawing, layout, updating and
property editing functionality for a field.
Register field types on application initialisation with the static function
wxRichTextBuffer::AddFieldType. They will be deleted automatically on
application exit.
@library{wxrichtext}
@category{richtext}
@see wxRichTextFieldTypeStandard, wxRichTextField, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextFieldType: public wxObject
{
DECLARE_CLASS(wxRichTextFieldType)
public:
/**
Creates a field type definition.
*/
wxRichTextFieldType(const wxString& name = wxEmptyString)
: m_name(name)
{ }
/**
Copy constructor.
*/
wxRichTextFieldType(const wxRichTextFieldType& fieldType)
: wxObject(fieldType)
{ Copy(fieldType); }
void Copy(const wxRichTextFieldType& fieldType) { m_name = fieldType.m_name; }
/**
Draw the item, within the given range. Some objects may ignore the range (for
example paragraphs) while others must obey it (lines, to implement wrapping)
*/
virtual bool Draw(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style) = 0;
/**
Lay the item out at the specified position with the given size constraint.
Layout must set the cached size. @rect is the available space for the object,
and @a parentRect is the container that is used to determine a relative size
or position (for example if a text box must be 50% of the parent text box).
*/
virtual bool Layout(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style) = 0;
/**
Returns the object size for the given range. Returns @false if the range
is invalid for this object.
*/
virtual bool GetRangeSize(wxRichTextField* obj, const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const = 0;
/**
Returns @true if we can edit the object's properties via a GUI.
*/
virtual bool CanEditProperties(wxRichTextField* WXUNUSED(obj)) const { return false; }
/**
Edits the object's properties via a GUI.
*/
virtual bool EditProperties(wxRichTextField* WXUNUSED(obj), wxWindow* WXUNUSED(parent), wxRichTextBuffer* WXUNUSED(buffer)) { return false; }
/**
Returns the label to be used for the properties context menu item.
*/
virtual wxString GetPropertiesMenuLabel(wxRichTextField* WXUNUSED(obj)) const { return wxEmptyString; }
/**
Update the field. This would typically expand the field to its value,
if this is a dynamically changing and/or composite field.
*/
virtual bool UpdateField(wxRichTextBuffer* WXUNUSED(buffer), wxRichTextField* WXUNUSED(obj)) { return false; }
/**
Returns @true if this object is top-level, i.e. contains its own paragraphs, such as a text box.
*/
virtual bool IsTopLevel(wxRichTextField* WXUNUSED(obj)) const { return true; }
/**
Sets the field type name. There should be a unique name per field type object.
*/
void SetName(const wxString& name) { m_name = name; }
/**
Returns the field type name. There should be a unique name per field type object.
*/
wxString GetName() const { return m_name; }
protected:
wxString m_name;
};
WX_DECLARE_STRING_HASH_MAP(wxRichTextFieldType*, wxRichTextFieldTypeHashMap);
/**
@class wxRichTextFieldTypeStandard
A field type that can handle fields with text or bitmap labels, with a small range
of styles for implementing rectangular fields and fields that can be used for start
and end tags.
The border, text and background colours can be customised; the default is
white text on a black background.
The following display styles can be used.
@beginStyleTable
@style{wxRICHTEXT_FIELD_STYLE_COMPOSITE}
Creates a composite field; you will probably need to derive a new class to implement UpdateField.
@style{wxRICHTEXT_FIELD_STYLE_RECTANGLE}
Shows a rounded rectangle background.
@style{wxRICHTEXT_FIELD_STYLE_NO_BORDER}
Suppresses the background and border; mostly used with a bitmap label.
@style{wxRICHTEXT_FIELD_STYLE_START_TAG}
Shows a start tag background, with the pointy end facing right.
@style{wxRICHTEXT_FIELD_STYLE_END_TAG}
Shows an end tag background, with the pointy end facing left.
@endStyleTable
@library{wxrichtext}
@category{richtext}
@see wxRichTextFieldType, wxRichTextField, wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextFieldTypeStandard: public wxRichTextFieldType
{
DECLARE_CLASS(wxRichTextFieldTypeStandard)
public:
// Display style types
enum { wxRICHTEXT_FIELD_STYLE_COMPOSITE = 0x01,
wxRICHTEXT_FIELD_STYLE_RECTANGLE = 0x02,
wxRICHTEXT_FIELD_STYLE_NO_BORDER = 0x04,
wxRICHTEXT_FIELD_STYLE_START_TAG = 0x08,
wxRICHTEXT_FIELD_STYLE_END_TAG = 0x10
};
/**
Constructor, creating a field type definition with a text label.
@param parent
The name of the type definition. This must be unique, and is the type
name used when adding a field to a control.
@param label
The text label to be shown on the field.
@param displayStyle
The display style: one of wxRICHTEXT_FIELD_STYLE_RECTANGLE,
wxRICHTEXT_FIELD_STYLE_NO_BORDER, wxRICHTEXT_FIELD_STYLE_START_TAG,
wxRICHTEXT_FIELD_STYLE_END_TAG.
*/
wxRichTextFieldTypeStandard(const wxString& name, const wxString& label, int displayStyle = wxRICHTEXT_FIELD_STYLE_RECTANGLE);
/**
Constructor, creating a field type definition with a bitmap label.
@param parent
The name of the type definition. This must be unique, and is the type
name used when adding a field to a control.
@param label
The bitmap label to be shown on the field.
@param displayStyle
The display style: one of wxRICHTEXT_FIELD_STYLE_RECTANGLE,
wxRICHTEXT_FIELD_STYLE_NO_BORDER, wxRICHTEXT_FIELD_STYLE_START_TAG,
wxRICHTEXT_FIELD_STYLE_END_TAG.
*/
wxRichTextFieldTypeStandard(const wxString& name, const wxBitmap& bitmap, int displayStyle = wxRICHTEXT_FIELD_STYLE_NO_BORDER);
/**
The default constructor.
*/
wxRichTextFieldTypeStandard() { Init(); }
/**
The copy constructor.
*/
wxRichTextFieldTypeStandard(const wxRichTextFieldTypeStandard& field)
: wxRichTextFieldType(field)
{ Copy(field); }
/**
Initialises the object.
*/
void Init();
/**
Copies the object.
*/
void Copy(const wxRichTextFieldTypeStandard& field);
/**
The assignment operator.
*/
void operator=(const wxRichTextFieldTypeStandard& field) { Copy(field); }
/**
Draw the item, within the given range. Some objects may ignore the range (for
example paragraphs) while others must obey it (lines, to implement wrapping)
*/
virtual bool Draw(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
/**
Lay the item out at the specified position with the given size constraint.
Layout must set the cached size. @rect is the available space for the object,
and @a parentRect is the container that is used to determine a relative size
or position (for example if a text box must be 50% of the parent text box).
*/
virtual bool Layout(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
/**
Returns the object size for the given range. Returns @false if the range
is invalid for this object.
*/
virtual bool GetRangeSize(wxRichTextField* obj, const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const;
/**
Get the size of the field, given the label, font size, and so on.
*/
wxSize GetSize(wxRichTextField* obj, wxDC& dc, wxRichTextDrawingContext& context, int style) const;
/**
Returns @true if the display type is wxRICHTEXT_FIELD_STYLE_COMPOSITE, @false otherwise.
*/
virtual bool IsTopLevel(wxRichTextField* WXUNUSED(obj)) const { return (GetDisplayStyle() & wxRICHTEXT_FIELD_STYLE_COMPOSITE) != 0; }
/**
Sets the text label for fields of this type.
*/
void SetLabel(const wxString& label) { m_label = label; }
/**
Returns the text label for fields of this type.
*/
const wxString& GetLabel() const { return m_label; }
/**
Sets the bitmap label for fields of this type.
*/
void SetBitmap(const wxBitmap& bitmap) { m_bitmap = bitmap; }
/**
Gets the bitmap label for fields of this type.
*/
const wxBitmap& GetBitmap() const { return m_bitmap; }
/**
Gets the display style for fields of this type.
*/
int GetDisplayStyle() const { return m_displayStyle; }
/**
Sets the display style for fields of this type.
*/
void SetDisplayStyle(int displayStyle) { m_displayStyle = displayStyle; }
/**
Gets the font used for drawing the text label.
*/
const wxFont& GetFont() const { return m_font; }
/**
Sets the font used for drawing the text label.
*/
void SetFont(const wxFont& font) { m_font = font; }
/**
Gets the colour used for drawing the text label.
*/
const wxColour& GetTextColour() const { return m_textColour; }
/**
Sets the colour used for drawing the text label.
*/
void SetTextColour(const wxColour& colour) { m_textColour = colour; }
/**
Gets the colour used for drawing the field border.
*/
const wxColour& GetBorderColour() const { return m_borderColour; }
/**
Sets the colour used for drawing the field border.
*/
void SetBorderColour(const wxColour& colour) { m_borderColour = colour; }
/**
Gets the colour used for drawing the field background.
*/
const wxColour& GetBackgroundColour() const { return m_backgroundColour; }
/**
Sets the colour used for drawing the field background.
*/
void SetBackgroundColour(const wxColour& colour) { m_backgroundColour = colour; }
/**
Sets the vertical padding (the distance between the border and the text).
*/
void SetVerticalPadding(int padding) { m_verticalPadding = padding; }
/**
Gets the vertical padding (the distance between the border and the text).
*/
int GetVerticalPadding() const { return m_verticalPadding; }
/**
Sets the horizontal padding (the distance between the border and the text).
*/
void SetHorizontalPadding(int padding) { m_horizontalPadding = padding; }
/**
Sets the horizontal padding (the distance between the border and the text).
*/
int GetHorizontalPadding() const { return m_horizontalPadding; }
/**
Sets the horizontal margin surrounding the field object.
*/
void SetHorizontalMargin(int margin) { m_horizontalMargin = margin; }
/**
Gets the horizontal margin surrounding the field object.
*/
int GetHorizontalMargin() const { return m_horizontalMargin; }
/**
Sets the vertical margin surrounding the field object.
*/
void SetVerticalMargin(int margin) { m_verticalMargin = margin; }
/**
Gets the vertical margin surrounding the field object.
*/
int GetVerticalMargin() const { return m_verticalMargin; }
protected:
wxString m_label;
int m_displayStyle;
wxFont m_font;
wxColour m_textColour;
wxColour m_borderColour;
wxColour m_backgroundColour;
int m_verticalPadding;
int m_horizontalPadding;
int m_horizontalMargin;
int m_verticalMargin;
wxBitmap m_bitmap;
};
/**
@class wxRichTextLine
This object represents a line in a paragraph, and stores
offsets from the start of the paragraph representing the
start and end positions of the line.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextLine
{
public:
// Constructors
wxRichTextLine(wxRichTextParagraph* parent);
wxRichTextLine(const wxRichTextLine& obj) { Init( NULL); Copy(obj); }
virtual ~wxRichTextLine() {}
// Overridables
// Accessors
/**
Sets the range associated with this line.
*/
void SetRange(const wxRichTextRange& range) { m_range = range; }
/**
Sets the range associated with this line.
*/
void SetRange(long from, long to) { m_range = wxRichTextRange(from, to); }
/**
Returns the parent paragraph.
*/
wxRichTextParagraph* GetParent() { return m_parent; }
/**
Returns the range.
*/
const wxRichTextRange& GetRange() const { return m_range; }
/**
Returns the range.
*/
wxRichTextRange& GetRange() { return m_range; }
/**
Returns the absolute range.
*/
wxRichTextRange GetAbsoluteRange() const;
/**
Returns the line size as calculated by Layout.
*/
virtual wxSize GetSize() const { return m_size; }
/**
Sets the line size as calculated by Layout.
*/
virtual void SetSize(const wxSize& sz) { m_size = sz; }
/**
Returns the object position relative to the parent.
*/
virtual wxPoint GetPosition() const { return m_pos; }
/**
Sets the object position relative to the parent.
*/
virtual void SetPosition(const wxPoint& pos) { m_pos = pos; }
/**
Returns the absolute object position.
*/
virtual wxPoint GetAbsolutePosition() const;
/**
Returns the rectangle enclosing the line.
*/
virtual wxRect GetRect() const { return wxRect(GetAbsolutePosition(), GetSize()); }
/**
Sets the stored descent.
*/
void SetDescent(int descent) { m_descent = descent; }
/**
Returns the stored descent.
*/
int GetDescent() const { return m_descent; }
#if wxRICHTEXT_USE_OPTIMIZED_LINE_DRAWING
wxArrayInt& GetObjectSizes() { return m_objectSizes; }
const wxArrayInt& GetObjectSizes() const { return m_objectSizes; }
#endif
// Operations
/**
Initialises the object.
*/
void Init(wxRichTextParagraph* parent);
/**
Copies from @a obj.
*/
void Copy(const wxRichTextLine& obj);
virtual wxRichTextLine* Clone() const { return new wxRichTextLine(*this); }
protected:
// The range of the line (start position to end position)
// This is relative to the parent paragraph.
wxRichTextRange m_range;
// Size and position measured relative to top of paragraph
wxPoint m_pos;
wxSize m_size;
// Maximum descent for this line (location of text baseline)
int m_descent;
// The parent object
wxRichTextParagraph* m_parent;
#if wxRICHTEXT_USE_OPTIMIZED_LINE_DRAWING
wxArrayInt m_objectSizes;
#endif
};
WX_DECLARE_LIST_WITH_DECL( wxRichTextLine, wxRichTextLineList , class WXDLLIMPEXP_RICHTEXT );
/**
@class wxRichTextParagraph
This object represents a single paragraph containing various objects such as text content, images, and further paragraph layout objects.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextParagraph: public wxRichTextCompositeObject
{
DECLARE_DYNAMIC_CLASS(wxRichTextParagraph)
public:
// Constructors
/**
Constructor taking a parent and style.
*/
wxRichTextParagraph(wxRichTextObject* parent = NULL, wxRichTextAttr* style = NULL);
/**
Constructor taking a text string, a parent and paragraph and character attributes.
*/
wxRichTextParagraph(const wxString& text, wxRichTextObject* parent = NULL, wxRichTextAttr* paraStyle = NULL, wxRichTextAttr* charStyle = NULL);
virtual ~wxRichTextParagraph();
wxRichTextParagraph(const wxRichTextParagraph& obj): wxRichTextCompositeObject() { Copy(obj); }
// Overridables
virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const;
virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart);
virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
virtual void CalculateRange(long start, long& end);
virtual wxString GetXMLNodeName() const { return wxT("paragraph"); }
// Accessors
/**
Returns the cached lines.
*/
wxRichTextLineList& GetLines() { return m_cachedLines; }
// Operations
/**
Copies the object.
*/
void Copy(const wxRichTextParagraph& obj);
virtual wxRichTextObject* Clone() const { return new wxRichTextParagraph(*this); }
/**
Clears the cached lines.
*/
void ClearLines();
// Implementation
/**
Applies paragraph styles such as centering to the wrapped lines.
*/
virtual void ApplyParagraphStyle(wxRichTextLine* line, const wxRichTextAttr& attr, const wxRect& rect, wxDC& dc);
/**
Inserts text at the given position.
*/
virtual bool InsertText(long pos, const wxString& text);
/**
Splits an object at this position if necessary, and returns
the previous object, or NULL if inserting at the beginning.
*/
virtual wxRichTextObject* SplitAt(long pos, wxRichTextObject** previousObject = NULL);
/**
Moves content to a list from this point.
*/
virtual void MoveToList(wxRichTextObject* obj, wxList& list);
/**
Adds content back from a list.
*/
virtual void MoveFromList(wxList& list);
/**
Returns the plain text searching from the start or end of the range.
The resulting string may be shorter than the range given.
*/
bool GetContiguousPlainText(wxString& text, const wxRichTextRange& range, bool fromStart = true);
/**
Finds a suitable wrap position. @a wrapPosition is the last position in the line to the left
of the split.
*/
bool FindWrapPosition(const wxRichTextRange& range, wxDC& dc, wxRichTextDrawingContext& context, int availableSpace, long& wrapPosition, wxArrayInt* partialExtents);
/**
Finds the object at the given position.
*/
wxRichTextObject* FindObjectAtPosition(long position);
/**
Returns the bullet text for this paragraph.
*/
wxString GetBulletText();
/**
Allocates or reuses a line object.
*/
wxRichTextLine* AllocateLine(int pos);
/**
Clears remaining unused line objects, if any.
*/
bool ClearUnusedLines(int lineCount);
/**
Returns combined attributes of the base style, paragraph style and character style. We use this to dynamically
retrieve the actual style.
*/
wxRichTextAttr GetCombinedAttributes(const wxRichTextAttr& contentStyle, bool includingBoxAttr = false) const;
/**
Returns the combined attributes of the base style and paragraph style.
*/
wxRichTextAttr GetCombinedAttributes(bool includingBoxAttr = false) const;
/**
Returns the first position from pos that has a line break character.
*/
long GetFirstLineBreakPosition(long pos);
/**
Creates a default tabstop array.
*/
static void InitDefaultTabs();
/**
Clears the default tabstop array.
*/
static void ClearDefaultTabs();
/**
Returns the default tabstop array.
*/
static const wxArrayInt& GetDefaultTabs() { return sm_defaultTabs; }
/**
Lays out the floating objects.
*/
void LayoutFloat(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style, wxRichTextFloatCollector* floatCollector);
protected:
// The lines that make up the wrapped paragraph
wxRichTextLineList m_cachedLines;
// Default tabstops
static wxArrayInt sm_defaultTabs;
friend class wxRichTextFloatCollector;
};
/**
@class wxRichTextPlainText
This object represents a single piece of text.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextPlainText: public wxRichTextObject
{
DECLARE_DYNAMIC_CLASS(wxRichTextPlainText)
public:
// Constructors
/**
Constructor.
*/
wxRichTextPlainText(const wxString& text = wxEmptyString, wxRichTextObject* parent = NULL, wxRichTextAttr* style = NULL);
/**
Copy constructor.
*/
wxRichTextPlainText(const wxRichTextPlainText& obj): wxRichTextObject() { Copy(obj); }
// Overridables
virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
virtual bool AdjustAttributes(wxRichTextAttr& attr, wxRichTextDrawingContext& context);
virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const;
virtual wxString GetTextForRange(const wxRichTextRange& range) const;
virtual wxRichTextObject* DoSplit(long pos);
virtual void CalculateRange(long start, long& end);
virtual bool DeleteRange(const wxRichTextRange& range);
virtual bool IsEmpty() const { return m_text.empty(); }
virtual bool CanMerge(wxRichTextObject* object, wxRichTextDrawingContext& context) const;
virtual bool Merge(wxRichTextObject* object, wxRichTextDrawingContext& context);
virtual void Dump(wxTextOutputStream& stream);
virtual bool CanSplit(wxRichTextDrawingContext& context) const;
virtual wxRichTextObject* Split(wxRichTextDrawingContext& context);
/**
Get the first position from pos that has a line break character.
*/
long GetFirstLineBreakPosition(long pos);
/// Does this object take note of paragraph attributes? Text and image objects don't.
virtual bool UsesParagraphAttributes() const { return false; }
#if wxUSE_XML
virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
#endif
#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
#endif
#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
#endif
virtual wxString GetXMLNodeName() const { return wxT("text"); }
// Accessors
/**
Returns the text.
*/
const wxString& GetText() const { return m_text; }
/**
Sets the text.
*/
void SetText(const wxString& text) { m_text = text; }
// Operations
// Copies the text object,
void Copy(const wxRichTextPlainText& obj);
// Clones the text object.
virtual wxRichTextObject* Clone() const { return new wxRichTextPlainText(*this); }
private:
bool DrawTabbedString(wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, wxString& str, wxCoord& x, wxCoord& y, bool selected);
protected:
wxString m_text;
};
/**
@class wxRichTextImageBlock
This class stores information about an image, in binary in-memory form.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextImageBlock: public wxObject
{
public:
/**
Constructor.
*/
wxRichTextImageBlock();
/**
Copy constructor.
*/
wxRichTextImageBlock(const wxRichTextImageBlock& block);
virtual ~wxRichTextImageBlock();
/**
Initialises the block.
*/
void Init();
/**
Clears the block.
*/
void Clear();
/**
Load the original image into a memory block.
If the image is not a JPEG, we must convert it into a JPEG
to conserve space.
If it's not a JPEG we can make use of @a image, already scaled, so we don't have to
load the image a second time.
*/
virtual bool MakeImageBlock(const wxString& filename, wxBitmapType imageType,
wxImage& image, bool convertToJPEG = true);
/**
Make an image block from the wxImage in the given
format.
*/
virtual bool MakeImageBlock(wxImage& image, wxBitmapType imageType, int quality = 80);
/**
Uses a const wxImage for efficiency, but can't set quality (only relevant for JPEG)
*/
virtual bool MakeImageBlockDefaultQuality(const wxImage& image, wxBitmapType imageType);
/**
Makes the image block.
*/
virtual bool DoMakeImageBlock(const wxImage& image, wxBitmapType imageType);
/**
Writes the block to a file.
*/
bool Write(const wxString& filename);
/**
Writes the data in hex to a stream.
*/
bool WriteHex(wxOutputStream& stream);
/**
Reads the data in hex from a stream.
*/
bool ReadHex(wxInputStream& stream, int length, wxBitmapType imageType);
/**
Copy from @a block.
*/
void Copy(const wxRichTextImageBlock& block);
// Load a wxImage from the block
/**
*/
bool Load(wxImage& image);
// Operators
/**
Assignment operation.
*/
void operator=(const wxRichTextImageBlock& block);
// Accessors
/**
Returns the raw data.
*/
unsigned char* GetData() const { return m_data; }
/**
Returns the data size in bytes.
*/
size_t GetDataSize() const { return m_dataSize; }
/**
Returns the image type.
*/
wxBitmapType GetImageType() const { return m_imageType; }
/**
*/
void SetData(unsigned char* image) { m_data = image; }
/**
Sets the data size.
*/
void SetDataSize(size_t size) { m_dataSize = size; }
/**
Sets the image type.
*/
void SetImageType(wxBitmapType imageType) { m_imageType = imageType; }
/**
Returns @true if the data is non-NULL.
*/
bool IsOk() const { return GetData() != NULL; }
bool Ok() const { return IsOk(); }
/**
Gets the extension for the block's type.
*/
wxString GetExtension() const;
/// Implementation
/**
Allocates and reads from a stream as a block of memory.
*/
static unsigned char* ReadBlock(wxInputStream& stream, size_t size);
/**
Allocates and reads from a file as a block of memory.
*/
static unsigned char* ReadBlock(const wxString& filename, size_t size);
/**
Writes a memory block to stream.
*/
static bool WriteBlock(wxOutputStream& stream, unsigned char* block, size_t size);
/**
Writes a memory block to a file.
*/
static bool WriteBlock(const wxString& filename, unsigned char* block, size_t size);
protected:
// Size in bytes of the image stored.
// This is in the raw, original form such as a JPEG file.
unsigned char* m_data;
size_t m_dataSize;
wxBitmapType m_imageType;
};
/**
@class wxRichTextImage
This class implements a graphic object.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl, wxRichTextImageBlock
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextImage: public wxRichTextObject
{
DECLARE_DYNAMIC_CLASS(wxRichTextImage)
public:
// Constructors
/**
Default constructor.
*/
wxRichTextImage(wxRichTextObject* parent = NULL): wxRichTextObject(parent) { Init(); }
/**
Creates a wxRichTextImage from a wxImage.
*/
wxRichTextImage(const wxImage& image, wxRichTextObject* parent = NULL, wxRichTextAttr* charStyle = NULL);
/**
Creates a wxRichTextImage from an image block.
*/
wxRichTextImage(const wxRichTextImageBlock& imageBlock, wxRichTextObject* parent = NULL, wxRichTextAttr* charStyle = NULL);
/**
Copy constructor.
*/
wxRichTextImage(const wxRichTextImage& obj): wxRichTextObject(obj) { Copy(obj); }
/**
Destructor.
*/
~wxRichTextImage();
/**
Initialisation.
*/
void Init();
// Overridables
virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const;
/**
Returns the 'natural' size for this object - the image size.
*/
virtual wxTextAttrSize GetNaturalSize() const;
virtual bool IsEmpty() const { return false; /* !m_imageBlock.IsOk(); */ }
virtual bool CanEditProperties() const { return true; }
virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
virtual wxString GetPropertiesMenuLabel() const { return wxGetTranslation("&Picture"); }
virtual bool UsesParagraphAttributes() const { return false; }
#if wxUSE_XML
virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
#endif
#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
#endif
#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
#endif
// Images can be floatable (optionally).
virtual bool IsFloatable() const { return true; }
virtual wxString GetXMLNodeName() const { return wxT("image"); }
// Accessors
/**
Returns the image cache (a scaled bitmap).
*/
const wxBitmap& GetImageCache() const { return m_imageCache; }
/**
Sets the image cache.
*/
void SetImageCache(const wxBitmap& bitmap) { m_imageCache = bitmap; m_originalImageSize = wxSize(bitmap.GetWidth(), bitmap.GetHeight()); }
/**
Resets the image cache.
*/
void ResetImageCache() { m_imageCache = wxNullBitmap; m_originalImageSize = wxSize(-1, -1); }
/**
Returns the image block containing the raw data.
*/
wxRichTextImageBlock& GetImageBlock() { return m_imageBlock; }
// Operations
/**
Copies the image object.
*/
void Copy(const wxRichTextImage& obj);
/**
Clones the image object.
*/
virtual wxRichTextObject* Clone() const { return new wxRichTextImage(*this); }
/**
Creates a cached image at the required size.
*/
virtual bool LoadImageCache(wxDC& dc, bool resetCache = false, const wxSize& parentSize = wxDefaultSize);
/**
Gets the original image size.
*/
wxSize GetOriginalImageSize() const { return m_originalImageSize; }
/**
Sets the original image size.
*/
void SetOriginalImageSize(const wxSize& sz) { m_originalImageSize = sz; }
protected:
wxRichTextImageBlock m_imageBlock;
wxBitmap m_imageCache;
wxSize m_originalImageSize;
};
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextCommand;
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction;
/**
@class wxRichTextBuffer
This is a kind of paragraph layout box, used to represent the whole buffer.
@library{wxrichtext}
@category{richtext}
@see wxRichTextParagraphLayoutBox, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextBuffer: public wxRichTextParagraphLayoutBox
{
DECLARE_DYNAMIC_CLASS(wxRichTextBuffer)
public:
// Constructors
/**
Default constructor.
*/
wxRichTextBuffer() { Init(); }
/**
Copy constructor.
*/
wxRichTextBuffer(const wxRichTextBuffer& obj): wxRichTextParagraphLayoutBox() { Init(); Copy(obj); }
virtual ~wxRichTextBuffer() ;
// Accessors
/**
Returns the command processor.
A text buffer always creates its own command processor when it is initialized.
*/
wxCommandProcessor* GetCommandProcessor() const { return m_commandProcessor; }
/**
Sets style sheet, if any. This will allow the application to use named character and paragraph
styles found in the style sheet.
Neither the buffer nor the control owns the style sheet so must be deleted by the application.
*/
void SetStyleSheet(wxRichTextStyleSheet* styleSheet) { m_styleSheet = styleSheet; }
/**
Returns the style sheet.
*/
virtual wxRichTextStyleSheet* GetStyleSheet() const { return m_styleSheet; }
/**
Sets the style sheet and sends a notification of the change.
*/
bool SetStyleSheetAndNotify(wxRichTextStyleSheet* sheet);
/**
Pushes the style sheet to the top of the style sheet stack.
*/
bool PushStyleSheet(wxRichTextStyleSheet* styleSheet);
/**
Pops the style sheet from the top of the style sheet stack.
*/
wxRichTextStyleSheet* PopStyleSheet();
/**
Returns the table storing fonts, for quick access and font reuse.
*/
wxRichTextFontTable& GetFontTable() { return m_fontTable; }
/**
Returns the table storing fonts, for quick access and font reuse.
*/
const wxRichTextFontTable& GetFontTable() const { return m_fontTable; }
/**
Sets table storing fonts, for quick access and font reuse.
*/
void SetFontTable(const wxRichTextFontTable& table) { m_fontTable = table; }
/**
Sets the scale factor for displaying fonts, for example for more comfortable
editing.
*/
void SetFontScale(double fontScale);
/**
Returns the scale factor for displaying fonts, for example for more comfortable
editing.
*/
double GetFontScale() const { return m_fontScale; }
/**
Sets the scale factor for displaying certain dimensions such as indentation and
inter-paragraph spacing. This can be useful when editing in a small control
where you still want legible text, but a minimum of wasted white space.
*/
void SetDimensionScale(double dimScale);
/**
Returns the scale factor for displaying certain dimensions such as indentation
and inter-paragraph spacing.
*/
double GetDimensionScale() const { return m_dimensionScale; }
// Operations
/**
Initialisation.
*/
void Init();
/**
Clears the buffer, adds an empty paragraph, and clears the command processor.
*/
virtual void ResetAndClearCommands();
#if wxUSE_FFILE && wxUSE_STREAMS
//@{
/**
Loads content from a file.
Not all handlers will implement file loading.
*/
virtual bool LoadFile(const wxString& filename, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
//@}
//@{
/**
Saves content to a file.
Not all handlers will implement file saving.
*/
virtual bool SaveFile(const wxString& filename, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
//@}
#endif // wxUSE_FFILE
#if wxUSE_STREAMS
//@{
/**
Loads content from a stream.
Not all handlers will implement loading from a stream.
*/
virtual bool LoadFile(wxInputStream& stream, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
//@}
//@{
/**
Saves content to a stream.
Not all handlers will implement saving to a stream.
*/
virtual bool SaveFile(wxOutputStream& stream, wxRichTextFileType type = wxRICHTEXT_TYPE_ANY);
//@}
#endif // wxUSE_STREAMS
/**
Sets the handler flags, controlling loading and saving.
*/
void SetHandlerFlags(int flags) { m_handlerFlags = flags; }
/**
Gets the handler flags, controlling loading and saving.
*/
int GetHandlerFlags() const { return m_handlerFlags; }
/**
Convenience function to add a paragraph of text.
*/
virtual wxRichTextRange AddParagraph(const wxString& text, wxRichTextAttr* paraStyle = NULL) { Modify(); return wxRichTextParagraphLayoutBox::AddParagraph(text, paraStyle); }
/**
Begin collapsing undo/redo commands. Note that this may not work properly
if combining commands that delete or insert content, changing ranges for
subsequent actions.
@a cmdName should be the name of the combined command that will appear
next to Undo and Redo in the edit menu.
*/
virtual bool BeginBatchUndo(const wxString& cmdName);
/**
End collapsing undo/redo commands.
*/
virtual bool EndBatchUndo();
/**
Returns @true if we are collapsing commands.
*/
virtual bool BatchingUndo() const { return m_batchedCommandDepth > 0; }
/**
Submit the action immediately, or delay according to whether collapsing is on.
*/
virtual bool SubmitAction(wxRichTextAction* action);
/**
Returns the collapsed command.
*/
virtual wxRichTextCommand* GetBatchedCommand() const { return m_batchedCommand; }
/**
Begin suppressing undo/redo commands. The way undo is suppressed may be implemented
differently by each command. If not dealt with by a command implementation, then
it will be implemented automatically by not storing the command in the undo history
when the action is submitted to the command processor.
*/
virtual bool BeginSuppressUndo();
/**
End suppressing undo/redo commands.
*/
virtual bool EndSuppressUndo();
/**
Are we suppressing undo??
*/
virtual bool SuppressingUndo() const { return m_suppressUndo > 0; }
/**
Copy the range to the clipboard.
*/
virtual bool CopyToClipboard(const wxRichTextRange& range);
/**
Paste the clipboard content to the buffer.
*/
virtual bool PasteFromClipboard(long position);
/**
Returns @true if we can paste from the clipboard.
*/
virtual bool CanPasteFromClipboard() const;
/**
Begin using a style.
*/
virtual bool BeginStyle(const wxRichTextAttr& style);
/**
End the style.
*/
virtual bool EndStyle();
/**
End all styles.
*/
virtual bool EndAllStyles();
/**
Clears the style stack.
*/
virtual void ClearStyleStack();
/**
Returns the size of the style stack, for example to check correct nesting.
*/
virtual size_t GetStyleStackSize() const { return m_attributeStack.GetCount(); }
/**
Begins using bold.
*/
bool BeginBold();
/**
Ends using bold.
*/
bool EndBold() { return EndStyle(); }
/**
Begins using italic.
*/
bool BeginItalic();
/**
Ends using italic.
*/
bool EndItalic() { return EndStyle(); }
/**
Begins using underline.
*/
bool BeginUnderline();
/**
Ends using underline.
*/
bool EndUnderline() { return EndStyle(); }
/**
Begins using point size.
*/
bool BeginFontSize(int pointSize);
/**
Ends using point size.
*/
bool EndFontSize() { return EndStyle(); }
/**
Begins using this font.
*/
bool BeginFont(const wxFont& font);
/**
Ends using a font.
*/
bool EndFont() { return EndStyle(); }
/**
Begins using this colour.
*/
bool BeginTextColour(const wxColour& colour);
/**
Ends using a colour.
*/
bool EndTextColour() { return EndStyle(); }
/**
Begins using alignment.
*/
bool BeginAlignment(wxTextAttrAlignment alignment);
/**
Ends alignment.
*/
bool EndAlignment() { return EndStyle(); }
/**
Begins using @a leftIndent for the left indent, and optionally @a leftSubIndent for
the sub-indent. Both are expressed in tenths of a millimetre.
The sub-indent is an offset from the left of the paragraph, and is used for all
but the first line in a paragraph. A positive value will cause the first line to appear
to the left of the subsequent lines, and a negative value will cause the first line to be
indented relative to the subsequent lines.
*/
bool BeginLeftIndent(int leftIndent, int leftSubIndent = 0);
/**
Ends left indent.
*/
bool EndLeftIndent() { return EndStyle(); }
/**
Begins a right indent, specified in tenths of a millimetre.
*/
bool BeginRightIndent(int rightIndent);
/**
Ends right indent.
*/
bool EndRightIndent() { return EndStyle(); }
/**
Begins paragraph spacing; pass the before-paragraph and after-paragraph spacing
in tenths of a millimetre.
*/
bool BeginParagraphSpacing(int before, int after);
/**
Ends paragraph spacing.
*/
bool EndParagraphSpacing() { return EndStyle(); }
/**
Begins line spacing using the specified value. @e spacing is a multiple, where
10 means single-spacing, 15 means 1.5 spacing, and 20 means double spacing.
The ::wxTextAttrLineSpacing enumeration values are defined for convenience.
*/
bool BeginLineSpacing(int lineSpacing);
/**
Ends line spacing.
*/
bool EndLineSpacing() { return EndStyle(); }
/**
Begins numbered bullet.
This call will be needed for each item in the list, and the
application should take care of incrementing the numbering.
@a bulletNumber is a number, usually starting with 1.
@a leftIndent and @a leftSubIndent are values in tenths of a millimetre.
@a bulletStyle is a bitlist of the following values:
wxRichTextBuffer uses indentation to render a bulleted item.
The left indent is the distance between the margin and the bullet.
The content of the paragraph, including the first line, starts
at leftMargin + leftSubIndent.
So the distance between the left edge of the bullet and the
left of the actual paragraph is leftSubIndent.
*/
bool BeginNumberedBullet(int bulletNumber, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_ARABIC|wxTEXT_ATTR_BULLET_STYLE_PERIOD);
/**
Ends numbered bullet.
*/
bool EndNumberedBullet() { return EndStyle(); }
/**
Begins applying a symbol bullet, using a character from the current font.
See BeginNumberedBullet() for an explanation of how indentation is used
to render the bulleted paragraph.
*/
bool BeginSymbolBullet(const wxString& symbol, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_SYMBOL);
/**
Ends symbol bullet.
*/
bool EndSymbolBullet() { return EndStyle(); }
/**
Begins applying a standard bullet, using one of the standard bullet names
(currently @c standard/circle or @c standard/square.
See BeginNumberedBullet() for an explanation of how indentation is used to
render the bulleted paragraph.
*/
bool BeginStandardBullet(const wxString& bulletName, int leftIndent, int leftSubIndent, int bulletStyle = wxTEXT_ATTR_BULLET_STYLE_STANDARD);
/**
Ends standard bullet.
*/
bool EndStandardBullet() { return EndStyle(); }
/**
Begins named character style.
*/
bool BeginCharacterStyle(const wxString& characterStyle);
/**
Ends named character style.
*/
bool EndCharacterStyle() { return EndStyle(); }
/**
Begins named paragraph style.
*/
bool BeginParagraphStyle(const wxString& paragraphStyle);
/**
Ends named character style.
*/
bool EndParagraphStyle() { return EndStyle(); }
/**
Begins named list style.
Optionally, you can also pass a level and a number.
*/
bool BeginListStyle(const wxString& listStyle, int level = 1, int number = 1);
/**
Ends named character style.
*/
bool EndListStyle() { return EndStyle(); }
/**
Begins applying wxTEXT_ATTR_URL to the content.
Pass a URL and optionally, a character style to apply, since it is common
to mark a URL with a familiar style such as blue text with underlining.
*/
bool BeginURL(const wxString& url, const wxString& characterStyle = wxEmptyString);
/**
Ends URL.
*/
bool EndURL() { return EndStyle(); }
// Event handling
/**
Adds an event handler.
A buffer associated with a control has the control as the only event handler,
but the application is free to add more if further notification is required.
All handlers are notified of an event originating from the buffer, such as
the replacement of a style sheet during loading.
The buffer never deletes any of the event handlers, unless RemoveEventHandler()
is called with @true as the second argument.
*/
bool AddEventHandler(wxEvtHandler* handler);
/**
Removes an event handler from the buffer's list of handlers, deleting the
object if @a deleteHandler is @true.
*/
bool RemoveEventHandler(wxEvtHandler* handler, bool deleteHandler = false);
/**
Clear event handlers.
*/
void ClearEventHandlers();
/**
Send event to event handlers. If sendToAll is true, will send to all event handlers,
otherwise will stop at the first successful one.
*/
bool SendEvent(wxEvent& event, bool sendToAll = true);
// Implementation
virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
/**
Copies the buffer.
*/
void Copy(const wxRichTextBuffer& obj);
/**
Assignment operator.
*/
void operator= (const wxRichTextBuffer& obj) { Copy(obj); }
/**
Clones the buffer.
*/
virtual wxRichTextObject* Clone() const { return new wxRichTextBuffer(*this); }
/**
Submits a command to insert paragraphs.
*/
bool InsertParagraphsWithUndo(long pos, const wxRichTextParagraphLayoutBox& paragraphs, wxRichTextCtrl* ctrl, int flags = 0);
/**
Submits a command to insert the given text.
*/
bool InsertTextWithUndo(long pos, const wxString& text, wxRichTextCtrl* ctrl, int flags = 0);
/**
Submits a command to insert a newline.
*/
bool InsertNewlineWithUndo(long pos, wxRichTextCtrl* ctrl, int flags = 0);
/**
Submits a command to insert the given image.
*/
bool InsertImageWithUndo(long pos, const wxRichTextImageBlock& imageBlock, wxRichTextCtrl* ctrl, int flags = 0,
const wxRichTextAttr& textAttr = wxRichTextAttr());
/**
Submits a command to insert an object.
*/
wxRichTextObject* InsertObjectWithUndo(long pos, wxRichTextObject *object, wxRichTextCtrl* ctrl, int flags);
/**
Submits a command to delete this range.
*/
bool DeleteRangeWithUndo(const wxRichTextRange& range, wxRichTextCtrl* ctrl);
/**
Mark modified.
*/
void Modify(bool modify = true) { m_modified = modify; }
/**
Returns @true if the buffer was modified.
*/
bool IsModified() const { return m_modified; }
//@{
/**
Dumps contents of buffer for debugging purposes.
*/
virtual void Dump();
virtual void Dump(wxTextOutputStream& stream) { wxRichTextParagraphLayoutBox::Dump(stream); }
//@}
/**
Returns the file handlers.
*/
static wxList& GetHandlers() { return sm_handlers; }
/**
Adds a file handler to the end.
*/
static void AddHandler(wxRichTextFileHandler *handler);
/**
Inserts a file handler at the front.
*/
static void InsertHandler(wxRichTextFileHandler *handler);
/**
Removes a file handler.
*/
static bool RemoveHandler(const wxString& name);
/**
Finds a file handler by name.
*/
static wxRichTextFileHandler *FindHandler(const wxString& name);
/**
Finds a file handler by extension and type.
*/
static wxRichTextFileHandler *FindHandler(const wxString& extension, wxRichTextFileType imageType);
/**
Finds a handler by filename or, if supplied, type.
*/
static wxRichTextFileHandler *FindHandlerFilenameOrType(const wxString& filename,
wxRichTextFileType imageType);
/**
Finds a handler by type.
*/
static wxRichTextFileHandler *FindHandler(wxRichTextFileType imageType);
/**
Gets a wildcard incorporating all visible handlers. If @a types is present,
it will be filled with the file type corresponding to each filter. This can be
used to determine the type to pass to LoadFile given a selected filter.
*/
static wxString GetExtWildcard(bool combine = false, bool save = false, wxArrayInt* types = NULL);
/**
Clean up file handlers.
*/
static void CleanUpHandlers();
/**
Initialise the standard file handlers.
Currently, only the plain text loading/saving handler is initialised by default.
*/
static void InitStandardHandlers();
/**
Returns the drawing handlers.
*/
static wxList& GetDrawingHandlers() { return sm_drawingHandlers; }
/**
Adds a drawing handler to the end.
*/
static void AddDrawingHandler(wxRichTextDrawingHandler *handler);
/**
Inserts a drawing handler at the front.
*/
static void InsertDrawingHandler(wxRichTextDrawingHandler *handler);
/**
Removes a drawing handler.
*/
static bool RemoveDrawingHandler(const wxString& name);
/**
Finds a drawing handler by name.
*/
static wxRichTextDrawingHandler *FindDrawingHandler(const wxString& name);
/**
Clean up drawing handlers.
*/
static void CleanUpDrawingHandlers();
/**
Returns the field types.
*/
static wxRichTextFieldTypeHashMap& GetFieldTypes() { return sm_fieldTypes; }
/**
Adds a field type.
@see RemoveFieldType(), FindFieldType(), wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard
*/
static void AddFieldType(wxRichTextFieldType *fieldType);
/**
Removes a field type by name.
@see AddFieldType(), FindFieldType(), wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard
*/
static bool RemoveFieldType(const wxString& name);
/**
Finds a field type by name.
@see RemoveFieldType(), AddFieldType(), wxRichTextField, wxRichTextFieldType, wxRichTextFieldTypeStandard
*/
static wxRichTextFieldType *FindFieldType(const wxString& name);
/**
Cleans up field types.
*/
static void CleanUpFieldTypes();
/**
Returns the renderer object.
*/
static wxRichTextRenderer* GetRenderer() { return sm_renderer; }
/**
Sets @a renderer as the object to be used to render certain aspects of the
content, such as bullets.
You can override default rendering by deriving a new class from
wxRichTextRenderer or wxRichTextStdRenderer, overriding one or more
virtual functions, and setting an instance of the class using this function.
*/
static void SetRenderer(wxRichTextRenderer* renderer);
/**
Returns the minimum margin between bullet and paragraph in 10ths of a mm.
*/
static int GetBulletRightMargin() { return sm_bulletRightMargin; }
/**
Sets the minimum margin between bullet and paragraph in 10ths of a mm.
*/
static void SetBulletRightMargin(int margin) { sm_bulletRightMargin = margin; }
/**
Returns the factor to multiply by character height to get a reasonable bullet size.
*/
static float GetBulletProportion() { return sm_bulletProportion; }
/**
Sets the factor to multiply by character height to get a reasonable bullet size.
*/
static void SetBulletProportion(float prop) { sm_bulletProportion = prop; }
/**
Returns the scale factor for calculating dimensions.
*/
double GetScale() const { return m_scale; }
/**
Sets the scale factor for calculating dimensions.
*/
void SetScale(double scale) { m_scale = scale; }
/**
Sets the floating layout mode. Pass @false to speed up editing by not performing
floating layout. This setting affects all buffers.
*/
static void SetFloatingLayoutMode(bool mode) { sm_floatingLayoutMode = mode; }
/**
Returns the floating layout mode. The default is @true, where objects
are laid out according to their floating status.
*/
static bool GetFloatingLayoutMode() { return sm_floatingLayoutMode; }
protected:
/// Command processor
wxCommandProcessor* m_commandProcessor;
/// Table storing fonts
wxRichTextFontTable m_fontTable;
/// Has been modified?
bool m_modified;
/// Collapsed command stack
int m_batchedCommandDepth;
/// Name for collapsed command
wxString m_batchedCommandsName;
/// Current collapsed command accumulating actions
wxRichTextCommand* m_batchedCommand;
/// Whether to suppress undo
int m_suppressUndo;
/// Style sheet, if any
wxRichTextStyleSheet* m_styleSheet;
/// List of event handlers that will be notified of events
wxList m_eventHandlers;
/// Stack of attributes for convenience functions
wxList m_attributeStack;
/// Flags to be passed to handlers
int m_handlerFlags;
/// File handlers
static wxList sm_handlers;
/// Drawing handlers
static wxList sm_drawingHandlers;
/// Field types
static wxRichTextFieldTypeHashMap sm_fieldTypes;
/// Renderer
static wxRichTextRenderer* sm_renderer;
/// Minimum margin between bullet and paragraph in 10ths of a mm
static int sm_bulletRightMargin;
/// Factor to multiply by character height to get a reasonable bullet size
static float sm_bulletProportion;
/// Floating layout mode, @true by default
static bool sm_floatingLayoutMode;
/// Scaling factor in use: needed to calculate correct dimensions when printing
double m_scale;
/// Font scale for adjusting the text size when editing
double m_fontScale;
/// Dimension scale for reducing redundant whitespace when editing
double m_dimensionScale;
};
/**
@class wxRichTextCell
wxRichTextCell is the cell in a table.
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextCell: public wxRichTextBox
{
DECLARE_DYNAMIC_CLASS(wxRichTextCell)
public:
// Constructors
/**
Default constructor; optionally pass the parent object.
*/
wxRichTextCell(wxRichTextObject* parent = NULL);
/**
Copy constructor.
*/
wxRichTextCell(const wxRichTextCell& obj): wxRichTextBox() { Copy(obj); }
// Overridables
virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
virtual bool AdjustAttributes(wxRichTextAttr& attr, wxRichTextDrawingContext& context);
virtual wxString GetXMLNodeName() const { return wxT("cell"); }
virtual bool CanEditProperties() const { return true; }
virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
virtual wxString GetPropertiesMenuLabel() const { return wxGetTranslation("&Cell"); }
// Accessors
int GetColSpan() const;
void SetColSpan(long span) { GetProperties().SetProperty(wxT("colspan"), span); }
int GetRowSpan() const;
void SetRowSpan(long span) { GetProperties().SetProperty(wxT("rowspan"), span); }
// Operations
virtual wxRichTextObject* Clone() const { return new wxRichTextCell(*this); }
void Copy(const wxRichTextCell& obj);
protected:
};
/**
@class wxRichTextTable
wxRichTextTable represents a table with arbitrary columns and rows.
*/
WX_DEFINE_ARRAY_PTR(wxRichTextObject*, wxRichTextObjectPtrArray);
WX_DECLARE_USER_EXPORTED_OBJARRAY(wxRichTextObjectPtrArray, wxRichTextObjectPtrArrayArray, WXDLLIMPEXP_RICHTEXT);
class WXDLLIMPEXP_RICHTEXT wxRichTextTable: public wxRichTextBox
{
DECLARE_DYNAMIC_CLASS(wxRichTextTable)
public:
// Constructors
/**
Default constructor; optionally pass the parent object.
*/
wxRichTextTable(wxRichTextObject* parent = NULL);
/**
Copy constructor.
*/
wxRichTextTable(const wxRichTextTable& obj): wxRichTextBox() { Copy(obj); }
// Overridables
virtual bool Draw(wxDC& dc, wxRichTextDrawingContext& context, const wxRichTextRange& range, const wxRichTextSelection& selection, const wxRect& rect, int descent, int style);
virtual int HitTest(wxDC& dc, wxRichTextDrawingContext& context, const wxPoint& pt, long& textPosition, wxRichTextObject** obj, wxRichTextObject** contextObj, int flags = 0);
virtual bool AdjustAttributes(wxRichTextAttr& attr, wxRichTextDrawingContext& context);
virtual wxString GetXMLNodeName() const { return wxT("table"); }
virtual bool Layout(wxDC& dc, wxRichTextDrawingContext& context, const wxRect& rect, const wxRect& parentRect, int style);
virtual bool GetRangeSize(const wxRichTextRange& range, wxSize& size, int& descent, wxDC& dc, wxRichTextDrawingContext& context, int flags, const wxPoint& position = wxPoint(0,0), const wxSize& parentSize = wxDefaultSize, wxArrayInt* partialExtents = NULL) const;
virtual bool DeleteRange(const wxRichTextRange& range);
virtual wxString GetTextForRange(const wxRichTextRange& range) const;
#if wxUSE_XML
virtual bool ImportFromXML(wxRichTextBuffer* buffer, wxXmlNode* node, wxRichTextXMLHandler* handler, bool* recurse);
#endif
#if wxRICHTEXT_HAVE_DIRECT_OUTPUT
virtual bool ExportXML(wxOutputStream& stream, int indent, wxRichTextXMLHandler* handler);
#endif
#if wxRICHTEXT_HAVE_XMLDOCUMENT_OUTPUT
virtual bool ExportXML(wxXmlNode* parent, wxRichTextXMLHandler* handler);
#endif
virtual bool FindPosition(wxDC& dc, wxRichTextDrawingContext& context, long index, wxPoint& pt, int* height, bool forceLineStart);
virtual void CalculateRange(long start, long& end);
// Can this object handle the selections of its children? FOr example, a table.
virtual bool HandlesChildSelections() const { return true; }
/// Returns a selection object specifying the selections between start and end character positions.
/// For example, a table would deduce what cells (of range length 1) are selected when dragging across the table.
virtual wxRichTextSelection GetSelection(long start, long end) const;
virtual bool CanEditProperties() const { return true; }
virtual bool EditProperties(wxWindow* parent, wxRichTextBuffer* buffer);
virtual wxString GetPropertiesMenuLabel() const { return wxGetTranslation("&Table"); }
// Returns true if objects of this class can accept the focus, i.e. a call to SetFocusObject
// is possible. For example, containers supporting text, such as a text box object, can accept the focus,
// but a table can't (set the focus to individual cells instead).
virtual bool AcceptsFocus() const { return false; }
// Accessors
/**
Returns the cells array.
*/
const wxRichTextObjectPtrArrayArray& GetCells() const { return m_cells; }
/**
Returns the cells array.
*/
wxRichTextObjectPtrArrayArray& GetCells() { return m_cells; }
/**
Returns the row count.
*/
int GetRowCount() const { return m_rowCount; }
/**
Sets the row count.
*/
void SetRowCount(int count) { m_rowCount = count; }
/**
Returns the column count.
*/
int GetColumnCount() const { return m_colCount; }
/**
Sets the column count.
*/
void SetColumnCount(int count) { m_colCount = count; }
/**
Returns the cell at the given row/column position.
*/
virtual wxRichTextCell* GetCell(int row, int col) const;
/**
Returns the cell at the given character position (in the range of the table).
*/
virtual wxRichTextCell* GetCell(long pos) const;
/**
Returns the row/column for a given character position.
*/
virtual bool GetCellRowColumnPosition(long pos, int& row, int& col) const;
/**
Returns the coordinates of the cell with keyboard focus, or (-1,-1) if none.
*/
virtual wxPosition GetFocusedCell() const;
// Operations
/**
Clears the table.
*/
virtual void ClearTable();
/**
Creates a table of the given dimensions.
*/
virtual bool CreateTable(int rows, int cols);
/**
Sets the attributes for the cells specified by the selection.
*/
virtual bool SetCellStyle(const wxRichTextSelection& selection, const wxRichTextAttr& style, int flags = wxRICHTEXT_SETSTYLE_WITH_UNDO);
/**
Deletes rows from the given row position.
*/
virtual bool DeleteRows(int startRow, int noRows = 1);
/**
Deletes columns from the given column position.
*/
virtual bool DeleteColumns(int startCol, int noCols = 1);
/**
Adds rows from the given row position.
*/
virtual bool AddRows(int startRow, int noRows = 1, const wxRichTextAttr& attr = wxRichTextAttr());
/**
Adds columns from the given column position.
*/
virtual bool AddColumns(int startCol, int noCols = 1, const wxRichTextAttr& attr = wxRichTextAttr());
// Makes a clone of this object.
virtual wxRichTextObject* Clone() const { return new wxRichTextTable(*this); }
// Copies this object.
void Copy(const wxRichTextTable& obj);
protected:
int m_rowCount;
int m_colCount;
// An array of rows, each of which is a wxRichTextObjectPtrArray containing
// the cell objects. The cell objects are also children of this object.
// Problem: if boxes are immediate children of a box, this will cause problems
// with wxRichTextParagraphLayoutBox functions (and functions elsewhere) that
// expect to find just paragraphs. May have to adjust the way we handle the
// hierarchy to accept non-paragraph objects in a paragraph layout box.
// We'll be overriding much wxRichTextParagraphLayoutBox functionality so this
// may not be such a problem. Perhaps the table should derive from a different
// class?
wxRichTextObjectPtrArrayArray m_cells;
};
/** @class wxRichTextTableBlock
Stores the coordinates for a block of cells.
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextTableBlock
{
public:
wxRichTextTableBlock() { Init(); }
wxRichTextTableBlock(int colStart, int colEnd, int rowStart, int rowEnd)
{ Init(); m_colStart = colStart; m_colEnd = colEnd; m_rowStart = rowStart; m_rowEnd = rowEnd; }
wxRichTextTableBlock(const wxRichTextTableBlock& block) { Copy(block); }
void Init() { m_colStart = 0; m_colEnd = 0; m_rowStart = 0; m_rowEnd = 0; }
void Copy(const wxRichTextTableBlock& block)
{
m_colStart = block.m_colStart; m_colEnd = block.m_colEnd; m_rowStart = block.m_rowStart; m_rowEnd = block.m_rowEnd;
}
void operator=(const wxRichTextTableBlock& block) { Copy(block); }
bool operator==(const wxRichTextTableBlock& block)
{ return m_colStart == block.m_colStart && m_colEnd == block.m_colEnd && m_rowStart == block.m_rowStart && m_rowEnd == block.m_rowEnd; }
/// Computes the block given a table (perhaps about to be edited) and a rich text control
/// that may have a selection. If no selection, the whole table is used. If just the whole content
/// of one cell is selected, this cell only is used. If the cell contents is not selected and
/// requireCellSelection is @false, the focused cell will count as a selected cell.
bool ComputeBlockForSelection(wxRichTextTable* table, wxRichTextCtrl* ctrl, bool requireCellSelection = true);
/// Does this block represent the whole table?
bool IsWholeTable(wxRichTextTable* table) const;
/// Returns the cell focused in the table, if any
static wxRichTextCell* GetFocusedCell(wxRichTextCtrl* ctrl);
int& ColStart() { return m_colStart; }
int ColStart() const { return m_colStart; }
int& ColEnd() { return m_colEnd; }
int ColEnd() const { return m_colEnd; }
int& RowStart() { return m_rowStart; }
int RowStart() const { return m_rowStart; }
int& RowEnd() { return m_rowEnd; }
int RowEnd() const { return m_rowEnd; }
int m_colStart, m_colEnd, m_rowStart, m_rowEnd;
};
/**
The command identifiers for Do/Undo.
*/
enum wxRichTextCommandId
{
wxRICHTEXT_INSERT,
wxRICHTEXT_DELETE,
wxRICHTEXT_CHANGE_ATTRIBUTES,
wxRICHTEXT_CHANGE_STYLE,
wxRICHTEXT_CHANGE_PROPERTIES,
wxRICHTEXT_CHANGE_OBJECT
};
/**
@class wxRichTextObjectAddress
A class for specifying an object anywhere in an object hierarchy,
without using a pointer, necessary since wxRTC commands may delete
and recreate sub-objects so physical object addresses change. An array
of positions (one per hierarchy level) is used.
@library{wxrichtext}
@category{richtext}
@see wxRichTextCommand
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextObjectAddress
{
public:
/**
Creates the address given a container and an object.
*/
wxRichTextObjectAddress(wxRichTextParagraphLayoutBox* topLevelContainer, wxRichTextObject* obj) { Create(topLevelContainer, obj); }
/**
*/
wxRichTextObjectAddress() { Init(); }
/**
*/
wxRichTextObjectAddress(const wxRichTextObjectAddress& address) { Copy(address); }
void Init() {}
/**
Copies the address.
*/
void Copy(const wxRichTextObjectAddress& address) { m_address = address.m_address; }
/**
Assignment operator.
*/
void operator=(const wxRichTextObjectAddress& address) { Copy(address); }
/**
Returns the object specified by the address, given a top level container.
*/
wxRichTextObject* GetObject(wxRichTextParagraphLayoutBox* topLevelContainer) const;
/**
Creates the address given a container and an object.
*/
bool Create(wxRichTextParagraphLayoutBox* topLevelContainer, wxRichTextObject* obj);
/**
Returns the array of integers representing the object address.
*/
wxArrayInt& GetAddress() { return m_address; }
/**
Returns the array of integers representing the object address.
*/
const wxArrayInt& GetAddress() const { return m_address; }
/**
Sets the address from an array of integers.
*/
void SetAddress(const wxArrayInt& address) { m_address = address; }
protected:
wxArrayInt m_address;
};
class WXDLLIMPEXP_FWD_RICHTEXT wxRichTextAction;
/**
@class wxRichTextCommand
Implements a command on the undo/redo stack. A wxRichTextCommand object contains one or more wxRichTextAction
objects, allowing aggregation of a number of operations into one command.
@library{wxrichtext}
@category{richtext}
@see wxRichTextAction
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextCommand: public wxCommand
{
public:
/**
Constructor for one action.
*/
wxRichTextCommand(const wxString& name, wxRichTextCommandId id, wxRichTextBuffer* buffer,
wxRichTextParagraphLayoutBox* container, wxRichTextCtrl* ctrl, bool ignoreFirstTime = false);
/**
Constructor for multiple actions.
*/
wxRichTextCommand(const wxString& name);
virtual ~wxRichTextCommand();
/**
Performs the command.
*/
bool Do();
/**
Undoes the command.
*/
bool Undo();
/**
Adds an action to the action list.
*/
void AddAction(wxRichTextAction* action);
/**
Clears the action list.
*/
void ClearActions();
/**
Returns the action list.
*/
wxList& GetActions() { return m_actions; }
protected:
wxList m_actions;
};
/**
@class wxRichTextAction
Implements a part of a command.
@library{wxrichtext}
@category{richtext}
@see wxRichTextCommand
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextAction: public wxObject
{
public:
/**
Constructor. @a buffer is the top-level buffer, while @a container is the object within
which the action is taking place. In the simplest case, they are the same.
*/
wxRichTextAction(wxRichTextCommand* cmd, const wxString& name, wxRichTextCommandId id,
wxRichTextBuffer* buffer, wxRichTextParagraphLayoutBox* container,
wxRichTextCtrl* ctrl, bool ignoreFirstTime = false);
virtual ~wxRichTextAction();
/**
Performs the action.
*/
bool Do();
/**
Undoes the action.
*/
bool Undo();
/**
Updates the control appearance, optimizing if possible given information from the call to Layout.
*/
void UpdateAppearance(long caretPosition, bool sendUpdateEvent = false,
wxArrayInt* optimizationLineCharPositions = NULL, wxArrayInt* optimizationLineYPositions = NULL, bool isDoCmd = true);
/**
Replaces the buffer paragraphs with the given fragment.
*/
void ApplyParagraphs(const wxRichTextParagraphLayoutBox& fragment);
/**
Returns the new fragments.
*/
wxRichTextParagraphLayoutBox& GetNewParagraphs() { return m_newParagraphs; }
/**
Returns the old fragments.
*/
wxRichTextParagraphLayoutBox& GetOldParagraphs() { return m_oldParagraphs; }
/**
Returns the attributes, for single-object commands.
*/
wxRichTextAttr& GetAttributes() { return m_attributes; }
/**
Returns the object to replace the one at the position defined by the container address
and the action's range start position.
*/
wxRichTextObject* GetObject() const { return m_object; }
/**
Stores the object to replace the one at the position defined by the container address
without making an address for it (cf SetObject() and MakeObject()).
*/
void StoreObject(wxRichTextObject* obj) { m_object = obj; }
/**
Sets the object to replace the one at the position defined by the container address
and the action's range start position.
*/
void SetObject(wxRichTextObject* obj) { m_object = obj; m_objectAddress.Create(m_buffer, m_object); }
/**
Makes an address from the given object.
*/
void MakeObject(wxRichTextObject* obj) { m_objectAddress.Create(m_buffer, obj); }
/**
Sets the existing and new objects, for use with wxRICHTEXT_CHANGE_OBJECT.
*/
void SetOldAndNewObjects(wxRichTextObject* oldObj, wxRichTextObject* newObj) { SetObject(oldObj); StoreObject(newObj); }
/**
Calculate arrays for refresh optimization.
*/
void CalculateRefreshOptimizations(wxArrayInt& optimizationLineCharPositions, wxArrayInt& optimizationLineYPositions);
/**
Sets the position used for e.g. insertion.
*/
void SetPosition(long pos) { m_position = pos; }
/**
Returns the position used for e.g. insertion.
*/
long GetPosition() const { return m_position; }
/**
Sets the range for e.g. deletion.
*/
void SetRange(const wxRichTextRange& range) { m_range = range; }
/**
Returns the range for e.g. deletion.
*/
const wxRichTextRange& GetRange() const { return m_range; }
/**
Returns the address (nested position) of the container within the buffer being manipulated.
*/
wxRichTextObjectAddress& GetContainerAddress() { return m_containerAddress; }
/**
Returns the address (nested position) of the container within the buffer being manipulated.
*/
const wxRichTextObjectAddress& GetContainerAddress() const { return m_containerAddress; }
/**
Sets the address (nested position) of the container within the buffer being manipulated.
*/
void SetContainerAddress(const wxRichTextObjectAddress& address) { m_containerAddress = address; }
/**
Sets the address (nested position) of the container within the buffer being manipulated.
*/
void SetContainerAddress(wxRichTextParagraphLayoutBox* container, wxRichTextObject* obj) { m_containerAddress.Create(container, obj); }
/**
Returns the container that this action refers to, using the container address and top-level buffer.
*/
wxRichTextParagraphLayoutBox* GetContainer() const;
/**
Returns the action name.
*/
const wxString& GetName() const { return m_name; }
/**
Instructs the first Do() command should be skipped as it's already been applied.
*/
void SetIgnoreFirstTime(bool b) { m_ignoreThis = b; }
/**
Returns true if the first Do() command should be skipped as it's already been applied.
*/
bool GetIgnoreFirstTime() const { return m_ignoreThis; }
protected:
// Action name
wxString m_name;
// Buffer
wxRichTextBuffer* m_buffer;
// The address (nested position) of the container being manipulated.
// This is necessary because objects are deleted, and we can't
// therefore store actual pointers.
wxRichTextObjectAddress m_containerAddress;
// Control
wxRichTextCtrl* m_ctrl;
// Stores the new paragraphs
wxRichTextParagraphLayoutBox m_newParagraphs;
// Stores the old paragraphs
wxRichTextParagraphLayoutBox m_oldParagraphs;
// Stores an object to replace the one at the position
// defined by the container address and the action's range start position.
wxRichTextObject* m_object;
// Stores the attributes
wxRichTextAttr m_attributes;
// The address of the object being manipulated (used for changing an individual object or its attributes)
wxRichTextObjectAddress m_objectAddress;
// Stores the old attributes
// wxRichTextAttr m_oldAttributes;
// The affected range
wxRichTextRange m_range;
// The insertion point for this command
long m_position;
// Ignore 1st 'Do' operation because we already did it
bool m_ignoreThis;
// The command identifier
wxRichTextCommandId m_cmdId;
};
/*!
* Handler flags
*/
// Include style sheet when loading and saving
#define wxRICHTEXT_HANDLER_INCLUDE_STYLESHEET 0x0001
// Save images to memory file system in HTML handler
#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_MEMORY 0x0010
// Save images to files in HTML handler
#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_FILES 0x0020
// Save images as inline base64 data in HTML handler
#define wxRICHTEXT_HANDLER_SAVE_IMAGES_TO_BASE64 0x0040
// Don't write header and footer (or BODY), so we can include the fragment
// in a larger document
#define wxRICHTEXT_HANDLER_NO_HEADER_FOOTER 0x0080
// Convert the more common face names to names that will work on the current platform
// in a larger document
#define wxRICHTEXT_HANDLER_CONVERT_FACENAMES 0x0100
/**
@class wxRichTextFileHandler
The base class for file handlers.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextFileHandler: public wxObject
{
DECLARE_CLASS(wxRichTextFileHandler)
public:
/**
Creates a file handler object.
*/
wxRichTextFileHandler(const wxString& name = wxEmptyString, const wxString& ext = wxEmptyString, int type = 0)
: m_name(name), m_extension(ext), m_type(type), m_flags(0), m_visible(true)
{ }
#if wxUSE_STREAMS
/**
Loads the buffer from a stream.
Not all handlers will implement file loading.
*/
bool LoadFile(wxRichTextBuffer *buffer, wxInputStream& stream)
{ return DoLoadFile(buffer, stream); }
/**
Saves the buffer to a stream.
Not all handlers will implement file saving.
*/
bool SaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream)
{ return DoSaveFile(buffer, stream); }
#endif
#if wxUSE_FFILE && wxUSE_STREAMS
/**
Loads the buffer from a file.
*/
virtual bool LoadFile(wxRichTextBuffer *buffer, const wxString& filename);
/**
Saves the buffer to a file.
*/
virtual bool SaveFile(wxRichTextBuffer *buffer, const wxString& filename);
#endif // wxUSE_STREAMS && wxUSE_STREAMS
/**
Returns @true if we handle this filename (if using files). By default, checks the extension.
*/
virtual bool CanHandle(const wxString& filename) const;
/**
Returns @true if we can save using this handler.
*/
virtual bool CanSave() const { return false; }
/**
Returns @true if we can load using this handler.
*/
virtual bool CanLoad() const { return false; }
/**
Returns @true if this handler should be visible to the user.
*/
virtual bool IsVisible() const { return m_visible; }
/**
Sets whether the handler should be visible to the user (via the application's
load and save dialogs).
*/
virtual void SetVisible(bool visible) { m_visible = visible; }
/**
Sets the name of the handler.
*/
void SetName(const wxString& name) { m_name = name; }
/**
Returns the name of the handler.
*/
wxString GetName() const { return m_name; }
/**
Sets the default extension to recognise.
*/
void SetExtension(const wxString& ext) { m_extension = ext; }
/**
Returns the default extension to recognise.
*/
wxString GetExtension() const { return m_extension; }
/**
Sets the handler type.
*/
void SetType(int type) { m_type = type; }
/**
Returns the handler type.
*/
int GetType() const { return m_type; }
/**
Sets flags that change the behaviour of loading or saving.
See the documentation for each handler class to see what flags are relevant
for each handler.
You call this function directly if you are using a file handler explicitly
(without going through the text control or buffer LoadFile/SaveFile API).
Or, you can call the control or buffer's SetHandlerFlags function to set
the flags that will be used for subsequent load and save operations.
*/
void SetFlags(int flags) { m_flags = flags; }
/**
Returns flags controlling how loading and saving is done.
*/
int GetFlags() const { return m_flags; }
/**
Sets the encoding to use when saving a file. If empty, a suitable encoding is chosen.
*/
void SetEncoding(const wxString& encoding) { m_encoding = encoding; }
/**
Returns the encoding to use when saving a file. If empty, a suitable encoding is chosen.
*/
const wxString& GetEncoding() const { return m_encoding; }
protected:
#if wxUSE_STREAMS
/**
Override to load content from @a stream into @a buffer.
*/
virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream) = 0;
/**
Override to save content to @a stream from @a buffer.
*/
virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream) = 0;
#endif
wxString m_name;
wxString m_encoding;
wxString m_extension;
int m_type;
int m_flags;
bool m_visible;
};
/**
@class wxRichTextPlainTextHandler
Implements saving a buffer to plain text.
@library{wxrichtext}
@category{richtext}
@see wxRichTextFileHandler, wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextPlainTextHandler: public wxRichTextFileHandler
{
DECLARE_CLASS(wxRichTextPlainTextHandler)
public:
wxRichTextPlainTextHandler(const wxString& name = wxT("Text"),
const wxString& ext = wxT("txt"),
wxRichTextFileType type = wxRICHTEXT_TYPE_TEXT)
: wxRichTextFileHandler(name, ext, type)
{ }
// Can we save using this handler?
virtual bool CanSave() const { return true; }
// Can we load using this handler?
virtual bool CanLoad() const { return true; }
protected:
#if wxUSE_STREAMS
virtual bool DoLoadFile(wxRichTextBuffer *buffer, wxInputStream& stream);
virtual bool DoSaveFile(wxRichTextBuffer *buffer, wxOutputStream& stream);
#endif
};
/**
@class wxRichTextDrawingHandler
The base class for custom drawing handlers.
Currently, drawing handlers can provide virtual attributes.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextDrawingHandler: public wxObject
{
DECLARE_CLASS(wxRichTextDrawingHandler)
public:
/**
Creates a drawing handler object.
*/
wxRichTextDrawingHandler(const wxString& name = wxEmptyString)
: m_name(name)
{ }
/**
Returns @true if this object has virtual attributes that we can provide.
*/
virtual bool HasVirtualAttributes(wxRichTextObject* obj) const = 0;
/**
Provides virtual attributes that we can provide.
*/
virtual bool GetVirtualAttributes(wxRichTextAttr& attr, wxRichTextObject* obj) const = 0;
/**
Gets the count for mixed virtual attributes for individual positions within the object.
For example, individual characters within a text object may require special highlighting.
*/
virtual int GetVirtualSubobjectAttributesCount(wxRichTextObject* obj) const = 0;
/**
Gets the mixed virtual attributes for individual positions within the object.
For example, individual characters within a text object may require special highlighting.
Returns the number of virtual attributes found.
*/
virtual int GetVirtualSubobjectAttributes(wxRichTextObject* obj, wxArrayInt& positions, wxRichTextAttrArray& attributes) const = 0;
/**
Do we have virtual text for this object? Virtual text allows an application
to replace characters in an object for editing and display purposes, for example
for highlighting special characters.
*/
virtual bool HasVirtualText(const wxRichTextPlainText* obj) const = 0;
/**
Gets the virtual text for this object.
*/
virtual bool GetVirtualText(const wxRichTextPlainText* obj, wxString& text) const = 0;
/**
Sets the name of the handler.
*/
void SetName(const wxString& name) { m_name = name; }
/**
Returns the name of the handler.
*/
wxString GetName() const { return m_name; }
protected:
wxString m_name;
};
#if wxUSE_DATAOBJ
/**
@class wxRichTextBufferDataObject
Implements a rich text data object for clipboard transfer.
@library{wxrichtext}
@category{richtext}
@see wxDataObjectSimple, wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextBufferDataObject: public wxDataObjectSimple
{
public:
/**
The constructor doesn't copy the pointer, so it shouldn't go away while this object
is alive.
*/
wxRichTextBufferDataObject(wxRichTextBuffer* richTextBuffer = NULL);
virtual ~wxRichTextBufferDataObject();
/**
After a call to this function, the buffer is owned by the caller and it
is responsible for deleting it.
*/
wxRichTextBuffer* GetRichTextBuffer();
/**
Returns the id for the new data format.
*/
static const wxChar* GetRichTextBufferFormatId() { return ms_richTextBufferFormatId; }
// base class pure virtuals
virtual wxDataFormat GetPreferredFormat(Direction dir) const;
virtual size_t GetDataSize() const;
virtual bool GetDataHere(void *pBuf) const;
virtual bool SetData(size_t len, const void *buf);
// prevent warnings
virtual size_t GetDataSize(const wxDataFormat&) const { return GetDataSize(); }
virtual bool GetDataHere(const wxDataFormat&, void *buf) const { return GetDataHere(buf); }
virtual bool SetData(const wxDataFormat&, size_t len, const void *buf) { return SetData(len, buf); }
private:
wxDataFormat m_formatRichTextBuffer; // our custom format
wxRichTextBuffer* m_richTextBuffer; // our data
static const wxChar* ms_richTextBufferFormatId; // our format id
};
#endif
/**
@class wxRichTextRenderer
This class isolates some common drawing functionality.
@library{wxrichtext}
@category{richtext}
@see wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextRenderer: public wxObject
{
public:
/**
Constructor.
*/
wxRichTextRenderer() {}
virtual ~wxRichTextRenderer() {}
/**
Draws a standard bullet, as specified by the value of GetBulletName. This function should be overridden.
*/
virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect) = 0;
/**
Draws a bullet that can be described by text, such as numbered or symbol bullets. This function should be overridden.
*/
virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, const wxString& text) = 0;
/**
Draws a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName. This function should be overridden.
*/
virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect) = 0;
/**
Enumerate the standard bullet names currently supported. This function should be overridden.
*/
virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames) = 0;
};
/**
@class wxRichTextStdRenderer
The standard renderer for drawing bullets.
@library{wxrichtext}
@category{richtext}
@see wxRichTextRenderer, wxRichTextBuffer, wxRichTextCtrl
*/
class WXDLLIMPEXP_RICHTEXT wxRichTextStdRenderer: public wxRichTextRenderer
{
public:
/**
Constructor.
*/
wxRichTextStdRenderer() {}
// Draw a standard bullet, as specified by the value of GetBulletName
virtual bool DrawStandardBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect);
// Draw a bullet that can be described by text, such as numbered or symbol bullets
virtual bool DrawTextBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect, const wxString& text);
// Draw a bitmap bullet, where the bullet bitmap is specified by the value of GetBulletName
virtual bool DrawBitmapBullet(wxRichTextParagraph* paragraph, wxDC& dc, const wxRichTextAttr& attr, const wxRect& rect);
// Enumerate the standard bullet names currently supported
virtual bool EnumerateStandardBulletNames(wxArrayString& bulletNames);
};
/*!
* Utilities
*
*/
inline bool wxRichTextHasStyle(int flags, int style)
{
return ((flags & style) == style);
}
/// Compare two attribute objects
WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2);
WXDLLIMPEXP_RICHTEXT bool wxTextAttrEq(const wxRichTextAttr& attr1, const wxRichTextAttr& attr2);
/// Apply one style to another
WXDLLIMPEXP_RICHTEXT bool wxRichTextApplyStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style, wxRichTextAttr* compareWith = NULL);
// Remove attributes
WXDLLIMPEXP_RICHTEXT bool wxRichTextRemoveStyle(wxRichTextAttr& destStyle, const wxRichTextAttr& style);
/// Combine two bitlists
WXDLLIMPEXP_RICHTEXT bool wxRichTextCombineBitlists(int& valueA, int valueB, int& flagsA, int flagsB);
/// Compare two bitlists
WXDLLIMPEXP_RICHTEXT bool wxRichTextBitlistsEqPartial(int valueA, int valueB, int flags);
/// Split into paragraph and character styles
WXDLLIMPEXP_RICHTEXT bool wxRichTextSplitParaCharStyles(const wxRichTextAttr& style, wxRichTextAttr& parStyle, wxRichTextAttr& charStyle);
/// Compare tabs
WXDLLIMPEXP_RICHTEXT bool wxRichTextTabsEq(const wxArrayInt& tabs1, const wxArrayInt& tabs2);
/// Convert a decimal to Roman numerals
WXDLLIMPEXP_RICHTEXT wxString wxRichTextDecimalToRoman(long n);
// Collects the attributes that are common to a range of content, building up a note of
// which attributes are absent in some objects and which clash in some objects.
WXDLLIMPEXP_RICHTEXT void wxTextAttrCollectCommonAttributes(wxTextAttr& currentStyle, const wxTextAttr& attr, wxTextAttr& clashingAttr, wxTextAttr& absentAttr);
WXDLLIMPEXP_RICHTEXT void wxRichTextModuleInit();
#endif
// wxUSE_RICHTEXT
#endif
// _WX_RICHTEXTBUFFER_H_
|