comparison dwt/widgets/Tree.d @ 237:e2affbeb686d

Making tango.sys.win32.Types and dwt.internal.win32.WINTYPES to match common declaration. Make ansi charactars of type ubyte.
author Frank Benoit <benoit@tionex.de>
date Thu, 19 Jun 2008 03:25:36 +0200
parents 9c2ceaa48046
children ecb80b2a89e1
comparison
equal deleted inserted replaced
236:9c1bb90eba13 237:e2affbeb686d
274 } 274 }
275 275
276 TreeItem _getItem (HANDLE hItem) { 276 TreeItem _getItem (HANDLE hItem) {
277 TVITEM tvItem; 277 TVITEM tvItem;
278 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM; 278 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM;
279 tvItem.hItem = hItem; 279 tvItem.hItem = cast(HTREEITEM)hItem;
280 if (OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem) !is 0) { 280 if (OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem) !is 0) {
281 return _getItem (tvItem.hItem, tvItem.lParam); 281 return _getItem (tvItem.hItem, tvItem.lParam);
282 } 282 }
283 return null; 283 return null;
284 } 284 }
1246 hdItem.mask = OS.HDI_WIDTH; 1246 hdItem.mask = OS.HDI_WIDTH;
1247 OS.SendMessage (hwndHeader, OS.HDM_GETITEM, index, &hdItem); 1247 OS.SendMessage (hwndHeader, OS.HDM_GETITEM, index, &hdItem);
1248 OS.SetRect (&rect, nmcd.nmcd.rc.left, nmcd.nmcd.rc.top, nmcd.nmcd.rc.left + hdItem.cxy, nmcd.nmcd.rc.bottom); 1248 OS.SetRect (&rect, nmcd.nmcd.rc.left, nmcd.nmcd.rc.top, nmcd.nmcd.rc.left + hdItem.cxy, nmcd.nmcd.rc.bottom);
1249 if (OS.COMCTL32_MAJOR < 6 || !OS.IsAppThemed ()) { 1249 if (OS.COMCTL32_MAJOR < 6 || !OS.IsAppThemed ()) {
1250 RECT itemRect; 1250 RECT itemRect;
1251 if (OS.TreeView_GetItemRect (handle, item.handle, &itemRect, true)) { 1251 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)item.handle, &itemRect, true)) {
1252 rect.left = Math.min (itemRect.left, rect.right); 1252 rect.left = Math.min (itemRect.left, rect.right);
1253 } 1253 }
1254 } 1254 }
1255 if ((style & DWT.FULL_SELECTION) !is 0) { 1255 if ((style & DWT.FULL_SELECTION) !is 0) {
1256 if (!selected) fillBackground (hDC, clrTextBk, &rect); 1256 if (!selected) fillBackground (hDC, clrTextBk, &rect);
1383 } else { 1383 } else {
1384 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_LASTVISIBLE, 0); 1384 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_LASTVISIBLE, 0);
1385 } 1385 }
1386 if (hItem !is null) { 1386 if (hItem !is null) {
1387 RECT rect; 1387 RECT rect;
1388 if (OS.TreeView_GetItemRect (handle, hItem, &rect, false)) { 1388 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hItem, &rect, false)) {
1389 top = rect.bottom; 1389 top = rect.bottom;
1390 } 1390 }
1391 } 1391 }
1392 RECT rect; 1392 RECT rect;
1393 OS.SetRect (&rect, nmcd.nmcd.rc.left, top, nmcd.nmcd.rc.right, nmcd.nmcd.rc.bottom); 1393 OS.SetRect (&rect, nmcd.nmcd.rc.left, top, nmcd.nmcd.rc.right, nmcd.nmcd.rc.bottom);
1438 hItem = getBottomItem (); 1438 hItem = getBottomItem ();
1439 } else { 1439 } else {
1440 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_LASTVISIBLE, 0); 1440 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_LASTVISIBLE, 0);
1441 } 1441 }
1442 if (hItem !is null) { 1442 if (hItem !is null) {
1443 if (OS.TreeView_GetItemRect (handle, hItem, &rect, false)) { 1443 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hItem, &rect, false)) {
1444 height = rect.bottom - rect.top; 1444 height = rect.bottom - rect.top;
1445 } 1445 }
1446 } 1446 }
1447 if (height is 0) { 1447 if (height is 0) {
1448 height = OS.SendMessage (handle, OS.TVM_GETITEMHEIGHT, 0, 0); 1448 height = OS.SendMessage (handle, OS.TVM_GETITEMHEIGHT, 0, 0);
1494 if (hItem is null) { 1494 if (hItem is null) {
1495 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_FIRSTVISIBLE, 0); 1495 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_FIRSTVISIBLE, 0);
1496 if (hItem !is null) { 1496 if (hItem !is null) {
1497 TVITEM tvItem; 1497 TVITEM tvItem;
1498 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE; 1498 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE;
1499 tvItem.hItem = hItem; 1499 tvItem.hItem = cast(HTREEITEM)hItem;
1500 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 1500 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
1501 hSelect = hItem; 1501 hSelect = hItem;
1502 ignoreDeselect = ignoreSelect = lockSelection = true; 1502 ignoreDeselect = ignoreSelect = lockSelection = true;
1503 OS.SendMessage (handle, OS.TVM_SELECTITEM, OS.TVGN_CARET, hItem); 1503 OS.SendMessage (handle, OS.TVM_SELECTITEM, OS.TVGN_CARET, hItem);
1504 ignoreDeselect = ignoreSelect = lockSelection = false; 1504 ignoreDeselect = ignoreSelect = lockSelection = false;
1741 clearAll (hItem, &tvItem, all); 1741 clearAll (hItem, &tvItem, all);
1742 } 1742 }
1743 } 1743 }
1744 1744
1745 void clear (HANDLE hItem, TVITEM* tvItem) { 1745 void clear (HANDLE hItem, TVITEM* tvItem) {
1746 tvItem.hItem = hItem; 1746 tvItem.hItem = cast(HTREEITEM)hItem;
1747 TreeItem item = null; 1747 TreeItem item = null;
1748 if (OS.SendMessage (handle, OS.TVM_GETITEM, 0, tvItem) !is 0) { 1748 if (OS.SendMessage (handle, OS.TVM_GETITEM, 0, tvItem) !is 0) {
1749 item = tvItem.lParam !is -1 ? items [tvItem.lParam] : null; 1749 item = tvItem.lParam !is -1 ? items [tvItem.lParam] : null;
1750 } 1750 }
1751 if (item !is null) { 1751 if (item !is null) {
1833 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_ROOT, 0); 1833 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_ROOT, 0);
1834 while (hItem !is null) { 1834 while (hItem !is null) {
1835 if ((style & DWT.VIRTUAL) is 0 && !painted) { 1835 if ((style & DWT.VIRTUAL) is 0 && !painted) {
1836 TVITEM tvItem; 1836 TVITEM tvItem;
1837 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_TEXT; 1837 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_TEXT;
1838 tvItem.hItem = hItem; 1838 tvItem.hItem = cast(HTREEITEM)hItem;
1839 tvItem.pszText = OS.LPSTR_TEXTCALLBACK; 1839 tvItem.pszText = OS.LPSTR_TEXTCALLBACK;
1840 ignoreCustomDraw = true; 1840 ignoreCustomDraw = true;
1841 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 1841 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
1842 ignoreCustomDraw = false; 1842 ignoreCustomDraw = false;
1843 } 1843 }
1844 if (OS.TreeView_GetItemRect (handle, hItem, &rect, true)) { 1844 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hItem, &rect, true)) {
1845 width = Math.max (width, rect.right); 1845 width = Math.max (width, rect.right);
1846 height += rect.bottom - rect.top; 1846 height += rect.bottom - rect.top;
1847 } 1847 }
1848 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXTVISIBLE, hItem); 1848 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXTVISIBLE, hItem);
1849 } 1849 }
2111 HANDLE hNewItem; 2111 HANDLE hNewItem;
2112 HANDLE hFirstItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, hParent); 2112 HANDLE hFirstItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, hParent);
2113 bool fixParent = hFirstItem is null; 2113 bool fixParent = hFirstItem is null;
2114 if (hItem is null) { 2114 if (hItem is null) {
2115 TVINSERTSTRUCT tvInsert; 2115 TVINSERTSTRUCT tvInsert;
2116 tvInsert.hParent = hParent; 2116 tvInsert.hParent = cast(HTREEITEM)hParent;
2117 tvInsert.hInsertAfter = hInsertAfter; 2117 tvInsert.hInsertAfter = cast(HTREEITEM)hInsertAfter;
2118 tvInsert.item.lParam = id; 2118 tvInsert.item.lParam = id;
2119 tvInsert.item.pszText = OS.LPSTR_TEXTCALLBACK; 2119 tvInsert.item.pszText = OS.LPSTR_TEXTCALLBACK;
2120 tvInsert.item.iImage = tvInsert.item.iSelectedImage = cast(HBITMAP) OS.I_IMAGECALLBACK; 2120 tvInsert.item.iImage = tvInsert.item.iSelectedImage = cast(HBITMAP) OS.I_IMAGECALLBACK;
2121 tvInsert.item.mask = OS.TVIF_TEXT | OS.TVIF_IMAGE | OS.TVIF_SELECTEDIMAGE | OS.TVIF_HANDLE | OS.TVIF_PARAM; 2121 tvInsert.item.mask = OS.TVIF_TEXT | OS.TVIF_IMAGE | OS.TVIF_SELECTEDIMAGE | OS.TVIF_HANDLE | OS.TVIF_PARAM;
2122 if ((style & DWT.CHECK) !is 0) { 2122 if ((style & DWT.CHECK) !is 0) {
2137 // OS.SetWindowLong (handle, OS.GWL_STYLE, bits); 2137 // OS.SetWindowLong (handle, OS.GWL_STYLE, bits);
2138 // } 2138 // }
2139 } else { 2139 } else {
2140 TVITEM tvItem; 2140 TVITEM tvItem;
2141 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM; 2141 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM;
2142 tvItem.hItem = hNewItem = hItem; 2142 tvItem.hItem = cast(HTREEITEM)( hNewItem = hItem );
2143 tvItem.lParam = id; 2143 tvItem.lParam = id;
2144 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 2144 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
2145 } 2145 }
2146 if (item !is null) { 2146 if (item !is null) {
2147 item.handle = hNewItem; 2147 item.handle = hNewItem;
2163 * child is added to a visible parent item and redraw the parent. 2163 * child is added to a visible parent item and redraw the parent.
2164 */ 2164 */
2165 if (fixParent) { 2165 if (fixParent) {
2166 if (drawCount is 0 && OS.IsWindowVisible (handle)) { 2166 if (drawCount is 0 && OS.IsWindowVisible (handle)) {
2167 RECT rect; 2167 RECT rect;
2168 if (OS.TreeView_GetItemRect (handle, hParent, &rect, false)) { 2168 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hParent, &rect, false)) {
2169 OS.InvalidateRect (handle, &rect, true); 2169 OS.InvalidateRect (handle, &rect, true);
2170 } 2170 }
2171 } 2171 }
2172 } 2172 }
2173 /* 2173 /*
2178 * new area. 2178 * new area.
2179 */ 2179 */
2180 if ((style & DWT.VIRTUAL) !is 0) { 2180 if ((style & DWT.VIRTUAL) !is 0) {
2181 if (currentItem !is null) { 2181 if (currentItem !is null) {
2182 RECT rect; 2182 RECT rect;
2183 if (OS.TreeView_GetItemRect (handle, hNewItem, &rect, false)) { 2183 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hNewItem, &rect, false)) {
2184 RECT damageRect; 2184 RECT damageRect;
2185 bool damaged = cast(bool) OS.GetUpdateRect (handle, &damageRect, true); 2185 bool damaged = cast(bool) OS.GetUpdateRect (handle, &damageRect, true);
2186 if (damaged && damageRect.top < rect.bottom) { 2186 if (damaged && damageRect.top < rect.bottom) {
2187 static if (OS.IsWinCE) { 2187 static if (OS.IsWinCE) {
2188 OS.OffsetRect (&damageRect, 0, rect.bottom - rect.top); 2188 OS.OffsetRect (&damageRect, 0, rect.bottom - rect.top);
2346 } 2346 }
2347 2347
2348 void deselect (HANDLE hItem, TVITEM* tvItem, HANDLE hIgnoreItem) { 2348 void deselect (HANDLE hItem, TVITEM* tvItem, HANDLE hIgnoreItem) {
2349 while (hItem !is null) { 2349 while (hItem !is null) {
2350 if (hItem !is hIgnoreItem) { 2350 if (hItem !is hIgnoreItem) {
2351 tvItem.hItem = hItem; 2351 tvItem.hItem = cast(HTREEITEM)hItem;
2352 OS.SendMessage (handle, OS.TVM_SETITEM, 0, tvItem); 2352 OS.SendMessage (handle, OS.TVM_SETITEM, 0, tvItem);
2353 } 2353 }
2354 auto hFirstItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, hItem); 2354 auto hFirstItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, hItem);
2355 deselect (hFirstItem, tvItem, hIgnoreItem); 2355 deselect (hFirstItem, tvItem, hIgnoreItem);
2356 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXT, hItem); 2356 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXT, hItem);
2379 if (item is null) error (DWT.ERROR_NULL_ARGUMENT); 2379 if (item is null) error (DWT.ERROR_NULL_ARGUMENT);
2380 if (item.isDisposed ()) error (DWT.ERROR_INVALID_ARGUMENT); 2380 if (item.isDisposed ()) error (DWT.ERROR_INVALID_ARGUMENT);
2381 TVITEM tvItem; 2381 TVITEM tvItem;
2382 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE; 2382 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE;
2383 tvItem.stateMask = OS.TVIS_SELECTED; 2383 tvItem.stateMask = OS.TVIS_SELECTED;
2384 tvItem.hItem = item.handle; 2384 tvItem.hItem = cast(HTREEITEM)item.handle;
2385 OS.SendMessage (handle, OS.TVM_SETITEM, 0, cast(int)&tvItem); 2385 OS.SendMessage (handle, OS.TVM_SETITEM, 0, cast(int)&tvItem);
2386 } 2386 }
2387 2387
2388 /** 2388 /**
2389 * Deselects all selected items in the receiver. 2389 * Deselects all selected items in the receiver.
2399 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE; 2399 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE;
2400 tvItem.stateMask = OS.TVIS_SELECTED; 2400 tvItem.stateMask = OS.TVIS_SELECTED;
2401 if ((style & DWT.SINGLE) !is 0) { 2401 if ((style & DWT.SINGLE) !is 0) {
2402 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0); 2402 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0);
2403 if (hItem !is null) { 2403 if (hItem !is null) {
2404 tvItem.hItem = hItem; 2404 tvItem.hItem = cast(HTREEITEM)hItem;
2405 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 2405 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
2406 } 2406 }
2407 } else { 2407 } else {
2408 auto oldProc = OS.GetWindowLongPtr (handle, OS.GWLP_WNDPROC); 2408 auto oldProc = OS.GetWindowLongPtr (handle, OS.GWLP_WNDPROC);
2409 OS.SetWindowLongPtr (handle, OS.GWLP_WNDPROC, cast(LONG_PTR)TreeProc); 2409 OS.SetWindowLongPtr (handle, OS.GWLP_WNDPROC, cast(LONG_PTR)TreeProc);
2412 deselect (hItem, &tvItem, null); 2412 deselect (hItem, &tvItem, null);
2413 } else { 2413 } else {
2414 for (int i=0; i<items.length; i++) { 2414 for (int i=0; i<items.length; i++) {
2415 TreeItem item = items [i]; 2415 TreeItem item = items [i];
2416 if (item !is null) { 2416 if (item !is null) {
2417 tvItem.hItem = item.handle; 2417 tvItem.hItem = cast(HTREEITEM)item.handle;
2418 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 2418 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
2419 } 2419 }
2420 } 2420 }
2421 } 2421 }
2422 OS.SetWindowLongPtr (handle, OS.GWLP_WNDPROC, oldProc); 2422 OS.SetWindowLongPtr (handle, OS.GWLP_WNDPROC, oldProc);
2582 HANDLE hParent; 2582 HANDLE hParent;
2583 bool fixRedraw = false; 2583 bool fixRedraw = false;
2584 if ((style & DWT.DOUBLE_BUFFERED) is 0) { 2584 if ((style & DWT.DOUBLE_BUFFERED) is 0) {
2585 if (drawCount is 0 && OS.IsWindowVisible (handle)) { 2585 if (drawCount is 0 && OS.IsWindowVisible (handle)) {
2586 RECT rect; 2586 RECT rect;
2587 fixRedraw = !OS.TreeView_GetItemRect (handle, hItem, &rect, false); 2587 fixRedraw = !OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hItem, &rect, false);
2588 } 2588 }
2589 } 2589 }
2590 if (fixRedraw) { 2590 if (fixRedraw) {
2591 hParent = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_PARENT, hItem); 2591 hParent = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_PARENT, hItem);
2592 OS.UpdateWindow (handle); 2592 OS.UpdateWindow (handle);
2628 * If the item that was deleted was the last child of a tree item that 2628 * If the item that was deleted was the last child of a tree item that
2629 * is visible, redraw the parent item to force the + / - to be updated. 2629 * is visible, redraw the parent item to force the + / - to be updated.
2630 */ 2630 */
2631 if (OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, hParent) is 0) { 2631 if (OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, hParent) is 0) {
2632 RECT rect; 2632 RECT rect;
2633 if (OS.TreeView_GetItemRect (handle, hParent, &rect, false)) { 2633 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hParent, &rect, false)) {
2634 OS.InvalidateRect (handle, &rect, true); 2634 OS.InvalidateRect (handle, &rect, true);
2635 } 2635 }
2636 } 2636 }
2637 } 2637 }
2638 int count = OS.SendMessage (handle, OS.TVM_GETCOUNT, 0, 0); 2638 int count = OS.SendMessage (handle, OS.TVM_GETCOUNT, 0, 0);
3144 int id = nmcd.nmcd.lItemlParam; 3144 int id = nmcd.nmcd.lItemlParam;
3145 if ((style & DWT.VIRTUAL) !is 0) { 3145 if ((style & DWT.VIRTUAL) !is 0) {
3146 if (id is -1) { 3146 if (id is -1) {
3147 TVITEM tvItem; 3147 TVITEM tvItem;
3148 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM; 3148 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM;
3149 tvItem.hItem = cast(HANDLE) nmcd.nmcd.dwItemSpec; 3149 tvItem.hItem = cast(HTREEITEM) nmcd.nmcd.dwItemSpec;
3150 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 3150 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
3151 id = tvItem.lParam; 3151 id = tvItem.lParam;
3152 } 3152 }
3153 } 3153 }
3154 return _getItem (cast(HANDLE) nmcd.nmcd.dwItemSpec, id); 3154 return _getItem (cast(HANDLE) nmcd.nmcd.dwItemSpec, id);
3286 } 3286 }
3287 int index = 0; 3287 int index = 0;
3288 TreeItem [] result = new TreeItem [count]; 3288 TreeItem [] result = new TreeItem [count];
3289 TVITEM tvItem; 3289 TVITEM tvItem;
3290 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM; 3290 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM;
3291 tvItem.hItem = hTreeItem; 3291 tvItem.hItem = cast(HTREEITEM)hTreeItem;
3292 /* 3292 /*
3293 * Feature in Windows. In some cases an expand or collapse message 3293 * Feature in Windows. In some cases an expand or collapse message
3294 * can occur from within TVM_DELETEITEM. When this happens, the item 3294 * can occur from within TVM_DELETEITEM. When this happens, the item
3295 * being destroyed has been removed from the list of items but has not 3295 * being destroyed has been removed from the list of items but has not
3296 * been deleted from the tree. The fix is to check for null items and 3296 * been deleted from the tree. The fix is to check for null items and
3298 */ 3298 */
3299 while (tvItem.hItem !is null) { 3299 while (tvItem.hItem !is null) {
3300 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 3300 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
3301 TreeItem item = _getItem (tvItem.hItem, tvItem.lParam); 3301 TreeItem item = _getItem (tvItem.hItem, tvItem.lParam);
3302 if (item !is null) result [index++] = item; 3302 if (item !is null) result [index++] = item;
3303 tvItem.hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXT, tvItem.hItem); 3303 tvItem.hItem = cast(HTREEITEM) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXT, tvItem.hItem);
3304 } 3304 }
3305 if (index !is count) { 3305 if (index !is count) {
3306 TreeItem [] newResult = new TreeItem [index]; 3306 TreeItem [] newResult = new TreeItem [index];
3307 System.arraycopy (result, 0, newResult, 0, index); 3307 System.arraycopy (result, 0, newResult, 0, index);
3308 result = newResult; 3308 result = newResult;
3371 } 3371 }
3372 3372
3373 int getSelection (HANDLE hItem, TVITEM* tvItem, TreeItem [] selection, int index, int count, bool bigSelection, bool all) { 3373 int getSelection (HANDLE hItem, TVITEM* tvItem, TreeItem [] selection, int index, int count, bool bigSelection, bool all) {
3374 while (hItem !is null) { 3374 while (hItem !is null) {
3375 if (OS.IsWinCE || bigSelection) { 3375 if (OS.IsWinCE || bigSelection) {
3376 tvItem.hItem = hItem; 3376 tvItem.hItem = cast(HTREEITEM)hItem;
3377 OS.SendMessage (handle, OS.TVM_GETITEM, 0, tvItem); 3377 OS.SendMessage (handle, OS.TVM_GETITEM, 0, tvItem);
3378 if ((tvItem.state & OS.TVIS_SELECTED) !is 0) { 3378 if ((tvItem.state & OS.TVIS_SELECTED) !is 0) {
3379 if (selection !is null && index < selection.length) { 3379 if (selection !is null && index < selection.length) {
3380 selection [index] = _getItem (hItem, tvItem.lParam); 3380 selection [index] = _getItem (hItem, tvItem.lParam);
3381 } 3381 }
3383 } 3383 }
3384 } else { 3384 } else {
3385 int state = OS.SendMessage (handle, OS.TVM_GETITEMSTATE, hItem, OS.TVIS_SELECTED); 3385 int state = OS.SendMessage (handle, OS.TVM_GETITEMSTATE, hItem, OS.TVIS_SELECTED);
3386 if ((state & OS.TVIS_SELECTED) !is 0) { 3386 if ((state & OS.TVIS_SELECTED) !is 0) {
3387 if (tvItem !is null && selection !is null && index < selection.length) { 3387 if (tvItem !is null && selection !is null && index < selection.length) {
3388 tvItem.hItem = hItem; 3388 tvItem.hItem = cast(HTREEITEM)hItem;
3389 OS.SendMessage (handle, OS.TVM_GETITEM, 0, tvItem); 3389 OS.SendMessage (handle, OS.TVM_GETITEM, 0, tvItem);
3390 selection [index] = _getItem (hItem, tvItem.lParam); 3390 selection [index] = _getItem (hItem, tvItem.lParam);
3391 } 3391 }
3392 index++; 3392 index++;
3393 } 3393 }
3427 if ((style & DWT.SINGLE) !is 0) { 3427 if ((style & DWT.SINGLE) !is 0) {
3428 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0); 3428 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0);
3429 if (hItem is null) return new TreeItem [0]; 3429 if (hItem is null) return new TreeItem [0];
3430 TVITEM tvItem; 3430 TVITEM tvItem;
3431 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM | OS.TVIF_STATE; 3431 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM | OS.TVIF_STATE;
3432 tvItem.hItem = hItem; 3432 tvItem.hItem = cast(HTREEITEM)hItem;
3433 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 3433 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
3434 if ((tvItem.state & OS.TVIS_SELECTED) is 0) return new TreeItem [0]; 3434 if ((tvItem.state & OS.TVIS_SELECTED) is 0) return new TreeItem [0];
3435 return [_getItem (tvItem.hItem, tvItem.lParam)]; 3435 return [_getItem (tvItem.hItem, tvItem.lParam)];
3436 } 3436 }
3437 int count = 0; 3437 int count = 0;
3759 bool isItemSelected (NMTVCUSTOMDRAW* nmcd) { 3759 bool isItemSelected (NMTVCUSTOMDRAW* nmcd) {
3760 bool selected = false; 3760 bool selected = false;
3761 if (OS.IsWindowEnabled (handle)) { 3761 if (OS.IsWindowEnabled (handle)) {
3762 TVITEM tvItem; 3762 TVITEM tvItem;
3763 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE; 3763 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE;
3764 tvItem.hItem = cast(HANDLE) nmcd.nmcd.dwItemSpec; 3764 tvItem.hItem = cast(HTREEITEM)nmcd.nmcd.dwItemSpec;
3765 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 3765 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
3766 if ((tvItem.state & (OS.TVIS_SELECTED | OS.TVIS_DROPHILITED)) !is 0) { 3766 if ((tvItem.state & (OS.TVIS_SELECTED | OS.TVIS_DROPHILITED)) !is 0) {
3767 selected = true; 3767 selected = true;
3768 /* 3768 /*
3769 * Feature in Windows. When the mouse is pressed and the 3769 * Feature in Windows. When the mouse is pressed and the
3823 void redrawSelection () { 3823 void redrawSelection () {
3824 if ((style & DWT.SINGLE) !is 0) { 3824 if ((style & DWT.SINGLE) !is 0) {
3825 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0); 3825 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0);
3826 if (hItem !is null) { 3826 if (hItem !is null) {
3827 RECT rect; 3827 RECT rect;
3828 if (OS.TreeView_GetItemRect (handle, hItem, &rect, false)) { 3828 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hItem, &rect, false)) {
3829 OS.InvalidateRect (handle, &rect, true); 3829 OS.InvalidateRect (handle, &rect, true);
3830 } 3830 }
3831 } 3831 }
3832 } else { 3832 } else {
3833 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_FIRSTVISIBLE, 0); 3833 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_FIRSTVISIBLE, 0);
3847 state = tvItem.state; 3847 state = tvItem.state;
3848 } else { 3848 } else {
3849 state = OS.SendMessage (handle, OS.TVM_GETITEMSTATE, hItem, OS.TVIS_SELECTED); 3849 state = OS.SendMessage (handle, OS.TVM_GETITEMSTATE, hItem, OS.TVIS_SELECTED);
3850 } 3850 }
3851 if ((state & OS.TVIS_SELECTED) !is 0) { 3851 if ((state & OS.TVIS_SELECTED) !is 0) {
3852 if (OS.TreeView_GetItemRect (handle, hItem, &rect, false)) { 3852 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hItem, &rect, false)) {
3853 OS.InvalidateRect (handle, &rect, true); 3853 OS.InvalidateRect (handle, &rect, true);
3854 } 3854 }
3855 } 3855 }
3856 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXTVISIBLE, hItem); 3856 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXTVISIBLE, hItem);
3857 index++; 3857 index++;
3867 } 3867 }
3868 3868
3869 void releaseItem (HANDLE hItem, TVITEM* tvItem, bool release) { 3869 void releaseItem (HANDLE hItem, TVITEM* tvItem, bool release) {
3870 if (hItem is hAnchor) hAnchor = null; 3870 if (hItem is hAnchor) hAnchor = null;
3871 if (hItem is hInsert) hInsert = null; 3871 if (hItem is hInsert) hInsert = null;
3872 tvItem.hItem = hItem; 3872 tvItem.hItem = cast(HTREEITEM)hItem;
3873 if (OS.SendMessage (handle, OS.TVM_GETITEM, 0, tvItem) !is 0) { 3873 if (OS.SendMessage (handle, OS.TVM_GETITEM, 0, tvItem) !is 0) {
3874 if (tvItem.lParam !is -1) { 3874 if (tvItem.lParam !is -1) {
3875 if (tvItem.lParam < lastID) lastID = tvItem.lParam; 3875 if (tvItem.lParam < lastID) lastID = tvItem.lParam;
3876 if (release) { 3876 if (release) {
3877 TreeItem item = items [tvItem.lParam]; 3877 TreeItem item = items [tvItem.lParam];
4108 bool expanded = false; 4108 bool expanded = false;
4109 TVITEM tvItem; 4109 TVITEM tvItem;
4110 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM; 4110 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM;
4111 if (!redraw && (style & DWT.VIRTUAL) !is 0) { 4111 if (!redraw && (style & DWT.VIRTUAL) !is 0) {
4112 if (OS.IsWinCE) { 4112 if (OS.IsWinCE) {
4113 tvItem.hItem = hParent; 4113 tvItem.hItem = cast(HTREEITEM)hParent;
4114 tvItem.mask = OS.TVIF_STATE; 4114 tvItem.mask = OS.TVIF_STATE;
4115 OS.SendMessage (handle, OS.TVM_GETITEM, 0, cast(int)&tvItem); 4115 OS.SendMessage (handle, OS.TVM_GETITEM, 0, cast(int)&tvItem);
4116 expanded = (tvItem.state & OS.TVIS_EXPANDED) !is 0; 4116 expanded = (tvItem.state & OS.TVIS_EXPANDED) !is 0;
4117 } else { 4117 } else {
4118 /* 4118 /*
4124 int state = OS.SendMessage (handle, OS.TVM_GETITEMSTATE, hParent, OS.TVIS_EXPANDED); 4124 int state = OS.SendMessage (handle, OS.TVM_GETITEMSTATE, hParent, OS.TVIS_EXPANDED);
4125 expanded = (state & OS.TVIS_EXPANDED) !is 0; 4125 expanded = (state & OS.TVIS_EXPANDED) !is 0;
4126 } 4126 }
4127 } 4127 }
4128 while (hItem !is null) { 4128 while (hItem !is null) {
4129 tvItem.hItem = hItem; 4129 tvItem.hItem = cast(HTREEITEM)hItem;
4130 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 4130 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
4131 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXT, hItem); 4131 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXT, hItem);
4132 TreeItem item = tvItem.lParam !is -1 ? items [tvItem.lParam] : null; 4132 TreeItem item = tvItem.lParam !is -1 ? items [tvItem.lParam] : null;
4133 if (item !is null && !item.isDisposed ()) { 4133 if (item !is null && !item.isDisposed ()) {
4134 item.dispose (); 4134 item.dispose ();
4138 } 4138 }
4139 } 4139 }
4140 if ((style & DWT.VIRTUAL) !is 0) { 4140 if ((style & DWT.VIRTUAL) !is 0) {
4141 for (int i=itemCount; i<count; i++) { 4141 for (int i=itemCount; i<count; i++) {
4142 if (expanded) ignoreShrink = true; 4142 if (expanded) ignoreShrink = true;
4143 createItem (null, hParent, cast(HANDLE) OS.TVI_LAST, null); 4143 createItem (null, hParent, cast(HTREEITEM) OS.TVI_LAST, null);
4144 if (expanded) ignoreShrink = false; 4144 if (expanded) ignoreShrink = false;
4145 } 4145 }
4146 } else { 4146 } else {
4147 shrink = true; 4147 shrink = true;
4148 int extra = Math.max (4, (count + 3) / 4 * 4); 4148 int extra = Math.max (4, (count + 3) / 4 * 4);
4149 TreeItem [] newItems = new TreeItem [items.length + extra]; 4149 TreeItem [] newItems = new TreeItem [items.length + extra];
4150 System.arraycopy (items, 0, newItems, 0, items.length); 4150 System.arraycopy (items, 0, newItems, 0, items.length);
4151 items = newItems; 4151 items = newItems;
4152 for (int i=itemCount; i<count; i++) { 4152 for (int i=itemCount; i<count; i++) {
4153 new TreeItem (this, DWT.NONE, hParent, cast(HANDLE) OS.TVI_LAST, null); 4153 new TreeItem (this, DWT.NONE, hParent, cast(HTREEITEM) OS.TVI_LAST, null);
4154 } 4154 }
4155 } 4155 }
4156 if (redraw) { 4156 if (redraw) {
4157 OS.DefWindowProc (handle, OS.WM_SETREDRAW, 1, 0); 4157 OS.DefWindowProc (handle, OS.WM_SETREDRAW, 1, 0);
4158 OS.InvalidateRect (handle, null, true); 4158 OS.InvalidateRect (handle, null, true);
4209 return columnCount is 0 && scrollWidth is 0 ? handle : hwndParent; 4209 return columnCount is 0 && scrollWidth is 0 ? handle : hwndParent;
4210 } 4210 }
4211 4211
4212 void select (HANDLE hItem, TVITEM* tvItem) { 4212 void select (HANDLE hItem, TVITEM* tvItem) {
4213 while (hItem !is null) { 4213 while (hItem !is null) {
4214 tvItem.hItem = hItem; 4214 tvItem.hItem = cast(HTREEITEM)hItem;
4215 OS.SendMessage (handle, OS.TVM_SETITEM, 0, tvItem); 4215 OS.SendMessage (handle, OS.TVM_SETITEM, 0, tvItem);
4216 auto hFirstItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, hItem); 4216 auto hFirstItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CHILD, hItem);
4217 select (hFirstItem, tvItem); 4217 select (hFirstItem, tvItem);
4218 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXT, hItem); 4218 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXT, hItem);
4219 } 4219 }
4301 } 4301 }
4302 TVITEM tvItem; 4302 TVITEM tvItem;
4303 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE; 4303 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE;
4304 tvItem.stateMask = OS.TVIS_SELECTED; 4304 tvItem.stateMask = OS.TVIS_SELECTED;
4305 tvItem.state = OS.TVIS_SELECTED; 4305 tvItem.state = OS.TVIS_SELECTED;
4306 tvItem.hItem = item.handle; 4306 tvItem.hItem = cast(HTREEITEM)item.handle;
4307 OS.SendMessage (handle, OS.TVM_SETITEM, 0, cast(int)&tvItem); 4307 OS.SendMessage (handle, OS.TVM_SETITEM, 0, cast(int)&tvItem);
4308 } 4308 }
4309 4309
4310 /** 4310 /**
4311 * Selects all of the items in the receiver. 4311 * Selects all of the items in the receiver.
4332 select (hItem, &tvItem); 4332 select (hItem, &tvItem);
4333 } else { 4333 } else {
4334 for (int i=0; i<items.length; i++) { 4334 for (int i=0; i<items.length; i++) {
4335 TreeItem item = items [i]; 4335 TreeItem item = items [i];
4336 if (item !is null) { 4336 if (item !is null) {
4337 tvItem.hItem = item.handle; 4337 tvItem.hItem = cast(HTREEITEM)item.handle;
4338 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 4338 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
4339 } 4339 }
4340 } 4340 }
4341 } 4341 }
4342 OS.SetWindowLongPtr (handle, OS.GWLP_WNDPROC, oldProc); 4342 OS.SetWindowLongPtr (handle, OS.GWLP_WNDPROC, oldProc);
4753 if (redraw) { 4753 if (redraw) {
4754 if (drawCount is 1) { 4754 if (drawCount is 1) {
4755 int count = OS.SendMessage (handle, OS.TVM_GETCOUNT, 0, 0); 4755 int count = OS.SendMessage (handle, OS.TVM_GETCOUNT, 0, 0);
4756 if (count is 0) { 4756 if (count is 0) {
4757 TVINSERTSTRUCT tvInsert; 4757 TVINSERTSTRUCT tvInsert;
4758 tvInsert.hInsertAfter = cast(HANDLE) OS.TVI_FIRST; 4758 tvInsert.hInsertAfter = cast(HTREEITEM) OS.TVI_FIRST;
4759 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_INSERTITEM, 0, &tvInsert); 4759 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_INSERTITEM, 0, &tvInsert);
4760 } 4760 }
4761 OS.DefWindowProc (handle, OS.WM_SETREDRAW, 1, 0); 4761 OS.DefWindowProc (handle, OS.WM_SETREDRAW, 1, 0);
4762 updateScrollBar (); 4762 updateScrollBar ();
4763 } 4763 }
4841 while (index < selection.length) { 4841 while (index < selection.length) {
4842 TreeItem item = selection [index]; 4842 TreeItem item = selection [index];
4843 if (item !is null && item.handle is hItem) break; 4843 if (item !is null && item.handle is hItem) break;
4844 index++; 4844 index++;
4845 } 4845 }
4846 tvItem.hItem = hItem; 4846 tvItem.hItem = cast(HTREEITEM)hItem;
4847 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 4847 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
4848 if ((tvItem.state & OS.TVIS_SELECTED) !is 0) { 4848 if ((tvItem.state & OS.TVIS_SELECTED) !is 0) {
4849 if (index is selection.length) { 4849 if (index is selection.length) {
4850 tvItem.state = 0; 4850 tvItem.state = 0;
4851 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 4851 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
4966 if (hOldItem is hNewItem) { 4966 if (hOldItem is hNewItem) {
4967 TVITEM tvItem; 4967 TVITEM tvItem;
4968 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE; 4968 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE;
4969 tvItem.state = OS.TVIS_SELECTED; 4969 tvItem.state = OS.TVIS_SELECTED;
4970 tvItem.stateMask = OS.TVIS_SELECTED; 4970 tvItem.stateMask = OS.TVIS_SELECTED;
4971 tvItem.hItem = hNewItem; 4971 tvItem.hItem = cast(HTREEITEM)hNewItem;
4972 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 4972 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
4973 showItem (hNewItem); 4973 showItem (hNewItem);
4974 } 4974 }
4975 } 4975 }
4976 if ((style & DWT.SINGLE) !is 0) return; 4976 if ((style & DWT.SINGLE) !is 0) return;
4991 int index = 0; 4991 int index = 0;
4992 while (index < length) { 4992 while (index < length) {
4993 if (items [index] is item) break; 4993 if (items [index] is item) break;
4994 index++; 4994 index++;
4995 } 4995 }
4996 tvItem.hItem = item.handle; 4996 tvItem.hItem = cast(HTREEITEM)item.handle;
4997 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 4997 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
4998 if ((tvItem.state & OS.TVIS_SELECTED) !is 0) { 4998 if ((tvItem.state & OS.TVIS_SELECTED) !is 0) {
4999 if (index is length) { 4999 if (index is length) {
5000 tvItem.state = 0; 5000 tvItem.state = 0;
5001 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 5001 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
5139 OS.SendMessage (handle, OS.WM_SETREDRAW, 0, 0); 5139 OS.SendMessage (handle, OS.WM_SETREDRAW, 0, 0);
5140 } 5140 }
5141 } else { 5141 } else {
5142 bool scroll = true; 5142 bool scroll = true;
5143 RECT itemRect; 5143 RECT itemRect;
5144 if (OS.TreeView_GetItemRect (handle, hItem, &itemRect, true)) { 5144 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hItem, &itemRect, true)) {
5145 forceResize (); 5145 forceResize ();
5146 RECT rect; 5146 RECT rect;
5147 OS.GetClientRect (handle, &rect); 5147 OS.GetClientRect (handle, &rect);
5148 POINT pt; 5148 POINT pt;
5149 pt.x = itemRect.left; 5149 pt.x = itemRect.left;
5166 } 5166 }
5167 } 5167 }
5168 } 5168 }
5169 if (hwndParent !is null) { 5169 if (hwndParent !is null) {
5170 RECT itemRect; 5170 RECT itemRect;
5171 if (OS.TreeView_GetItemRect (handle, hItem, &itemRect, true)) { 5171 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hItem, &itemRect, true)) {
5172 forceResize (); 5172 forceResize ();
5173 RECT rect; 5173 RECT rect;
5174 OS.GetClientRect (hwndParent, &rect); 5174 OS.GetClientRect (hwndParent, &rect);
5175 OS.MapWindowPoints (hwndParent, handle, cast(POINT*) &rect, 2); 5175 OS.MapWindowPoints (hwndParent, handle, cast(POINT*) &rect, 2);
5176 POINT pt; 5176 POINT pt;
5334 } 5334 }
5335 5335
5336 /*public*/ void sort () { 5336 /*public*/ void sort () {
5337 checkWidget (); 5337 checkWidget ();
5338 if ((style & DWT.VIRTUAL) !is 0) return; 5338 if ((style & DWT.VIRTUAL) !is 0) return;
5339 sort ( cast(HANDLE) OS.TVI_ROOT, false); 5339 sort ( cast(HTREEITEM) OS.TVI_ROOT, false);
5340 } 5340 }
5341 5341
5342 void sort (HANDLE hParent, bool all) { 5342 void sort (HANDLE hParent, bool all) {
5343 int itemCount = OS.SendMessage (handle, OS.TVM_GETCOUNT, 0, 0); 5343 int itemCount = OS.SendMessage (handle, OS.TVM_GETCOUNT, 0, 0);
5344 if (itemCount is 0 || itemCount is 1) return; 5344 if (itemCount is 0 || itemCount is 1) return;
5349 } else { 5349 } else {
5350 //Callback compareCallback = new Callback (this, "CompareFunc", 3); 5350 //Callback compareCallback = new Callback (this, "CompareFunc", 3);
5351 //int lpfnCompare = compareCallback.getAddress (); 5351 //int lpfnCompare = compareCallback.getAddress ();
5352 sThis = this; 5352 sThis = this;
5353 TVSORTCB psort; 5353 TVSORTCB psort;
5354 psort.hParent = hParent; 5354 psort.hParent = cast(HTREEITEM)hParent;
5355 psort.lpfnCompare = &CompareFunc; 5355 psort.lpfnCompare = &CompareFunc;
5356 psort.lParam = sortColumn is null ? 0 : indexOf (sortColumn); 5356 psort.lParam = sortColumn is null ? 0 : indexOf (sortColumn);
5357 OS.SendMessage (handle, OS.TVM_SORTCHILDRENCB, all ? 1 : 0, &psort); 5357 OS.SendMessage (handle, OS.TVM_SORTCHILDRENCB, all ? 1 : 0, &psort);
5358 sThis = null; 5358 sThis = null;
5359 //compareCallback.dispose (); 5359 //compareCallback.dispose ();
5779 if (hItem !is null) { 5779 if (hItem !is null) {
5780 hAnchor = hItem; 5780 hAnchor = hItem;
5781 OS.SendMessage (handle, OS.TVM_ENSUREVISIBLE, 0, hItem); 5781 OS.SendMessage (handle, OS.TVM_ENSUREVISIBLE, 0, hItem);
5782 TVITEM tvItem; 5782 TVITEM tvItem;
5783 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE | OS.TVIF_PARAM; 5783 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE | OS.TVIF_PARAM;
5784 tvItem.hItem = hItem; 5784 tvItem.hItem = cast(HTREEITEM)hItem;
5785 if ((style & DWT.CHECK) !is 0) { 5785 if ((style & DWT.CHECK) !is 0) {
5786 tvItem.stateMask = OS.TVIS_STATEIMAGEMASK; 5786 tvItem.stateMask = OS.TVIS_STATEIMAGEMASK;
5787 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 5787 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
5788 int state = tvItem.state >> 12; 5788 int state = tvItem.state >> 12;
5789 if ((state & 0x1) !is 0) { 5789 if ((state & 0x1) !is 0) {
5935 TVITEM tvItem; 5935 TVITEM tvItem;
5936 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE; 5936 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE;
5937 tvItem.stateMask = OS.TVIS_SELECTED; 5937 tvItem.stateMask = OS.TVIS_SELECTED;
5938 auto hDeselectItem = hItem; 5938 auto hDeselectItem = hItem;
5939 RECT rect1; 5939 RECT rect1;
5940 if (!OS.TreeView_GetItemRect (handle, hAnchor, &rect1, false)) { 5940 if (!OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hAnchor, &rect1, false)) {
5941 hAnchor = hItem; 5941 hAnchor = hItem;
5942 OS.TreeView_GetItemRect (handle, hAnchor, &rect1, false); 5942 OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hAnchor, &rect1, false);
5943 } 5943 }
5944 RECT rect2; 5944 RECT rect2;
5945 OS.TreeView_GetItemRect (handle, hDeselectItem, &rect2, false); 5945 OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hDeselectItem, &rect2, false);
5946 int flags = rect1.top < rect2.top ? OS.TVGN_PREVIOUSVISIBLE : OS.TVGN_NEXTVISIBLE; 5946 int flags = rect1.top < rect2.top ? OS.TVGN_PREVIOUSVISIBLE : OS.TVGN_NEXTVISIBLE;
5947 while (hDeselectItem !is hAnchor) { 5947 while (hDeselectItem !is hAnchor) {
5948 tvItem.hItem = hDeselectItem; 5948 tvItem.hItem = cast(HTREEITEM)hDeselectItem;
5949 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 5949 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
5950 hDeselectItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, flags, hDeselectItem); 5950 hDeselectItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, flags, hDeselectItem);
5951 } 5951 }
5952 auto hSelectItem = hAnchor; 5952 auto hSelectItem = hAnchor;
5953 OS.TreeView_GetItemRect (handle, hNewItem, &rect1, false); 5953 OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hNewItem, &rect1, false);
5954 OS.TreeView_GetItemRect (handle, hSelectItem, &rect2, false); 5954 OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hSelectItem, &rect2, false);
5955 tvItem.state = OS.TVIS_SELECTED; 5955 tvItem.state = OS.TVIS_SELECTED;
5956 flags = rect1.top < rect2.top ? OS.TVGN_PREVIOUSVISIBLE : OS.TVGN_NEXTVISIBLE; 5956 flags = rect1.top < rect2.top ? OS.TVGN_PREVIOUSVISIBLE : OS.TVGN_NEXTVISIBLE;
5957 while (hSelectItem !is hNewItem) { 5957 while (hSelectItem !is hNewItem) {
5958 tvItem.hItem = hSelectItem; 5958 tvItem.hItem = cast(HTREEITEM)hSelectItem;
5959 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 5959 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
5960 hSelectItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, flags, hSelectItem); 5960 hSelectItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, flags, hSelectItem);
5961 } 5961 }
5962 tvItem.hItem = hNewItem; 5962 tvItem.hItem = cast(HTREEITEM)hNewItem;
5963 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 5963 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
5964 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM; 5964 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM;
5965 tvItem.hItem = hNewItem; 5965 tvItem.hItem = cast(HTREEITEM)hNewItem;
5966 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 5966 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
5967 Event event = new Event (); 5967 Event event = new Event ();
5968 event.item = _getItem (hNewItem, tvItem.lParam); 5968 event.item = _getItem (hNewItem, tvItem.lParam);
5969 postEvent (DWT.Selection, event); 5969 postEvent (DWT.Selection, event);
5970 return new LRESULT (code); 5970 return new LRESULT (code);
5974 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0); 5974 HANDLE hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0);
5975 if (hItem !is null) { 5975 if (hItem !is null) {
5976 TVITEM tvItem; 5976 TVITEM tvItem;
5977 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE; 5977 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE;
5978 tvItem.stateMask = OS.TVIS_SELECTED; 5978 tvItem.stateMask = OS.TVIS_SELECTED;
5979 tvItem.hItem = hItem; 5979 tvItem.hItem = cast(HTREEITEM)hItem;
5980 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 5980 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
5981 bool oldSelected = (tvItem.state & OS.TVIS_SELECTED) !is 0; 5981 bool oldSelected = (tvItem.state & OS.TVIS_SELECTED) !is 0;
5982 HANDLE hNewItem; 5982 HANDLE hNewItem;
5983 switch (wParam) { 5983 switch (wParam) {
5984 case OS.VK_UP: 5984 case OS.VK_UP:
6002 OS.GetClientRect (handle, &clientRect); 6002 OS.GetClientRect (handle, &clientRect);
6003 hNewItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_FIRSTVISIBLE, 0); 6003 hNewItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_FIRSTVISIBLE, 0);
6004 do { 6004 do {
6005 auto hVisible = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXTVISIBLE, hNewItem); 6005 auto hVisible = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXTVISIBLE, hNewItem);
6006 if (hVisible is null) break; 6006 if (hVisible is null) break;
6007 if (!OS.TreeView_GetItemRect (handle, hVisible, &rect, false)) break; 6007 if (!OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hVisible, &rect, false)) break;
6008 if (rect.bottom > clientRect.bottom) break; 6008 if (rect.bottom > clientRect.bottom) break;
6009 if ((hNewItem = hVisible) is hItem) { 6009 if ((hNewItem = hVisible) is hItem) {
6010 OS.SendMessage (handle, OS.WM_VSCROLL, OS.SB_PAGEDOWN, 0); 6010 OS.SendMessage (handle, OS.WM_VSCROLL, OS.SB_PAGEDOWN, 0);
6011 } 6011 }
6012 } while (hNewItem !is null); 6012 } while (hNewItem !is null);
6016 break; 6016 break;
6017 default: 6017 default:
6018 } 6018 }
6019 if (hNewItem !is null) { 6019 if (hNewItem !is null) {
6020 OS.SendMessage (handle, OS.TVM_ENSUREVISIBLE, 0, hNewItem); 6020 OS.SendMessage (handle, OS.TVM_ENSUREVISIBLE, 0, hNewItem);
6021 tvItem.hItem = hNewItem; 6021 tvItem.hItem = cast(HTREEITEM)hNewItem;
6022 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 6022 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
6023 bool newSelected = (tvItem.state & OS.TVIS_SELECTED) !is 0; 6023 bool newSelected = (tvItem.state & OS.TVIS_SELECTED) !is 0;
6024 bool redraw = !newSelected && drawCount is 0 && OS.IsWindowVisible (handle); 6024 bool redraw = !newSelected && drawCount is 0 && OS.IsWindowVisible (handle);
6025 if (redraw) { 6025 if (redraw) {
6026 OS.UpdateWindow (handle); 6026 OS.UpdateWindow (handle);
6031 OS.SendMessage (handle, OS.TVM_SELECTITEM, OS.TVGN_CARET, hNewItem); 6031 OS.SendMessage (handle, OS.TVM_SELECTITEM, OS.TVGN_CARET, hNewItem);
6032 ignoreSelect = false; 6032 ignoreSelect = false;
6033 hSelect = null; 6033 hSelect = null;
6034 if (oldSelected) { 6034 if (oldSelected) {
6035 tvItem.state = OS.TVIS_SELECTED; 6035 tvItem.state = OS.TVIS_SELECTED;
6036 tvItem.hItem = hItem; 6036 tvItem.hItem = cast(HTREEITEM)hItem;
6037 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 6037 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
6038 } 6038 }
6039 if (!newSelected) { 6039 if (!newSelected) {
6040 tvItem.state = 0; 6040 tvItem.state = 0;
6041 tvItem.hItem = hNewItem; 6041 tvItem.hItem = cast(HTREEITEM)hNewItem;
6042 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 6042 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
6043 } 6043 }
6044 if (redraw) { 6044 if (redraw) {
6045 RECT rect1, rect2; 6045 RECT rect1, rect2;
6046 bool fItemRect = (style & DWT.FULL_SELECTION) is 0; 6046 bool fItemRect = (style & DWT.FULL_SELECTION) is 0;
6047 if (hooks (DWT.EraseItem) || hooks (DWT.PaintItem)) fItemRect = false; 6047 if (hooks (DWT.EraseItem) || hooks (DWT.PaintItem)) fItemRect = false;
6048 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) fItemRect = false; 6048 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) fItemRect = false;
6049 OS.TreeView_GetItemRect (handle, hItem, &rect1, fItemRect); 6049 OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hItem, &rect1, fItemRect);
6050 OS.TreeView_GetItemRect (handle, hNewItem, &rect2, fItemRect); 6050 OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hNewItem, &rect2, fItemRect);
6051 OS.DefWindowProc (handle, OS.WM_SETREDRAW, 1, 0); 6051 OS.DefWindowProc (handle, OS.WM_SETREDRAW, 1, 0);
6052 OS.InvalidateRect (handle, &rect1, true); 6052 OS.InvalidateRect (handle, &rect1, true);
6053 OS.InvalidateRect (handle, &rect2, true); 6053 OS.InvalidateRect (handle, &rect2, true);
6054 OS.UpdateWindow (handle); 6054 OS.UpdateWindow (handle);
6055 } 6055 }
6201 fixSelection = true; 6201 fixSelection = true;
6202 tvItem.stateMask = OS.TVIS_SELECTED; 6202 tvItem.stateMask = OS.TVIS_SELECTED;
6203 auto hNext = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXTVISIBLE, lpht.hItem); 6203 auto hNext = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXTVISIBLE, lpht.hItem);
6204 while (hNext !is null) { 6204 while (hNext !is null) {
6205 if (hNext is hAnchor) hAnchor = null; 6205 if (hNext is hAnchor) hAnchor = null;
6206 tvItem.hItem = hNext; 6206 tvItem.hItem = cast(HTREEITEM)hNext;
6207 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 6207 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
6208 if ((tvItem.state & OS.TVIS_SELECTED) !is 0) deselected = true; 6208 if ((tvItem.state & OS.TVIS_SELECTED) !is 0) deselected = true;
6209 tvItem.state = 0; 6209 tvItem.state = 0;
6210 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 6210 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
6211 HANDLE hItem = hNext = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXTVISIBLE, hNext); 6211 HANDLE hItem = hNext = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_NEXTVISIBLE, hNext);
6243 if ((bits & OS.TVS_FULLROWSELECT) is 0) { 6243 if ((bits & OS.TVS_FULLROWSELECT) is 0) {
6244 if (OS.SendMessage (handle, OS.TVM_GETIMAGELIST, OS.TVSIL_NORMAL, 0) is 0) { 6244 if (OS.SendMessage (handle, OS.TVM_GETIMAGELIST, OS.TVSIL_NORMAL, 0) is 0) {
6245 auto hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0); 6245 auto hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0);
6246 if (hItem !is null) { 6246 if (hItem !is null) {
6247 RECT rect; 6247 RECT rect;
6248 if (OS.TreeView_GetItemRect (handle, hItem, &rect, false)) { 6248 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hItem, &rect, false)) {
6249 OS.InvalidateRect (handle, &rect, true); 6249 OS.InvalidateRect (handle, &rect, true);
6250 } 6250 }
6251 } 6251 }
6252 } 6252 }
6253 } 6253 }
6357 } 6357 }
6358 6358
6359 /* Get the selected state of the last selected item */ 6359 /* Get the selected state of the last selected item */
6360 auto hOldItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0); 6360 auto hOldItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, OS.TVGN_CARET, 0);
6361 if ((style & DWT.MULTI) !is 0) { 6361 if ((style & DWT.MULTI) !is 0) {
6362 tvItem.hItem = hOldItem; 6362 tvItem.hItem = cast(HTREEITEM)hOldItem;
6363 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 6363 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
6364 6364
6365 /* Check for CONTROL or drag selection */ 6365 /* Check for CONTROL or drag selection */
6366 if (hittestSelected || (wParam & OS.MK_CONTROL) !is 0) { 6366 if (hittestSelected || (wParam & OS.MK_CONTROL) !is 0) {
6367 /* 6367 /*
6440 if ((style & DWT.SINGLE) !is 0) { 6440 if ((style & DWT.SINGLE) !is 0) {
6441 if (hOldItem is hNewItem) { 6441 if (hOldItem is hNewItem) {
6442 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE; 6442 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_STATE;
6443 tvItem.state = OS.TVIS_SELECTED; 6443 tvItem.state = OS.TVIS_SELECTED;
6444 tvItem.stateMask = OS.TVIS_SELECTED; 6444 tvItem.stateMask = OS.TVIS_SELECTED;
6445 tvItem.hItem = hNewItem; 6445 tvItem.hItem = cast(HTREEITEM)hNewItem;
6446 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 6446 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
6447 } 6447 }
6448 } 6448 }
6449 6449
6450 /* Reselect the last item that was unselected */ 6450 /* Reselect the last item that was unselected */
6473 } 6473 }
6474 RECT rect1, rect2; 6474 RECT rect1, rect2;
6475 bool fItemRect = (style & DWT.FULL_SELECTION) is 0; 6475 bool fItemRect = (style & DWT.FULL_SELECTION) is 0;
6476 if (hooks (DWT.EraseItem) || hooks (DWT.PaintItem)) fItemRect = false; 6476 if (hooks (DWT.EraseItem) || hooks (DWT.PaintItem)) fItemRect = false;
6477 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) fItemRect = false; 6477 if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (6, 0)) fItemRect = false;
6478 OS.TreeView_GetItemRect (handle, hOldItem, &rect1, fItemRect); 6478 OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hOldItem, &rect1, fItemRect);
6479 OS.TreeView_GetItemRect (handle, hNewItem, &rect2, fItemRect); 6479 OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hNewItem, &rect2, fItemRect);
6480 OS.DefWindowProc (handle, OS.WM_SETREDRAW, 1, 0); 6480 OS.DefWindowProc (handle, OS.WM_SETREDRAW, 1, 0);
6481 OS.InvalidateRect (handle, &rect1, true); 6481 OS.InvalidateRect (handle, &rect1, true);
6482 OS.InvalidateRect (handle, &rect2, true); 6482 OS.InvalidateRect (handle, &rect2, true);
6483 OS.UpdateWindow (handle); 6483 OS.UpdateWindow (handle);
6484 } 6484 }
6494 deselect (hItem, &tvItem, hNewItem); 6494 deselect (hItem, &tvItem, hNewItem);
6495 } else { 6495 } else {
6496 for (int i=0; i<items.length; i++) { 6496 for (int i=0; i<items.length; i++) {
6497 TreeItem item = items [i]; 6497 TreeItem item = items [i];
6498 if (item !is null && item.handle !is hNewItem) { 6498 if (item !is null && item.handle !is hNewItem) {
6499 tvItem.hItem = item.handle; 6499 tvItem.hItem = cast(HTREEITEM)item.handle;
6500 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 6500 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
6501 } 6501 }
6502 } 6502 }
6503 } 6503 }
6504 tvItem.hItem = hNewItem; 6504 tvItem.hItem = cast(HTREEITEM)hNewItem;
6505 tvItem.state = OS.TVIS_SELECTED; 6505 tvItem.state = OS.TVIS_SELECTED;
6506 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 6506 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
6507 OS.SetWindowLongPtr (handle, OS.GWLP_WNDPROC, oldProc); 6507 OS.SetWindowLongPtr (handle, OS.GWLP_WNDPROC, oldProc);
6508 if ((wParam & OS.MK_SHIFT) !is 0) { 6508 if ((wParam & OS.MK_SHIFT) !is 0) {
6509 RECT rect1; 6509 RECT rect1;
6510 if (hAnchor is null) hAnchor = hNewItem; 6510 if (hAnchor is null) hAnchor = hNewItem;
6511 if (OS.TreeView_GetItemRect (handle, hAnchor, &rect1, false)) { 6511 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hAnchor, &rect1, false)) {
6512 RECT rect2; 6512 RECT rect2;
6513 if (OS.TreeView_GetItemRect (handle, hNewItem, &rect2, false)) { 6513 if (OS.TreeView_GetItemRect (handle, cast(HTREEITEM)hNewItem, &rect2, false)) {
6514 int flags = rect1.top < rect2.top ? OS.TVGN_NEXTVISIBLE : OS.TVGN_PREVIOUSVISIBLE; 6514 int flags = rect1.top < rect2.top ? OS.TVGN_NEXTVISIBLE : OS.TVGN_PREVIOUSVISIBLE;
6515 tvItem.state = OS.TVIS_SELECTED; 6515 tvItem.state = OS.TVIS_SELECTED;
6516 auto hItem = tvItem.hItem = hAnchor; 6516 auto hItem = tvItem.hItem = cast(HTREEITEM)hAnchor;
6517 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 6517 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
6518 while (hItem !is hNewItem) { 6518 while (hItem !is hNewItem) {
6519 tvItem.hItem = hItem; 6519 tvItem.hItem = hItem;
6520 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem); 6520 OS.SendMessage (handle, OS.TVM_SETITEM, 0, &tvItem);
6521 hItem = cast(HANDLE) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, flags, hItem); 6521 hItem = cast(HTREEITEM) OS.SendMessage (handle, OS.TVM_GETNEXTITEM, flags, hItem);
6522 } 6522 }
6523 } 6523 }
6524 } 6524 }
6525 } 6525 }
6526 } 6526 }
6528 } 6528 }
6529 if ((wParam & OS.MK_SHIFT) is 0) hAnchor = hNewItem; 6529 if ((wParam & OS.MK_SHIFT) is 0) hAnchor = hNewItem;
6530 6530
6531 /* Issue notification */ 6531 /* Issue notification */
6532 if (!gestureCompleted) { 6532 if (!gestureCompleted) {
6533 tvItem.hItem = hNewItem; 6533 tvItem.hItem = cast(HTREEITEM)hNewItem;
6534 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM; 6534 tvItem.mask = OS.TVIF_HANDLE | OS.TVIF_PARAM;
6535 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem); 6535 OS.SendMessage (handle, OS.TVM_GETITEM, 0, &tvItem);
6536 Event event = new Event (); 6536 Event event = new Event ();
6537 event.item = _getItem (tvItem.hItem, tvItem.lParam); 6537 event.item = _getItem (tvItem.hItem, tvItem.lParam);
6538 postEvent (DWT.Selection, event); 6538 postEvent (DWT.Selection, event);
6681 } 6681 }
6682 return LRESULT.ZERO; 6682 return LRESULT.ZERO;
6683 } 6683 }
6684 6684
6685 override LRESULT WM_PAINT (int wParam, int lParam) { 6685 override LRESULT WM_PAINT (int wParam, int lParam) {
6686
6686 if (shrink && !ignoreShrink) { 6687 if (shrink && !ignoreShrink) {
6687 /* Resize the item array to fit the last item */ 6688 /* Resize the item array to fit the last item */
6688 int count = items.length - 1; 6689 int count = items.length - 1;
6689 while (count >= 0) { 6690 while (count >= 0) {
6690 if (items [count] !is null) break; 6691 if (items [count] !is null) break;