Changeset 3351 for trunk/src/comctl32/treeview.cpp
- Timestamp:
- Apr 8, 2000, 8:32:55 PM (25 years ago)
- File:
-
- 1 edited
-
trunk/src/comctl32/treeview.cpp (modified) (21 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/treeview.cpp
r3285 r3351 1 /* $Id: treeview.cpp,v 1. 6 2000-03-31 14:44:25 cbratschi Exp $ */1 /* $Id: treeview.cpp,v 1.7 2000-04-08 18:32:55 cbratschi Exp $ */ 2 2 /* Treeview control 3 3 * … … 12 12 * Using DPA to store the item ptr would be good. 13 13 * -check custom draw 14 uHotItem15 14 * use separate routine to get item text/image. 16 15 * … … 20 19 -treehelper: stack corruption makes big window. 21 20 * 22 * Status: in progress21 * Status: complete (many things untested) 23 22 * Version: 5.80 24 23 */ … … 35 34 - VK_LEFT in WinHlp32 displays expanded icon 36 35 - expand not finished 37 - TVS_FULLROWSELECT38 - TVS_TRACKSELECT (called hottrack)39 36 - WM_ENABLE: draw disabled control 40 37 */ … … 661 658 } 662 659 660 static VOID TREEVIEW_DrawHottrackLine(HDC hdc,TREEVIEW_ITEM *item) 661 { 662 HPEN hPen,hOldPen; 663 INT rop; 664 665 if (!item->visible) return; 666 667 rop = SetROP2(hdc,R2_XORPEN); 668 hPen = CreatePen(PS_SOLID,2,RGB(0,0,0)); 669 hOldPen = SelectObject(hdc,hPen); 670 671 MoveToEx(hdc,item->text.left,item->text.bottom-1,NULL); 672 LineTo(hdc,item->text.right,item->text.bottom-1); 673 674 DeleteObject(hPen); 675 SelectObject(hdc,hOldPen); 676 SetROP2(hdc,rop); 677 } 678 663 679 static void 664 680 TREEVIEW_DrawItem(HWND hwnd,HDC hdc,TREEVIEW_ITEM *item,DWORD dwStyle,TREEVIEW_INFO *infoPtr) … … 935 951 /* Draw insertion mark if necessary */ 936 952 937 //if (infoPtr->insertMarkItem)938 // TRACE ("item:%d,mark:%d\n", (int)wineItem->hItem,939 // (int) infoPtr->insertMarkItem);940 953 if (item->hItem == infoPtr->insertMarkItem) 941 954 { … … 964 977 SelectObject(hdc, hOldPen); 965 978 } 979 980 //draw hot item if necessary 981 if (item->hItem == infoPtr->hotItem) 982 TREEVIEW_DrawHottrackLine(hdc,item); 966 983 967 984 if (cditem & CDRF_NOTIFYPOSTPAINT) … … 1291 1308 1292 1309 r.left = xpos; 1293 if ((item->mask & TVIF_TEXT) && (item->pszText))1310 if ((item->mask & TVIF_TEXT) && item->pszText) 1294 1311 { 1295 1312 UINT uTextJustify = DT_LEFT; … … 3285 3302 { 3286 3303 case TVE_COLLAPSE: 3304 { 3305 POINT oldLeftTop = infoPtr->lefttop; 3306 3287 3307 if (!wineItem->state & TVIS_EXPANDED) 3288 3308 return 0; … … 3293 3313 TREEVIEW_RemoveAllChildren (hwnd, wineItem); 3294 3314 } else wineItem->state &= ~TVIS_EXPANDED; 3315 3316 //update window 3317 //CB: todo: optimize! 3318 TREEVIEW_UnqueueRefresh(hwnd,FALSE,FALSE); 3319 //CB: todo: precalc expanded items here 3320 TREEVIEW_CalcItems(hwnd,0,infoPtr); 3321 TREEVIEW_Refresh(hwnd); 3322 //CB: todo: check cx and cy to fit ranges! 3323 3324 //check selection 3325 HTREEITEM hItem = infoPtr->selectedItem; 3326 3327 if (!TREEVIEW_ValidItem (infoPtr, hItem)) 3328 hItem = wineItem->hItem; 3329 else 3330 { 3331 while (hItem) 3332 { 3333 hItem = infoPtr->items[(INT)hItem].parent; 3334 3335 if (hItem == wineItem->hItem) 3336 break; 3337 } 3338 } 3339 3340 if (hItem) 3341 TREEVIEW_DoSelectItem(hwnd,TVGN_CARET,hItem,TVC_UNKNOWN); 3342 3295 3343 break; 3344 } 3296 3345 3297 3346 case TVE_EXPAND: 3347 { 3348 POINT oldLeftTop = infoPtr->lefttop; 3349 3298 3350 if (wineItem->state & TVIS_EXPANDED) 3299 3351 return 0; … … 3301 3353 if (flag & TVE_EXPANDPARTIAL) 3302 3354 { 3303 return FALSE; //CB: to check3355 return FALSE; //CB: how does this work??? (only display one level? nonsense in MSDN docu) 3304 3356 wineItem->state ^=TVIS_EXPANDED; 3305 3357 wineItem->state |=TVIS_EXPANDEDONCE; … … 3335 3387 3336 3388 wineItem->state |= TVIS_EXPANDEDONCE; 3337 //TRACE(treeview, " TVN_ITEMEXPANDING sent...\n");3338 3389 3339 3390 TREEVIEW_SendTreeviewNotify (hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_ITEMEXPANDEDW:TVN_ITEMEXPANDEDA,TVE_EXPAND,0,(HTREEITEM)expand); 3340 3341 //TRACE(treeview, " TVN_ITEMEXPANDED sent...\n");3342 3343 3391 } else 3344 3392 { … … 3346 3394 wineItem->state |= TVIS_EXPANDED; 3347 3395 } 3396 3397 //update window 3398 //CB: todo: optimize! 3399 TREEVIEW_UnqueueRefresh(hwnd,FALSE,FALSE); 3400 //CB: todo: precalc expanded items here 3401 TREEVIEW_CalcItems(hwnd,0,infoPtr); 3402 TREEVIEW_Refresh(hwnd); 3403 //CB: todo: check cx and cy to fit ranges! 3404 3348 3405 break; 3406 } 3349 3407 3350 3408 default: 3351 3409 return FALSE; 3352 3410 } 3353 3354 /* If item was collapsed we probably need to change selection */3355 if (flag & TVE_COLLAPSE)3356 {3357 HTREEITEM hItem = infoPtr->selectedItem;3358 3359 if (!TREEVIEW_ValidItem (infoPtr, hItem))3360 hItem = wineItem->hItem;3361 else3362 {3363 while ( hItem )3364 {3365 hItem = infoPtr->items[(INT)hItem].parent;3366 3367 if (hItem == wineItem->hItem)3368 break;3369 }3370 }3371 3372 if (hItem)3373 TREEVIEW_DoSelectItem(hwnd, TVGN_CARET, hItem, TVC_UNKNOWN);3374 }3375 3376 //CB: todo: optimize!3377 TREEVIEW_UnqueueRefresh(hwnd,FALSE,FALSE);3378 //CB: todo: precalc expanded items here3379 infoPtr->uInternalStatus |= TV_CALCALL;3380 TREEVIEW_CalcItems(hwnd,0,infoPtr);3381 TREEVIEW_Refresh(hwnd);3382 //CB: todo: check cx and cy to fit ranges!3383 3411 3384 3412 return TRUE; … … 3879 3907 } 3880 3908 3909 HTREEITEM TREEVIEW_GetHottrackItem(HWND hwnd,TREEVIEW_INFO *infoPtr,POINT pt) 3910 { 3911 TVHITTESTINFO ht; 3912 3913 ht.pt = pt; 3914 TREEVIEW_HitTest(hwnd,&ht,FALSE); 3915 3916 return (ht.hItem && (ht.flags & TVHT_ONITEM)) ? ht.hItem:0; 3917 } 3918 3881 3919 static LRESULT TREEVIEW_MouseMove(HWND hwnd,WPARAM wParam,LPARAM lParam) 3882 3920 { … … 3906 3944 if (dwStyle & TVS_TRACKSELECT) 3907 3945 { 3908 //CB: todo: hottracking 3946 HTREEITEM hItem = TREEVIEW_GetHottrackItem(hwnd,infoPtr,pt); 3947 3948 if (infoPtr->hotItem != hItem) 3949 { 3950 TREEVIEW_ITEM *item; 3951 HDC hdc = 0; 3952 3953 item = TREEVIEW_ValidItem(infoPtr,infoPtr->hotItem); 3954 if (item) 3955 { 3956 if (!hdc) hdc = GetDC(hwnd); 3957 TREEVIEW_DrawHottrackLine(hdc,item); 3958 } 3959 if (hItem) 3960 { 3961 item = &infoPtr->items[(INT)hItem]; 3962 if (item) 3963 { 3964 if (!hdc) hdc = GetDC(hwnd); 3965 TREEVIEW_DrawHottrackLine(hdc,item); 3966 } 3967 } 3968 if (hdc) ReleaseDC(hwnd,hdc); 3969 } 3909 3970 } 3910 3971 … … 4131 4192 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE); 4132 4193 INT prevSelect; 4194 BOOL refreshPrev = FALSE,refreshNew = FALSE; 4133 4195 4134 4196 wineItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)newSelect); … … 4164 4226 4165 4227 if (prevItem) 4228 { 4229 refreshPrev = prevItem->state & TVIS_SELECTED; 4166 4230 prevItem->state &= ~TVIS_SELECTED; 4231 } 4167 4232 if (wineItem) 4233 { 4234 refreshNew = !(wineItem->state & TVIS_SELECTED); 4168 4235 wineItem->state |= TVIS_SELECTED; 4236 } 4169 4237 4170 4238 infoPtr->selectedItem = (HTREEITEM)newSelect; … … 4182 4250 4183 4251 TREEVIEW_UnqueueRefresh(hwnd,TRUE,TRUE); 4184 TREEVIEW_RefreshItem(hwnd,prevItem,FALSE); 4185 TREEVIEW_RefreshItem(hwnd,wineItem,FALSE); 4252 if (dwStyle & TVS_FULLROWSELECT) 4253 { 4254 TREEVIEW_ITEM *item; 4255 4256 //deselect last selected row 4257 if (prevItem) 4258 { 4259 if (refreshPrev) TREEVIEW_RefreshItem(hwnd,prevItem,FALSE); 4260 if (prevItem->upsibling) 4261 { 4262 item = &infoPtr->items[(INT)prevItem->upsibling]; 4263 while (item) 4264 { 4265 if (item->state & TVIS_SELECTED) 4266 { 4267 item->state &= ~TVIS_SELECTED; 4268 TREEVIEW_RefreshItem(hwnd,item,FALSE); 4269 } 4270 item = &infoPtr->items[(INT)item->upsibling]; 4271 } 4272 } 4273 if (prevItem->sibling) 4274 { 4275 item = &infoPtr->items[(INT)prevItem->sibling]; 4276 while (item) 4277 { 4278 if (item->state & TVIS_SELECTED) 4279 { 4280 item->state &= ~TVIS_SELECTED; 4281 TREEVIEW_RefreshItem(hwnd,item,FALSE); 4282 } 4283 item = &infoPtr->items[(INT)item->sibling]; 4284 } 4285 } 4286 } 4287 4288 //select new row 4289 if (wineItem) 4290 { 4291 if (refreshNew) TREEVIEW_RefreshItem(hwnd,wineItem,FALSE); 4292 if (wineItem->upsibling) 4293 { 4294 item = &infoPtr->items[(INT)wineItem->upsibling]; 4295 while (item) 4296 { 4297 if (!(item->state & TVIS_SELECTED)) 4298 { 4299 item->state |= TVIS_SELECTED; 4300 TREEVIEW_RefreshItem(hwnd,item,FALSE); 4301 } 4302 item = &infoPtr->items[(INT)item->upsibling]; 4303 } 4304 } 4305 if (wineItem->sibling) 4306 { 4307 item = &infoPtr->items[(INT)wineItem->sibling]; 4308 while (item) 4309 { 4310 if (!(item->state & TVIS_SELECTED)) 4311 { 4312 item->state |= TVIS_SELECTED; 4313 TREEVIEW_RefreshItem(hwnd,item,FALSE); 4314 } 4315 item = &infoPtr->items[(INT)item->sibling]; 4316 } 4317 } 4318 } 4319 } else 4320 { 4321 if (refreshPrev) TREEVIEW_RefreshItem(hwnd,prevItem,FALSE); 4322 if (refreshNew) TREEVIEW_RefreshItem(hwnd,wineItem,FALSE); 4323 } 4186 4324 4187 4325 TREEVIEW_SendTreeviewNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_SELCHANGEDW:TVN_SELCHANGEDA,cause,(HTREEITEM)prevSelect,(HTREEITEM)newSelect); … … 4193 4331 4194 4332 if (prevItem) 4333 { 4334 refreshPrev = prevItem->state & TVIS_DROPHILITED; 4195 4335 prevItem->state &= ~TVIS_DROPHILITED; 4336 } 4196 4337 4197 4338 infoPtr->dropItem = (HTREEITEM)newSelect; 4198 4339 4199 4340 if (wineItem) 4341 { 4342 refreshNew = !(wineItem->state & TVIS_DROPHILITED); 4200 4343 wineItem->state |=TVIS_DROPHILITED; 4344 } 4201 4345 4202 4346 TREEVIEW_UnqueueRefresh(hwnd,TRUE,TRUE); 4203 TREEVIEW_RefreshItem(hwnd,prevItem,FALSE);4204 TREEVIEW_RefreshItem(hwnd,wineItem,FALSE);4347 if (refreshPrev) TREEVIEW_RefreshItem(hwnd,prevItem,FALSE); 4348 if (refreshNew) TREEVIEW_RefreshItem(hwnd,wineItem,FALSE); 4205 4349 4206 4350 break; … … 4242 4386 TREEVIEW_SelectItem (HWND hwnd, WPARAM wParam, LPARAM lParam) 4243 4387 { 4244 return TREEVIEW_DoSelectItem (hwnd, wParam, (HTREEITEM) lParam, TVC_UNKNOWN);4388 return TREEVIEW_DoSelectItem (hwnd, wParam, (HTREEITEM) lParam, TVC_UNKNOWN); 4245 4389 } 4246 4390 … … 4248 4392 TREEVIEW_GetFont (HWND hwnd, WPARAM wParam, LPARAM lParam) 4249 4393 { 4250 TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd); 4251 4252 // TRACE (treeview,"%x\n",infoPtr->hFont); 4253 return infoPtr->hFont; 4394 TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd); 4395 4396 return infoPtr->hFont; 4254 4397 } 4255 4398
Note:
See TracChangeset
for help on using the changeset viewer.
