My favorites | Sign in
Project Home Downloads Source
Checkout   Browse   Changes    
 
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
topic "ArrayCtrl";
[2 $$0,0#00000000000000000000000000000000:Default]
[i448;a25;kKO9;2 $$1,0#37138531426314131252341829483380:class]
[l288;2 $$2,2#27521748481378242620020725143825:desc]
[0 $$3,0#96390100711032703541132217272105:end]
[H6;0 $$4,0#05600065144404261032431302351956:begin]
[i448;a25;kKO9;2 $$5,0#37138531426314131252341829483370:item]
[l288;a4;*@5;1 $$6,6#70004532496200323422659154056402:requirement]
[l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param]
[i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam]
[b42;2 $$9,9#13035079074754324216151401829390:normal]
[{_}%EN-US
[ {{10000t/25b/25@3 [s0;%- [*@(229)4 ArrayCtrl]]}}&]
[s5;K%- &]
[s0;
@@image:2362&1443
Šƒô‚΁€€€€€€€€€ø§œíݱîë¼å ¦Ðì¯ëȂž²„ï ‹ð͟º­Û´ƒ¤”™ ÍƒÜù…ÊÞÀ›â²ÃðÙ§äږéБÎ©®òíÙ¢
歊ü ÊòÿûþïÿüÏÿý’¿ÿ‹€°–ÏŽ€Œéݽƒ³£õ–ª÷½÷ŒÌÔ»ó€ŽØ¨Þݳ°Ó“ï΃à¡ú÷ËÏÀ̽»€‡…êݽƒ³•
“Çò™à«ä›¤Ø‡Ù† ’íÐàä›€È¶Åõí€¢Ùª†ÖÁ¶ˆäț؇ن ’ íàä›€È‹¶õí€¢ÕنÖÁ¶ˆä›Ø‡Ù† 
ђíàšä›¿———´†ð÷ÿÛÞ¦—ÏÏÏåýþŸ×í·Ûソ¿ŸÎ§Êá§¾¾¾îڊ´Ô‰Ë¡ÛÀºÛܟíŽÇ㱫’ðÊó¾ç·˜ýýý呿è
ö´À„¬ôüü²üë÷¨ÛÀòÕȶ°Ž÷ç›ç÷÷÷â¥á•ýæýίÙï÷½•Ô“„ÅŠƒÎûŽå›ØŽÝنÖáþì“ôÎñìö»øÇÏߝ–ÊóÚ¨
³ÅáðÈç Î§Óçççþ¾±§¸û£ÛÀß¶§ÛÀºÜ™íõò‰©°ú§¿¿ÿâ´Ô÷÷÷ûå´Ì’ŸØÉ÷¯½‘í௓Øíàî̶é®ÄÇÛÛÛøï
ø·þ÷¯ÎËË¥óÎ•à“¥Ý³·ù’²üúõ²¬ÃÙþ¦òŸŸŸçÞÿ×ÓÆÿ֦åòíýüü„οžŸŸÓȨ±¿›Ž‡Ã÷ⅻñ©
ô⁆…ûúúŒªŠŸßʯ¦“Ðáí×럝ªùúúúž¿ô‡Åš§×—­è˶õ¸§óÛä“ÒÃÎá£Ò´ÔÚ ŸƒÛЧý®¾›Ö…™¢ÍЈ¼é
ž«é„Òð¤ÌõˆÆÅêëˏêŠÅ›Öèô›…œØß©›…žåª¸Šû÷ÏÀªÌ—Æä©Š‰©èê´ÔžÅÃÒß¡ïÜý÷èôºÕ‚Í”®ï­œ‡É¥Ì
à›½ç“ÒÃóü¼×–äÖú»ÞºÑ ¹â¨ƒîݽƒ³Ýšó‘§¨¦¤¢«ÓÒùæòôñ³õݼÊå§Í ÂšùýýïåÅÉ¢¨…¡â€ŒÒÚÿþ¥ð
¶Ú¸þ辊˿ßáÄúÎÛ¨“Аìƒë°»ãیÎȕýÃÃè´Ôú÷ôö«§òîŠÒÃÏɍÞ“îèʅϠ… ´ÌÁ¹ç–™ãê·Ñï¯ïì킭È
š¶°Ž³³Íºë‹’ß咥Éû—Ñé©´­ÑÏٟú»Óº¥‹ôÊ茙¼£Ÿ¿ÕÕìÓï¯ïì킭Ț¶°Ž³³ÍºÅ‹²œçɗëéŽÎË¥íÎ
çþÔß­œÇ€˜ÂÊÉóÒäŕ†³Í©Ø¯ù¬Öùײͯ½¾³·‹´¢ÛÛÀºÌ˶Çߐºä¸­ÕÿßÖՒ„„°§ßïó°Ó©ÂêñÙðå‚ã”
Ðùæ¿õðÒÉëאָðëŠÎ•¤÷÷ŒÌԉ„†•ñ¹­ÓŒœÿÖòž±¾Ý©¨Ü±ºüœ¸²ËŞÞú’Ò¿ÐŰâ´Ï¯¥ä÷ԗøÍŒÅçÒ»û†æ
ݪ„ƒŠÊé“üÂñÉîùޱ¸¾ÿ¾Ìӿ󜯡±„”’ÿ©õéÊ´ÈÅ®úžô÷ÎæÑ¦â¼ß¦í®¿ùÐýʁð¯ËŠî«÷÷ŒÉÌԜËӎÿ
§ü¦¤Ë×Åԛ–™½Ö§Ó«ê¡ÒŒ·û郏éÂæ”ÞÆ×ùžŠ¼å¹ÄéՂäنÖĶ́õ˜‘íƟùë»´úˆ¼ó˜ãýå­ôËÿÔðÝüÂæø
ãÇðÔÒ´ñ÷Ó¤òóÄù„–Èìƒÿìƒë„°£ÛÔæöò£Å®ûúõßòÓÛ—î“Æºÿ÷ŒÒ´¼œ„¨Êç¼®½üÔ¹ÿч‰õ’íௐíà
äîͶ·ÍÝç¤ÕæÓȳLJúüÄËÚáÈþÐéõá¶¢âÏê ÊÐé²÷ééßùž°òÏ´¶ð©øò¼Ÿý¸ô¸ãËó¯ßÚßà—Éê¶°Ž·æ››
㮹ÍÑ¡Ÿ–•š½Öϼ¹ë¸ø‡ÓþÁʏєǓ¯“žž£³ÊãϞüæÕחøåÅáÞá»û†æªŽåó«Çþšú§ÜÔ«½úäàûƅúËÁ£¿û³
òü–àþ…Ì”ŠÈ–ž¹¼ªìÜ蘟Îÿ½ç»“—ß¶¿Â북õ¸©Ûܐ´¡•ŸŒü½çØÿññ‘âòÌø£¤Š¸æÐË¿”Õ¬öâµãëºÆö
ñ»Ýªÿøãí«í­þ‰ÑŠ·›­²œð›ä›žØ‡›²ÍŸÕ“¹‹Š ‘íà֝¶íҜӑ”‰©à³ä›ö؇Õç›Óé·”æ•Æ¯“‘ˆä›Ø‡õç
³›¼ê×¬¶Î¶õØÎµ¶ñ҆¨“í¬àÖíâ½Á㯯¯“‚¶Ì¶õØê÷¶˜Î¶¢õí€¢Ù†•ÖÁ¶ˆä›¤Ø‡Ù† ’í
Ðàä›€È¶Áõø‚àÌï­î™˜©÷çÍ°Ð½»çà¦ëޝ‡ÀÂõ™ú÷ž€Æ‹Õ»û†æêáÝù€¬ÔïîÀ™Ø­½Œ€°Ò¦²€°¦²
”€°¦²€¥°¦²€°¦©²€°¦²Ê€°¦²€°Ò¦²€°¦²”€°¦²€¥°¦²€°¦©²€°¦²Ê€°¦²€°Ò¦²€°¦²
”€°¦²Í«Ðπ¬ÃÇδÖúŸÊæ€ü轠ЙʶÐÊïـ¢Ÿ½‡„ºÓ†âÚéý¨ƒð£“÷€ÀçÚÀ«¡½å€þôž¢è̛襸
ë²Î€ü–ن͜¶ÐŠìƒÐ‹ìÃΛèÅÕ¶èŶ¡§ª´¢Û€ô¢§ÛÓ†Ú‘픀ú‘íÈ郳­È¶€½È¶Ç䴁Ö䛀Þä›òÚÀ«
‘²À¯²¹ªí •Ù† —·Ù†œ¶ÐŠì†ƒÐ‹ìÃΛÔèŶèŶª¡§´¢Û€ô¢ÛÓ†Úёí€ú‘íȜ郭Ì˶πկ¯¯ïïï
ןŸŸí“º™¨×üԝ›ú×ÐòÀ’ȶäÓ´Öž‘í’Ï××ׇö‹¿Ò϶š’íȤ郭¼´Û„¯»Ýï­»¹ÙȶÀå¤Å÷ÑûÀ ³
†í •ùƒñýÿùãñøöö–­–ÙåäÔ¹Â¶­íÉÈ郭¼¢ÛŒÄ©Þ„¿šô聋¦Û€óÈζ䴁֞—æíŽÇãÜæùÓù¹ÅŸ°Ü²
„°ìÃΛúèåñÙ¦¾Øéôúÿÿÿùªù‰‹„¿ÂÿóË×ײßïãÿßßßÇçỪ›ýëÖ¿õß´ÅÂáðóØíö¡ì¥Ôî÷醲üá
¸ëɧÁÂÇïÙ­õ¾ÛНÕôՇºŽþՕÀ¯“íÈ郅­ôɶáôÎÉãû®¼¸œ¸Ç󕤁º‰Ãßôô²¾õë³úçý›Çãñÿ´ÊÑðŠëô
Èֈ¡ÃÎ¯ÿõ×××¥í®ñþº¨Ø¾â¨Ù콠Й¶ÐˆÊñäÝú¼Ö–ÉóÒ¯¯¯Ûùëá´½´ÄìÇáÑí½¿»¿®ÿññ±õ±ì£ïݺþ
¦™ßÆè¾™ØÑ‹ûæ×ºí­‚ËŠ¯šøååÅ¡ÙûÀ ³ÖúÍ췞­•åҠܜäŠÈ£üȼéìñÍϯ”×çä‘Å‹ƒúœÌ‰çÿæçئ–­
¿¾üÄõÏø¶àÒêúûûûþíþί‡Ú§­‚”Ï‚ªÊ•ß©ÌËõéÛÊßèÌÓþáÓé«ìŽ…¸´’à—ø•½ðÎ봁֊£ëÖíãñôݰŒæ
üç›òÑüóóγªÅ¥Ÿù«Éüº¤­çÒø¿Õš»‡ßÔ²¾õëÅú§®öô½Ã·Â­ë¥šÎô¿Í¬õúª‹éóæÑŠ·õª¸ÕôÀ½‡
ĄºÓ†Ú©Ž…¬ùÇãű´Á§ëâǧúÂϋֵؑœüÀÉÃ÷èò•¦â¾¸ñý“ˆ×»Ý“ҍו’®ŠžøÊル¿ÃŸ–ƒ¬è°ûˆô
Ŧ´ÒœÙóÎÇ˪çŽûÇã𵣗賤µïí©¯Üß©ö苓פ¿ñµõáÍ¡ÆÝ䷯ݪÕíèç§Ôº­¹ºÞìúՀ‡ª§úÌރ‚é
òƒ­”ÇÖ¼ãÙ±ÆÕýþŸÀÏō¿øõÍø“¿òÓò·¦ùˆ©…ž¸ÌùëßôÓøÚ†·ð⵩Õ啫“êņž§¸˜Ðûˆô¦´Œ²ï˜›½¬Þ
çýà”ÑûöòÝ£ïݺþùË契¤‰™ãþœÚßÝܔ⃘ÕœŒ½‡„ÒºÓ†Ú™·ÌÉ͞–¯þðʹ¨½ûùÑ·îöÝÿŒå¾¿¿Ýó¯ùùùù·
ÿÛí÷ûÃáÓߦýÏ©îýãހ¥¨úàÞ¤ƒ‚éƒ­”¾ÇÖ­Ç㭇šòýú›”î»½Þ¦¿ºÒý¶úŠ˜¸þ‰‡«Íåϕžî¥É©†«Éß
×õèä °„²Ø¹í •ßÎÆ¶÷ܧµüŽ«îáðˆïå÷ðãݪÛþÌÀóѺÌÜÿÐÕîÀ½¥ªýß§•¾ê÷÷÷Ê၎䛲òÚÀ«¿œí
´¦¾ßæôÉ­¹Ã»úÒ©‰¼²€Œ¾¤çœ½úËðҊ˜¸þý¡û²ÍÕû¤Ç†¥ª¿…¨½Ý’ÿÕóäé§ÝáϽ€¿Æõ¶¡§´òË÷ÙæœÍá
’ÛŸËœ’À̬Äá°Îÿü±¸ß¾å˜°ž¸Ž“ÿÖä¥ÅŒÌÜÿŒï£ÿÀ¾ðÊô¡Ý¤û×£¼ì寧י¬Ê£…ÇË¥ÿ¥©ˆ…Õƒ¥óãÏþՊ
™ºªúàރ‚ɝ郭”ÇÖÏ­ÇãŒãùöñïɕÉàÒò«—îÈʇôûÖ¿ãÛÈ·Ýɑߘ“Þ̏©à«”™ä´Œâ׿ê§í ¯çâì½ Ð™
¢¶ÐÊñäÝúº¼Î»œçý޳øèÏ鏞ö€˜¾Ã¦Þö»ºÚì™ëŸñíäÜú¬ÍþöæÁÒ兀˵ü³¡„Ëå¸ôÕ¨¿‰¶°€ÅÑÉÙûÀ ³í 
ߕâȺõøœôýÄLJÙå“ÞµïïïÃû‚ýŠí…ø‘¦œ‡Šß¬üüüÏĕ‡‘½Ý·ô¼Úìù뿴ۆŠÔ¤§ÿçåˆÂõãýÓٕ•Ë÷½åóê
¡—ÊÕ©Ãøøýþ€äð…„•×˜Š‚¥íÈÜ郭Ì˶¿ãéÑåÛò݁Êõ“íÈ郭©È¶Ë®»°îѲ¹í •ÙÒæÉõ‡ÖͶª¡§´¢Û¬
ß¹îÀºÉ¶äÓ´Ö䛥׸Ø·Ù†œ¶»ÐŠì³äºƒë¦ÛÓ†ÚÄÙþ¶Ø«Ù›†œ¶ÐŠìƒƒÐ‹ìÃΛèªÅ¶èŶ¡Õ§´¢Û€ô
΢ېӆڑ¨í€ú‘íÈ鿃­È¶€½È޶䴁Ö䛡€Þä›òÚÀ¸«ÿ±Ûü•òö‚Ôɶ䴁²Öž€Ø†Þƒ²‚éƒ­ô¾Í”øÑûÀ 
¼³í •Þ‡²À€¿úˆô¦Î´ÒûІàúÇδèÖúŸÊ€ü謽 Ð™¶°åÉö¾€ëãôÛØ²ûŸ€õ±º¶í™½Àú˜Ý¶Ìއàý
ьîÛæïƒ°´¾Æ·­³÷ü؟£Û–ÙûÑíËì¼ý€ÖÇè¶åÉö¾€ëãôÛØ²ûŸ€õ±º¶í™½Àú˜Ý¶ÌއàýьîÛæïƒ°
´¾Æ·­³÷ü؟£Û–ÙûÑíËì¼ý€ÖÇè¶åáöþ“Ï€‹ÔÕ»÷ìæËõǕÞï¢÷ý®÷ïØÍ–ë·Ž½ßÄïދ¼àÜïÞ±›­
ùםû¿‰Þ½ž—À¸Þ½ã·ÊÛ®»öþ“½Ôû¯€ñ½ûDzî¶Ü÷ìý¦·ŠÎäŒÐ‰ì¼“í¹îØûÍÕȶÀÂȶѿ–뎽߄ì㬄ì“í¹
×îØûÍȶÀúÂȶіëŽÇ½ß„샬„øì“í¹îØûªÍȶÀÂȶÿі뎽߄ˆìƒ¬„ì“í¯¹îØûÍȶõÀÂȶі돎½ß„샬
ñ„ì“í¹îØÕûÍȶÀÂÈþ¶Ñ–뎽ߑ„샬„ì“Þí¹îØûÍÈê¶ÀÂȶіŸë޽߄ìƒâ¬„ì“í¹î›ØûÍÌ˶ÏþÕ¯¯¯ûýþ
¿ëëë¡Ýà쉳«ûçö¿¾²¾î܃¬›ì¼“í¹îØûͬ¼¢Ûä¡çøô¼¾´³œá÷ÿ³Íçççóó×óýéˆÖͶ³‰¶Ü÷ìý¦ªžší‚°¦¯
¶­Þüþ¶¹ÿꍰ…²Í´åźãï·ñç¶Ü™ý÷ûûû¿Ãß§åÞÞÞÚèõþüþҐ¨íàŠÙ¦ÚòÏݱ÷›øÄ¶Õ‰ÂÂɋ­êÔғن–ɶ
³‰¶Ü÷ìý¦ºž—í‚Ãáð—ûþþ¾»Û¬ëƶå’í墭םû¿‰½‡æ›àåå¥î®ùùù¹úñ珏˜þöûþýþÁÓéôþÓþž¾žþˆÿ
 ¯Þ­ÌšŽÈûýýÍ·º£ßðõåãÔÛ¼žÈøéÿߝÖû”ðéÌÄíÂûÖȶі뎟½ßÄ£³Íººõ“Ç—ôñüÏÞêíí­­¨î¬ª„—‡ñ
 ¥¯Ìˆ˜ÅÇӊÈôÓá«ËÁ痔•ÆÓܙŒ¯™¶¦¸Òîú÷ŽÝì¹îËØûÍ̛ö§®¯ŸÒËœþ¼¼˜þŽ©ž¨¾ûõõõ©ì¶ÄœóÒë
Ÿïïï£Ë—×ÛûÜßِÞê䥌µ®¾››Ý¸ÝؚâÈé¹Ý»ö³åºã±ï·±ïؽéÏùáÂù–Ó¤úÉҙ›———ô”ãŸéõâãêüí¡ÆÄ
†Ù¡ðïþŽçÊöáǗÏëÎÚ§¡ÂžÉß¿Ö狰ͲʹïåºóăÜÚ҅ÍÛ¸½²œ¤°Ê§Ä€©©®Ý‰ÿÍñæúôÞ§ŸÕŠÒùåºù‚º¿²
“—֐ʘŠßÀ߃°Ôôǽʇ™î¶Ü÷ìõý¦úæ›áïÒ²„ü’ßš½àí¼ÞøÜʃÊÚÒҚÝþžÊáë埸ïÑ»ìƒÓȶÑߖ뎽ßÄß
¬ì³¼ï©éęýšñø±¾ù›¿°²¶ú‘òӊ¿ºüŠŠàÑî·»œŽ›£÷ðÍÛ¢ìñ“ì“í¹îرûͼºÛŒÎáÓÔ¾þõ͕ˤÔäù©ëÈ
úçÇò¯¯¯£Ì¡Ç¶©ä›ÚèËõÇÞïâ÷ÑÙ¦þŸÔŒøµ¯¡ÛœÿŠ‘Êïòª”—’È˶°…쓞í¹îØûͼ¾ºÛ¤û²ÃŸ”Ó¾þײÍÔ
¨¼à°—ßü£ëÛÀ”²Í´åµºãï·ñèìϓÆý‰ãýýòú›ô–èÖë€íÞßßç”þûúòáӟŸŸ©ùõ¸÷ÜქۤÛÄÛ®»Ñöþ“Í¶é
—¡ÄÅρ׾’þÏýÒÃǖ·×ŸŠü­–—é—Ï—ÛÔÒԩӝçŠà›äµ›èËõÇÞï½âñÙæûû»æå€éφžøžü›ÑçՔ‰½ê¼á׬æÕ
ý¶’ÀÒµÓ²ºÜʶ‰¶Ü¦÷ìý¦ž‘íß¾¾¾òŸÛÊÇ烦ü¼ÿþçð­Ï¥ŽÛг‰èø¼¦§„ðϿ봱²ùå¯Â¤§¡Ç×ÙÓÆÇ¯ž
¨èƒ¢Ù¦Úòßݱ÷›¸³Û¨Üµ¼ýòžŸêë¼ôûÒ÷£×ô֖¯«ë—¶ò“Ô”Ÿ¢©Ê‚™ñ”‡Ñïޱ园םû¿‰¤ËƒúÍÝÐ¥
ô¡€Œ¾Ñîê·ææýŽøñøìœþª²üÝաҎÿó¼ÉïÀŠ»þ´üÊÀ·Œ›ÔœÇ½ÊûÇî¶Ü÷ì‘ý¦®è·õòÁ…éÂàž¼þ‹»òñʦ
訊‘ Š˜‰Á¢¬óêҹʟ»óöö¶Úچúá‡å«“”öð¸ä§ðÐâ¡Ç§žÒ¼†™ÎЁÑñŒÛöÙòÝï±÷›¸´ ÿÌ¡ÿºðÀ¢Û
”ÄÛ®»öþ“Õ²°²Í´Ëåºãï·¡ÛȀ‹¡ÛÄÛ®Ò»öþ“²°º²Í´åºã‰ï·¡Û€‹¡©ÛÄÛ®»öþª“²°²Í×´åºãï·±
™‚샬ƒì“Þí¹îØûÍÈê¶ÀÂȶіŸë޽߄ìƒâ¬„ì“í¹î«ØûÍȶÀÂýȶі뎽£ß„샬„켓í¹îØûÍÕȶÀÂȶÑ
¿–뎽߄ì㬄ì“í¹×îØûÍȶÀúÂȶіëŽ×½ßēÀ¢õíÙòݱÏ÷›èÝûŒóëÝ»ö³åººãï·Ñ»÷‚֘׻÷ìæË
ÖõÇÞï¢÷ïô…°®÷ïØÍߖ뎽ßÄïñދàÜïޱś­×ûŸ€µõ±ºí™½ûÀú˜Ý¶Ìވ‡àýŒîÛæ¥ïƒ°¾Æ·­ã³÷ØŸ£Û
÷–Ùû€¬ÑæíËìý€ÖÇËè¶åö¾€ëÄãôÛ²ûŸ€µõ±ºí™½ûÀú˜Ý¶Ìވ‡àýŒîÛæ¥ïƒ°¾Æ·­ã³÷ØŸ£Û÷–Ùû€¬Ñ
æíËìý€ÖÇËè¶åö¾€ëÄãôÛ²ûŸ€õõ±ºí™½ßµÄ“À¢õîû»Ùòݱ÷›óèÝûŒëÝÜ»ö³åºãïηѻ÷‚˜×Õ»÷ìæËõÇ
•Þï¢÷ý®÷ïØÍ–ë·Ž½ßÄïދ¼àÜïÞ±›­¹×û¿‰¢³¹ƒô¢ÛÄÛ¥®»öþ“²õ°²Í´åº’ã﷡ۀ‹Ò¡ÛÄÛ®»ö
Ôþ“²°²®Í´åºãï·¢¡Û€‹¡ÛÄÊÛ®»öþ“²ê°²Í´å¥ºã﷡ۀ¤‹¡ÛÄÛ®»©öþ“²°Ý²Í´åºãïÄ·¡Û€‹¡Û
”ÄÛ®»öþ“Õ²°²Í´Ëåºãï·¡ÛȀ‹¡ÛÄÛ®Ò»öþ“²°º²Í´åºã‰ï·¡Û€‹¡©ÛÄÛ®»öþî“ó²ÍÓÕëûëëþ¿ÿúú
øúè·ØÊççœç¨íËË˪…ÿî·ûÿÿ¿Î£Ë¿º‡‹Ê™ì–ì“폹îØûͼ¢‹Ûä¡çø¼¾…´³¼ÇÈßù¤™úøø˜þÖʶ‡‘í¢
ò­×û¿‰‡Þæ›àùùù™ñæ¿ßÏ©ÿŽØ¬ø ìƒÒ¢ÛÄÛ®»ö°þ“÷æ›Ñ÷ÿ¿¿¿óäðòïòÒ®óëãý™ý½¯ÞáðȂìôºýþþ
Ûæç󊳷²Ä‡¼ˆì“í¹ÇîØûͼ¢Û”Ä¡á܊‡ýÙ兛ž–Éòâø–ßû£ÛÀûƒÈ¶Ñ–뎟½ßÄã²Íðô¸œââÏÏÏØ÷÷ûÍìö»
ëÁ¦Êçïò ¥å›øÙ¦½Úòݱ÷›øòè¶¹çñàóóóô㟟Ÿ’±ü”Éãôº¿½¿¿§‡¿Æ®Ý»Ô”¦ïùýýÍ·šŽÇéñ«ü
þ¼­ª²¹°ªþØÂÊé©ÙÕô©Ö’î骬¸¡‰‹„’§­¿†Ï֗‡¾äµ›èËõÇÞï·âÑÙ¦º™æ½õ‘Ϗ½½ó½¥…¨ˆñ¡ÞœÆ•¼
ð°é¨ÏŠÈ”—®´¹úÒ¦ŠÞ¥¼´¹“†»…ÌÓÐýÕ©ÜÖ²º†Ñûí§Ã‹£ÛüúïÓȄũÚêï—Þ±›­×û·¿‰¢³¹µ‹ãººäʯ»Ý
Æîøñ´½”„ô””ߍãò苠œ”£ùú½™¿Â¸—ŸÎÉþۜýø´ÚÞᎊŠð°»žºù‹£Á¦©™îÄË禦–¢è¨½ûåÇî¶Ü÷ê½
®·óÜڅÍۊ¸ß⊴ɺßáðòò’ÆáñüÄı”¯Ö­Ä˜¸í’þ·Í³Çðå³çþçòͽ½½Åûõ„ˆ—Öœ§µ¸ûª³º’з©´’¸÷´
©¸“­Íüå‹Å‡’¦¯äї ¿ÁÒôǽ‡Å™î¶Ü÷袢ﶙΌ¥“””áü­âǾȇ´úõξ«¢•¥Ñ¾¥¨ÛÔëکΑáò͒·©Îð¥Ã
ë»éÓ¼É禬ª‹Ÿ³¹»áפ„îä›èËêõ‡¦úæ›áÕäÈȧÅà€ËÃùžãªëÐ˃ýÚ¾á¶Ø™îî¸òûªô³Üɰ„€äÔ¤™ô©õ¥
õëð†Û„…êí¢­×šè¥›í†“ÃéÌ¿Ëèӌӕ¤ýùɉÊچËò·Ì¶ÓÞº§€º“×ÒÈçæ‹êåßàƒ•ÁǶ‰¶Ü÷èâ«ÑÙ¦ØÈç
Äêח¨ºÿ¤ø÷¦œ°­±€³Ë¶ñ£Þ·í§É¦ÕȖþÑÑÄû÷ûŽÝì¹îÐÄû¼ñîúòõûý¤æ¬ùÖ¡¿¬ø·Íï̼×Ù¨òøýå›
¿ø‘›öÎÓäÚÓֆ¿©è¢•½ûÇî¶Ü÷ÄèâÞø·ýùèôßöøãÊÇÿ›„Êò£ÏëÛ¹¤Í™Õ¯Û‡™Ý¶‰Ÿ¹Žéïܺ«á¹÷Šî¨÷ïØÍ
ã–ëŽÍ”É­­ÝÐեӜüÐþž¤òñúáœÑº‹ôëõ–¶é‘ú£óäǗ¤ëòçç›âûª³ñ¥…´§ððŒ“¬œì¼“í¹îÐÄÃÁ³ÍºÉÒܹ
†Úùø½·–ÓŸ¸»ú–æâµïÉåÏÀ›˜›Ì†ïµ½ÏêÂØÁáÔˋçÖ§Êàϐí¢Ê­×šøÜ¶ñɟç׌앁Ïü Ìþ·üôÚÛðޟÑ
¶ß³ÊÿèáÒˆÁ¦ÿÜ޻ďߺ§ºÓé•Ë‘ñ¼–óŽò­ŽÏó¤Þ÷‹‡óÀ’ÈŽ¶Ñ–ëŽÍ¼â¢Ûüýý¥Ùùœá¶¸úñü—½·¾—¸ì
´«Æˆ°¬ç¿€“Ùì¢¯Þø¦·Œø©ø„Ï†À“ÿ˜Ó‘„ª…ŸýëöàõÆ×’ª•Êϓ‚ÍÓÿç Åòµ§Ð—ª˜ê¯ïץؠ¢æ»êÝ»ö³å
ÁºÃ“Å粯š‹ª˜ž¯¸Ï¥ˆÆõõÞú¦ô–¦¾üô×é× ŠÓÿ˛òÒÛ¿ðûүŃø®îÑɶ›–©è¨½ûÅÇî¶Ü÷袥èÌæõÁ•±
šôô目îî‰Þçç“ÉÉýå„Å¥ß֌¨ÂҚ½œ·ÒÑøËï½î÷Àɟ®„•ËÛ¼‘´¼¬ÁÑÖû÷÷ŽÝì¹îÐþÄљÌ낆µ£çˆ•ûô
¹¦ì®„¢ýþçŸÿìãØçÕÕ¤”âÍºÔøŸíííê½Âñ±¦¦ü¤ŸÇ‰ªŸ¬¤¢Ê᫦ïͫΡԮ°ßɨö¥œáÙåá“ùïãÖíë…Ýɶі
ÙëŽÍÌ˶‹£ò§‹¤²Í§´åºÃ“²õ°²Í´åºÔÓ²°²ÎÍ´åºÃ“²ê°²Í´å©ºÃ“²°²Í´åºÃ“Õ²°²Í´
£åºÃ“«È¶õÀºÈ¶Ñ–ëԎÍȶÀÂÈζіëŽÍÈê¶ÀÂȶі©ëŽÍȶÀȶіëŽÍÕȶÀÂȶÑӖëŽÍȶÀºÂȶіëŽ
ªÍȶÀÂȶ§Ñ–ëŽÍȶõÀÂȶіëÀŽÍ¼¬Òï×Þ±›­×šóèÝûŒëݜ»ö³åºÃ“©½û¯€ñ½ûÅÇî¶Ü÷è¢Ò÷®÷ï
ÏØÍ–ëŽÍô»î½€Æõîë»Ùò݁€õ©‘퀀µ‘íʀ€µ‘퀀ҵ‘퀀µ‘”퀀µ‘퀥€µ‘퀀µ©‘퀀µ‘íʀ€µ‘퀀
Òµ‘퀀µ‘”퀀µ‘퀥€µ‘퀀µ©‘퀀µ‘튀€µ‘íÚù€‚à™úˆô¦´ÒûІõàÇδсÖúŸÊ€üÙ轠Й¶Ð
ÒÊïـŸ½È‡„ºÓ†Úéøý¨ƒð£÷€äÀçÚÀ«Å‘Üõ†à·È¶ä£´Ö䛀ÞÈä›òÚÀ«²ˆÀ¯²¹íÕ •Ù† —Ù›†œ¶ÐŠìƒ
ƒÐ‹ìÃΛèªÅ¶èŶ¡Õ§´¢Û€ô΢ېӆڑ¨í€ú‘íÈ鿃­È¶€½È޶䴁Ö䛡€Þä›òÚÀ¢«²À¯²Ô¹í •Ù† 
î—Ù†œ¶ÐŠŒìƒÐ‹ìÃÎì›èåÎìóýý½ßïßÞ޹Қö»Ýáðú¸Î͏ýʸ²ùÂß­¶Šðв¹íû •û²ÍÛÛûÛӅÏÏϟ
›ŸŸíýˋöœÇâëá•⦛†ø¨Ù†Ýœ¶ÐÊììó“úúú©Ø¤ÍÿâÍÕ²½¿¿º—ۍ¯Ü¿Ý•€Ç“íÈéƒç­Ì˶¡´¤ßì÷ûü¼É
ã××מûîŸËœºÚ¶´¡µ÷Ûí⟦¥€Ô¿Á¶¡§´Ì²¯Û¤”ñ鴌Ɋ·÷ŸÂ›©—­ŸŠ¹‚ªýíڊؾ÷نœ¶Ðʼøìóõù¯¯¯
ñ¸Àˆ¹­ŽýýÑ÷ӄÔÛÛµÛ¹»„È´”Űü²¹í ¹•‡å›«Ëüäþþ¦ó»»Ý’®žæ™ýÈýà½éªÞۓª¦ËªÓÒùŠØ¿¾¾žþÝù
Ÿ¼ßï§¼›šŽ‡Ðæðú܂²ü‘²ÕññˆÑªØˆùŁ‹òó˗Š‰ììÃΛèåŠÞ¶É±ä¸ð´Ï‘¢Â±Ý–Î·ç›üÂîê¸ü¥é©´
×À÷÷÷ú»žÇö¹úîØçŠø´Ã¡ð¤­¤à“ÊÅ®ºÿ‹ÊÆÅêíªú“Þƒ‚éƒ¹­”ÇÖÄã±ëžÐøšõ¯÷Ï𶦔Æ‹€Ñ©Û±¡•Ý
¯–Ê£Èú»ß䍫ïžÎ§Îʰ‰Â·“ש“ò׌í¹Ô³Â´Ñà›ŠŽç¤÷€Àçõñ÷…Ù¦Ÿ’ù͘ÐéÒæêÝсùôÌØÃܾáüÛ¼ªçôØ
þŸ®­˜Š®äÎË囚¦‹ûÊ»ù”úþþþί緆åג—¥ ÔœÁÊ­ëïø„Ãà¯ÌªúàÞëÜ郭ÌζçЋç࢈¯¬ßšµÓô̰
æøäçÉÆý¶âùщ©â£»£ÓÒéÝáìöÑýݔ¥†Ÿö𽄦‰ÊÙÏ µ¼Êšø‘ëä›òÚÀ«÷ä›ó¿±½§Œà£³µ£Óä©ÀŒç²ò
öçæŒžûÅò”©Ùå×¹”Ûð™­ÃÚáèŲÂõ÷«†åœ­±£‡Ø¦÷نœ¶Ðʝ‘Ù¦¹žŸŸ®ŸÅÊ«§¾ñ†çÔ®‡¹¾Ô¶´ªá¼Ò
¿åìÐùڔЫýÝá™Ã€‰”©¥¯ø¾ÀÊøýéí©Øù¬Š–°Í²¹í‹ •ÖÙ¦—ÂÜΚӋó³õôÍ϶Ãߐ©ºä˜¢æ”¡€—ÏÕÕþò¢
Ö߸¸ì¸ò²±°ÁÅïÑûòÀ ³í •ÊŸü´ÓÜñ漣׌¾˜¶îÔºªÝ¸ôôϙ’üâì’ÏÑåãÄÙªöÛ襾À֔½úÇδ
¼ÖªãòՃññÆâ³òÅè‹ÄÓþ©³šÞ²ò»£ŒÑþ셧ÿçÞÂâ‰â©åð¸Ì¹°ˆ¹¯ö«ŸÉ‡Ÿþ´¢¿ê½ ‹Ð™¶ÐÊñäà͹˜§¾¸¯
åžÉ†ÓŗžáÖ»ü±ßòÒÄÕ±•åæç›Ò´Á”¢Í𻅗¾˜®ìÎ×üÍüžÕ“òíÈ郭ÌȚ¶éΟÊãõÀ¯ÝØÒùìÝçôû¤¦¾×÷
³Ò¶æç›ÊۈéŽîøîþážóüÃÝßÀ¤çېӆڙ‘Žíò©™Ëó«ÁéäÅñáÉå¹Áúé迚펦Îì¤í•ٝâ‘ÙæÒýÒ÷çÿžÁІ—
ô€Û¤ÛÓì†Ú™‘íÎÿêýÎÞø»ŸœÍʟÒû´¶÷ߔŸ¾ˆ÷Á‡çÑ¿¸þæôØãÿÍÑáÊ­îÆé³ù”Òì–ì“—¼­°¤Õ¨¼•½Í“
Εµ»ôÃ×À»Öȶ䴁Öõæå›óö䖳ŠÑ“”ùôͪîâù›´Å³¥åÖ£´ý–ÏÂËÕ«Ûù÷âµÍÙÇ×䟓¬üÀ¹°µÅ“ïÑûÀ ³í
Ÿ •âȚþȽžÎ§üìÍЂåæåø§õȬʓŸÝ÷ÓÏӐ¾™¸ÞÙÿú»—îÏÊÏñތ¯¥Ê«æáîï ©ú’Þ¤ƒ‚éƒ­”öÇÖ­‡æ÷÷
Ú÷ñ »ð÷å·÷¤òæ·ýÅéš«Ùæ¦ª‰©èøäàû¯²Íùßɘ”Ú㟡úñÍõõŸŠÊ«½õÕ§œ€•“íÈœéƒ­Ü™ížÆô˜÷­Æó•
×»¨€­“íȬ郭ȶ¿ ‡ý¬§‰© §§ÛÓ†Ú‘í’žíôº¥ù±‹¿‰ää›òÙÚÀ«²ÍÃå»ß­»¤€‚ì ÃΛèŶù—¨ü»õ҆¨
È¶ä´Öä÷›‡Š÷½¼£¼¸½Š˜’íÉÈ郭¬ªÛ„€ìŠìÃΛÔèŶèŶª¡§´¢Û€ô¢ÛÓ†Úёí€ú‘íÈÌ郭ȶ€½
È¶ä´Ö䛀Þä›òÚÄÀ«²À¯²¨¹í •نݠ—Ù†œ¶Ð™Ê“€ËÐûÀù ³í •Þ‡€²€¿úˆô¦´ÒûІõàÇδ
сÖúŸÊ€üÙ轠Й¶ÐÒÊïـŸ½È‡„ºÓ†€€Òµ‘퀀µ‘”퀀µ‘퀥€µ‘퀀µ©‘퀀µ‘íʀ€µ‘퀀ҵ‘퀀µ‘
”퀀µ‘퀥€µ‘퀀µ©‘퀀µ‘íʀ€µ‘퀀ҵ‘퀀µ‘€íÚù‚à™ú菈ô¦´Ò©ûІàÇÎ´ÖúŸÍʀüè½ Ð
•™¶ÐÊïÙŀŸ½‡„ºÓĆÚéý¨ƒð§£÷€ÀçÚÀæ«Å‘õ†à·È¶ä´Ö䛀Þä›òÚÄÀ«²À¯²¨¹í •نݠ—Ù†œ¶Ð
™ŠìƒÐ‹ìÃÐΛèŶèªÅ¶¡§´¢õۀô¢ÛÓĆڑí€ú‘²íÈ郭ȶö€½È¶ä´ˆÖ䛀Þ䛒òÚÀ«²À¢¯²¹í •
õن —Ù†œæ¶ÐŠìƒÐ‹ ìÃΛè¥É¶ùùùÉ눪ÿ·½öÿÍÓþÕ¨×ÛÛÛç…ççÛíµÙ›õðÇɶ䴁öÖî϶Çã±ÈØÉø¥ùð
†‹êÙ¦ùýýÎí¸­ûׅüâݲ¹í •ßû³Íûûû±«’ðÊóžà—ªÌ̶Áî·ë£µ­¦¥‡þ¨÷نœ¶ÐÊý‘Ù¦Íȅ‘¿»þñǧ¥êß
ƒÂñøüûû˯˴šœ‚¶Ì•¶¡§´ò競ɧ¤Î§ÓÃúû¯ÎËÍù¤’Ò¼‰ÿüÖ¯¹€Õ’íÈéܙí҄¼ÔœëÓÐÿ—ǧ¥¦ü‰©Ë
轿¿ÿÚÁ€Ëµ’íÈ郭Ûܙí҄Ԝݣ‰ÿÆÿ֦åòíýüüÄ¿œ°ßï§¼›ŒŽ‡Ýî—Þ€Ï±ãø‡ÓªçØ×××рüüÒ¥‚ÕԖ
í›Ò°ÊʦԸØ“Ù†œ¶ëÐʽ٦Ÿüšžª—¦¥Ò¾‚ßßßéﴑÅÓÿ·¬³¥—‡¡ü’ßô‚阍‚©ÖôÛìºÞëÑÅݦ—¬²’úÝ
»õ©úŠÞƒ’‚éƒ­”ǁÖÍÇ屡•îݝ–ÊÇüôÒ÷ț×ß½†Î•üýüü“ÄõÔ¦Ò‰åÓÆ‹Íתœ¾Ö›Ÿ˜º©à•íÕ¿™àý
ŸŠŽ¢÷€ÀçÙÚÀ«Å‘õÓÀÑÙÌÈÅ×§ç¥ò͍‡îʽ»ù”úþþÎñ¯ÿýý½¾¾ÿÆ·ò‡Ï¤¼ÒќÁÊ동ÖäôõʕÓê©ÈχÝÚ°Ë
óÛªÿ³ÀúÈö¶äžøŒé‡çäè„Ôñ´Ž¤ÎË¥÷ǯ¤¿©¼›¢ÔðÓ¯£—ЄµÄסò³È¡ïėχà«ÿ‰áïƒù锼ÃܚڰËÛªÿ³
ãÀú”½ð•Öâö¶É§š«†—“¤Œ°ìº­•¶µ¼Ê÷÷ê»ÓºˆôÅÊ茙¼Å暮º©ûÌȶ¶·Öø£äܛø„ÙÙ¦½¬˜Îž¤‹õ
¾Ç§¥Ò¶Š©µ¡©ï–ŽÇãùˆ¡¥¤©Ÿ¡¢ŠéÚª­­È•»¿ñÒ캎îÊŽ׋֨ÿñÊ݁•êíà‘æå›áðïÈݲœ–ªòïëêɸ¿
¯ßïóÌЩÂÚñÙðýé´õ›Š„­†íŽ“‡Ñ¼‚Íÿ‘ØÏ±¢—è½ ÀüÊÔÆßŠøôý•©ŠûƒÎ÷êå›ô¡òÅè¥òñ⬕»þ÷©Ïįគ
ðÍÿ‘ر¢—Éè½ ÀÊÔÆÿߊÊى­û—ìÖÞ͟úòôïÜËȬ’¡¥œŽ‡©—Þ¶çŞþ¼½ð©æ”ìú‹À‘Š•æïÚÖ¢¸²¦œŒ
Ûù½¿—®Œ©Ø¬³»Û¤‰¦ýœ†Û½ôÁÈôáóºŠèÆ£¦ëæ”̶³Î²¼ÆŒìÞóé¹¾…ùÇÈ«¼Ûù«Ý°’µü·¿°¹©þ±¼•´¥à
•³Š¦Û€çáنžãƶ©«Ïì¤é’”©ï­›òî孚˷£ÿû† ©šÞ‚´¥à•³Š¦Û€çÙنžãÖì“ע”ŸÂΫáÍçêæç›ü
ÁÄËÚáÈÐéÿõá¶¢âê Ñ«¿ôõµÞ÷´—̶Î²Î¼Æ­Ù¦Íñ€ÌùþÝúÐÞо­µ»Û̼è¹ëø›öþÁ‘‰¿Ðþ“™…Ž›ÝÖ삀ÿ
ŠÔÑËôžàú¥Š£ëꑘã΁Ìùöî迓ëÛª¿ûïéþ¬ü¤Éð®Ù‚ùÍʕÈÜöÏ´¸µà²”ð–íà±îÁʶ·ÍÈÅÃ짃ߓíÎÿ
®Î’¤´þˆœÙ¥®¹òÃѹù꫑ìÎè¤ñÓÁä›à¬ÛÛÀãܔíþèÊÝԀÉÒ¶ðˆÛȶé¬ç½ý¾¶°¨ù²¼Âê³Í©éôÊóâ•ß
•ƒ‚øý²¼çº³ÍÞµÊНҀÝȶð¦ˆÛɶÎڀ¬Ë£ÛÀ£¬»‹ÛÄÛ³ßÞÞ·¦Ü±ŽðËäěø„õ盀Š¥“íà‘ä›Á€Þ䛸„Ù
І —Ù†žÁµ¶èŶÇѐí€ú‘íàˆ‘ä›€Þä›Ôø„Ù† —Ù¨†žÁ¶èѶÇø‚à™¨úˆ°’½ˆå€þôžàè¥úŸÊ€üè
Ô½ ÀÊô¾”æøÑûÀ€•ñèý¨ƒð£÷€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€ø€€€ðÇüÏ
›ÿý¿½‹€€ãЌ샀¬‰˜ìƒ€¬‰ìƒª€üéÿÓ´Úæ
&]
[s0; &]
[s1;:ArrayCtrl`:`:class:%- [@(0.0.255)3 class][3 _][*3 ArrayCtrl][3 _:_][@(0.0.255)3 public][3 _][*@3;3 C
trl]&]
[s1; &]
[s0; [*
@@image:1843&731
€ƒ§õ€€€ƒ‹ÿ€€€€ø¿œíÏŽÜϐÆç•О£„§Þ€£‡ŽÜÉó€ðፀñˆ€¹Äܐÿ¤Ȑ‰ˆÊ²¡ÍüÝ¢°¢‰›ÅÍæ­Åˆ¸
……æ¬õÌ×÷›»ªûºË®ÿ±ŸÊ«ï­Ý³‹ý¹ÿÛ½³öŒÍ÷¼ß¡ˆì„‚±Žøó°‘ˆÄ¥ˆÁí÷‚‚ Šš„ÄÎýÎ퐗Îÿ¿·’žÂ™Ý
Ӛ“ñ” ›ÜØÛÉÏáÌîÍéé·¾¸ðéí¡÷¿Ê¬¦Ýߝݾý΀îð¨ï¥½…³»µ»§Û’çâîïˏº¿ž‡—“þ®ïþÚïÖåžÂ·ù¿øÏÒ
É´óã÷¦ûº÷Юµô¦ß¶ôêÅМ÷ÓÍö⎩¯¾íҗ±÷Ý­·ç×ì€Ýâ×ÄÌöôô¤†–óÉϹ¶ë­áÛåì£úèþ£èãç—î¿Éǯ
­¿þ׳†è†±÷ŠûºÛ®µÔð†Ð¹‹¾ß¼»žÇÙ×Îùµ™þÏî×ЅõכãÌììÄíŽÊ´¼ó÷¤ÇÐŞáú„æâ­Ë•£ƒºáÁçøãÁݖ™
ßÓ½„îñŽÝ¸¾ÆÉ®˜ºó´“ôí½à£¦¢çú›·îÉÿ½ä¼ñí¥Î„Ù¯é¬è‡—Ò呹ÁÝ©©—ïõ¼±×ǐïöæºÓÅÎÄÐö
Ø²ø”ý×¹‚Ÿè¸Ïû²³Íÿ¨™é’ÎÚو±ôŸÝüä¬âàÍÛöÑÕɀ®½ÆâùéÖØ­çÞö̗·×‘¥ŒÂÀ÷·”Îæ˜Ó½“„îðÄÙáŸ
…ãÌלº¯Óý¸Î«ážèÝÈËé痻ŽËñ¡ÛÊÏóÌé¼ÎÉùôÆï®ÌœßýƐæ¦ë²¼œçÒçØªöÔ¬šî¬É¿§›üÎÝúˆ·ÄƒóŒ’
·Ïé†ß—ÕåՑ¹ÝË螦£«ƒ®Ù´»®Íí¯»ØÊˆáĕ©éóºÓëÏé®ï¤£ýð󺪡ò·±ÍÐÚâÿüªÀ—¶§»½¢ûå뻿¤£ð
™Š”û¡…ç·òÌéί½ôö̹¹¬¸›Ë¿»¿ò¯½¼ù¡ý“„‚‘‹žç–ÝÞåðñãÁ󈄢–™óè£çù¹†õ‹Ê¨ˆŠÎ¤Ôïâþºµ¨¸´Ô
ÕË訄Ǚ¨¾×½ûéÖ ˜Þô퟉®€–ÈÞýô—î¿ûÙÞÐðøâ­÷£í¥ß‡ÛéşÞÞ»¾òû¹†Ù…îƵÝçïþô€“êîϗ€Î¨ñ
Ýçô“Љ¾§öۃ¬Â×ÓƉ·ç‹¶ôçÎ¼Î‰–½Ô¯ÕøŠ”ÉèºÑɕ©ëá苾Ùÿʉ©ôœ¿íµ¿¿ÿ÷ÿ«ƒƒƒû÷ïÜ¿¼Õññ± 
™Û­ô›Íæ²ù³¬™†îúÏð§ö…ÃíëèèˆÐµ˜éê€Ý¼åÐúúñǓÎÈ¡Ûß×êÕ·Þ¥èø€Ç†¡»öÃñŸçß»·Öìӌ”ºþ‚
Œ‹Â爻¹¹¼ô•–—㫪ø½Ìýžïҟ†¡»úý㗟Ãݔý¯´£Ï…îÞ½ûŽ®Œ˜ôϞ½ƒôªµ ›“•ˬþņ¡ûêΣܾ†Ê¼í¾¤
“й—ñ€î¦‡ÐѹŒ¯Ý—ßþ¾„×ijçü§©ôý™Û¦Áèžï…·èÚÏô˒á§è®ì½œÇÀ—œ——Â×ÿ´ž„îÏ­€ó–—陆îò
“­ûÞ¸â貞ƒºÃÃàô˜ÿí…èðÆÊ¾Ú†¡ûâæïóœÂ÷´ÕñÐÖ§§§îŜôÛÒº‰ÎáöåÏրŽ×¤¤¤å˜º«·ö¹õ‘£îéÓ
‹§€ŽÐÉå˜Ëº«·îð‚×¸ÞæˆÐ•Ȫžô¸Ë ª€Ý£‰¬Â§• “¦‰Ð•ˆ÷Ž©Áñ†ê…èÊӄ¡•“œÉ¨ø’ôžü½†–ðî©¿‡ù†
՜ɛƒèÊܝ£Éõ•žÊð©œÁŒæ€º’¡÷èòՋìÞÁ€Îºì€Ý‰ðû´é€ºŒ„Œ¸Î †ó€Â݉û´é€º£ŒÂĜ瘟¯Ž«ŸÖ†Ã†
×Е¸Ç“¶ ©“–¦â¸Ã¬Â̤þڛŒ›²æÐí¶›ÉÌúâÏÁꦍ݉£É›Ðɋ“‚ñœá–¦Ò¿Ý­†âÌǝ„®ý«®û´À郺éᢎ
ö³ÌÂÄê§µ£Á°Ùœôó‰ÃÃÐɋ“ñœ á–¦Ò¿­†Íûå¥Ý«“Ò¥ãìÛë°áֈ§Ÿìî…“ö¦íÀ§Ô­ÌÄñ†Ù˜œÈŠÚўº
¬ÊӐ¯É蒝íЈÒù‡¡•ܸܙ†ÎÚטˆãŒ³°‘¤º”µã¦Ð…ÙߧɏÿÊЪ…ÛϸǓ¶Ó “–¦â¸Ãä¬Ì¤ŽÅ혌‰ô‰ý㻀
¥ºúʨÌÄñå†Ù˜ÈŠÚܱ·è¼¡ž¤âò²ÀרŒñÂĜ瘅‰—Ô¡¨³ý£Òåòú””ºàċÖ´„°‘Ç™æá¢õ¨ê‡®È©
‚ô¦íÀ§­ªÌÄñ†Ù˜Èãý´¶˜¶€®íĽš´´„°‘Ç™Üû¹µ˜ƒèÊÜ£ÉöƒÐᮃÚî†Ð•¸Ç“†« “ŠÐɇé «ñ¦Ëï
‘ÂÞâðœÁŒõ怺’÷ԟùüƒÎ¤Í©šÝʄš×±§Á™„€Ý‰Ð‰÷òˆŽ³Ð¯ À×¢Ôøî…¡èĂô¥²Šž¾Ë ª€Ý뉬—јÈ
Üëßړ ú«‘á褅‰‰¼–âÐñŠ“ïµè¡ªÔ¾‰ªµ‘‰æã»¥‚´¾ÀÚú¬ß§†¡“–¦òÚáÂ·®ÌÔ¢¿‡ªÒéªÂð×ò¸Ó†¡“
Ԗ¦òڈÁǼ©ÌÔ¢‡ªÚ€ƒôù­ð䘰ºé᢯…˜ÆôœÂÄ­ú¨æª•å¥Ýûч¥àäÔÅۘ„鸞‹¾ÖžÏ•†¡“–¦òÊڈÁÇ©ÌÔ
Ç¢‡ªê¥¢©È—ÿýèµÛ’†®ñè™Ü²™†ÎژÈëÈ¡†§°Ñ‹Òžªê¦Ð…ßí÷ÈãàÂ‡Ì®¸ÏÊÜ»•¾á褅‰¼–ââÐñŠ“µè
áªæ‚ÝâÿÅàŽ““–ç¦í‹µÈ—á褧…‰¼–âÐñüŠ“µè¡ªæ€†Ý–Žô¯¿þÿҌóò‡Ë˘²Š“ùÌ­¤ ›¬Ìԟ¢‡ªší›©
±ãÃâëÂΊ±¸Þ½Öð‚·ŽŒÃ§­ÌÛ䵐ƒŽÓ˜á¨ÅÕå銗”ì—æÙ²Œ»´°‘פÆô‰ÂÄ­ú¨Äª›ÐåÏՅ첌´°‘×
–‚®½ÌȆôÒÚ²Šî²¨°ªÀ×¢«ÐÉ…èĂô¥Â³ãÃðœú¢º’áèńðç’µ°Â²–ÎêÏខç«Ò怺’÷èŒÒý¥§’œç
ºƒ¹€®Ä½ÕšÜՂ»— ¡“Ž›À×➔͚€ŽßåЪû؀º’÷è±Ò€ô™…‰¸ƒÎàÛû†ó€‚݉û´éƒºèéᢎ³Ì¾Äê§µÁ°é
ê†Ý¦þÅ«éüì·æŒ¯þƒÞ¹û´éƒºèéᢎ³ÌÂâĺĴˆÝ™é®™ô»êŠºšÇ“¶ “–¦¥â¸Ã¬Ì¤‚âÂËØ›ôå­îùîѤè¤
‹…‰¸Î°‹“穀вԖ—ªô½Ç—ÿ‰íÿº§×Ԑ¤‡¬³Ûã»Ç“¶Ó “–¦â¸Ã¤¬Ì¤ŽÅí蔏¥©È—³²™ÌЀéÓÈÏ·ÆäΰôÒ
ñÂĜ瘅‰§Ô¡¨³®¡øÞ‡Å ýÖøŒ‡ê¯µàœ„«ò¦íÀ§Ô­ÌÄñ†Ù˜ÌȝŠÚ±“èҒû‡·è¾üÝö§ùÂò²£„°‘Ç™æá¢
¸õ¨êÇÜ ‹à‚¢ÝÞ²Ûǝò²¦ŒÂĜþ瘅‰Ô¡¨¢³ý£¥ÈžðÏÄú®ßþéûÁÖøîѽ¤è¤…‰¸‘ΰ‹“©Ãѐ»ðÅÊ¡û´
À郺éᢎö³ÌÂÄê§µãÁ°ô¥îѽ¤è¤…‰¸ŸÎàÚËÁœÀ¢×âžÍš€Žä÷™Ôž¶€®¥Ä½š´€ÔÁ€Îºì€Ý‰ û´Ùþ—ö’
ƒƒãŒâ°çŒÖÝðÿ˜ Ë¸‹§þœæ™ð¦ú펷ӽòƄµš¨†–”ê¢Þń璪´‹Ó­Ä¨û¹„¥Ç™¨—溒ƒ¡Âó¯À§’Ò溒مŽß
˜åÐ՘éÊ䎕ºŒÂÄދïøÖž„°Ó•™È°ôÒÂÄÞ´‹±è¸…‰Ú¡ôÐÕ­çºÍµòی“ùñ•çˉ¾ì˜ß•ɼۙ†Îژ±ÈëÁŠÝ¸°
ªÑ‹žªÊ÷‹æÄøÐ͞’ØêÐɕјȐ롆§°Ñõ‹žªŠÐ•ÈŒ°ôÒÂÄދڱ踅‰ÚôˆÐÕ­¡›†¿¼Ý®ÒÕãä¶ÜÍúËËÉlj
Îí‹Ü£É›Ðàɋ“ù­Ä ‘㔦êÑÃՓµ‡®†Ë¸Ã™“œªƒèñ²ÍÁ‡åȰôÒ¡ÂÄދ±è¸‹…‰ÚôÐճՁ®ÕÆÌÇÌù”Ѫµ¨Ã
ÁÐɋ“ù­Ä£ ã”¦êÑÊÕ턺ÿç‡„¾¹
]&]
[s0;* &]
[s0; [* ArrayCtrl] implements basic grid functionality. It is typically
used for display and editation of arrays of values or (heterogeneous)
records. The records correspond to rows in the array, the individual
fields within each record can be either bound to columns or to
any generic [* Ctrl]`'s, thus supporting basic master`-detail functionality
with practically no additional cost.&]
[s0; &]
[s0; The standard derived classes extend various aspects of the ArrayCtrl
functionality. [* SqlArray] adds the nuts and bolts needed for
editing SQL`-based tables, whereas [* PopupTable] couples the ArrayCtrl
functionality with the drop`-down mechanism very similar to the
one used in popup menus. This opens the door for implementing
drop`-down controls like [* DropList] (aka [/ combo box]) or [* DropChoice]
(usually used together with a control of the [* EditField ]or [* DataPusher]
family to support coupling native data editation with drop`-down
selection, widely used for history or commonly used predefined
values. The [* ArrayPair] is, as its name implies, a pair of [* ArrayCtrl]`'s
with arrow buttons between them allowing to visually select subsets
of a certain set by moving its elements between the two lists.&]
[s0; &]
[s0; [*+117 The array data organization: indices and columns]&]
[s0; &]
[s0; There is a great deal of genericity supported by the ArrayCtrl
with respect both to its source data and its visual presentation.
Conceptually, the source array data is a matrix of [* Value]`'s.
There is a series of methods for accessing this source data,
the basic ones being [* Set] and [* Get]. The rows are addressed
by integer indices (zero based), the columns can be addressed
either by integer indices as well, or alternatively any source
column can be assigned an [* Id] identifier and addressed by it.
This is especially helpful in SQL`-based tables, where the table
column names can be used for the [* Id]`'s. A pair of methods,
[* GetPos] and [* GetId], can be used to translate these two column
addressing modes. In the code terminology, the columns in the
source data matrix are called [/ indices] whereas the visual (output)
columns are called simply [/ columns].&]
[s0; &]
[s0; The visual ArrayCtrl structure can be entirely independent of
the source data strucrure (although it`'s seldom helpful to make
the mapping completely arbitrary). Basically, each column can
have an arbitrary number of indices defining its source data.
Of course, the most common case is one index per column. This
is also simplest to address, because the column indices are equal
to the source data indices. However, many other combinations
are possible, each of which can be handy in certain situations:&]
[s0; &]
[s0;i150;O0; Index without a column: the most common of the `"special`"
cases is used mainly for row id`'s or other internally important
data without visual representation. The same behaviour can be
obtained by making a column invisible.&]
[s0;i150;O0; Column without an index (a [/ rownum column]): this less
common case can be used to display external data (not stored
in the table). &]
[s0;i150;O0; Multiple columns sharing the same index: this can be
used to display various aspects of a complex data object or to
display the same source data in multiple ways (e.g., a temperature
reading in Celsius and Fahrenheit degrees).&]
[s0;i150;O0; Column with multiple indices: can be used to display
information gathered from multiple source data columns. This
is used for instance in IconDes in TheIDE to display image identifiers
together with their sizes in the list. This is the most complicated
case because you have to implement a specific [* Display] for such
a multi`-index column.&]
[s0; &]
[s0; [* Note:] in the current U`+`+ version, the implementation of index`-less
columns (arrays with external data not stored in the source matrix)
is rather awkward. It is planned to enhance this feature in the
future by adding support for access to external data via a data
accessor interface object. &]
[s0; &]
[s0; [*+117 ArrayCtrl GUI: selection, editation, and local menu]&]
[s0; &]
[s0; Array rows can be selected using the mouse or keyboard. ArrayCtrl`'s
support both single`-selection (plain cursor) and multiselection
model. Of course, row selection can be controlled via the programmatic
array interface as well. The selection and cursor always spans
entire rows, it is not possible (without substantical patchwork)
to select only certain columns or individual cells.&]
[s0; &]
[s0; The ArrayCtrl rows can be inserted, edited and deleted either
programmatically, or via common GUI elements (mouse and keyboard
selection, local menu). It is possible to alter the standard
ArrayCtrl local menu using the [* WhenBar] callback.&]
[s0; &]
[s0; [* Note:] it is worth noting that the standard editation keys ([* Insert]
`= row insertion, [* Ctrl`+Enter] `= editation and [* Ctrl`+Delete]
`= deletion) are not hardcoded in the ArrayCtrl`'s [* Key] method,
they are mere hotkeys for the relevant local menu items. When
you change the ArrayCtrl`'s local menu, the editation hotkeys
change accordingly.&]
[s0; &]
[s0; A special but rather important case of array editation is [/ sorting]:
there is no specific standard GUI for that. If you aren`'t content
with programmatic sorting (e.g. after opening a dialog or after
loading the array data), you have to implement some GUI for that
as well. In certain cases, it is cool to use the [* HeaderCtrl]
[* WhenAction] method to allow sorting the array by clicking on
the header columns; alternatively you can add a sort function
to the array local menu or possibly somewhere else (like a standalone
button in the dialog).&]
[s0; &]
[s0; [* Insertion tricks: before, after, and the secrets of the AppendLine]&]
[s0; &]
[s0; In todays text editors, when you type a new letter, it is trivial
to see where in the text will the new letter go. This is so because
the caret is always positioned between a pair of successive letters
and thus is well defines the insertion spot. Additionally, the
caret can be placed in front of the first letter or after the
last letter, which naturally allows typing some text at the very
beginning or end.&]
[s0; &]
[s0; When inserting new rows into the array controls, things are
a bit more tricky. This is so because, unlike in the text editor,
the cursor is not placed [/ between] two successive rows, but [/ over]
a certain row. This is of course necessary to make row editing
possible (note that in the aforementioned text editor analogy,
a single letter is an atomic object whereas in the array it is
a potentially complex structure consisting of many columns and
data items). However, when it comes to row insertion, it has
two main troubles as its implication:&]
[s0; &]
[s0;i150;O9; [* 1.]-|It is necessary to decide somehow whether the new
row will go [/ above] or [/ below] the cursor row.&]
[s0;i150;O9; [* 2.]-|In an array with [/ n] rows, there are [/ n`+1] possible
locations for a new row (before the row #0, #1 ... #([/ n`-1])
and after the last row), but only [/ n] distinct cursor locations.&]
[s0; &]
[s0; Over the years, during the development of U`+`+, we experimented
with multiple ways to overcome these logical problems. As a result
of this, the ArrayCtrl supports a few methods allowing to fine`-tune
the row insertion mechanism. It is also worth noting that there
are cases, like in the case of SQL`-based tables, where the row
ordering is arbitrary or implicit and the exact `'location`'
of a new row doesn`'t make any sense. In such cases, it is possible
to replace array [/ insertion] function with the [/ append] function
emphasizing the fact that the visual row order is unimportant
and that insertion means merely adding a new record to the record
set.&]
[s0; &]
[s0; For arrays in which the order is important, there are two ways
to solve the [/ n`+1] row positions dilemma:&]
[s0; &]
[s0;i150;O9; [* 1.]-|Replacing the Insert function with a pair of functions
for inserting a new row [/ before] / [/ after] the current row.&]
[s0;i150;O9; [* 2.]-|Visually extending the array by adding a pseudo`-row
with no real data at its end; this creates the [/ n`+1]`-th cursor
position necessary to denote all the available row insertion
locations.&]
[s0; &]
[s0; In the first case, it is also possible to select which of the
insertion functions (before / after) takes precedence (which
of the two actions should be bound to the standard [* Insert] hotkey).
This corresponds to the [* BeforeAfterInserting] and [* AfterBeforeInserting]
methods. The second case is called the [* AppendLine] and is activated
by setting the property with the same name.&]
[s0; &]
[s0; To make all this even more interesting, a special mechanism
called [* InsertAppend] is available to make array filling as easy
as possible. When activated and the user appends a new row at
the table end, after pressing [* Enter] (to commit the inserted
row) another row is automatically added after it and opened for
editing. This mechanism is turned on by default, but it can be
disable by setting the [* NoInsertAppend] property to true.&]
[s3; &]
[s0; &]
[s0;%- &]
[ {{10000t/25b/25@3 [s0;%- [*@(229)4 Categorized method summary]]}}&]
[s9; The following table summarizes ArrayCtrl methods according to
the aspect of functionality they support together with a very
brief description. For more thorough documentation of the individual
methods see below.&]
[s0; &]
[ {{2337:7663-1 [s0; [* Initialization and configuration]]
:: [s0;%- ]
:: [s0; Reset]
:: [s0; clears column `& index definition and restores all ArrayCtrl
default properties]
:: [s0; IsEdit]
:: [s0; true `= array state automaton is currently in row editing mode]
:: [s0; IsInsert]
:: [s0; true `= array state automaton is currently in row insertion
mode]
:: [s0; SetLineCy]
:: [s0; sets array row height (global or individual for a single row)]
:: [s0; GetLineCy]
:: [s0; returns logical array row height (value set by preceding SetLineCy)]
:: [s0; GetLineY]
:: [s0; returns [/ y] position of given row (relative to table beginning)]
:: [s0; `[No`]AppendLine]
:: [s0; `[do not`] display an additional pseudo`-row used for row insertion]
:: [s0; IsAppendLine]
:: [s0; returns actual value of the [* AppendLine] property]
:: [s0; ShowAppendLine]
:: [s0; scrolls the table view to display the appending line]
:: [s0; `[No`]Inserting]
:: [s0; `[do not`] allow inserting new rows]
:: [s0; IsInserting]
:: [s0; returns actual value of the [* Inserting] property]
:: [s0; BeforeAfterInserting]
:: [s0; allow inserting rows before / after current row (default `=
before)]
:: [s0; AfterBeforeInserting]
:: [s0; allow inserting rows before / after current row (default `=
after)]
:: [s0; NoInsertAppend]
:: [s0; do not autoinsert another row after committing last row insertion]
:: [s0; IsEditing]
:: [s0; true `= (at least one column of the) ArrayCtrl supports editing]
:: [s0; `[No`]Duplicating]
:: [s0; `[do not`] allow row duplication]
:: [s0; IsDuplicating]
:: [s0; returns actual value of the [* Duplicating] property]
:: [s0; Appending]
:: [s0; allow appending new row at the table end]
:: [s0; IsAppending]
:: [s0; returns actual state of the [* Appending] property]
:: [s0; AutoAppending]
:: [s0; allow appending new row at the table end, Enter appends another
one]
:: [s0; IsAutoAppending]
:: [s0; returns actual state of [* AutoAppending] property]
:: [s0; `[No`]Removing]
:: [s0; `[do not`] allow table row removing]
:: [s0; IsRemoving]
:: [s0; returns actual state of the [* Removing] property]
:: [s0; `[No`]AskRemove]
:: [s0; `[do not`] prompt user to confirm row removal]
:: [s0; IsAskRemove]
:: [s0; returns actual state of the [* AskRemove] property]
:: [s0; Moving]
:: [s0; allow row swapping (moving a row before / after neighbouring
row)]
:: [s0; IsMoving]
:: [s0; returns actual state of the [* Moving] property]
:: [s0; `[No`]Header]
:: [s0; `[do not`] display table header]
:: [s0; `[No`]Track]
:: [s0; `[do not`] animate tracking table column widths]
:: [s0; `[No`]VertGrid]
:: [s0; `[do not`] display column breaks]
:: [s0; `[No`]HorzGrid]
:: [s0; `[do not`] display row breaks]
:: [s0; `[No`]Grid]
:: [s0; `[do not`] display both grids (VertGrid `+ HorzGrid)]
:: [s0; GridColor]
:: [s0; set grid line color]
:: [s0; EvenRowColor]
:: [s0; background color for even rows]
:: [s0; OddRowColor]
:: [s0; background color for odd rows]
:: [s0; RowFormat]
:: [s0; formats menu items substituting given word for the term `'row`']
:: [s0; RowName]
:: [s0; sets the context`-relevant word to substitute for `'row`' in
the local menu texts]
:: [s0; NoCursor]
:: [s0; do not highlight cursor row]
:: [s0; `[No`]MouseMoveCursor]
:: [s0; automatically move cursor as the mouse moves (used e.g. in PopupTable)]
:: [s0; `[No`]AutoHideSb]
:: [s0; `[do not`] display scroll bar only when necessary]
:: [s0; MultiSelect]
:: [s0; enable selecting multiple rows at the same time]
:: [s0; ColumnWidths]
:: [s0; sets logical column widths using a formatted string, e.g. `"1
5 10 10 5 1`"]}}&]
[s0; &]
[ {{2337:7663-1 [s0; [* Array index `& column structure management]]
:: [s0;%- ]
:: [s0; IndexInfo]
:: [s0; returns the [* IdInfo] structure describing an index (see below)]
:: [s0; AddIndex]
:: [s0; adds a new index to the source data matrix]
:: [s0; GetIndexCount]
:: [s0; returns number of index columns (columns in the source data
matrix)]
:: [s0; GetId]
:: [s0; returns identifier of a given index (given by its integral index)]
:: [s0; GetPos]
:: [s0; returns integral index of source matrix column ([/ index]) identified
by an [* Id]]
:: [s0; SetId]
:: [s0; sets the [* Id] identifier for a given index (column of the source
matrix)]
:: [s0; AddKey]
:: [s0; sets up the first index to act as primary key (often used for
SQL tables)]
:: [s0; GetKeyId]
:: [s0; returns primary key identifier (equal to [* GetId(0)])]
:: [s0; AddColumn]
:: [s0; adds a column`-index pair to the table (one data column, one
output column)]
:: [s0; AddColumnAt]
:: [s0; adds a column bound to a given index]
:: [s0; AddRowNumColumn]
:: [s0; adds a column without an index (used for external data)]
:: [s0; GetColumnCount]
:: [s0; returns number of (visual) columns in the table]
:: [s0; FindColumnWithPos]
:: [s0; locates table column according to given index number]
:: [s0; FindColumnWithId]
:: [s0; locates table column according to index identifier]
:: [s0; ColumnAt]
:: [s0; returns the [* ArrayCtrl`::Column] structure describing given column]
:: [s0; HeaderTab]
:: [s0; returns the [* HeaderCtrl`::Column] structure for the given column]
:: [s0; HeaderObject]
:: [s0; returns a reference to the [* HeaderCtrl] object for this table]
:: [s0; SerializeHeader]
:: [s0; serialize header layout information (column widths etc.)]
:: [s0; AddCtrl]
:: [s0; adds an outer control`-index pair to the table (one data column,
one outer Ctrl)]
:: [s0; AddCtrlAt]
:: [s0; adds an outer control bound to a given index]
:: [s0; AddRowNumCtrl]
:: [s0; adds an outer control without an index `- used ([/ seldom]) for
external data]
:: [s0; SetDisplay]
:: [s0; sets display for a given table column or cell]
:: [s0; GetDisplay]
:: [s0; returns column / cell display]
:: [s0; SetCtrl]
:: [s0; sets a [* Ctrl] object for custom editation of a given cell]
:: [s0; GetTotalCy]
:: [s0; returns total row height]
:: [s0; GetLineAt]
:: [s0; locate table row when given an [/ y] position (relative to table
top)]
:: [s0; GetClickColumn]
:: [s0; returns column number of last clicked column (Null if clicked
outside existing rows)]
:: [s0; GetClickRow]
:: [s0; returns row number of last clicked row (Null if clicked outside
existing rows)]
:: [s0; GetClickPos]
:: [s0; returns Point(GetClickColumn(), GetClickRow())]}}&]
[s0; &]
[ {{2337:7663-1 [s0; [* Data setting `& retrieval]]
:: [s0;%- ]
:: [s0; SetCount]
:: [s0; sets number of rows in the array]
:: [s0; SetVirtualCount]
:: [s0; sets number of rows in the array with external data]
:: [s0; GetCount]
:: [s0; returns number of rows]
:: [s0; Clear]
:: [s0; clears array data, identical to [* SetCount(0)]]
:: [s0; Shrink]
:: [s0; shrinks source data matrix to the minimum necessary size]
:: [s0; Get]
:: [s0; returns given Value element of the source data matrix]
:: [s0; GetOriginal]
:: [s0; returns given element of source data matrix before editation]
:: [s0; Set]
:: [s0; sets given element of the source data matrix]
:: [s0; GetKey]
:: [s0; returns given primary key (column #0 in the data matrix)]
:: [s0; GetOriginalKey]
:: [s0; returns `'old`' value of primary key before editation]
:: [s0; GetColumn]
:: [s0; returns value of a given output column (according to its index
mapping)]
:: [s0; GetConvertedColumn]
:: [s0; returns value of a given output column after applying its [* Convert]]
:: [s0; ReadRow]
:: [s0; returns a row of the source data matrix]
:: [s0; Add]
:: [s0; adds a new row at the end of table]
:: [s0; Insert]
:: [s0; inserts a new row into the table]
:: [s0; Remove]
:: [s0; removes a given table row]
:: [s0; SwapUp]
:: [s0; exchanges a table row with the preceding row]
:: [s0; SwapDown]
:: [s0; exchanges a table row with the next row]
:: [s0; Sort]
:: [s0; sorts table rows using a given predicate]
:: [s0; ClearCache]
:: [s0; clears data conversion cache]
:: [s0; InvalidateCache]
:: [s0; invalidates given table row in the conversion cache]}}&]
[s0; &]
[ {{2337:7663-1 [s0; [* Cursor `& selection management]]
:: [s0;%- ]
:: [s0; GetSelectCount]
:: [s0; returns number of currently selected rows]
:: [s0; IsSelection]
:: [s0; checks whether any rows are selected (identical to [* GetSelectCount()
> 0])]
:: [s0; Select]
:: [s0; selects / unselects given row or a series of rows]
:: [s0; IsSelected]
:: [s0; checks whether given row is selected]
:: [s0; ClearSelection]
:: [s0; clears the current selection]
:: [s0; SetCursor]
:: [s0; moves array cursor to a new row]
:: [s0; KillCursor]
:: [s0; removes the cursor away from the table]
:: [s0; CancelCursor]
:: [s0; cancels editation of current row]
:: [s0; IsCursor]
:: [s0; checks whether cursor is in the table (identical to [* GetCursor()
>`= 0])]
:: [s0; GetCursor]
:: [s0; returns current cursor row, `-1 when none]
:: [s0; GoBegin]
:: [s0; moves the cursor to the first table row]
:: [s0; GoEnd]
:: [s0; moves the cursor to the last table row]
:: [s0; GetCursorSc]
:: [s0; returns the location of the cursor row within the table view
area]
:: [s0; ScCursor]
:: [s0; scrolls the table to move the cursor row to given location within
the table view]
:: [s0; CenterCursor]
:: [s0; scrolls the table to move cursor into the middle of the current
view]
:: [s0; ScrollInto]
:: [s0; scrolls the table by minimum amount necessary to make given
row visible]
:: [s0; ScrollIntoCursor]
:: [s0; scrolls the table by minimum amount necessary to make cursor
row visible]
:: [s0; GetScroll]
:: [s0; returns current table scrollbar location]
:: [s0; ScrollTo]
:: [s0; sets table scrollbar location]
:: [s0; Find]
:: [s0; locates table row containing a given element]
:: [s0; FindSetCursor]
:: [s0; moves the cursor to table row containing a given element]}}&]
[s0;3 &]
[s0; &]
[s0; &]
[ {{2337:7663-1 [s0; [* GUI elements]]
:: [s0;%- ]
:: [s0; StdBar]
:: [s0; the default array local menu]
:: [s0; IsModified]
:: [s0; checks modification state of given array cell]
:: [s0; StartEdit]
:: [s0; open current array row for editing]
:: [s0; GetEditColumn]
:: [s0; returns the column being currently edited]
:: [s0; DoEdit]
:: [s0; corresponds to the local menu `'Edit`' function]
:: [s0; DoInsert]
:: [s0; corresponds to the local menu `'Insert`' function]
:: [s0; DoInsertBefore]
:: [s0; corresponds to the local menu `'Insert before`' function]
:: [s0; DoInsertAfter]
:: [s0; corresponds to the local menu `'Insert after`' function]
:: [s0; DoAppend]
:: [s0; corresponds to the local menu `'Append`' function]
:: [s0; DoRemove]
:: [s0; corresponds to the local menu `'Remove`' function]
:: [s0; DoDuplicate]
:: [s0; corresponds to the local menu `'Duplicate`' function]
:: [s0; DoSelectAll]
:: [s0; selects the entire array]
:: [s0; AcceptEnter]
:: [s0; commits the currently edited row and possibly begins insertion
of another row]}}&]
[s0; &]
[ {{2337:7663-1 [s0; [* Notification callbacks]]
:: [s0;%- ]
:: [s0; WhenLeftClick]
:: [s0; left mouse click within the array]
:: [s0; WhenLeftDouble]
:: [s0; left mouse doubleclick within the array]
:: [s0; WhenSel]
:: [s0; called when cursor or selection status of widget changes]
:: [s0; WhenCursor]
:: [s0; called whenever the cursor location changes [/ (deprecated, use
WhenSel)]]
:: [s0; WhenKillCursor]
:: [s0; called when the cursor moves away from the table [/ (deprecated,
use WhenSel)]]
:: [s0; WhenSelection]
:: [s0; called whenever current selection changes [/ (deprecated, use
WhenSel)]]
:: [s0; WhenEnterRow]
:: [s0; called whenever the cursor moves to a new row [/ (deprecated,
use WhenSel)]]
:: [s0; WhenUpdateRow]
:: [s0; called after updating a row]
:: [s0; WhenAcceptRow]
:: [s0; additional row validation callback]
:: [s0; WhenStartEdit]
:: [s0; called after initiating row editation]
:: [s0; WhenAcceptEdit]
:: [s0; called after accepting changes to a given row]
:: [s0; WhenArrayAction]
:: [s0; called whenever array source data changes (after insert / delete
/ edit)]
:: [s0; WhenBar]
:: [s0; can be used to supply custom local menu for the array]
:: [s0; WhenCtrlsAction]
:: [s0; called by [* WhenAction] callbacks of internally created controls]}}&]
[s3; &]
[s0; &]
[s0; &]
[s0;%- &]
[ {{10000t/25b/25@3 [s0;%- [*@(229)4 Detailed method description]]}}&]
[s0; &]
[s0; [* Initialization and configuration]&]
[s3; &]
[s0; &]
[s5;:ArrayCtrl`:`:Reset`(`):%- [@(0.0.255) void]_[* Reset]()&]
[s2; Clears table rows and resets all array properties to their default
values.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ShowAppendLine`(`):%- [@(0.0.255) void]_[* ShowAppendLine]()&]
[s2; Show an additional pseudo`-row at the table end. When clicked,
a new row is appended to the array.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsEdit`(`)const:%- [@(0.0.255) bool]_[* IsEdit]()_[@(0.0.255) const]&]
[s2; Checks whether the array is currently being edited.&]
[s7; [*/ Return value]-|[* true] `= a row is currently open for editing,
[* false] `= array is in normal browsing mode&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsInsert`(`)const:%- [@(0.0.255) bool]_[* IsInsert]()_[@(0.0.255) const]&]
[s2; Checks whether a new row is currently being inserted.&]
[s7; [*/ Return value]-|[* true] `= newly inserted row is currently being
edited, [* false] when not&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SetLineCy`(int`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* SetLineCy](
[@(0.0.255) int]_[*@3 cy])&]
[s2; Sets the (default) array row height. For certain rows, this
can be overriden by the two`-parameter version of this method.&]
[s7; [%-*C@3 cy]-|row height in pixels&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SetLineCy`(int`,int`):%- [@(0.0.255) void]_[* SetLineCy]([@(0.0.255) int]_
[*@3 i], [@(0.0.255) int]_[*@3 cy])&]
[s2; Sets row height for a given row. This overrides the default
value set by the one`-parameter version of this method.&]
[s7; [%-*C@3 i]-|row index (zero based)&]
[s7; [%-*C@3 cy]-|row height in pixels, [* Null] `= use default row height&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetLineCy`(`)const:%- [@(0.0.255) int]_[* GetLineCy]()_[@(0.0.255) const]&]
[s2; Returns default array row height.&]
[s7; [*/ Return value]-|row height in pixels&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetLineY`(int`)const:%- [@(0.0.255) int]_[* GetLineY]([@(0.0.255) int]_[*@3 i
])_[@(0.0.255) const]&]
[s2; Returns [/ y] position of given array row (the pixel distance
between the top of first array row and [/ i]`-th row, i.e. sum
of heights of all rows above this row).&]
[s7; [%-*C@3 i]-|row index (zero based)&]
[s7; [*/ Return value]-|Vertical position of row top in pixels (relative
to array beginning)&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetLineCy`(int`)const:%- [@(0.0.255) int]_[* GetLineCy]([@(0.0.255) int]_
[*@3 i])_[@(0.0.255) const]&]
[s2; Returns the height of a given row (either the row`-specific
row height, or, when Null, the default row height).&]
[s7; [%-*C@3 i]-|row index (zero based)&]
[s7; [*/ Return value]-|row height in pixels&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AppendLine`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* AppendLi
ne]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; The AppendLine property controls whether the array displays
an additional `'append`' row after its last (real) row. &]
[s7; [%-*C@3 b]-|[* true] `= display appending row, [* false] `= hide it&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoAppendLine`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoAppendLi
ne]()&]
[s2; Hide the appending line (identical to [* AppendLine(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsAppendLine`(`)const:%- [@(0.0.255) bool]_[* IsAppendLine]()_[@(0.0.255) c
onst]&]
[s2; Returns current state of the [* AppendLine] property.&]
[s7; [*/ Return value]-|[* true] `= display appending pseudo`-row at the
end of the array&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Inserting`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Inserting
]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Enable / disable inserting new rows in the array (no matter
which insertion mechanism is selected).&]
[s7; [%-*C@3 b]-|[* true] `= enable insertion, [* false] `= disable it&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoInserting`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoInserting
]()&]
[s2; Disables row insertion (identical to [* Inserting(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsInserting`(`)const:%- [@(0.0.255) bool]_[* IsInserting]()_[@(0.0.255) c
onst]&]
[s2; Returns current state of the [* Inserting] property.&]
[s7; [*/ Return value]-|[* true] `= row insertion is enabled, [* false]
when not&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Appending`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Appending
]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Enable / disable adding new rows at the table end.&]
[s7; [%-*C@3 b]-|[* true] `= enable row appending, [* false] `= disable
it&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsAppending`(`)const:%- [@(0.0.255) bool]_[* IsAppending]()_[@(0.0.255) c
onst]&]
[s2; Returns current state of the [* Appending] property.&]
[s7; [*/ Return value]-|[* true] `= appending rows is enabled, [* false]
when not.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AutoAppending`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* AutoA
ppending]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Same as [* Appending] but Enter pressed when editing a new row
accepts it and adds another one at the table end.&]
[s7; [%-*C@3 b]-|[* true ]to enable the mode&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsAutoAppending`(`)const:%- [@(0.0.255) bool]_[* IsAutoAppending]()_[@(0.0.255) c
onst]&]
[s2; Returns current state of [* AutoAppending] property.&]
[s7; [*/ Return value]-|[* true] `= [* AutoAppending ]is active&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:BeforeAfterInserting`(int`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_
[* BeforeAfterInserting]([@(0.0.255) int]_[*@3 q]_`=_[@3 1])&]
[s2; Activate before / after row insertion mechanism ([* Insert] hotkey
`= before).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AfterBeforeInserting`(int`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_
[* AfterBeforeInserting]([@(0.0.255) int]_[*@3 q]_`=_[@3 2])&]
[s2; Activate before / after row insertion mechanism ([* Insert] hotkey
`= after)&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Duplicating`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Duplica
ting]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Enable / disable row duplication. Note that this property only
controls whether the `'Duplicate`' item should be present in
the array local menu. Of course, nothing can prevent you from
supporting duplication in some other way, or from calling the
[* DoDuplicate] method as you see fit.&]
[s7; [%-*C@3 b]-|[* true] `= enable duplication, [* false] `= disable it&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoDuplicating`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoDuplica
ting]()&]
[s2; Disable row duplication (identical to [* Duplicating(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsDuplicating`(`)const:%- [@(0.0.255) bool]_[* IsDuplicating]()_[@(0.0.255) c
onst]&]
[s2; Returns the state of the [* Duplicating] property.&]
[s7; [*/ Return value]-|[* true] `= local menu offers row duplication,
[* false] when not&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoInsertAppend`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoIn
sertAppend]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Enables / disables the auto`-append mechanism (see above section
on inserting rows).&]
[s7; [%-*C@3 b]-|[* true] `= disable InsertAppend mechanism, [* false] `=
enable it (the default)&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsEditing`(`)const:%- [@(0.0.255) bool]_[* IsEditing]()_[@(0.0.255) const
]&]
[s2; Checks whether at least one array column supports editing (whether
it is possible to [/ open] a row for editation).&]
[s7; [*/ Return value]-|[* true] `= row editing is possible, [* false] when
not&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Removing`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Removing](
[@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Enable / disable deleting rows from the table.&]
[s7; [%-*C@3 b]-|[* true] `= enable deletion, [* false] `= disable it&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoRemoving`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoRemoving](
)&]
[s2; Disable deleting table rows (identical to [* Removing(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsRemoving`(`)const:%- [@(0.0.255) bool]_[* IsRemoving]()_[@(0.0.255) con
st]&]
[s2; Returns current state of the [* Removing] property.&]
[s7; [*/ Return value]-|[* true] `= row deletion is enabled, [* false ]when
not&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AskRemove`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* AskRemove
]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Sets whether the user must manually confirm array row deletion.
When set to [* true], every time a row is to be deleted, a confirmation
dialog pops up. When set to [* false], rows are deleted automatically
without any further confirmation.&]
[s7; [%-*C@3 b]-|[* true] `= prompt user to confirm row deletion, [* false]
`= delete rows instantly&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoAskRemove`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoAskRemove
]()&]
[s2; Disables user confirmation of row deletion (equivalent to [* AskRemove(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsAskRemove`(`)const:%- [@(0.0.255) bool]_[* IsAskRemove]()_[@(0.0.255) c
onst]&]
[s2; Returns current state of the [* AskRemove] property.&]
[s7; [*/ Return value]-|[* true] `= user confirmation is needed to delete
rows, [* false] `= rows are deleted immediately&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Moving`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Moving]([@(0.0.255) b
ool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Enable / disable row swapping. When set to [* true], it is possible
to move an array row up and down by swapping it with the previous
/ next row. This can be used to reorder array rows in a visually
straightforward manner.&]
[s7; [%-*C@3 b]-|[* true] `= offer row moving in the local menu, [* false]
`= don`'t&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsMoving`(`)const:%- [@(0.0.255) bool]_[* IsMoving]()_[@(0.0.255) const]&]
[s2; Returns current state of the [* Moving] property.&]
[s7; [*/ Return value]-|[* true] `= local menu supports row swapping,
[* false] `= it doesn`'t&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Header`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Header]([@(0.0.255) b
ool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Show / hide the [*^topic`:`/`/CtrlLib`/src`/HeaderCtrl`$en`-us^ HeaderCtrl]
object for this table.&]
[s7; [%-*C@3 b]-|[* true] `= show table header, [* false] `= hide it&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoHeader`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoHeader]()&]
[s2; Hide table header (equivalent to [* Header(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Track`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Track]([@(0.0.255) b
ool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Animate array column resizing. This is equivalent to setting
the [*^topic`:`/`/CtrlLib`/src`/HeaderCtrl`$en`-us`#`:`:HeaderCtrl`:`:Track`(bool`)^ T
rack] property in the array HeaderCtrl.&]
[s7; [%-*C@3 b]-|[* true] `= repaint the array repeatedly while dragging
column widths, [* false] `= regenerate everything only after drag
`& drop is finished.&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoTrack`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoTrack]()&]
[s2; Do not animate array column resizing (equivalent to [* Track(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:VertGrid`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* VertGrid](
[@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Show / hide vertical array grid lines (separating array columns).&]
[s7; [%-*C@3 b]-|[* true] `= show vertical grid lines, [* false] `= hide
them&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoVertGrid`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoVertGrid](
)&]
[s2; Hide vertical grid lines (equivalent to [* VertGrid(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:HorzGrid`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* HorzGrid](
[@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Show / hide horizontal grid lines (separating array rows).&]
[s7; [%-*C@3 b]-|[* true] `= show horizontal grid lines, [* false] `= hide
them&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoHorzGrid`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoHorzGrid](
)&]
[s2; Hide horizontal grid lines (equivalent to [* HorzGrid(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Grid`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Grid]([@(0.0.255) b
ool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Show / hide both horizontal and vertical grid lines (equivalent
to [* HorzGrid(b).VertGrid(b)]).&]
[s7; [%-*C@3 b]-|[* true] `= show grid line matrix, [* false] `= hide all
grid lines&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoGrid`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoGrid]()&]
[s2; Hide horizontal and vertical grid lines (equivalent to [* Grid(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GridColor`(Color`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* GridColo
r]([_^Color^ Color]_[*@3 c])&]
[s2; Sets the color for grid lines.&]
[s7; [%-*C@3 c]-|new grid line color&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:EvenRowColor`(Color`,Color`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_
[* EvenRowColor]([_^Color^ Color]_[*@3 paper]_`=_Blend(SColorMark,
SColorPaper, [@3 220]), [_^Color^ Color]_[*@3 ink]_`=_SColorText)&]
[s2; Sets the paper and ink (background and foreground) color for
even array rows. In certain cases setting a different background
color for odd and even rows helps to simplify visual orientation
in the arrays (especially when the array has many columns).&]
[s2; [* Note:] the even / odd row terminology refers to the natural
array row numbering, so first array row is [/ odd] and the second
is [/ even]. This is in contrast to the zero`-baesd integral row
indexing, where the first array row has index 0.&]
[s7; [%-*C@3 paper]-|background color to use for second, fourth, sixth
etc. array row&]
[s7; [%-*C@3 ink]-|foreground color for even rows&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:OddRowColor`(Color`,Color`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_
[* OddRowColor]([_^Color^ Color]_[*@3 paper]_`=_SColorInfo, [_^Color^ Color]_[*@3 ink]_`=_S
ColorText)&]
[s2; Sets the paper and ink (background and foreground) color for
odd array rows.&]
[s7; [%-*C@3 paper]-|background color to use for first, third, fifth
etc. array row&]
[s7; [%-*C@3 ink]-|foreground color for odd rows&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoCursor`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoCursor](
[@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Turns on / off highlighting cursor row.&]
[s7; [%-*C@3 b]-|[* true] `= do not highlight cursor row, [* false] `= default
behaviour (cursor row is shown in inverse colors)&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:MouseMoveCursor`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Mou
seMoveCursor]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Enables / disables automatical cursor row switching as the mouse
cursor moves over the array rows.&]
[s7; [%-*C@3 b]-|[* true] `= automatically switch cursor row, [* false]
`= only upon clicks and keyboard navigation&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoMouseMoveCursor`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoMou
seMoveCursor]()&]
[s2; Disable automatical cursor row switching (equivalent to [* MouseMoveCursor(false)])
.&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AutoHideSb`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* AutoHide
Sb]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; When set to [* true], the vertical scrollbar at the right array
edge is displayed only when the total row height exceeds the
array view height. When set to [* false], the scrollbar is shown
all the time.&]
[s7; [%-*C@3 b]-|[* true] `= show / hide the scrollbar as necessary, [* false]
`= display it unconditionally&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoAutoHideSb`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoAutoHide
Sb]()&]
[s2; Display vertical scrollbar all the time (equivalent to [* AutoHideSb(false)]).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:HideSb`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* HideSb]([@(0.0.255) b
ool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Hides vertical scrollbar (even if it would be needed).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AutoHideHorzSb`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Auto
HideHorzSb]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Makes horizontal scroll bar (active if HeaderCtrl is in absolute
mode only) to autohide. Default is on.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoAutoHideHorzSb`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoAuto
HideHorzSb]()&]
[s2; Same as AutoHideHorzSb(false).&]
[s3;%- &]
[s4;%- &]
[s5;:ArrayCtrl`:`:HideHorzSb`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* HideHorz
Sb]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Unconditionally hides horizontal scrollbar (active if HeaderCtrl
is in absolute mode only).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:MultiSelect`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* MultiSe
lect]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Enable / disable multiple row selection. &]
[s7; [%-*C@3 b]-|[* true] `= allow selecting multiple rows at the same
time, [* false] `= only one row at a time&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsMultiSelect`(`)const:%- [@(0.0.255) bool]_[* IsMultiSelect]()_[@(0.0.255) c
onst]&]
[s2; Returns true if ArrayCtrl is in multiselect mode.&]
[s3;%- &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoBackground`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoBack
ground]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Sets the widget into transparent mode `- background is not painted
and Transparent is activated `- a result, anything painted behind
the widget is visible, allowing client code to provide any background
it needs.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:PopUpEx`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* PopUpEx]([@(0.0.255) b
ool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Activates showing small popup windows with cell content when
mouse is over and cell is to big to fit current dimensions. Default
is activated.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoPopUpEx`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoPopUpEx]()&]
[s2; Same as PopUpEx(false).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoFocusSetCursor`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoFocu
sSetCursor]()&]
[s2; Normally, when ArrayCtrl gets a focus and no cursor is set (and
cursor is allowed and there is at least one line), ArrayCtrl
a sets the cursor to the first line. This modifier deactivates
this feature.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:MovingHeader`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Moving
Header]([@(0.0.255) bool]_[*@3 b])&]
[s2; Activates dragging columns in header. Default is active.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoMovingHeader`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* NoMoving
Header]()&]
[s2; Same as MovingHeader(false).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ColumnSortFindKey`(bool`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* C
olumnSortFindKey]([@(0.0.255) bool]_[*@3 b]_`=_[@(0.0.255) true])&]
[s2; Before ColumnSort orders the ArrayCtrl, the key of current row
(with cursor) is stored and after sorting, it is restored.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AllSorting`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* AllSorting](
)&]
[s2; If set, Sorting() is invoked for all columns (added either before
or after this modifier is called).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ColumnSortSecondary`(const ArrayCtrl`:`:Order`&`):%- [_^ArrayCtrl^ Ar
rayCtrl][@(0.0.255) `&]_[* ColumnSortSecondary]([@(0.0.255) const]_[_^ArrayCtrl`:`:Order^ O
rder][@(0.0.255) `&]_[*@3 order])&]
[s2; Sets secondary sorting predicate for column sorts (see ColumnSort,
Sorting) `- if two cells are equal when performing sort by column,
they are ordered by this predicate.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:NoColumnSortSecondary`(`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* N
oColumnSortSecondary]()&]
[s2; Same as ColumnSortSecondary(false).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ColumnWidths`(const char`*`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_
[* ColumnWidths]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 s])&]
[s2; Initializes column widths based on a text string containing
blank`-separated decimal numbers, e.g. `"1 4 6 4 1`".&]
[s7; [%-*C@3 s]-|control string defining column widths&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:RowFormat`(const char`*`):%- [_^String^ String]_[* RowFormat]([@(0.0.255) c
onst]_[@(0.0.255) char]_`*[*@3 s])&]
[s2; Formats a text by substituting [* %s] with the array`-specific
term for `'row`' (as set by the [* RowName] property). This is
used for array local menu items.&]
[s7; [%-*C@3 s]-|[* Format]`-like string to substitute.&]
[s7; [*/ Return value]-|&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:RowName`(const char`*`):%- [_^ArrayCtrl^ ArrayCtrl][@(0.0.255) `&]_[* Row
Name]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 s])&]
[s2; Sets the array`-specific term for `'row`'. This can be used
to customize the local menu terminology according to the logical
content of the array. For instance, when you have an array with
the list of employees, you can call [* RowName(`"employee`")] and
the menu items will then read [/ `'Insert new employee`', `'Delete
employee`'] etc.&]
[s7; [%-*C@3 s]-|the term to substitute for `'array row`' in menu items&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s0;* &]
[s0; [* Column structure programming]&]
[s3; &]
[s0;%- &]
[s5;:ArrayCtrl`:`:IndexInfo`(int`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_[* Ind
exInfo]([@(0.0.255) int]_[*@3 ii])&]
[s2; Returns a reference to the [* IdInfo] structure describing a given
array index (column in the source data matrix).&]
[s7; [%-*C@3 ii]-|zero`-based ordinal number of the array index&]
[s7; [*/ Return value]-|IdInfo reference for the given index&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IndexInfo`(const Id`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&
]_[* IndexInfo]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])&]
[s2; Returns a reference to the [* IdInfo] structure describing a given
array index.&]
[s7; [%-*C@3 id]-|the [* Id] index identifier&]
[s7; [*/ Return value]-|IdInfo reference for the given index&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddIndex`(const Id`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&
]_[* AddIndex]([@(0.0.255) const] [_^Id^ Id]`&_[*@3 id])&]
[s2; Adds a new index to the array and assign it a given [* Id] identifier.&]
[s7; [%-*C@3 id]-|new index identifier&]
[s7; [*/ Return value]-|A reference to the [* IdInfo ]structure describing
the newly added index. The reference can be used to set additional
index properties.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddIndex`(`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_[* AddInde
x]()&]
[s2; Adds a new index (without an identifier) to the array.&]
[s7; [*/ Return value]-|A reference to the [* IdInfo] structure describing
the newly added index.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetIndexCount`(`)const:%- [@(0.0.255) int]_[* GetIndexCount]()_[@(0.0.255) c
onst]&]
[s2; Returns number of indices in the array.&]
[s7; [*/ Return value]-|index count&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetId`(int`)const:%- [_^Id^ Id]_[* GetId]([@(0.0.255) int]_[*@3 ii])_[@(0.0.255) c
onst]&]
[s2; Returns the identifier of a given index (addresses by its zero`-based
ordinal number).&]
[s7; [%-*C@3 ii]-|zero`-based ordinal number of the queried index&]
[s7; [*/ Return value]-|index identifier or [* Null] if the index has
no identifier&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetPos`(const Id`&`)const:%- [@(0.0.255) int]_[* GetPos]([@(0.0.255) cons
t ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&]
[s2; Returns the zero`-based positional number of the array index
with a given identifier.&]
[s7; [%-*C@3 id]-|array index identifier&]
[s7; [*/ Return value]-|zero`-based index number, `-1 when not found&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SetId`(int`,const Id`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&
]_[* SetId]([@(0.0.255) int]_[*@3 ii], [@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])&]
[s2; Sets the identifier for a given array index. This can be used
to set or modify the identifier for a previously added index.&]
[s7; [%-*C@3 ii]-|zero`-based ordinal number of the index to set the
identifier for&]
[s7; [%-*C@3 id]-|new index identifier ([* Null] when none)&]
[s7; [*/ Return value]-|A reference to the [* IdInfo] descriptive structure
for the [/ ii]`-th index. The reference can be used to set additional
properties of the altered index.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddKey`(const Id`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_
[* AddKey]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])&]
[s2; Adds a [/ primary key] index to the table. The [/ primary key] is
just another name for the first index (index with ordinal number
0). This is just a handy convention often used for SQL`-based
tables. [* AddKey] must be called only once after array initialization
or [* Reset] and before calling any other functions adding indices
(like [* AddIndex], [* AddColumn] or [* AddCtrl]). When [* GetIndexCount()
> 0 ]before the call to this function, this method fails with
an [* ASSERT].&]
[s7; [%-*C@3 id]-|primary key identifier&]
[s7; [*/ Return value]-|A reference to the descriptive [* IdInfo] structure
for the primary key index.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddKey`(`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_[* AddKey]()
&]
[s2; Adds a primary key index without an identifier to the table.
This is equivalent to [* AddKey(Null)].&]
[s7; [*/ Return value]-|A reference to the [* IdInfo] structure describing
the primary key index.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetKeyId`(`)const:%- [_^Id^ Id]_[* GetKeyId]()_[@(0.0.255) const]&]
[s2; Returns primary key identifier for this table. This is equivalent
to calling [* GetId(0)].&]
[s7; [*/ Return value]-|primary key index identifier&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddColumn`(const char`*`,int`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&
]_[* AddColumn]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 text]_`=_NULL,
[@(0.0.255) int]_[*@3 w]_`=_[@3 0])&]
[s2; Add a new column`-index pair to the table. The function adds
a (source) index and an (output) column and sets the index as
the data source for the column. This is the most common method
for adding columns to the array.&]
[s7; [%-*C@3 text]-|column name (displayed in the array header)&]
[s7; [%-*C@3 w]-|logical relative column width&]
[s7; [*/ Return value]-|A reference to the [* Column] structure describing
the newly added column. This can be used to set additional properties
for the newly added column and the corresponding header tab.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddColumn`(const Id`&`,const char`*`,int`):%- [_^ArrayCtrl`:`:Column^ C
olumn][@(0.0.255) `&]_[* AddColumn]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id],
[@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 text], [@(0.0.255) int]_[*@3 w]_`=_[@3 0])&]
[s2; Adds a new column`-index pair to the table. This is equivalent
to the above two`-parameter version but, in addition, the method
sets the [* Id] identifier for the newly created index.&]
[s7; [%-*C@3 id]-|new index identifier&]
[s7; [%-*C@3 text]-|column name (displayed in the header)&]
[s7; [%-*C@3 w]-|logical relative column width&]
[s7; [*/ Return value]-|A reference to the [* Column] structure describing
the newly added array column.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddColumnAt`(int`,const char`*`,int`):%- [_^ArrayCtrl`:`:Column^ Colu
mn][@(0.0.255) `&]_[* AddColumnAt]([@(0.0.255) int]_[*@3 ii], [@(0.0.255) const]_[@(0.0.255) c
har]_`*[*@3 text], [@(0.0.255) int]_[*@3 w]_`=_[@3 0])&]
[s2; Adds a new column to the table and binds it to a given source
data index.&]
[s7; [%-*C@3 ii]-|zero`-based ordinal number of the index to use as
source for this column&]
[s7; [%-*C@3 text]-|column name (displayed in the header)&]
[s7; [%-*C@3 w]-|logical relative column width&]
[s7; [*/ Return value]-|A reference to the [* Column] structure describing
the newly added array column.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddColumnAt`(const Id`&`,const char`*`,int`):%- [_^ArrayCtrl`:`:Column^ C
olumn][@(0.0.255) `&]_[* AddColumnAt]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id],
[@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 text], [@(0.0.255) int]_[*@3 w]_`=_[@3 0])&]
[s2; Adds a new column to the table and binds it to a given source
data index.&]
[s7; [%-*C@3 id]-|identifier of the index to use as source for the newly
added column&]
[s7; [%-*C@3 text]-|column name (displayed in the header)&]
[s7; [%-*C@3 w]-|logical relative column width&]
[s7; [*/ Return value]-|A reference to the [* Column] structure describing
the newly added array column.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddRowNumColumn`(const char`*`,int`):%- [_^ArrayCtrl`:`:Column^ Colum
n][@(0.0.255) `&]_[* AddRowNumColumn]([@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 text],
[@(0.0.255) int]_[*@3 w]_`=_[@3 0])&]
[s2; Adds a new column to the table. The newly added column has no
source index, it is assumed to have an external data source.
Instead of the source data [* Value] object, the current zero`-based
row number is passed to the column`'s [* Convert] / [* Display].
This allows the host application to decode somehow the external
data based on the row number. In the current U`+`+ version, the
[/ RowNum columns] cannot be edited (using the standard array inline
editation mechanism).&]
[s7; [%-*C@3 text]-|column name (displayed in the header)&]
[s7; [%-*C@3 w]-|logical relative column width&]
[s7; [*/ Return value]-|A reference to the [* Column] structure describing
the newly added array column.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddCtrl`(Ctrl`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_[* Ad
dCtrl]([_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 ctrl])&]
[s2; Adds a new index`-control pair to the table; the index keeps
the source data and the external control is used to edit it.
The ArrayCtrl handles data transfer between the source data matrix
and the external control. The method returns a reference the
[* IdInfo] descriptive structure for the newly added index.&]
[s2; [* Note:] it is good to keep in mind that there are a few differences
between the ordinary array cell editors and the freestanding
edit controls. In contrast with the cell editors, which appear
only when the row is opened for editing, the freestanding controls
are present all the time. For instance, the ArrayCtrl automatically
disables the controls when the cursor moves away from the table
(using [* KillCursor]) and re`-enables them after it comes back.
This is important e.g. if you want to implement an additional
logic enabling some of the controls only depending on the circumstances;
in such case, you have to use one of the notification callbacks
(like [* WhenEnterRow]) to force your additional behaviour on
the controls.&]
[s7; [%-*C@3 ctrl]-|control to attach to the given index&]
[s7; [*/ Return value]-|a reference to the IdInfo structure describing
the newly added index&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddCtrl`(const Id`&`,Ctrl`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&
]_[* AddCtrl]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id], [_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 ctrl
])&]
[s2; Adds a new index`-control pair to the table. This is identical
to the above version with the only difference that the newly
added index is assigned an [* Id] identifier at the same time.&]
[s7; [%-*C@3 id]-|the identifier to assign to the newly created index&]
[s7; [%-*C@3 ctrl]-|freestanding control used to edit the given index&]
[s7; [*/ Return value]-|a reference to the IdInfo structure describing
the newly added index&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddCtrlAt`(int`,Ctrl`&`):%- [@(0.0.255) void]_[* AddCtrlAt]([@(0.0.255) i
nt]_[*@3 ii], [_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 ctrl])&]
[s2; Adds a new control to the table and binds it to the index with
given ordinal number. You can use this method to create the binding
between the control and an arbitrary source index.&]
[s7; [%-*C@3 ii]-|zero`-based ordinal number of the index to bind to
this control&]
[s7; [%-*C@3 ctrl]-|freestanding control used to edit the [/ ii]`-th data
index&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddCtrlAt`(const Id`&`,Ctrl`&`):%- [@(0.0.255) void]_[* AddCtrlAt]([@(0.0.255) c
onst ][_^Id^ Id]`&_[*@3 id], [_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 ctrl])&]
[s2; Adds a new control to the table and binds it to the index with
given identifier.&]
[s7; [%-*C@3 id]-|identifier of the index to bind to this control&]
[s7; [%-*C@3 ctrl]-|freestanding control used to edit the index with
identifier [/ id]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AddRowNumCtrl`(Ctrl`&`):%- [@(0.0.255) void]_[* AddRowNumCtrl]([_^Ctrl^ C
trl][@(0.0.255) `&]_[*@3 ctrl])&]
[s2; Adds a new freestanding control to the table. The control is
not bound to any source data index. During cursor movement in
the array, array uses the control`'s [* SetData] method to set
it to the current row number. The control must be ready for that
and it can use the row number value to decode some externally
located data for display. In the current U`+`+ version, such
controls cannot be used for editation (there is currently no
clean way to store the edited data back to its external storage).&]
[s7; [%-*C@3 ctrl]-|[/ RowNum]`-based freestanding editor control&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetColumnCount`(`)const:%- [@(0.0.255) int]_[* GetColumnCount]()_[@(0.0.255) c
onst]&]
[s2; Returns the current number of (output) columns in the array.&]
[s7; [*/ Return value]-|number of columns&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:FindColumnWithPos`(int`)const:%- [@(0.0.255) int]_[* FindColumnWithPos](
[@(0.0.255) int]_[*@3 pos])_[@(0.0.255) const]&]
[s2; Returns the zero`-based index of a column based on its source
data index.&]
[s7; [%-*C@3 pos]-|ordinal number of the source index&]
[s7; [*/ Return value]-|ordinal number of the column having the given
index as its source, `-1 when not found&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:FindColumnWithId`(const Id`&`)const:%- [@(0.0.255) int]_[* FindColumnWi
thId]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&]
[s2; Returns the zero`-based index of a column based on its source
data index.&]
[s7; [%-*C@3 id]-|source index identifier&]
[s7; [*/ Return value]-|ordinal number of the column having the given
index as its source, `-1 when not found&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ColumnAt`(int`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_[* Colu
mnAt]([@(0.0.255) int]_[*@3 i])&]
[s2; Returns the [* Column] structure describing a given column.&]
[s7; [%-*C@3 i]-|zero`-based column index&]
[s7; [*/ Return value]-|a reference to the [* Column] structure describing
the given column&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ColumnAt`(const Id`&`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&
]_[* ColumnAt]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])&]
[s2; Returns the [* Column] structure describing a given column.&]
[s7; [%-*C@3 i]-|zero`-based column index&]
[s7; [*/ Return value]-|a constant reference to the [* Column] structure
describing the given column&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ColumnAt`(int`)const:%- [@(0.0.255) const]_[_^ArrayCtrl`:`:Column^ Colu
mn][@(0.0.255) `&]_[* ColumnAt]([@(0.0.255) int]_[*@3 i])_[@(0.0.255) const]&]
[s2; Returns the [* Column] structure describing a column with given
source index. This is merely the const version of the above method;
it can be used to query properties for the column.&]
[s7; [%-*C@3 id]-|identifier of the index used as source for the column&]
[s7; [*/ Return value]-|a reference to the [* Column] structure describing
the given column&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ColumnAt`(const Id`&`)const:%- [@(0.0.255) const]_[_^ArrayCtrl`:`:Column^ C
olumn][@(0.0.255) `&]_[* ColumnAt]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) cons
t]&]
[s2; Returns a constant reference to the [* Column] structure describing
a column with given source index. This is the constant version
of the above method; it can be used to query properties for the
column.&]
[s7; [%-*C@3 id]-|identifier of the index used as source for the column&]
[s7; [*/ Return value]-|a constant reference to the [* Column] structure
describing the given column&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:HeaderTab`(int`):%- [_^HeaderCtrl`:`:Column^ HeaderCtrl`::Column][@(0.0.255) `&
]_[* HeaderTab]([@(0.0.255) int]_[*@3 i])&]
[s2; Returns the [*^topic`:`/`/CtrlLib`/src`/HeaderCtrl`$en`-us`#`:`:HeaderCtrl`:`:Column`:`:Min`(int`)^ H
eaderCtrl`::Column] descriptive structure for the given column.
The correspondence between the array columns and the header tabs
is 1:1, so that the indices of both are always the same ([* array.GetColumnCount()
`=`= array.HeaderObject().GetCount()] holds all the time).&]
[s7; [%-*C@3 i]-|zero`-based column index&]
[s7; [*/ Return value]-|a reference to the [* HeaderCtrl`::Column] structure.
This can be used to set additional properties of the header column
(e.g. column width constraints, font and icon for the column
title etc.)&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:HeaderTab`(int`)const:%- [@(0.0.255) const]_[_^HeaderCtrl`:`:Column^ He
aderCtrl`::Column][@(0.0.255) `&]_[* HeaderTab]([@(0.0.255) int]_[*@3 i])_[@(0.0.255) const]&]
[s2; Returns a constant reference to the [* HeaderCtrl`::Column] structure
for the given column.&]
[s7; [%-*C@3 i]-|zero`-based column index&]
[s7; [*/ Return value]-|a reference to the [* HeaderCtrl`::Column] structure.
This can be used to set additional properties of the header column
(e.g. column width constraints, font and icon for the column
title etc.)&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:HeaderTab`(const Id`&`):%- [_^HeaderCtrl`:`:Column^ HeaderCtrl`::Colum
n][@(0.0.255) `&]_[* HeaderTab]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])&]
[s2; Returns the [* HeaderCtrl`::Column] descriptive structure for the
column bound to a given source index.&]
[s7; [%-*C@3 id]-|identifier of the index used as source for the column&]
[s7; [*/ Return value]-|a reference to the [* HeaderCtrl`::Column] structure&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:HeaderTab`(const Id`&`)const:%- [@(0.0.255) const]_[_^HeaderCtrl`:`:Column^ H
eaderCtrl`::Column][@(0.0.255) `&]_[* HeaderTab]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) c
onst]&]
[s2; Returns a constant reference to the [* HeaderCtrl`::Column] descriptive
structure for the column bound to a given source index.&]
[s7; [%-*C@3 id]-|identifier of the index used as source for the column&]
[s7; [*/ Return value]-|a constant reference to the [* HeaderCtrl`::Column]
structure&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:HeaderObject`(`)const:%- [@(0.0.255) const]_[_^HeaderCtrl^ HeaderCtrl][@(0.0.255) `&
]_[* HeaderObject]()_[@(0.0.255) const]&]
[s2; Returns a non`-constant reference to the [* HeaderCtrl] object
for this table. The reference can be further used to alter properties
of the table header (tab visibility, header visual mode and so
on).&]
[s7; [*/ Return value]-|A non`-constant reference to the table HeaderCtrl
object.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:HeaderObject`(`):%- [_^HeaderCtrl^ HeaderCtrl][@(0.0.255) `&]_[* HeaderOb
ject]()&]
[s2; This is just the constant version of the above method; when
called on a constant [* ArrayCtrl] reference, it returns a constant
reference to its underlying HeaderCtrl object which can be then
used to query additional header information.&]
[s7; [*/ Return value]-|A constant reference to the table HeaderCtrl
object.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SerializeHeader`(Stream`&`):%- [@(0.0.255) void]_[* SerializeHeader]([_^Stream^ S
tream][@(0.0.255) `&]_[*@3 s])&]
[s2; Serializes all information pertaining to the array header (mainly
the user`-set column widths). This is equivalent to calling [* HeaderObject().Seria
lize(s)]. The main purpose of this function is to allow storing
header configuration to be restored upon opening the dialog or
the application for the next time. This function is now deprecated
in favor of SerializeSettings.&]
[s7; [%-*C@3 s]-|the [*^topic`:`/`/Core`/src`/Stream`$en`-us^ Stream]
object to serialize the header to/from&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SerializeSettings`(Stream`&`):%- [@(0.0.255) void]_[* SerializeSettings
]([_^Stream^ Stream][@(0.0.255) `&]_[*@3 s])&]
[s2; Serializes all information pertaining to the array header (mainly
the user`-set column widths) and the setting of sort column.
The main purpose of this function is to allow storing configuration
to be restored upon opening the dialog or the application for
the next time.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SetDisplay`(int`,int`,const Display`&`):%- [@(0.0.255) void]_[* SetDisp
lay]([@(0.0.255) int]_[*@3 i], [@(0.0.255) int]_[*@3 col], [@(0.0.255) const]_[_^Display^ Dis
play][@(0.0.255) `&]_[*@3 d])&]
[s2; Sets the [* Display] object for a given array cell.&]
[s2;* &]
[s2; [* Note:] the ownership to the Display object is not transferred
by this call. The ArrayCtrl stores a mere pointer to it and it
is the responsibility of the programmer to keep the Display object
alive as long as necessary (until the array is shut down or the
cell display changed via another call to SetDisplay). In fact,
most Display`-based objects don`'t support data copying at all.
In any case, copying Displays is not a very good practice and
is very prone to slicing (as most actual Displays are actually
derived classes with additional data members).&]
[s2; &]
[s2; In many cases it would be relatively safe to assume that the
Display is not used unless the array is actually painted (e.g.,
when the control is not bound to a parent or when its view has
zero size), but it is not a very wise practice and it can fail
in very weird ways under special circumstances (like making screenshots
or graphical exports from the array control).&]
[s2; &]
[s7; [%-*C@3 i]-|zero`-based row index&]
[s7; [%-*C@3 j]-|zero`-based column index&]
[s7; [%-*C@3 d]-|display to use&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetDisplay`(int`,int`):%- [@(0.0.255) const]_[_^Display^ Display][@(0.0.255) `&
]_[* GetDisplay]([@(0.0.255) int]_[*@3 row], [@(0.0.255) int]_[*@3 col])&]
[s2; Returns a reference to the Display object for the given array
cell.&]
[s7; [%-*C@3 row]-|zero`-based row index&]
[s7; [%-*C@3 col]-|zero`-based column index&]
[s7; [*/ Return value]-|a reference to the Display object.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetDisplay`(int`):%- [@(0.0.255) const]_[_^Display^ Display][@(0.0.255) `&
]_[* GetDisplay]([@(0.0.255) int]_[*@3 col])&]
[s2; Returns a reference to the Display object for the given array
column.&]
[s7; [%-*C@3 col]-|zero`-based column index&]
[s7; [*/ Return value]-|constant reference to the column Display&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SetCtrl`(int`,int`,Ctrl`&`,bool`):%- [@(0.0.255) void]_[* SetCtrl]([@(0.0.255) i
nt]_[*@3 i], [@(0.0.255) int]_[*@3 col], [_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 ctrl],
[@(0.0.255) bool]_[*@3 value]_`=_[@(0.0.255) true])&]
[s2; Sets an external control to use as the editor for a single array
cell. Naturally, the same Ctrl object cannot be used as the editor
for multiple array cells. If the position of Ctrl is equivalent
to `'SetRect(0, 0, 0, 0)`', which is the default value, Ctrl
is resized to fit the ArrayCtrl cell accurately, otherwise the
position represents the position within the cell. If [%-*@3 value]
is true, then the Ctrl represents the value of the cell, otherwise
it is independent of it.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetTotalCy`(`)const:%- [@(0.0.255) int]_[* GetTotalCy]()_[@(0.0.255) cons
t]&]
[s2; Returns total height of the array (sum of the individual line
heights for all array rows)&]
[s7; [*/ Return value]-|array height in pixels&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetLineAt`(int`)const:%- [@(0.0.255) int]_[* GetLineAt]([@(0.0.255) int]_
[*@3 y])_[@(0.0.255) const]&]
[s2; Locates the array row according to given [/ y] coordinate (such
array row [/ r] for which [* GetLineY(r) <`= y `&`& GetLineY(r) `+
GetLineCy(r) > y]).&]
[s7; [%-*C@3 y]-|vertical pixel coordinate to locate&]
[s7; [*/ Return value]-|zero`-based row number or `-1 when not found&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetClickColumn`(`)const:%- [@(0.0.255) int]_[* GetClickColumn]()_[@(0.0.255) c
onst]&]
[s2; Returns column index of the last clicked column in the array.
If the click happens past the last row of array, returns Null.&]
[s7; [*/ Return value]-|zero`-based index of the relevant column&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetClickRow`(`)const:%- [@(0.0.255) int]_[* GetClickRow]()_[@(0.0.255) co
nst]&]
[s2; Returns column index of the last clicked row in the array. If
the click happens past the last row of array, returns Null.&]
[s7; [*/ Return value]-|zero`-based index of the relevant column&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetClickPos`(`)const:%- [_^Point^ Point]_[* GetClickPos]()_[@(0.0.255) co
nst]&]
[s7; [*/ Return value]-|[* Point(GetClickColumn(), GetClickRow())].&]
[s3; &]
[s0;* &]
[s0; [* Data setting and retrieval]&]
[s3; &]
[s0;%- &]
[s5;:ArrayCtrl`:`:SetCount`(int`):%- [@(0.0.255) void]_[* SetCount]([@(0.0.255) int]_[*@3 c])
&]
[s2; Sets the number of rows in the array. This extends or trims
the source matrix as necessary. When using the Ctrl`-based individual
cell editors, as a side`-effect of this call some controls can
be constructed or destroyed.&]
[s7; [%-*C@3 c]-|new row count&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SetVirtualCount`(int`):%- [@(0.0.255) void]_[* SetVirtualCount]([@(0.0.255) i
nt]_[*@3 c])&]
[s2; Sets the number of rows in an array with external data. This
makes sense only when all the [/ Column`'s] and [/ Ctrl`'s] of the
array are [/ rownum]`-based. The function doesn`'t physically allocate
any source data matrix space, it just makes the array `'think`'
it has [/ c] rows (this is of course necessary for the Paint routine,
for cursor / selection management and so on).&]
[s2; [* Note:] in the current implementation, selection flags for the
individual rows are kept in the row objects. Therefore it is
not very wise to use multiselection for arrays with external
data, because as soon as the last row is selected, all row storage
structures are allocated as a side effect to keep the selection
flags.&]
[s7; [%-*C@3 c]-|new `'virtual`' number of rows&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetCount`(`)const:%- [@(0.0.255) int]_[* GetCount]()_[@(0.0.255) const]&]
[s2; Returns the number of rows in the array. In fact, this returns
the maximum of the number of `'real`' source matrix rows (as
set by the SetCount / Add / Insert methods) and the `'virtual`'
row count (as se by SetVirtualCount). By checking the implementation
of this method, you can easily find that, simply,&]
[s2; &]
[s2; [C int ArrayCtrl`::GetCount() const `{]&]
[s2; [C -|-|return max(virtualcount, array.GetCount());]&]
[s2; [C `}]&]
[s2; &]
[s7; [*/ Return value]-|Number of rows in the array.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Clear`(`):%- [@(0.0.255) void]_[* Clear]()&]
[s2; Clears the array source data matrix and sets the virtual row
count to 0.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Shrink`(`):%- [@(0.0.255) void]_[* Shrink]()&]
[s2; Shrinks the source data array, i.e. reallocates the data to
the minimum required memory space.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Get`(int`,int`)const:%- [_^Value^ Value]_[* Get]([@(0.0.255) int]_[*@3 i],
[@(0.0.255) int]_[*@3 ii])_[@(0.0.255) const]&]
[s2; Returns the value at a given location in the source data matrix.&]
[s7; [%-*C@3 i]-|zero`-based row number&]
[s7; [%-*C@3 ii]-|zero`-based index ordinal number&]
[s7; [*/ Return value]-|value at the given location in the source data
matrix&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Get`(int`,const Id`&`)const:%- [_^Value^ Value]_[* Get]([@(0.0.255) int]_
[*@3 i], [@(0.0.255) const ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&]
[s2; Returns the value at a given location in the source data matrix.
In this version, the source indices are addressed by their identifiers.&]
[s7; [%-*C@3 i]-|zero`-based row number&]
[s7; [%-*C@3 id]-|source index identifier&]
[s7; [*/ Return value]-|value at the given location in the source data
matrix&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Get`(int`)const:%- [_^Value^ Value]_[* Get]([@(0.0.255) int]_[*@3 ii])_[@(0.0.255) c
onst]&]
[s2; Returns the value of a given source index at the currently active
cursor row. This is equivalent to [* Get(GetCursor(), ii)]. When
the row is currently being edited, the function returns the `'new`'
value (the current value of the respective editor control, i.e.
potentially edited).&]
[s2; [* Note:] when the cursor row is not set (when [* !IsCursor()]),
the function fails with an [* ASSERT].&]
[s7; [%-*C@3 ii]-|zero`-based index ordinal number&]
[s7; [*/ Return value]-|value at a given location in the cursor row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Get`(const Id`&`)const:%- [_^Value^ Value]_[* Get]([@(0.0.255) const
][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&]
[s2; Returns the value of a given source index at the currently active
cursor row. This is equivalent to [* Get(GetCursor(), id)].&]
[s7; [%-*C@3 id]-|source index identifier&]
[s7; [*/ Return value]-|value at the given location in the cursor row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetOriginal`(int`)const:%- [_^Value^ Value]_[* GetOriginal]([@(0.0.255) i
nt]_[*@3 ii])_[@(0.0.255) const]&]
[s2; Returns the `'original`' value of a given source index at the
currently active cursor row. When the row is open for editing,
this function returns the `'old`' value before any editation
took place.&]
[s7; [%-*C@3 ii]-|zero`-based index ordinal number&]
[s7; [*/ Return value]-|value at the given location in the cursor row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetOriginal`(const Id`&`)const:%- [_^Value^ Value]_[* GetOriginal]([@(0.0.255) c
onst ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&]
[s2; Returns the `'original`' value (i.e., without any editing changed
applied) of a given source index at the currently active cursor
row.&]
[s7; [%-*C@3 id]-|source index identifier&]
[s7; [*/ Return value]-|value at the given location in the cursor row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetKey`(`)const:%- [_^Value^ Value]_[* GetKey]()_[@(0.0.255) const]&]
[s2; Returns the value of the current row`'s primary key. This is
equivalent to [* Get(0)].&]
[s7; [*/ Return value]-|value at the index #0 in the cursor row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetOriginalKey`(`)const:%- [_^Value^ Value]_[* GetOriginalKey]()_[@(0.0.255) c
onst]&]
[s2; Returns the original value of the current row`'s primary key.
During editation, the function returns the value at the time
of opening the row for editing, i.e. without any editing changes
applied. This is equivalent to [* GetOriginal(0)].&]
[s7; [*/ Return value]-|value at the index #0 in the cursor row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Set`(int`,int`,const Value`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) i
nt]_[*@3 i], [@(0.0.255) int]_[*@3 ii], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v
])&]
[s2; Sets the value at a given location in the source data matrix.&]
[s7; [%-*C@3 i]-|zero`-based row number&]
[s7; [%-*C@3 ii]-|zero`-based index ordinal number&]
[s7; [%-*C@3 v]-|value to set to the given cell&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Set`(int`,const Id`&`,const Value`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) i
nt]_[*@3 i], [@(0.0.255) const ][_^Id^ Id]`&_[*@3 id], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&
]_[*@3 v])&]
[s2; Sets the value at a given location in the source data matrix.
&]
[s7; [%-*C@3 i]-|zero`-based row number&]
[s7; [%-*C@3 id]-|source index identifier&]
[s7; [%-*C@3 v]-|value to set to the given cell&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Set`(int`,const Value`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) int]_[*@3 i
i], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v])&]
[s2; Modifies the value at a given location in the cursor row. When
the row is open for editing, the function immediately changes
the value in the appropriate editor control.&]
[s7; [%-*C@3 ii]-|zero`-based index ordinal number&]
[s7; [%-*C@3 v]-|value to set&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Set`(const Id`&`,const Value`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) c
onst ][_^Id^ Id]`&_[*@3 id], [@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v])&]
[s2; Modifies the value at a given location in the cursor row. This
overloaded version uses the [* Id] identifier to address the relevant
index.&]
[s7; [%-*C@3 id]-|index identifier&]
[s7; [%-*C@3 v]-|value to set&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetColumn`(int`,int`)const:%- [_^Value^ Value]_[* GetColumn]([@(0.0.255) i
nt]_[*@3 row], [@(0.0.255) int]_[*@3 col])_[@(0.0.255) const]&]
[s2; Returns the value of a given column. This depends on the column`-index
mapping established when adding columns to the table. When the
column is a [/ rownum] type (it is bound to no source indices),
the function just returns the [/ row] parameter. For columns with
a single source index, the function returns the value of the
mapped source index. For columns with multiple source indices,
the function returns a [* ValueArray ]containing the values of
its source indices.&]
[s7; [%-*C@3 row]-|zero`-based row index&]
[s7; [%-*C@3 col]-|zero`-based column index&]
[s7; [*/ Return value]-|value of the given column&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetConvertedColumn`(int`,int`):%- [_^Value^ Value]_[* GetConvertedColum
n]([@(0.0.255) int]_[*@3 row], [@(0.0.255) int]_[*@3 col])&]
[s2; Returns the value of a given column after application of its
[* Convert]. For performance reasons, the values obtained by calls
to the [* Convert`::Format] methods are cached internally within
the ArrayCtrl object. You can manipulate the conversion cache
using the methods [*^topic`:`/`/CtrlLib`/src`/ArrayCtrl`$en`-us`#`:`:ArrayCtrl`:`:ClearCache`(`)^ C
learCache] and[* ][*^topic`:`/`/CtrlLib`/src`/ArrayCtrl`$en`-us`#`:`:ArrayCtrl`:`:InvalidateCache`(int`)^ I
nvalidateCache].&]
[s7; [%-*C@3 row]-|zero`-based row index&]
[s7; [%-*C@3 col]-|zero`-based column index&]
[s7; [*/ Return value]-|the converted cell value&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ReadRow`(int`)const:%- [_^Vector^ Vector]<[_^Value^ Value]>_[* ReadRow]([@(0.0.255) i
nt]_[*@3 i])_[@(0.0.255) const]&]
[s2; Returns a [* Vector] containing the values of all source indices
in the given row. Invariantly, the [* GetCount()] of the returned
array is equal to the [* GetIndexCount()] of the source ArrayCtrl.&]
[s7; [%-*C@3 i]-|zero`-based row index&]
[s7; [*/ Return value]-|an array of all source values in the given row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Set`(int`,const Vector`<Value`>`&`):%- [@(0.0.255) void]_[* Set]([@(0.0.255) i
nt]_[*@3 i], [@(0.0.255) const]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 v])&]
[s2; Modified a given row by setting all source index values to values
passed in the parameter [/ v].&]
[s7; [%-*C@3 i]-|zero`-based row index&]
[s7; [%-*C@3 v]-|an array of values to set to the source data matrix
row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Add`(`):%- [@(0.0.255) void]_[* Add]()&]
[s2; Adds an empty row to the source data matrix.&]
[s2; [* Note:] the [* InsertValue] property of the [* IdInfo] structure
defines a method to generate / retrieve default values for newly
inserted rows. However, these values are only used during the
GUI`-based [* DoInsert] method and do not apply to the [* Add] method.
If you need to set the newly added source matrix row to some
non`-null defaults, you have to modify the relevant cells manually.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Add`(const Vector`<Value`>`&`):%- [@(0.0.255) void]_[* Add]([@(0.0.255) c
onst]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 v])&]
[s2; Adds a new row at the end of the source data matrix. The [*^topic`:`/`/Core`/src`/Vector`$en`-us^ V
ector] parameter contains the values to be used to initialize
the new row of the matrix.&]
[s7; [%-*C@3 v]-|new matrix row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Add`(const Value`&`[`,const Value`&`]`.`.`.`):%- [@(0.0.255) void]_[* A
dd]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_`[, [@(0.0.255) const]_[_^Value^ Val
ue][@(0.0.255) `&]_`]...)&]
[s2; Adds a new row at the bottom of the source data matrix. This
is in fact a series of functions (generated automatically using
the [* Expand] macro) which takes an arbitrary number of arguments.
Its arguments are used to initialize the source indices in the
newly added row.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Insert`(int`):%- [@(0.0.255) void]_[* Insert]([@(0.0.255) int]_[*@3 i])&]
[s2; Inserts a new row into the source array. All indices are initialized
to [* Null] values. The [* InsertValue] property doesn`'t apply;
if you need to set the newly created row to some non`-trivial
values, you have to do so manually.&]
[s7; [%-*C@3 i]-|zero`-based position of the newly created row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Insert`(int`,const Vector`<Value`>`&`):%- [@(0.0.255) void]_[* Insert](
[@(0.0.255) int]_[*@3 i], [@(0.0.255) const]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 v])&]
[s2; Inserts a new row into the array at a given position. The second
parameter, [/ v], is used to initialize the source indices of the
newly created row.&]
[s7; [%-*C@3 i]-|zero`-based row index&]
[s7; [%-*C@3 v]-|a vector of values used to initialize the source indices
of the given row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Remove`(int`):%- [@(0.0.255) void]_[* Remove]([@(0.0.255) int]_[*@3 i])&]
[s2; Removes the given source data row.&]
[s2; [* Note:] the [* AskRemove] property of the [* ArrayCtrl] object tells
whether a confirmation dialog should pop up every time the user
wants to remove a row. However, this method applies only to the
GUI`-based row removal; the [* Remove] method always removes the
requested row unconditionally without popping up any confirmation
dialog.&]
[s7; [%-*C@3 i]-|zero`-based index of the row to remove&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SwapUp`(`):%- [@(0.0.255) void]_[* SwapUp]()&]
[s2; Exchanges the cursor row with the preceding row, effectively
moving it up.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SwapDown`(`):%- [@(0.0.255) void]_[* SwapDown]()&]
[s2; Exchanges the cursor row with following row, effectively moving
it down.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Sort`(const ArrayCtrl`:`:Order`&`):%- [@(0.0.255) void]_[* Sort]([@(0.0.255) c
onst]_[_^ArrayCtrl`:`:Order^ ArrayCtrl`::Order][@(0.0.255) `&]_[*@3 order])&]
[s2; Sorts the array rows according to a given ordering predicate.
The [* ArrayCtrl`::Order] object defines the ordering predicate;
its [* operator ()] should return [* true] whenever its first parameter
(a vector containing the values of all source indices in a row)
is less than its second parameter.&]
[s7; [%-*C@3 order]-|&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Sort`(int`,int`,const ArrayCtrl`:`:Order`&`):%- [@(0.0.255) void]_[* So
rt]([@(0.0.255) int]_[*@3 from], [@(0.0.255) int]_[*@3 count], [@(0.0.255) const]_[_^ArrayCtrl`:`:Order^ A
rrayCtrl`::Order][@(0.0.255) `&]_[*@3 order])&]
[s2; Sorts a portion of the array using a given ordering predicate.&]
[s7; [%-*C@3 from]-|zero`-based index of the first row to sort&]
[s7; [%-*C@3 count]-|number of rows to be sorted&]
[s7; [%-*C@3 order]-|the ordering predicate object. The object should
be derived from [* ArrayCtrl`::Order] and should override the [* operator
()] method. This method should return [* true ]whenever its first
parameter (a vector containing all source index values for a
certain row) is less than its second parameter.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Sort`(int`(`*`)`(const Vector`<Value`>`&v1`,const Vector`<Value`>`&v2`)`):%- [@(0.0.255) v
oid]_[* Sort]([@(0.0.255) int]_(`*[*@3 compare])([@(0.0.255) const]_Vector<Value>`&_v1,
[@(0.0.255) const]_Vector<Value>`&_v2))&]
[s2; Sorts the array rows according to the order defined by the specified
ordering predicate [/ compare]. This is supposed to be a global
function returning [* true] whenever its first parameter ([/ v1],
an array consisting of all source indices within a row) is less
than the second parameter [/ v2] (according to the desired ordering).&]
[s7; [%-*C@3 compare]-|the ordering predicate; _the function is supposed
to return [* true] whenever its first parameter ([/ v1]) is less
than the second parameter ([/ v2]) according to the desired ordering.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Sort`(int`,int`(`*`)`(const Value`&v1`,const Value`&v2`)`):%- [@(0.0.255) v
oid]_[* Sort]([@(0.0.255) int]_[*@3 ii], [@(0.0.255) int]_(`*[*@3 compare])([@(0.0.255) const
]_Value[@(0.0.255) `&]_v1, [@(0.0.255) const]_Value[@(0.0.255) `&]_v2)_`=_StdValueCompa
re)&]
[s2; Sorts the array rows according to the given ordering predicate
for the source index with a given ordinal number. When not explicitly
specified, the [* StdValueCompare] function is used as the default
comparison predicate.&]
[s7; [%-*C@3 ii]-|zero`-based ordinal number of the source index used
for sorting&]
[s7; [%-*C@3 compare]-|the sorting predicate function: the function is
supposed to return [* true] whenever its first parameter ([/ v1])
is less than the second parameter ([/ v2]) according to the desired
ordering.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Sort`(const Id`&`,int`(`*`)`(const Value`&v1`,const Value`&v2`)`):%- [@(0.0.255) v
oid]_[* Sort]([@(0.0.255) const ][_^Id^ Id]`&_[*@3 id], [@(0.0.255) int]_(`*[*@3 compare])([@(0.0.255) c
onst]_Value[@(0.0.255) `&]_v1, [@(0.0.255) const]_Value[@(0.0.255) `&]_v2)_`=_StdValueC
ompare)&]
[s2; Sorts the array rows according to the given ordering predicate
for the source index with a given identifier. When not explicitly
specified, the [* StdValueCompare] function is used as the default
comparison predicate.&]
[s7; [%-*C@3 id]-|identifier of the source index used for sorting&]
[s7; [%-*C@3 compare]-|the sorting predicate function: the function is
supposed to return [* true] whenever its first parameter ([/ v1])
is less than the second parameter ([/ v2]) according to the desired
ordering .&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Sort`(`):%- [@(0.0.255) void]_[* Sort]()&]
[s2; Sorts the array according to the default ordering predicate
for the first source index. This is equivalent to calling [* Sort(0)].&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ColumnSort`(int`,const ValueOrder`&`):%- [@(0.0.255) void]_[* ColumnSor
t]([@(0.0.255) int]_[*@3 column], [@(0.0.255) const]_[_^ValueOrder^ ValueOrder][@(0.0.255) `&
]_[*@3 order])&]
[s2; Sorts by the column. Note that this is different from Sort,
because the final converted value of column is used (which can
even be combination of more indexes).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SetSortColumn`(int`,bool`):%- [@(0.0.255) void]_[* SetSortColumn]([@(0.0.255) i
nt]_[*@3 ii], [@(0.0.255) bool]_[*@3 descending]_`=_[@(0.0.255) false])&]
[s2; Sets the `"sorting`" column and calls DoColumnSort. This setting
is used by DoColumnSort.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ToggleSortColumn`(int`):%- [@(0.0.255) void]_[* ToggleSortColumn]([@(0.0.255) i
nt]_[*@3 ii])&]
[s2; Similar to SetSortColumn, but if the column is already set,
descending flag is inverted; otherwise descending flag is set
to false (indicating ascending sort).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:DoColumnSort`(`):%- [@(0.0.255) void]_[* DoColumnSort]()&]
[s2; Sorts the array by sorting column and indicates it by setting
an image in the header.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ClearCache`(`):%- [@(0.0.255) void]_[* ClearCache]()&]
[s2; Invalidates the whole [/ convert cache]. The convert cache keeps
the results of the [* Convert`::Format] method applied to individual
array data cells for performance reasons. Whenever you call the
[* ClearCache] method, all cache entries are marked as obsolete
and the [* Convert]`'s [* Format] method will be called as soon as
the converted value of a table cell is required (usually during
the next [* Paint]).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:InvalidateCache`(int`):%- [@(0.0.255) void]_[* InvalidateCache]([@(0.0.255) i
nt]_[*@3 i])&]
[s2; Invalidates a given row in the [/ convert cache]. For performance
reasons, the results of the [* Convert`::Format] method applied
to the individual data cells are kept in a cache. This function
marks a given row of the cache as obsolete; this means the next
time the converted values are to be used (usually within the
[* Paint] routine or when setting up the row editor controls),
the [* Convert] objects are used again to generate the actualized
output values.&]
[s7; [*C@3 i]-|zero`-based row index&]
[s3; &]
[s0; &]
[s0; [* Cursor and selection management]&]
[s3; &]
[s0; &]
[s5;:ArrayCtrl`:`:ScrollUp`(`):%- [@(0.0.255) void]_[* ScrollUp]()&]
[s5;:ArrayCtrl`:`:ScrollDown`(`):%- [@(0.0.255) void]_[* ScrollDown]()&]
[s5;:ArrayCtrl`:`:ScrollPageUp`(`):%- [@(0.0.255) void]_[* ScrollPageUp]()&]
[s5;:ArrayCtrl`:`:ScrollPageDown`(`):%- [@(0.0.255) void]_[* ScrollPageDown]()&]
[s5;:ArrayCtrl`:`:ScrollEnd`(`):%- [@(0.0.255) void]_[* ScrollEnd]()&]
[s5;:ArrayCtrl`:`:ScrollBegin`(`):%- [@(0.0.255) void]_[* ScrollBegin]()&]
[s2; Scrolls the content of ArrayCtrl.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetSelectCount`(`)const:%- [@(0.0.255) int]_[* GetSelectCount]()_[@(0.0.255) c
onst]&]
[s2; Returns the number of selected row within the table.&]
[s7; [*/ Return value]-|number of selected records (in the range [/ `[0
.. GetCount()`]])&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsSelection`(`)const:%- [@(0.0.255) bool]_[* IsSelection]()_[@(0.0.255) c
onst]&]
[s2; Checks whether any rows are selected. Equivalent to [* GetSelectCount()
> 0].&]
[s7; [*/ Return value]-|[* true] `= there is at least one selected row,
[* false] `= there is none.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Select`(int`,bool`):%- [@(0.0.255) void]_[* Select]([@(0.0.255) int]_[*@3 i
], [@(0.0.255) bool]_[*@3 sel]_`=_[@(0.0.255) true])&]
[s2; Selects / unselects a given row.&]
[s7; [%-*C@3 i]-|zero`-based row index&]
[s7; [%-*C@3 sel]-|[* true] `= add row to the current selection, [* false]
`= remove row from selection&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Select`(int`,int`,bool`):%- [@(0.0.255) void]_[* Select]([@(0.0.255) int]_
[*@3 i], [@(0.0.255) int]_[*@3 count], [@(0.0.255) bool]_[*@3 sel]_`=_[@(0.0.255) true])&]
[s2; Selects / unselects a given row range.&]
[s7; [%-*C@3 i]-|zero`-based index of the first row to select / unselect&]
[s7; [%-*C@3 count]-|number of rows to select / unselect&]
[s7; [%-*C@3 sel]-|[* true] `= select the rows, [* false] `= unselect the
rows&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsSelected`(int`)const:%- [@(0.0.255) bool]_[* IsSelected]([@(0.0.255) in
t]_[*@3 i])_[@(0.0.255) const]&]
[s2; Checks whether a given row is selected. For tables without the
multiselection option, this is equal to the check [* GetCursor()
`=`= i].&]
[s7; [%-*C@3 i]-|zero`-based row index to check for selection&]
[s7; [*/ Return value]-|[* true] `= row is selected, [* false] `= not selected&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsSel`(int`)const:%- [@(0.0.255) bool]_[* IsSel]([@(0.0.255) int]_[*@3 i])_
[@(0.0.255) const]&]
[s2; If there is selection in the widget, returns true if [%-*@3 i]
is selected, otherwise returns true if cursor is at [%-*@3 i].&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ClearSelection`(`):%- [@(0.0.255) void]_[* ClearSelection]()&]
[s2; Clears the current selection (unselects all selected rows).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsCursor`(`)const:%- [@(0.0.255) bool]_[* IsCursor]()_[@(0.0.255) const]&]
[s2; Checks whether the cursor is within the table. This is equivalent
to [* GetCursor()_>`=_0].&]
[s7; [*/ Return value]-|&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SetCursor`(int`):%- [@(0.0.255) bool]_[* SetCursor]([@(0.0.255) int]_[*@3 i
])&]
[s2; Sets the current cursor row. When an array row is open for editing,
the function first commits the edited row, then moved the cursor
to the new row. When the edited row cannot be commited, the function
returns [* false] and doesn`'t change the cursor location.&]
[s7; [%-*C@3 i]-|zero`-based row index&]
[s7; [*/ Return value]-|[* true] `= cursor has been moved, [* false ]when
not (when committing the previously edited row failed)&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:KillCursor`(`):%- [@(0.0.255) bool]_[* KillCursor]()&]
[s2; Moves the cursor away from the array. When an array row is open
for editing, the function first commits the edited row, then
moved the cursor away from the array. When the edited row cannot
be commited, the function returns [* false] and doesn`'t change
the cursor location.&]
[s7; [*/ Return value]-|[* true] `= cursor has been moved away from the
array, [* false] when not (when committing the previously edited
row failed)&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:CancelCursor`(`):%- [@(0.0.255) void]_[* CancelCursor]()&]
[s2; Cancels editation of the row being currently edited. All changes
made in the individual column editors are rejected.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetCursor`(`)const:%- [@(0.0.255) int]_[* GetCursor]()_[@(0.0.255) const]&]
[s2; Returns the current cursor row, `-1 when none.&]
[s7; [*/ Return value]-|zero`-based cursor row index, `-1 `= cursor
is not in the array&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GoBegin`(`):%- [@(0.0.255) void]_[* GoBegin]()&]
[s2; Moves the cursor to the first row in the array (equivalent to
[* SetCursor(0)]).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GoEnd`(`):%- [@(0.0.255) void]_[* GoEnd]()&]
[s2; Moves the cursor to the last array row (equivalent to [* SetCursor(GetCount()
`- 1)]).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetCursorSc`(`)const:%- [@(0.0.255) int]_[* GetCursorSc]()_[@(0.0.255) co
nst]&]
[s2; Returns the visual vertical position of the cursor row relative
to the current view. This method, in combination with [* ScCursor],
can be used to reposition the cursor row while maintaining the
same visual position of the row within the array view.&]
[s7; [*/ Return value]-|an integer describing the vertical position
of the cursor row relative to the array view&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ScCursor`(int`):%- [@(0.0.255) void]_[* ScCursor]([@(0.0.255) int]_[*@3 a])
&]
[s2; Modifies the scrollbar position so that the current cursor row
appears at a given vertical position relative to the array view.
By doing the following sequence of operations: [* GetCursorSc],
then reposition the cursor row, then [* ScCursor], you can achieve
cursor relocation while maintaining its visual location within
the array view.&]
[s7; [%-*C@3 a]-|an integer describing the vertical position of the
cursor row (typically a number returned by a previous call to
[* GetCursorSc])&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:CenterCursor`(`):%- [@(0.0.255) void]_[* CenterCursor]()&]
[s2; Modifies the scrollbar position so that the current cursor row
appears in the middle of the array view.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ScrollInto`(int`):%- [@(0.0.255) void]_[* ScrollInto]([@(0.0.255) int]_[*@3 l
ine])&]
[s2; Moves the scrollbar by the least possible amount in order to
make the given array row visible. When the given array row is
already visible, the function does nothing.&]
[s7; [%-*C@3 line]-|zero`-based row index of the array row to make visible&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ScrollIntoCursor`(`):%- [@(0.0.255) void]_[* ScrollIntoCursor]()&]
[s2; Moves the scrollbar by the least possible amount in order to
make the cursor row visible. This is equivalent to [* ScrollInto(GetCursor())].&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetCursor`(`)const:%- [@(0.0.255) int]_[* GetCursor]()_[@(0.0.255) const]&]
[s2; Returns the current vertical scrollbar position.&]
[s7; [*/ Return value]-|Pixel position of the vertical scrollbar. Position
0 is at the very top (the top row of the array is fully visible).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:ScrollTo`(int`):%- [@(0.0.255) void]_[* ScrollTo]([@(0.0.255) int]_[*@3 sc])
&]
[s2; Moves the vertical array scrollbar to a given position.&]
[s7; [%-*C@3 sc]-|Pixel position of the scrollbar. The visible portion
of the array can be obtained conceptually by taking the stack
of array rows with its top aligned at the top of the view and
moving it [/ sc] pixels upwards.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Find`(const Value`&`,int`,int`)const:%- [@(0.0.255) int]_[* Find]([@(0.0.255) c
onst]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v], [@(0.0.255) int]_[*@3 ii]_`=_[@3 0],
[@(0.0.255) int]_[*@3 from]_`=_[@3 0])_[@(0.0.255) const]&]
[s2; [%-*C@3 v]-|value to look for in the given source index&]
[s7; [%-*C@3 ii]-|zero`-based ordinal number of the source index to
search&]
[s7; [%-*C@3 from]-|zero`-based row index to start the search from&]
[s7; [*/ Return value]-|zero`-based number of the matched row, `-1 when
none&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Find`(const Value`&`,const Id`&`,int`)const:%- [@(0.0.255) int]_[* Find
]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v], [@(0.0.255) const
][_^Id^ Id]`&_[*@3 id], [@(0.0.255) int]_[*@3 from]_`=_[@3 0])_[@(0.0.255) const]&]
[s2; Locates the row (using linear search beginning at the row [/ from])
in which the source index value identified by [/ id] equals [/ val].
If such a row is found, the function returns its zero`-based
index. When not matched, the function returns `-1.&]
[s7; [%-*C@3 v]-|value to look for in the given source index&]
[s7; [%-*C@3 id]-|source index identifier&]
[s7; [%-*C@3 from]-|zero`-based row index to start the search from&]
[s7; [*/ Return value]-|zero`-based number of the matched row, `-1 when
none&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:FindSetCursor`(const Value`&`,int`,int`):%- [@(0.0.255) bool]_[* FindSe
tCursor]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 val],
[@(0.0.255) int]_[*@3 ii]_`=_[@3 0], [@(0.0.255) int]_[*@3 from]_`=_[@3 0])&]
[s2; Locates the row (using linear search beginning at the row [/ from])
in which the source index value identified by its ordinal number
[/ ii] equals [/ val]. If such a row is found, the [* SetCursor] is
called automatically to move the cursor to such a row.&]
[s7; [%-*C@3 val]-|value to look for in the given source index&]
[s7; [%-*C@3 ii]-|zero`-based ordinal number of the source index to
search&]
[s7; [%-*C@3 from]-|zero`-based row index to start the search from&]
[s7; [*/ Return value]-|zero`-based number of the matched row, `-1 when
none&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:FindSetCursor`(const Value`&`,const Id`&`,int`):%- [@(0.0.255) bool]_
[* FindSetCursor]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 val],
[@(0.0.255) const ][_^Id^ Id]`&_[*@3 id], [@(0.0.255) int]_[*@3 from]_`=_[@3 0])&]
[s2; Locates the row (using linear search beginning at the row [/ from])
in which the source index value identified by [/ id] equals [/ val].
If such a row is found, the [* SetCursor] is called automatically
to move the cursor to such a row.&]
[s7; [%-*C@3 val]-|value to look for in the given source index&]
[s7; [%-*C@3 id]-|source index identifier&]
[s7; [%-*C@3 from]-|zero`-based row index to start the search from&]
[s7; [*/ Return value]-|[* true] `= the desired row was found (and the
cursor set), [* false] when not&]
[s3; &]
[s0;* &]
[s0; [* User interface elements]&]
[s3; &]
[s0; &]
[s5;:ArrayCtrl`:`:StdBar`(Bar`&`):%- [@(0.0.255) void]_[* StdBar]([_^Bar^ Bar][@(0.0.255) `&]_
[*@3 menu])&]
[s2; The default array local menu. The default local menu consists
of the standard editation actions (inserting / appending / duplicating
a row, editing a row, removing a row, moving a row, select all
rows) filtered by the array properties enabling / disabling the
various GUI elements (item insertion / deletion etc.). &]
[s7; [*C@3 menu]-|the [* Bar] object representing the menu being generated&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsModified`(int`)const:%- [@(0.0.255) bool]_[* IsModified]([@(0.0.255) in
t]_[*@3 ii])_[@(0.0.255) const]&]
[s2; Checks a source index in the currently edited row for changes.&]
[s7; [%-*C@3 ii]-|zero`-based row index&]
[s7; [*/ Return value]-|[* true] `= the index has been modified, [* false]
`= the index is in its original state&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IsModified`(const Id`&`)const:%- [@(0.0.255) bool]_[* IsModified]([@(0.0.255) c
onst ][_^Id^ Id]`&_[*@3 id])_[@(0.0.255) const]&]
[s2; Checks a source index in the currently edited array row for
changes.&]
[s7; [%-*C@3 id]-|source index identifier&]
[s7; [*/ Return value]-|[* true] `= the source index has been modified,
[* false ]when not&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:StartEdit`(int`):%- [@(0.0.255) bool]_[* StartEdit]([@(0.0.255) int]_[*@3 d
]_`=_[@3 0])&]
[s2; Opens the current cursor row for editing and sets focus to the
[/ d]`-th column.&]
[s7; [%-*C@3 d]-|zero`-based column index&]
[s7; [*/ Return value]-|[* true] `= editation successfully initiated,
[* false] when not (when the array is in [* ReadOnly] mode or it
has no editable columns)&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:GetEditColumn`(`)const:%- [@(0.0.255) int]_[* GetEditColumn]()_[@(0.0.255) c
onst]&]
[s2; Returns the column being currently edited.&]
[s7; [*/ Return value]-|zero`-based index of the column being edited,
`-1 `= none&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:DoEdit`(`):%- [@(0.0.255) void]_[* DoEdit]()&]
[s2; Opens the current cursor row for editing.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:DoInsert`(int`):%- [@(0.0.255) void]_[* DoInsert]([@(0.0.255) int]_[*@3 cur
sor])&]
[s2; Begins the GUI insertion of a new row at a given location.&]
[s7; [%-*C@3 cursor]-|zero`-based location of the new row&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:DoInsertBefore`(`):%- [@(0.0.255) void]_[* DoInsertBefore]()&]
[s2; Begins the GUI insertion of a new row above the current row.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:DoInsertAfter`(`):%- [@(0.0.255) void]_[* DoInsertAfter]()&]
[s2; Begins the GUI insertion of a new row below the current row.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:DoAppend`(`):%- [@(0.0.255) void]_[* DoAppend]()&]
[s2; Begins the GUI insertion of a new row at the end of the array.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:DoRemove`(`):%- [@(0.0.255) virtual] [@(0.0.255) bool]_[* DoRemove]()&]
[s2; Performs the GUI`-based removal of the current cursor row. When
the [* AskRemove] property is set to [* true] and the user cancels
the confirmation dialog, the function returns [* false] and the
current row is not removed.&]
[s7; [*/ Return value]-|[* true] `= row has been removed successfully,
[* false] `= user has canceled the row removal&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:DoDuplicate`(`):%- [@(0.0.255) void]_[* DoDuplicate]()&]
[s2; Duplicates the current row and opens it for editing.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:DoSelectAll`(`):%- [@(0.0.255) void]_[* DoSelectAll]()&]
[s2; Marks all array row as selected.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AcceptEnter`(`):%- [@(0.0.255) bool]_[* AcceptEnter]()&]
[s2; Performs all necessary GUI actions equivalent to when the user
presses the [* Enter] key. The row being currently edited is committed
and, in the case it was a newly appended line and the [* NoInsertAppend]
property is not set, an additional row is added to the array
and opened for editation.&]
[s7; [*/ Return value]-|[* true] `= the current row has been successfully
committed, [* false] when not&]
[s3; &]
[s0; &]
[s0; &]
[s0; [* Content export]&]
[s0;* &]
[s3;%- &]
[s5;:ArrayCtrl`:`:AsText`(String`(`*`)`(const Value`&`)`,bool`,const char`*`,const char`*`,const char`*`,const char`*`)const:%- [_^String^ S
tring]_[* AsText]([_^String^ String]_(`*[*@3 format])([@(0.0.255) const]_Value[@(0.0.255) `&
]), [@(0.0.255) bool]_[*@3 sel]_`=_[@(0.0.255) false], [@(0.0.255) const]_[@(0.0.255) char]_
`*[*@3 tab]_`=_`"`\t`", [@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 row]_`=_`"`\r`\n`",
[@(0.0.255) const]_[@(0.0.255) char]_`*[*@3 hdrtab]_`=_`"`\t`", [@(0.0.255) const]_[@(0.0.255) c
har]_`*[*@3 hdrrow]_`=_`"`\r`\n`")_[@(0.0.255) const]&]
[s2; Generic function for conversion of ArrayCtrl content to text.
The content visible on screen is exported (means, it exports
columns defined using AddColumn, not indicies). Cells are converted
to output format using [%-*@3 format] function. If [%-*@3 sel] is
true, only rows with IsSel true are exported. [%-*@3 tab] represents
a separator text between cells in a row, [%-*@3 row] separator
of rows. [%-*@3 hdrtab] is separator of header cells (those are
texts of ArrayCtrl header) `- if NULL, no header is exported.
[%-*@3 hdrrow].is separator of header and data rows.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:SetClipboard`(bool`,bool`)const:%- [@(0.0.255) void]_[* SetClipboard]([@(0.0.255) b
ool]_[*@3 sel]_`=_[@(0.0.255) false], [@(0.0.255) bool]_[*@3 hdr]_`=_[@(0.0.255) true])_[@(0.0.255) c
onst]&]
[s2; Puts ArrayCtrl content to clipboard in text format, `"`\t`"
and `"`\r`\n`" as separators. If [%-*@3 sel] is true, only rows
with IsSel true are exported, [%-*@3 hdr] controls whether header
is exported.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AsQtf`(bool`,bool`):%- [_^String^ String]_[* AsQtf]([@(0.0.255) bool]_[*@3 s
el]_`=_[@(0.0.255) false], [@(0.0.255) bool]_[*@3 hdr]_`=_[@(0.0.255) true])&]
[s2; Returns ArrayCtrl content in QTF format. If [%-*@3 sel] is true,
only rows with IsSel true are exported, [%-*@3 hdr] controls whether
header is exported.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:AsCsv`(bool`,int`,bool`):%- [_^String^ String]_[* AsCsv]([@(0.0.255) bool
]_[*@3 sel]_`=_[@(0.0.255) false], [@(0.0.255) int]_[*@3 sep]_`=_`';`',
[@(0.0.255) bool]_[*@3 hdr]_`=_[@(0.0.255) true])&]
[s2; Returns ArrayCtrl content in csv format, using [%-*@3 sep] as
separator. If [%-*@3 sel] is true, only rows with IsSel true are
exported, [%-*@3 hdr] controls whether header is exported.&]
[s0; &]
[s0; &]
[s0; [* Notification callbacks]&]
[s3; &]
[s0; &]
[s5;:ArrayCtrl`:`:WhenLeftClick:%- [_^Callback^ Callback]_[* WhenLeftClick]&]
[s2; This callback is called whenever the user clicks an array cell.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenLeftDouble:%- [_^Callback^ Callback]_[* WhenLeftDouble]&]
[s2; This callback is called whenever the user doubleclicks an array
cell.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenBar:%- [_^Callback1^ Callback1]<Bar[@(0.0.255) `&]>_[* WhenBar]&]
[s2; This callback is called whenever the local array menu has to
be regenerated. By setting this callback to a different function
/ method you can supply a custom local menu for the array. The
[* Bar`&] argument is a reference to the menu to be generated.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenEnterRow:%- [_^Callback^ Callback]_[* WhenEnterRow]&]
[s2; This callback is called every time the cursor location changes
to a different row of the array.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenAcceptRow:%- [_^Gate^ Gate]_[* WhenAcceptRow]&]
[s2; This gate is called every time an array row (open for editing)
needs to be validated. When the gate returns [* false], the validation
process is assumed to have failed, when it returns [* true], it
is assumed to have succeeded. You can use this callback to add
your own validation algorithms relevant to the array context
within your application.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenUpdateRow:%- [_^Callback^ Callback]_[* WhenUpdateRow]&]
[s2; This callback is called whenever an array row has been updated.
You can use this callback e.g. to project the changes to a database
or generally to an external data source.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenKillCursor:%- [_^Callback^ Callback]_[* WhenKillCursor]&]
[s2; This callback is called whenever the cursor is moved away from
the table.&]
[s2; [* Note:] internally, when moving the cursor (e.g. by calling the
[* SetCursor ]method), after committing the previous row the cursor
is removed from the table using [* KillCursor] and placed to the
new location afterwards. Therefore every time the cursor is moved,
the [* WhenKillCursor] callback is called as a by`-product.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenCursor:%- [_^Callback^ Callback]_[* WhenCursor]&]
[s2; This callback is called every time the cursor row number changes
(either when the cursor is removed from the table, or when it
has been moved to a different row).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenArrayAction:%- [_^Callback^ Callback]_[* WhenArrayAction]&]
[s2; This callback is called every time the source array data changes
(typically after accepting changes to a certain row or after
deleting a row).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenStartEdit:%- [_^Callback^ Callback]_[* WhenStartEdit]&]
[s2; This callback is called whenever the array row editation process
is initiated. It can be used e.g. to set up some additional properties
of the column editor objects, to fill in drop`-down lists pertaining
to certain column editors etc.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenAcceptEdit:%- [_^Callback^ Callback]_[* WhenAcceptEdit]&]
[s2; This callback is called whenever the currently edited line has
been committed.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenSelection:%- [_^Callback^ Callback]_[* WhenSelection]&]
[s2; This callback is called whenever the current array selection
changes. This includes changes to the cursor location as the
cursor is automatically considered part of the selection.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:WhenCtrlsAction:%- [_^Callback^ Callback]_[* WhenCtrlsAction]&]
[s2; This callback is called whenever some of the editor controls
constructed automatically via the column editation [/ factory]
calls its [* WhenAction] method. It can be used to watch out for
changes in the cell editors and react to specific situations
accordingly.&]
[s3; &]
[s0; &]
[s0; &]
[s0;%- &]
[ {{10000t/25b/25@3 [s0;%- [*@(229)4 ArrayCtrl`::IdInfo]]}}&]
[s3; &]
[s1;:ArrayCtrl`:`:IdInfo`:`:struct:%- [@(0.0.255)3 struct][3 _][*3 IdInfo]&]
[s9; The [* IdInfo] structure contains properties of all source array
indices. It can be used to set additional properties pertaining
to source array data.&]
[s3; &]
[s0;%- &]
[ {{10000F(128)G(128)@1 [s0; [* Public Member List]]}}&]
[s3;%- &]
[s5;:ArrayCtrl`:`:IdInfo`:`:InsertValue`(const Value`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdI
nfo][@(0.0.255) `&]_[* InsertValue]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v
])&]
[s2; The method sets up the default source index value for newly
created rows. This is used only when the row insertion is GUI`-based
(like using the [* DoInsert] method for instance). When a row is
added to the array programmatically (e.g. using [* Add] or [* Insert]),
these default values are not used.&]
[s7; [%-*C@3 v]-|default source index value&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IdInfo`:`:InsertValue`(ValueGen`&`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo
][@(0.0.255) `&]_[* InsertValue]([_^ValueGen^ ValueGen][@(0.0.255) `&]_[*@3 g])&]
[s2; The method sets up a factory for generating default index values
for newly created rows. This is used only when the row insertion
is GUI`-based (like using the [* DoInsert] method for instance).
When a row is added to the array programmatically (e.g. using
[* Add] or [* Insert]), the [* InserValue] property is not consulted.&]
[s7; [%-*C@3 g]-|a reference to the value generation factory. The ownership
to the factory is not passed by this call; the caller must insure
the existence of the factory object throughout the array duration.&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IdInfo`:`:Accel`(int`(`*`)`(int`)`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo
][@(0.0.255) `&]_[* Accel]([@(0.0.255) int]_(`*[*@3 filter])([@(0.0.255) int]))&]
[s2; This method sets up the source index accelerator function. The
accelerator is used to quickly locate rows using the keyboard
key presses.&]
[s7; [%-*C@3 filter]-|a [* CharFilter ]function for keypress filtering&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IdInfo`:`:Accel`(`):%- [_^ArrayCtrl`:`:IdInfo^ IdInfo][@(0.0.255) `&]_[* A
ccel]()&]
[s2; This method sets up keyboard acceleration for the given source
index. The `'trivial`' [/ CharConvert] is used for character translation.&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:IdInfo`:`:GetInsertValue`(`):%- [_^Value^ Value]_[* GetInsertValue]()&]
[s2; Uses the [* InsertValue] property to generate a new source index
value (either using a fixed default value or the value creation
factory).&]
[s7; [*/ Return value]-|the generated value to be used as the default
for the newly inserted row.&]
[s3; &]
[s0; &]
[s0; &]
[s0;%- &]
[ {{10000t/25b/25@3 [s0;%- [*@(229)4 ArrayCtrl`::Column]]}}&]
[s3; &]
[s1;:ArrayCtrl`:`:Column`:`:class:%- [@(0.0.255)3 class][3 _][*3 Column][3 _:_][@(0.0.255)3 priv
ate][3 _][*@3;3 FormatConvert]&]
[s2; &]
[s0;%- [%%/ Derived from][%% ]FormatConvert&]
[s0;3 &]
[s0;%- The [* ArrayCtrl`::Column] structure describes an output array
column. Its methods can be used to set or query its properties,
some of which are also settable via ArrayCtrl methods.&]
[s3;%- &]
[s0;%- &]
[ {{10000F(128)G(128)@1 [s0; [* Public Member List]]}}&]
[s3;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Add`(int`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_
[* Add]([@(0.0.255) int]_[*@3 `_pos])&]
[s2; Adds another source data index to the list of source indices
used as the data for the given output column.&]
[s7; [%-*C@3 `_pos]-|zero`-based ordinal number of the source index&]
[s7; [*/ Return value]-|[* `*this].&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Add`(const Id`&`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&
]_[* Add](const [_^Id^ Id]`&_[*@3 id])&]
[s2; Adds another source data index to the list of source indices
used as the data for the given output column.&]
[s7; [%-*C@3 id]-|the [* Id] identifier of the source index&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:AddIndex`(const Id`&`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&
]_[* AddIndex]([@(0.0.255) const]_[_^Id^ Id][@(0.0.255) `&]_[*@3 id])&]
[s2; Adds another source index to the array and adds it to the list
of source indices bound to this output column. The newly created
index is assigned the given identifier.&]
[s7; [%-*C@3 id]-|the identifier for the newly created index&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:AddIndex`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&
]_[* AddIndex]()&]
[s2; Adds another source index to the array and adds it to the list
of source indices bound to this output column.&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:SetConvert`(const Convert`&`):%- [_^ArrayCtrl`:`:Column^ Co
lumn][@(0.0.255) `&]_[* SetConvert]([@(0.0.255) const]_[_^Convert^ Convert][@(0.0.255) `&]_
[*@3 c])&]
[s2; Sets the [* Convert] object for the given column. This object
is used to convert the source values (obtained from the source
data matrix) to the values displayable and/or editable by the
respective column display / editor object.&]
[s2; [* Note:] the ownership of the [* Convert] object is not transferred
by this function. The array merely stores a pointer to the Convert
object. It is up to the host application to keep the Convert
object alive as long as necessary (until the ArrayCtrl object
is destroyed or all references to the Convert object obliterated
by new calls to the [* SetConvert] method). In any case, most Convert`-based
object do not support copying at all; moreover, as the Convert`-based
objects are mostly derived from the basic class, their copying
is normally prone to slicing.&]
[s7; [%-*C@3 c]-|a constant reference to the Convert object to use for
the given column&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:SetFormat`(const char`*`):%- [@(0.0.255) virtual]
[_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_[* SetFormat]([@(0.0.255) const]_[@(0.0.255) c
har]_`*[*@3 fmt])&]
[s2; Sets the format string to use for the default value formatting.
When no Convert object is set for the column, the source value
is normally passed to the [* NFormat] function where the [/ fmt]
argument defines the desired formatting pattern.&]
[s7; [%-*C@3 fmt]-|a [* NFormat]`-compatible formatting pattern&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:SetDisplay`(const Display`&`):%- [_^ArrayCtrl`:`:Column^ Co
lumn][@(0.0.255) `&]_[* SetDisplay]([@(0.0.255) const]_[_^Display^ Display][@(0.0.255) `&]_
[*@3 d])&]
[s2; Sets the default Display to use for this column. The column
Display can be overridden for certain array cells by calls to
the [*^topic`:`/`/CtrlLib`/src`/ArrayCtrl`$en`-us`#`:`:ArrayCtrl`:`:SetDisplay`(int`,int`,const Display`&`)^ A
rrayCtrl`::SetDisplay] method.&]
[s2; [* Note:] the ownership to the Display object is not transferred
by this function. The array merely stores a pointer to the Display;
it is up to the host application to keep the Display object alive
as long as necessary.&]
[s7; [%-*C@3 d]-|a reference to the Display object&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Edit`(Ctrl`&`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&
]_[* Edit]([_^Ctrl^ Ctrl][@(0.0.255) `&]_[*@3 e])&]
[s2; Sets up the Ctrl`-based object to use for inline array column
editing.&]
[s7; [%-*C@3 e]-|a reference to the editor control object&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Ctrls`(Callback1`<One`<Ctrl`>`&`>`):%- [_^ArrayCtrl`:`:Column^ C
olumn][@(0.0.255) `&]_[* Ctrls]([_^Callback1^ Callback1]<[_^One^ One]<[_^Ctrl^ Ctrl]>`&>_[*@3 f
actory])&]
[s2; The methods sets up a factory which the ArrayCtrl uses as necessary
to create new Ctrl`'s for editing a given column. The argument
of this function is a callback, which, upon execution, should
allocate (normally using the [* new] operator) the desired editor
object and set it to its argument. If the position of Ctrl is
equivalent to `'SetRect(0, 0, 0, 0)`', which is the default value,
Ctrl is resized to fit the ArrayCtrl cell accurately, otherwise
the position represents the position within the cell.&]
[s7; [%-*C@3 factory]-|callback used for new control creation&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Ctrls`(void`(`*`)`(One`<Ctrl`>`&`)`):%- [_^ArrayCtrl`:`:Column^ C
olumn][@(0.0.255) `&]_[* Ctrls]([@(0.0.255) void]_(`*[*@3 factory])(One<Ctrl>`&))&]
[s2; This method sets up a factory which the ArrayCtrl uses as necessary
to create new Ctrl`'s for editing a given column. The argument,
a global function, is supposed to allocate a new editor control
(normally using the [* new] operator) and set it to its argument.
If the position of Ctrl is equivalent to `'SetRect(0, 0, 0, 0)`',
which is the default value, Ctrl is resized to fit the ArrayCtrl
cell accurately, otherwise the position represents the position
within the cell. If the position of Ctrl is equivalent to `'SetRect(0,
0, 0, 0)`', which is the default value, Ctrl is resized to fit
the ArrayCtrl cell accurately, otherwise the position represents
the position within the cell.&]
[s7; [%-*C@3 factory]-|a global function used for editor control creation&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Ctrls`(`):%- [@(0.0.255) template]_<[@(0.0.255) class]_[*@4 T]>
_[_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_[* Ctrls]()&]
[s2; This member template sets up a default factory for creating
editor controls of a given type. Every time the ArrayCtrl needs
to create a new editor control, an object of the type [* T] is
created automatically (using the [* new] operator). If the position
of Ctrl is equivalent to `'SetRect(0, 0, 0, 0)`', which is the
default value, Ctrl is resized to fit the ArrayCtrl cell accurately,
otherwise the position represents the position within the cell.&]
[s7; [*C@4 T]-|the desired object editor type &]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:InsertValue`(const Value`&`):%- [_^ArrayCtrl`:`:Column^ Col
umn][@(0.0.255) `&]_[* InsertValue]([@(0.0.255) const]_[_^Value^ Value][@(0.0.255) `&]_[*@3 v
])&]
[s2; Instructs the ArrayCtrl object to initialize this column in
newly created rows to the given value [/ v]. (This applies only
to GUI`-based row insertion using methods like [* DoInsert] etc.,
the low`-level, programmer`-controlled row insertion methods
like [* Add] or [* Insert] always initialize the source data matrix
with [* Null]`'s).&]
[s7; [%-*C@3 v]-|the value to use as the default for newly inserted
rows&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:InsertValue`(ValueGen`&`):%- [_^ArrayCtrl`:`:Column^ Column
][@(0.0.255) `&]_[* InsertValue]([_^ValueGen^ ValueGen][@(0.0.255) `&]_[*@3 g])&]
[s2; Programs the ArrayCtrl object to use the given [* ValueGen] factory
for default value generation for newly created rows. This can
be used e.g. to generate unique UUID`'s or primary keys using
an Oracle SEQUENCE object for a primary key column.&]
[s7; [%-*C@3 g]-|a reference to the ValueGen object used for default
value generation&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:NoClickEdit`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&
]_[* NoClickEdit]()&]
[s2; Disables entering the editation mode when clicking the respective
column.&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Cache`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_[* C
ache]()&]
[s2; Enables using the cache to store the converted values of this
column. By default, converted value caching is turned off to
make cell value conversion entirely dynamic; however, very often
it is advisable to enable using the cache, especially when the
conversion is relatively slow (for instance, when the conversion
queries a database connection to convert the value).&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Accel`(int`(`*`)`(int`)`):%- [_^ArrayCtrl`:`:Column^ Column
][@(0.0.255) `&]_[* Accel]([@(0.0.255) int]_(`*[*@3 filter])([@(0.0.255) int]))&]
[s2; Sets up the accelerator for the given column. A given filtering
function is used to convert keystrokes before acceleration.&]
[s7; [%-*C@3 filter]-|a [* CharConvert]`-style function to use for keystroke
conversion&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Accel`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_[* A
ccel]()&]
[s2; Sets up the accelerator for the given column. No keystroke conversion
is performed.&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Margin`(int`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&
]_[* Margin]([@(0.0.255) int]_[*@3 m])&]
[s2; Sets up the margin width for the given column. This is equivalent
to calling the [*^topic`:`/`/CtrlLib`/src`/HeaderCtrl`$en`-us`#`:`:HeaderCtrl`:`:Column`:`:SetMargin`(int`)^ S
etMargin] method of the underlying [* HeaderTab].&]
[s7; [%-*C@3 m]-|&]
[s7; [*/ Return value]-|[* `*this]&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:Sorting`(const ValueOrder`&`):%- [_^ArrayCtrl`:`:Column^ Co
lumn][@(0.0.255) `&]_[* Sorting]([@(0.0.255) const]_[_^ValueOrder^ ValueOrder][@(0.0.255) `&
]_[*@3 o])&]
[s5;:ArrayCtrl`:`:Column`:`:Sorting`(int`(`*`)`(const Value`&a`,const Value`&b`)`):%- [_^ArrayCtrl`:`:Column^ C
olumn][@(0.0.255) `&]_[* Sorting]([@(0.0.255) int]_(`*[*@3 c])([@(0.0.255) const]_Value[@(0.0.255) `&
]_a, [@(0.0.255) const]_Value[@(0.0.255) `&]_b))&]
[s5;:ArrayCtrl`:`:Column`:`:Sorting`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&]_
[* Sorting]()&]
[s2; Activates sorting of ArrayCtrl column by clicking on its header
tab. Parameterless version uses default Value ordering using
StdValueCompare.&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:SortDefault`(`):%- [_^ArrayCtrl`:`:Column^ Column][@(0.0.255) `&
]_[* SortDefault]()&]
[s2; Sets this column to be initial sorting column (calls SetSortColumn
of ArrayCtrl).&]
[s3; &]
[s4;%- &]
[s5;:ArrayCtrl`:`:Column`:`:HeaderTab`(`):%- [_^HeaderCtrl`:`:Column^ HeaderCtrl`::Colum
n][@(0.0.255) `&]_[* HeaderTab]()&]
[s2; Returns the [* HeaderCtrl`::Column] object describing the given
column. This object can be used to set up additional column properties
(like column width constraints or the [*^topic`:`/`/CtrlLib`/src`/HeaderCtrl`$en`-us`#`:`:HeaderCtrl`:`:Column`:`:Callback WhenAction^ W
henAction] callback).&]
[s3; &]
[s0; &]
[s0; &]
[s0;%- &]
[ {{10000t/25b/25@3 [s0;%- [*@(229)4 ArrayCtrl`::Order]]}}&]
[s3; &]
[s1;:ArrayCtrl`:`:Order`:`:struct:%- [@(0.0.255)3 struct][3 _][*3 Order]&]
[s9; The [* Order] object is used for array row sorting. The overloaded
[* operator ()] acts as the sorting predicate, which is consulted
within the sorting method to determine which of a given pair
of row is `'less`' according to the desired sorting.&]
[s3;%- &]
[s0;%- &]
[ {{10000F(128)G(128)@1 [s0; [* Public Member List]]}}&]
[s3;%- &]
[s5;:ArrayCtrl`:`:Order`:`:operator`(`)`(const Vector`<Value`>`&`,const Vector`<Value`>`&`)const:%- [@(0.0.255) v
irtual] [@(0.0.255) bool]_[* operator()]([@(0.0.255) const]_[_^Vector^ Vector]<[_^Value^ Va
lue]>`&_[*@3 row1], [@(0.0.255) const]_[_^Vector^ Vector]<[_^Value^ Value]>`&_[*@3 row2])_[@(0.0.255) c
onst]_`=_[@3 0]&]
[s2; The sorting predicate. This method should return [* true] when
its first argument ([/ row1]) is less than the second argument
([/ row2]) according to the desired ordering.&]
[s7; [%-*C@3 row1]-|an array of source data index values for the first
of the rows to compare&]
[s7; [%-*C@3 row2]-|an array of source data index values for the other
row to compare&]
[s7; [*/ Return value]-|[* true] `= row1 < row2, [* false] `= row1 >`= row2&]
[s3; &]
[s0; ]

Change log

r4276 by cxl on Dec 8, 2011   Diff
Core: Id is now String based, Sql: SqlCol
erradicated
Go to: 
Project members, sign in to write a code review

Older revisions

r4217 by cxl on Dec 1, 2011   Diff
*CtrlLib: ArrayCtrl fixed cornercase
issue with sort and embedded widgets
r3933 by cxl on Sep 30, 2011   Diff
CtrlLib: ArrayCtrl::AsText,
SetClipboard, AsQtf, AsCsv
r3065 by cxl on Jan 23, 2011   Diff
.CtrlLib: ArrayCtrl docs
All revisions of this file

File info

Size: 142010 bytes, 2909 lines

File properties

svn:eol-style
native
Powered by Google Project Hosting