Changeset 3182 for trunk/src/comctl32/treeview.cpp
- Timestamp:
- Mar 21, 2000, 6:30:46 PM (25 years ago)
- File:
-
- 1 edited
-
trunk/src/comctl32/treeview.cpp (modified) (67 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/comctl32/treeview.cpp
r3154 r3182 1 /* $Id: treeview.cpp,v 1. 3 2000-03-18 16:17:34cbratschi Exp $ */1 /* $Id: treeview.cpp,v 1.4 2000-03-21 17:30:46 cbratschi Exp $ */ 2 2 /* Treeview control 3 3 * … … 66 66 static BOOL TREEVIEW_SendTreeviewNotify (HWND hwnd, UINT code, UINT action, HTREEITEM oldItem, HTREEITEM newItem); 67 67 static BOOL TREEVIEW_SendTreeviewDnDNotify (HWND hwnd, UINT code, HTREEITEM dragItem, POINT pt); 68 static BOOL TREEVIEW_SendDispInfoNotify (HWND hwnd, TREEVIEW_ITEM *wineItem, UINT code, UINT what); 68 static INT TREEVIEW_CallbackChildren(HWND hwnd,TREEVIEW_ITEM *wineItem); 69 static INT TREEVIEW_CallbackImage(HWND hwnd,TREEVIEW_ITEM *wineItem); 70 static INT TREEVIEW_CallbackSelectedImage(HWND hwnd,TREEVIEW_ITEM *wineItem); 71 static WCHAR* TREEVIEW_CallbackText(HWND hwnd,TREEVIEW_ITEM *wineItem,BOOL *mustFree); 69 72 static BOOL TREEVIEW_SendCustomDrawNotify (HWND hwnd, DWORD dwDrawStage, HDC hdc, RECT rc); 70 73 static BOOL TREEVIEW_SendCustomDrawItemNotify (HWND hwnd, HDC hdc, TREEVIEW_ITEM *tvItem, UINT uItemDrawState); … … 73 76 static LRESULT TREEVIEW_DoSelectItem(HWND hwnd,INT action,HTREEITEM newSelect,INT cause); 74 77 static void TREEVIEW_Refresh(HWND hwnd); 78 static void TREEVIEW_RefreshItem(HWND hwnd,TREEVIEW_ITEM *item,BOOL wholeLine); 75 79 static void TREEVIEW_Draw(HWND hwnd,HDC hdc,RECT *updateRect); 76 80 static BOOL TREEVIEW_UnqueueRefresh(HWND hwnd,BOOL calc,BOOL refresh); … … 127 131 { 128 132 if (wineItem->cChildren == I_CHILDRENCALLBACK) 129 { 130 TREEVIEW_ITEM tempItem; 131 132 tempItem.hItem = wineItem->hItem; 133 tempItem.state = wineItem->state; 134 tempItem.lParam = wineItem->lParam; 135 136 TREEVIEW_SendDispInfoNotify(hwnd, &tempItem, TVN_GETDISPINFO, TVIF_CHILDREN); 137 cChildren = tempItem.cChildren; 138 } 133 cChildren = TREEVIEW_CallbackChildren(hwnd,wineItem); 139 134 else 140 cChildren = wineItem->cChildren;135 cChildren = wineItem->cChildren; 141 136 } 142 137 else if ( wineItem->firstChild ) … … 328 323 COMCTL32_Free (killItem->pszText); 329 324 killItem->pszText = NULL; 330 TREEVIEW_SendTreeviewNotify (hwnd, TVN_DELETEITEM, 0, (HTREEITEM)kill, 0);325 TREEVIEW_SendTreeviewNotify (hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_DELETEITEMW:TVN_DELETEITEMA, 0, (HTREEITEM)kill, 0); 331 326 if (killItem->firstChild) 332 327 TREEVIEW_RemoveAllChildren (hwnd, killItem); … … 356 351 wineItem->pszText = NULL; 357 352 358 TREEVIEW_SendTreeviewNotify (hwnd, TVN_DELETEITEM, 0, (HTREEITEM)iItem, 0);353 TREEVIEW_SendTreeviewNotify (hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_DELETEITEMW:TVN_DELETEITEMA, 0, (HTREEITEM)iItem, 0); 359 354 360 355 if (wineItem->firstChild) … … 403 398 killItem->pszText = NULL; 404 399 405 TREEVIEW_SendTreeviewNotify 406 (hwnd, TVN_DELETEITEM, 0, killItem->hItem, 0); 400 TREEVIEW_SendTreeviewNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_DELETEITEMW:TVN_DELETEITEMA, 0, killItem->hItem, 0); 407 401 } 408 402 … … 474 468 if (!(GetWindowLongA(hwnd, GWL_STYLE) & TVS_NONEVENHEIGHT)) 475 469 if (infoPtr->uItemHeight & 0x1) infoPtr->uItemHeight++; 470 471 if (prevHeight != infoPtr->uItemHeight) 472 { 473 infoPtr->uInternalStatus |= TV_CALCALL; 474 TREEVIEW_QueueRefresh(hwnd); 475 } 476 476 477 477 return prevHeight; … … 808 808 /* The item is curently selected */ 809 809 if (item->iSelectedImage == I_IMAGECALLBACK) 810 TREEVIEW_SendDispInfoNotify(hwnd, item, TVN_GETDISPINFO, TVIF_SELECTEDIMAGE);811 812 imageIndex = item->iSelectedImage;810 imageIndex = TREEVIEW_CallbackSelectedImage(hwnd,item); 811 else 812 imageIndex = item->iSelectedImage; 813 813 } else 814 814 { 815 815 /* The item is not selected */ 816 816 if (item->iImage == I_IMAGECALLBACK) 817 TREEVIEW_SendDispInfoNotify(hwnd, item, TVN_GETDISPINFO, TVIF_IMAGE);818 819 imageIndex = item->iImage;817 imageIndex = TREEVIEW_CallbackImage(hwnd,item); 818 else 819 imageIndex = item->iImage; 820 820 } 821 821 … … 844 844 HBRUSH hbrBk = 0; 845 845 BOOL inFocus = GetFocus() == hwnd; 846 WCHAR* text; 847 BOOL mustFree = FALSE; 846 848 847 849 oldBkMode = SetBkMode(hdc, TRANSPARENT); … … 879 881 880 882 if (item->pszText == LPSTR_TEXTCALLBACKW) 881 TREEVIEW_SendDispInfoNotify (hwnd, item, TVN_GETDISPINFO, TVIF_TEXT); 883 text = TREEVIEW_CallbackText(hwnd,item,&mustFree); 884 else 885 text = item->pszText; 882 886 883 887 if (hbrBk) … … 890 894 891 895 /* Draw it */ 892 DrawTextW ( hdc, 893 item->pszText, 894 lstrlenW(item->pszText), 895 &item->text, 896 uTextJustify | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX); 896 DrawTextW(hdc,text,lstrlenW(text),&item->text,uTextJustify | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX); 897 if (mustFree) COMCTL32_Free(text); 897 898 898 899 item->text.left -= 2; … … 1028 1029 TVITEMEXW *tvItem; 1029 1030 INT iItem,len; 1031 BOOL mustRefresh = FALSE; 1032 BOOL mustRepaint = FALSE; 1030 1033 1031 1034 if (infoPtr->hwndEdit) SetFocus(hwnd); … … 1034 1037 iItem = (INT)tvItem->hItem; 1035 1038 1036 wineItem = TREEVIEW_ValidItem (infoPtr,(HTREEITEM)iItem);1039 wineItem = TREEVIEW_ValidItem(infoPtr,(HTREEITEM)iItem); 1037 1040 if (!wineItem) return FALSE; 1038 1041 1039 if (tvItem->mask & TVIF_CHILDREN) 1042 if ((tvItem->mask & TVIF_CHILDREN) && (wineItem->cChildren != tvItem->cChildren)) 1043 { 1040 1044 wineItem->cChildren = tvItem->cChildren; 1041 1042 if (tvItem->mask & TVIF_IMAGE) 1045 mustRefresh = TRUE; 1046 } 1047 1048 if ((tvItem->mask & TVIF_IMAGE) && (wineItem->iImage != tvItem->iImage)) 1049 { 1043 1050 wineItem->iImage = tvItem->iImage; 1044 1045 if (tvItem->mask & TVIF_INTEGRAL) 1051 mustRepaint = TRUE; 1052 } 1053 1054 if ((tvItem->mask & TVIF_INTEGRAL) && (wineItem->iIntegral != tvItem->iIntegral)) 1055 { 1046 1056 wineItem->iIntegral = tvItem->iIntegral; 1057 mustRefresh = TRUE; 1058 } 1047 1059 1048 1060 if (tvItem->mask & TVIF_PARAM) 1049 1061 wineItem->lParam = tvItem->lParam; 1050 1062 1051 if (tvItem->mask & TVIF_SELECTEDIMAGE) 1063 if ((tvItem->mask & TVIF_SELECTEDIMAGE) && (wineItem->iSelectedImage != tvItem->iSelectedImage)) 1064 { 1052 1065 wineItem->iSelectedImage = tvItem->iSelectedImage; 1066 mustRepaint = TRUE; 1067 } 1053 1068 1054 1069 if (tvItem->mask & TVIF_STATE) 1055 1070 { 1071 DWORD oldState = wineItem->state,oldMask = wineItem->stateMask; 1072 1056 1073 wineItem->state &= ~tvItem->stateMask; 1057 1074 wineItem->state |= (tvItem->state & tvItem->stateMask); 1058 1075 wineItem->stateMask |= tvItem->stateMask; 1076 mustRepaint = (oldState != wineItem->state) || (oldMask != wineItem->stateMask); 1059 1077 } 1060 1078 … … 1066 1084 { 1067 1085 len = lstrlenW(tvItem->pszText)+1; 1086 1068 1087 if (len > wineItem->cchTextMax) 1069 1088 { 1070 wineItem->pszText= (WCHAR*)COMCTL32_ReAlloc(wineItem->pszText,len*sizeof(WCHAR)); 1089 if (wineItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(wineItem->pszText); 1090 wineItem->pszText= (WCHAR*)COMCTL32_Alloc(len*sizeof(WCHAR)); 1071 1091 wineItem->cchTextMax = len; 1072 1092 } 1073 lstrcpy nW(wineItem->pszText,tvItem->pszText,len);1093 lstrcpyW(wineItem->pszText,tvItem->pszText); 1074 1094 } else 1075 1095 { 1076 1096 if (wineItem->cchTextMax) 1077 1097 { 1078 COMCTL32_Free (wineItem->pszText);1098 if (wineItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free (wineItem->pszText); 1079 1099 wineItem->cchTextMax = 0; 1080 1100 } … … 1083 1103 } else 1084 1104 { 1085 LPTVITEMEXA tvItem; 1086 1087 tvItem = (LPTVITEMEXA)lParam; 1088 1089 if (tvItem->pszText != LPSTR_TEXTCALLBACKA) 1090 { 1091 len = lstrlenA (tvItem->pszText) + 1; 1105 if ((LPSTR)tvItem->pszText != LPSTR_TEXTCALLBACKA) 1106 { 1107 len = lstrlenA((LPSTR)tvItem->pszText)+1; 1092 1108 if (len > wineItem->cchTextMax) 1093 1109 { 1094 wineItem->pszText = (WCHAR*)COMCTL32_ReAlloc(wineItem->pszText,len*sizeof(WCHAR)); 1110 if (wineItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(wineItem->pszText); 1111 wineItem->pszText = (WCHAR*)COMCTL32_Alloc(len*sizeof(WCHAR)); 1095 1112 wineItem->cchTextMax = len; 1096 1113 } 1097 lstrcpy nAtoW(wineItem->pszText,tvItem->pszText,len);1114 lstrcpyAtoW(wineItem->pszText,(LPSTR)tvItem->pszText); 1098 1115 } else 1099 1116 { 1100 1117 if (wineItem->cchTextMax) 1101 1118 { 1102 COMCTL32_Free(wineItem->pszText);1119 if (wineItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(wineItem->pszText); 1103 1120 wineItem->cchTextMax = 0; 1104 1121 } … … 1106 1123 } 1107 1124 } 1108 } 1109 1110 wineItem->mask |= tvItem->mask; 1111 wineItem->calculated = FALSE; 1112 TREEVIEW_QueueRefresh(hwnd); 1125 mustRepaint = TRUE; 1126 } 1127 1128 if (wineItem->mask != (wineItem->mask | tvItem->mask)) 1129 { 1130 wineItem->mask |= tvItem->mask; 1131 mustRepaint = TRUE; 1132 } 1133 1134 if (mustRepaint || mustRefresh) 1135 { 1136 wineItem->calculated = FALSE; 1137 if (mustRefresh) 1138 TREEVIEW_QueueRefresh(hwnd); 1139 else 1140 TREEVIEW_RefreshItem(hwnd,wineItem,FALSE); 1141 } 1113 1142 1114 1143 return TRUE; … … 1153 1182 1154 1183 //redraw text and image 1155 if ((( item->mask &(TVIF_IMAGE | TVIF_SELECTEDIMAGE)) || (dwStyle & TVS_CHECKBOXES)) && (item->iSelectedImage != item->iImage))1184 if ((((item->mask & (TVIF_IMAGE | TVIF_SELECTEDIMAGE)) == (TVIF_IMAGE | TVIF_SELECTEDIMAGE)) || (dwStyle & TVS_CHECKBOXES)) && (item->iSelectedImage != item->iImage)) 1156 1185 { 1157 1186 rect.left += TREEVIEW_LEFT_MARGIN; … … 1265 1294 UINT uTextJustify = DT_LEFT; 1266 1295 HFONT hOldFont; 1296 WCHAR* text; 1297 BOOL mustFree = FALSE; 1267 1298 1268 1299 r.left += 3; … … 1275 1306 1276 1307 if (item->pszText == LPSTR_TEXTCALLBACKW) 1277 TREEVIEW_SendDispInfoNotify (hwnd, item, TVN_GETDISPINFO, TVIF_TEXT); 1308 text = TREEVIEW_CallbackText(hwnd,item,&mustFree); 1309 else 1310 text = item->pszText; 1278 1311 1279 1312 if (!hdc) … … 1289 1322 1290 1323 /* Obtain the text coordinate */ 1291 DrawTextW ( 1292 hdc, 1293 item->pszText, 1294 lstrlenW(item->pszText), 1295 &item->text, 1296 uTextJustify | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT | DT_NOPREFIX); 1324 DrawTextW (hdc,text,lstrlenW(text),&item->text,uTextJustify | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT | DT_NOPREFIX); 1325 if (mustFree) COMCTL32_Free(text); 1297 1326 1298 1327 SelectObject(hdc,hOldFont); … … 1583 1612 TREEVIEW_DrawItem(hwnd,hdc,item,dwStyle,infoPtr); 1584 1613 visFound = TRUE; 1585 } 1614 } else if (updateRect && (item->rect.top >= updateRect->bottom)) break; 1586 1615 } else if (visFound) break; 1587 1616 if (!visFound && (dwStyle & TVS_HASLINES) && (dwStyle & TVS_LINESATROOT)) … … 1691 1720 infoPtr->Timer &= ~TV_REFRESH_TIMER_SET; 1692 1721 if (calc) TREEVIEW_CalcItems(hwnd,0,infoPtr); 1693 if (refresh) TREEVIEW_Refresh(hwnd); 1722 if (refresh) 1723 { 1724 TREEVIEW_Refresh(hwnd); 1725 UpdateWindow(hwnd); 1726 } 1694 1727 1695 1728 return TRUE; … … 1720 1753 1721 1754 if (tvItem->mask & TVIF_IMAGE) 1722 tvItem->iImage = wineItem->iImage; 1755 { 1756 if (wineItem->iImage == I_IMAGECALLBACK) 1757 tvItem->iImage = TREEVIEW_CallbackImage(hwnd,wineItem); 1758 else 1759 tvItem->iImage = wineItem->iImage; 1760 } 1723 1761 1724 1762 if (tvItem->mask & TVIF_INTEGRAL) … … 1730 1768 1731 1769 if (tvItem->mask & TVIF_SELECTEDIMAGE) 1732 tvItem->iSelectedImage = wineItem->iSelectedImage; 1770 { 1771 if (wineItem->iSelectedImage == I_IMAGECALLBACK) 1772 tvItem->iSelectedImage = TREEVIEW_CallbackSelectedImage(hwnd,wineItem); 1773 else 1774 tvItem->iSelectedImage = wineItem->iSelectedImage; 1775 } 1733 1776 1734 1777 if (tvItem->mask & TVIF_STATE) … … 1737 1780 if (tvItem->mask & TVIF_TEXT) 1738 1781 { 1782 WCHAR* text; 1783 BOOL mustFree = FALSE; 1784 1739 1785 if (wineItem->pszText == LPSTR_TEXTCALLBACKW) 1740 TREEVIEW_SendDispInfoNotify(hwnd,wineItem,TVN_GETDISPINFO,TVIF_TEXT); 1786 text = TREEVIEW_CallbackText(hwnd,wineItem,&mustFree); 1787 else 1788 text = wineItem->pszText; 1789 1741 1790 if (unicode) 1742 { 1743 if (wineItem->pszText == LPSTR_TEXTCALLBACKW) 1744 tvItem->pszText = LPSTR_TEXTCALLBACKW; 1745 else if (wineItem->pszText) 1746 lstrcpynW(tvItem->pszText,wineItem->pszText,tvItem->cchTextMax); 1747 } else 1748 { 1749 LPTVITEMEXA tvItem = (LPTVITEMEXA)lParam; 1750 1751 if (wineItem->pszText == LPSTR_TEXTCALLBACKW) 1752 tvItem->pszText = LPSTR_TEXTCALLBACKA; 1753 else if (wineItem->pszText) 1754 lstrcpynWtoA(tvItem->pszText, wineItem->pszText,tvItem->cchTextMax); 1755 } 1791 lstrcpynW(tvItem->pszText,text,tvItem->cchTextMax); 1792 else 1793 lstrcpynWtoA((LPSTR)tvItem->pszText,text,tvItem->cchTextMax); 1794 if (mustFree) COMCTL32_Free(text); 1756 1795 } 1757 1796 … … 1974 2013 WCHAR *txt1,*txt2; 1975 2014 TREEVIEW_ITEM *item; 1976 1977 item = (TREEVIEW_ITEM *) first; 2015 INT res; 2016 BOOL mustFree1 = FALSE,mustFree2 = FALSE; 2017 2018 item = (TREEVIEW_ITEM*)first; 1978 2019 if (item->pszText == LPSTR_TEXTCALLBACKW) 1979 TREEVIEW_SendDispInfoNotify (hwnd, item, TVN_GETDISPINFO, TVIF_TEXT);1980 1981 txt1 = item->pszText;1982 1983 item = (TREEVIEW_ITEM *)second;2020 txt1 = TREEVIEW_CallbackText(hwnd,item,&mustFree1); 2021 else 2022 txt1 = item->pszText; 2023 2024 item = (TREEVIEW_ITEM*)second; 1984 2025 if (item->pszText == LPSTR_TEXTCALLBACKW) 1985 TREEVIEW_SendDispInfoNotify (hwnd, item, TVN_GETDISPINFO, TVIF_TEXT); 1986 1987 txt2 = item->pszText; 1988 1989 return lstrcmpiW(txt1,txt2); //CB: or lstrcmpW? 2026 txt2 = TREEVIEW_CallbackText(hwnd,item,&mustFree2); 2027 else 2028 txt2 = item->pszText; 2029 2030 res = lstrcmpiW(txt1,txt2); //CB: or lstrcmpW? 2031 if (mustFree1) COMCTL32_Free(txt1); 2032 if (mustFree2) COMCTL32_Free(txt2); 2033 2034 return res; 1990 2035 } 1991 2036 … … 2149 2194 static LRESULT 2150 2195 TREEVIEW_InsertItem(HWND hwnd,WPARAM wParam,LPARAM lParam,BOOL unicode) 2151 2152 2196 { 2153 2197 TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd); … … 2218 2262 */ 2219 2263 tvItem = &ptdi->itemex; 2220 wineItem =&infoPtr->items[iItem];2264 wineItem = &infoPtr->items[iItem]; 2221 2265 2222 2266 if ((ptdi->hParent==TVI_ROOT) || (ptdi->hParent==0)) { … … 2252 2296 if (tvItem->pszText != LPSTR_TEXTCALLBACKW) 2253 2297 { 2254 //TRACE (treeview,"(%p,%s)\n", &tvItem->pszText, tvItem->pszText);2255 2298 len = lstrlenW(tvItem->pszText)+1; 2256 2299 wineItem->pszText = (WCHAR*)COMCTL32_Alloc(len*sizeof(WCHAR)); … … 2259 2302 } else 2260 2303 { 2261 //TRACE (treeview,"LPSTR_TEXTCALLBACK\n");2262 2304 wineItem->pszText = LPSTR_TEXTCALLBACKW; 2263 2305 wineItem->cchTextMax = 0; … … 2265 2307 } else 2266 2308 { 2267 TVITEMEXA *tvItemA = (LPTVITEMEXA)tvItem; 2268 2269 if (tvItemA->pszText != LPSTR_TEXTCALLBACKA) 2270 { 2271 //TRACE (treeview,"(%p,%s)\n", &tvItem->pszText, tvItem->pszText); 2272 len = lstrlenA(tvItemA->pszText)+1; 2273 wineItem->pszText= (WCHAR*)COMCTL32_Alloc (len*sizeof(WCHAR)); 2274 lstrcpyAtoW (wineItem->pszText, tvItemA->pszText); 2309 if ((LPSTR)tvItem->pszText != LPSTR_TEXTCALLBACKA) 2310 { 2311 len = lstrlenA((LPSTR)tvItem->pszText)+1; 2312 wineItem->pszText = (WCHAR*)COMCTL32_Alloc(len*sizeof(WCHAR)); 2313 lstrcpyAtoW (wineItem->pszText,(LPSTR)tvItem->pszText); 2275 2314 wineItem->cchTextMax = len; 2276 2315 } else 2277 2316 { 2278 //TRACE (treeview,"LPSTR_TEXTCALLBACK\n");2279 2317 wineItem->pszText = LPSTR_TEXTCALLBACKW; 2280 2318 wineItem->cchTextMax = 0; … … 2309 2347 { 2310 2348 TREEVIEW_ITEM *aChild; 2311 2312 2349 TREEVIEW_ITEM *previousChild = NULL; 2313 2350 BOOL bItemInserted = FALSE; 2351 WCHAR* text; 2352 BOOL mustFree = FALSE; 2314 2353 2315 2354 if (parentItem) … … 2319 2358 2320 2359 /* lookup the text if using LPSTR_TEXTCALLBACKs */ 2321 if (wineItem->pszText==LPSTR_TEXTCALLBACKW) { 2322 TREEVIEW_SendDispInfoNotify (hwnd, wineItem, TVN_GETDISPINFO, TVIF_TEXT); 2323 } 2360 if (wineItem->pszText == LPSTR_TEXTCALLBACKW) 2361 text = TREEVIEW_CallbackText(hwnd,wineItem,&mustFree); 2362 else 2363 text = wineItem->pszText; 2324 2364 2325 2365 /* Iterate the parent children to see where we fit in */ … … 2327 2367 { 2328 2368 INT comp; 2369 WCHAR* text2; 2370 BOOL mustFree2 = FALSE; 2329 2371 2330 2372 /* lookup the text if using LPSTR_TEXTCALLBACKs */ 2331 if (aChild->pszText==LPSTR_TEXTCALLBACKW) { 2332 TREEVIEW_SendDispInfoNotify (hwnd, aChild, TVN_GETDISPINFO, TVIF_TEXT); 2333 } 2334 2335 comp = lstrcmpW(wineItem->pszText, aChild->pszText); 2373 if (aChild->pszText == LPSTR_TEXTCALLBACKW) 2374 text2 = TREEVIEW_CallbackText(hwnd,aChild,&mustFree2); 2375 else 2376 text2 = aChild->pszText; 2377 2378 comp = lstrcmpW(text,text2); 2379 if (mustFree2) COMCTL32_Free(text2); 2336 2380 if ( comp < 0 ) /* we are smaller than the current one */ 2337 2381 { … … 2361 2405 } 2362 2406 } 2407 if (mustFree) COMCTL32_Free(text); 2363 2408 2364 2409 /* … … 2481 2526 if (newIndent != infoPtr->uIndent) 2482 2527 { 2483 infoPtr->uIndent =newIndent;2528 infoPtr->uIndent = newIndent; 2484 2529 infoPtr->uInternalStatus |= TV_CALCALL; 2485 2530 TREEVIEW_QueueRefresh(hwnd); … … 2780 2825 TREEVIEW_Paint (HWND hwnd, WPARAM wParam, LPARAM lParam) 2781 2826 { 2782 HDC hdc; 2827 HDC hdc = (HDC)wParam; 2828 2829 if (!hdc) 2830 { 2783 2831 PAINTSTRUCT ps; 2784 2832 2785 hdc = wParam==0 ? BeginPaint (hwnd, &ps) : (HDC)wParam; 2786 TREEVIEW_Draw(hwnd,hdc,&ps.rcPaint); 2787 if(!wParam) 2788 EndPaint (hwnd, &ps); 2789 2790 return 0; 2833 hdc = BeginPaint(hwnd,&ps); 2834 TREEVIEW_Draw(hwnd, hdc,&ps.rcPaint); 2835 EndPaint(hwnd,&ps); 2836 } else 2837 TREEVIEW_Draw(hwnd,hdc,NULL); 2838 2839 return 0; 2791 2840 } 2792 2841 … … 2853 2902 2854 2903 static BOOL 2855 TREEVIEW_SendTreeviewNotify (HWND hwnd, UINT code, UINT action, 2856 HTREEITEM oldItem, HTREEITEM newItem) 2904 TREEVIEW_SendTreeviewNotify (HWND hwnd,UINT code,UINT action,HTREEITEM oldItem,HTREEITEM newItem) 2857 2905 { 2858 2906 TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd); … … 2875 2923 if (!isUnicodeNotify(&infoPtr->header)) 2876 2924 { 2877 if (!wineItem->pszText ) nmhdr.itemOld.pszText = NULL; else2925 if (!wineItem->pszText || (wineItem->pszText == LPSTR_TEXTCALLBACKW)) nmhdr.itemOld.pszText = NULL; else 2878 2926 { 2879 2927 INT len = lstrlenW(wineItem->pszText)+1; … … 2901 2949 if (!isUnicodeNotify(&infoPtr->header)) 2902 2950 { 2903 if (!wineItem->pszText ) nmhdr.itemNew.pszText = NULL; else2951 if (!wineItem->pszText || (wineItem->pszText == LPSTR_TEXTCALLBACKW)) nmhdr.itemNew.pszText = NULL; else 2904 2952 { 2905 2953 INT len = lstrlenW(wineItem->pszText)+1; … … 2950 2998 } 2951 2999 2952 static BOOL 2953 TREEVIEW_SendDispInfoNotify (HWND hwnd, TREEVIEW_ITEM *wineItem, UINT code, UINT what) 3000 static INT TREEVIEW_CallbackImage(HWND hwnd,TREEVIEW_ITEM *wineItem) 3001 { 3002 NMTVDISPINFOW tvdi; 3003 BOOL retval; 3004 3005 tvdi.item.mask = TVIF_IMAGE; 3006 tvdi.item.hItem = wineItem->hItem; 3007 tvdi.item.state = wineItem->state; 3008 tvdi.item.lParam = wineItem->lParam; 3009 tvdi.item.iImage = 0; 3010 3011 retval = (BOOL)sendNotify(hwnd,isUnicodeNotify(hwnd) ? TVN_GETDISPINFOW:TVN_GETDISPINFOA,&tvdi.hdr); 3012 3013 if (tvdi.item.mask & TVIF_DI_SETITEM) 3014 wineItem->iImage = tvdi.item.iImage; 3015 3016 return tvdi.item.iImage; 3017 } 3018 3019 static INT TREEVIEW_CallbackSelectedImage(HWND hwnd,TREEVIEW_ITEM *wineItem) 3020 { 3021 NMTVDISPINFOW tvdi; 3022 BOOL retval; 3023 3024 tvdi.item.mask = TVIF_SELECTEDIMAGE; 3025 tvdi.item.hItem = wineItem->hItem; 3026 tvdi.item.state = wineItem->state; 3027 tvdi.item.lParam = wineItem->lParam; 3028 tvdi.item.iSelectedImage = 0; 3029 3030 retval = (BOOL)sendNotify(hwnd,isUnicodeNotify(hwnd) ? TVN_GETDISPINFOW:TVN_GETDISPINFOA,&tvdi.hdr); 3031 3032 if (tvdi.item.mask & TVIF_DI_SETITEM) 3033 wineItem->iSelectedImage = tvdi.item.iSelectedImage; 3034 3035 return tvdi.item.iSelectedImage; 3036 } 3037 3038 static WCHAR* TREEVIEW_CallbackText(HWND hwnd,TREEVIEW_ITEM *wineItem,BOOL *mustFree) 2954 3039 { 2955 3040 TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd); … … 2958 3043 WCHAR *buf; 2959 3044 2960 tvdi.item.mask = what;3045 tvdi.item.mask = TVIF_TEXT; 2961 3046 tvdi.item.hItem = wineItem->hItem; 2962 3047 tvdi.item.state = wineItem->state; 2963 3048 tvdi.item.lParam = wineItem->lParam; 2964 tvdi.item.pszText = (WCHAR*)COMCTL32_Alloc(128*(isUnicodeNotify(&infoPtr->header) ? sizeof(WCHAR):sizeof( char)));2965 tvdi.item.cchTextMax = 128;3049 tvdi.item.pszText = (WCHAR*)COMCTL32_Alloc(128*(isUnicodeNotify(&infoPtr->header) ? sizeof(WCHAR):sizeof(CHAR))); 3050 tvdi.item.cchTextMax = 128; 2966 3051 buf = tvdi.item.pszText; 2967 3052 2968 retval = (BOOL)sendNotify(hwnd,code,&tvdi.hdr); 2969 2970 /* Ignore posible changes */ 2971 if (code == TVN_BEGINLABELEDIT) 2972 return retval; 2973 2974 if (what & TVIF_TEXT) 2975 { 2976 if (isUnicodeNotify(&infoPtr->header)) 3053 retval = (BOOL)sendNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_GETDISPINFOW:TVN_GETDISPINFOA,&tvdi.hdr); 3054 3055 if (tvdi.item.pszText == LPSTR_TEXTCALLBACKW) 3056 { 3057 *mustFree = FALSE; 3058 return NULL; 3059 } 3060 3061 if (isUnicodeNotify(&infoPtr->header)) 3062 { 3063 if (tvdi.item.mask & TVIF_DI_SETITEM) 2977 3064 { 2978 3065 wineItem->pszText = tvdi.item.pszText; … … 2982 3069 } else 2983 3070 { 2984 // TRACE (treeview,"user-supplied buffer\n");3071 //user-supplied buffer 2985 3072 COMCTL32_Free(buf); 2986 3073 wineItem->cchTextMax = 0; 2987 3074 } 3075 *mustFree = FALSE; 3076 return wineItem->pszText; 2988 3077 } else 2989 3078 { 3079 if (buf != tvdi.item.pszText) 3080 { 3081 COMCTL32_Free(buf); 3082 *mustFree = FALSE; 3083 } else *mustFree = TRUE; 3084 return tvdi.item.pszText; 3085 } 3086 } else 3087 { 3088 if (tvdi.item.mask & TVIF_DI_SETITEM) 3089 { 2990 3090 if (buf == tvdi.item.pszText) 2991 3091 { 2992 COMCTL32_Free(wineItem->pszText);2993 3092 wineItem->cchTextMax = 128; 2994 3093 wineItem->pszText = (WCHAR*)COMCTL32_Alloc(128*sizeof(WCHAR)); … … 2997 3096 } else 2998 3097 { 2999 // TRACE (treeview,"user-supplied buffer\n");3098 //user-supplied buffer 3000 3099 COMCTL32_Free(buf); 3001 3100 wineItem->cchTextMax = 0; 3002 3101 } 3102 *mustFree = FALSE; 3103 return wineItem->pszText; 3104 } else 3105 { 3106 INT len = lstrlenA((LPSTR)tvdi.item.pszText); 3107 WCHAR* textW = (WCHAR*)COMCTL32_Alloc((len+1)*sizeof(WCHAR)); 3108 3109 lstrcpyAtoW(textW,(LPSTR)tvdi.item.pszText); 3110 COMCTL32_Free(buf); 3111 *mustFree = TRUE; 3112 return textW; 3003 3113 } 3004 3114 } 3005 3006 if (what & TVIF_SELECTEDIMAGE) 3007 wineItem->iSelectedImage = tvdi.item.iSelectedImage; 3008 if (what & TVIF_IMAGE) 3009 wineItem->iImage = tvdi.item.iImage; 3010 if (what & TVIF_CHILDREN) 3011 wineItem->cChildren = tvdi.item.cChildren; 3012 3013 return retval; 3115 } 3116 3117 static INT TREEVIEW_CallbackChildren(HWND hwnd,TREEVIEW_ITEM *wineItem) 3118 { 3119 NMTVDISPINFOW tvdi; 3120 BOOL retval; 3121 3122 tvdi.item.mask = TVIF_CHILDREN; 3123 tvdi.item.hItem = wineItem->hItem; 3124 tvdi.item.state = wineItem->state; 3125 tvdi.item.lParam = wineItem->lParam; 3126 tvdi.item.cChildren = 0; 3127 3128 retval = (BOOL)sendNotify(hwnd,isUnicodeNotify(hwnd) ? TVN_GETDISPINFOW:TVN_GETDISPINFOA,&tvdi.hdr); 3129 3130 if (tvdi.item.mask & TVIF_DI_SETITEM) 3131 wineItem->cChildren = tvdi.item.cChildren; 3132 3133 return tvdi.item.cChildren; 3014 3134 } 3015 3135 … … 3162 3282 3163 3283 /* this item has never been expanded */ 3164 if (TREEVIEW_SendTreeviewNotify(hwnd, TVN_ITEMEXPANDING,TVE_EXPAND,0,(HTREEITEM)expand))3284 if (TREEVIEW_SendTreeviewNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_ITEMEXPANDINGW:TVN_ITEMEXPANDINGA,TVE_EXPAND,0,(HTREEITEM)expand)) 3165 3285 return FALSE; 3166 3286 … … 3186 3306 //TRACE(treeview, " TVN_ITEMEXPANDING sent...\n"); 3187 3307 3188 TREEVIEW_SendTreeviewNotify ( 3189 hwnd, 3190 TVN_ITEMEXPANDED, 3191 TVE_EXPAND, 3192 0, 3193 (HTREEITEM)expand); 3308 TREEVIEW_SendTreeviewNotify (hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_ITEMEXPANDEDW:TVN_ITEMEXPANDEDA,TVE_EXPAND,0,(HTREEITEM)expand); 3194 3309 3195 3310 //TRACE(treeview, " TVN_ITEMEXPANDED sent...\n"); … … 3321 3436 HFONT hOldFont = 0; 3322 3437 TEXTMETRICA textMetric; 3438 WCHAR* textW; 3439 CHAR* textA = NULL; 3440 BOOL mustFree = FALSE; 3441 NMTVDISPINFOW tvdi; 3323 3442 3324 3443 if (!editItem) … … 3333 3452 3334 3453 if (editItem->pszText == LPSTR_TEXTCALLBACKW) 3335 TREEVIEW_SendDispInfoNotify (hwnd, editItem, TVN_GETDISPINFO, TVIF_TEXT); 3454 textW = TREEVIEW_CallbackText(hwnd,editItem,&mustFree); 3455 else 3456 textW = editItem->pszText; 3336 3457 3337 3458 hdc = GetDC(hwnd); … … 3343 3464 3344 3465 /*Get String Lenght in pixels */ 3345 GetTextExtentPoint32W(hdc, editItem->pszText, lstrlenW(editItem->pszText),&sz);3466 GetTextExtentPoint32W(hdc,textW,lstrlenW(textW),&sz); 3346 3467 3347 3468 /*Add Extra spacing for the next character */ … … 3372 3493 (DWORD) TREEVIEW_Edit_SubclassProc); 3373 3494 3374 if (TREEVIEW_SendDispInfoNotify (hwnd, editItem, TVN_BEGINLABELEDIT, 3375 editItem->mask & (TVIF_HANDLE|TVIF_TEXT|TVIF_STATE|TVIF_PARAM))) 3495 tvdi.item.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_STATE | TVIF_PARAM; 3496 tvdi.item.hItem = editItem->hItem; 3497 tvdi.item.state = editItem->state; 3498 tvdi.item.lParam = editItem->lParam; 3499 if (isUnicodeNotify(&infoPtr->header)) 3500 { 3501 tvdi.item.pszText = textW; 3502 } else 3503 { 3504 textA = HEAP_strdupWtoA(GetProcessHeap(),0,textW); 3505 tvdi.item.pszText = (LPWSTR)textA; 3506 } 3507 3508 if (sendNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_BEGINLABELEDITW:TVN_BEGINLABELEDITA,&tvdi.hdr)) 3376 3509 { 3377 3510 DestroyWindow(infoPtr->hwndEdit); 3378 3511 infoPtr->hwndEdit = 0; 3512 if (mustFree) COMCTL32_Free(textW); 3513 if (textA) COMCTL32_Free(textA); 3379 3514 3380 3515 return (HWND)0; 3381 3516 } 3517 if (textA) HeapFree(GetProcessHeap(),0,textA); 3382 3518 3383 3519 infoPtr->editItem = hItem; 3384 SetWindowTextW(infoPtr->hwndEdit, editItem->pszText);3520 SetWindowTextW(infoPtr->hwndEdit,textW); 3385 3521 SetFocus(infoPtr->hwndEdit); 3386 3522 SendMessageA(infoPtr->hwndEdit, EM_SETSEL, 0, -1); 3387 3523 ShowWindow(infoPtr->hwndEdit, SW_SHOW); 3524 if (mustFree) COMCTL32_Free(textW); 3388 3525 3389 3526 return infoPtr->hwndEdit; … … 3392 3529 3393 3530 LRESULT WINAPI 3394 TREEVIEW_EndEditLabelNow (HWND hwnd,BOOL bCancel)3531 TREEVIEW_EndEditLabelNow(HWND hwnd,BOOL bCancel) 3395 3532 { 3396 3533 TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd); … … 3416 3553 iLength = GetWindowTextW(infoPtr->hwndEdit,textW,1023); 3417 3554 3418 //if (iLength >= 1023)3419 //{3420 // ERR("Insuficient space to retrieve new item label.");3421 //}3422 3423 3555 if (isUnicodeNotify(&infoPtr->header)) tvdi.item.pszText = textW; else 3424 3556 { 3425 3557 INT len = iLength+1; 3426 3558 3427 textA = (CHAR*)COMCTL32_Alloc(len );3559 textA = (CHAR*)COMCTL32_Alloc(len*sizeof(CHAR)); 3428 3560 lstrcpynWtoA(textA,textW,len); 3429 3561 tvdi.item.pszText = (WCHAR*)textA; 3430 3562 } 3431 3563 tvdi.item.cchTextMax = iLength + 1; 3432 } 3433 else 3434 { 3435 tvdi.item.pszText = NULL; 3436 tvdi.item.cchTextMax = 0; 3437 } 3438 3439 bCommit = (BOOL)sendNotify(hwnd,TVN_ENDLABELEDIT,&tvdi.hdr); 3564 } else 3565 { 3566 tvdi.item.pszText = NULL; 3567 tvdi.item.cchTextMax = 0; 3568 } 3569 3570 bCommit = (BOOL)sendNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_ENDLABELEDITW:TVN_ENDLABELEDITA,&tvdi.hdr); 3440 3571 3441 3572 if (!bCancel && bCommit) /* Apply the changes */ 3442 3573 { 3574 WCHAR* text; 3575 BOOL mustFree = FALSE; 3576 3443 3577 if (!isUnicodeNotify(&infoPtr->header)) 3444 3578 lstrcpynAtoW(textW,textA,iLength+1); 3445 if (lstrcmpW(textW,editedItem->pszText) != 0) 3446 { 3447 if(NULL == COMCTL32_ReAlloc(editedItem->pszText,(iLength+1)*sizeof(WCHAR))) 3448 { 3449 //ERR("OutOfMemory, cannot allocate space for label"); 3450 DestroyWindow(infoPtr->hwndEdit); 3451 infoPtr->hwndEdit = 0; 3452 if (textA) COMCTL32_Free(textA); 3453 if (textW) COMCTL32_Free(textW); 3454 3455 return FALSE; 3456 } 3457 else 3458 { 3459 editedItem->cchTextMax = iLength + 1; 3460 lstrcpyW( editedItem->pszText,textW); 3579 3580 if (editedItem->pszText == LPSTR_TEXTCALLBACKW) 3581 text = TREEVIEW_CallbackText(hwnd,editedItem,&mustFree); 3582 else 3583 text = editedItem->pszText; 3584 3585 if (lstrcmpW(textW,text) != 0) 3586 { 3587 if (editedItem->pszText == LPSTR_TEXTCALLBACKW) 3588 { 3589 NMTVDISPINFOW tvdi; 3590 BOOL retval; 3591 3592 tvdi.item.mask = TVIF_TEXT; 3593 tvdi.item.hItem = editedItem->hItem; 3594 tvdi.item.state = editedItem->state; 3595 tvdi.item.lParam = editedItem->lParam; 3596 if (isUnicodeNotify(&infoPtr->header)) 3597 { 3598 tvdi.item.pszText = textW; 3599 tvdi.item.cchTextMax = lstrlenW(textW); 3600 } else 3601 { 3602 tvdi.item.pszText = (LPWSTR)textA; 3603 tvdi.item.cchTextMax = lstrlenA(textA); 3604 } 3605 3606 retval = (BOOL)sendNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_SETDISPINFOW:TVN_SETDISPINFOA,&tvdi.hdr); 3607 } else 3608 { 3609 if(NULL == COMCTL32_ReAlloc(text,(iLength+1)*sizeof(WCHAR))) 3610 { 3611 //ERR("OutOfMemory, cannot allocate space for label"); 3612 DestroyWindow(infoPtr->hwndEdit); 3613 infoPtr->hwndEdit = 0; 3614 if (textA) COMCTL32_Free(textA); 3615 if (textW) COMCTL32_Free(textW); 3616 if (mustFree) COMCTL32_Free(text); 3617 3618 return FALSE; 3619 } else 3620 { 3621 editedItem->cchTextMax = iLength + 1; 3622 lstrcpyW(editedItem->pszText,textW); 3623 } 3461 3624 } 3462 3625 } 3626 if (mustFree) COMCTL32_Free(text); 3463 3627 } 3464 3628 … … 3580 3744 DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE); 3581 3745 LPWSTR text; 3746 BOOL mustFree = FALSE; 3582 3747 TTTOOLINFOW ti; 3583 3748 POINT pt; … … 3586 3751 { 3587 3752 NMTVGETINFOTIPW tvgit; 3588 3589 tvgit.pszText = (WCHAR*)COMCTL32_Alloc(isUnicodeNotify(&infoPtr->header) ? INFOTIPSIZE*sizeof(WCHAR):INFOTIPSIZE*sizeof(CHAR)); 3753 WCHAR* buf = (WCHAR*)COMCTL32_Alloc(isUnicodeNotify(&infoPtr->header) ? INFOTIPSIZE*sizeof(WCHAR):INFOTIPSIZE*sizeof(CHAR)); 3754 3755 tvgit.pszText = buf; 3590 3756 tvgit.cchTextMax = INFOTIPSIZE; 3591 3757 tvgit.hItem = item->hItem; … … 3595 3761 if (isUnicodeNotify(&infoPtr->header)) 3596 3762 { 3763 if (buf != tvgit.pszText) COMCTL32_Free(buf); else mustFree = TRUE; 3597 3764 text = tvgit.pszText; 3598 3765 } else … … 3600 3767 text = (WCHAR*)COMCTL32_Alloc(tvgit.cchTextMax*sizeof(WCHAR)); 3601 3768 lstrcpyAtoW(text,(LPSTR)tvgit.pszText); 3769 COMCTL32_Free(buf); 3602 3770 } 3603 3771 } else 3604 3772 { 3605 3773 if (item->pszText == LPSTR_TEXTCALLBACKW) 3606 TREEVIEW_SendDispInfoNotify(hwnd,item,TVN_GETDISPINFO,TVIF_TEXT);3607 3608 text = item->pszText;3774 text = TREEVIEW_CallbackText(hwnd,item,&mustFree); 3775 else 3776 text = item->pszText; 3609 3777 } 3610 3778 #if 0 //CB: not yet … … 3622 3790 SendMessageA(infoPtr->hwndToolTip,TTM_TRACKACTIVATE,(WPARAM)TRUE,(LPARAM)&ti); 3623 3791 #endif 3624 if ( text != item->pszText) COMCTL32_Free(text);3792 if (mustFree) COMCTL32_Free(text); 3625 3793 } 3626 3794 … … 3673 3841 if (TREEVIEW_TrackMouse(hwnd, ht.pt)) 3674 3842 { 3675 TREEVIEW_SendTreeviewDnDNotify (hwnd, TVN_BEGINDRAG, ht.hItem, ht.pt);3843 TREEVIEW_SendTreeviewDnDNotify (hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_BEGINDRAGW:TVN_BEGINDRAGA, ht.hItem, ht.pt); 3676 3844 infoPtr->dropItem = ht.hItem; 3677 3845 return 0; … … 3745 3913 if (ht.hItem) 3746 3914 { 3747 TREEVIEW_SendTreeviewDnDNotify (hwnd, TVN_BEGINRDRAG, ht.hItem, ht.pt);3915 TREEVIEW_SendTreeviewDnDNotify (hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_BEGINRDRAGW:TVN_BEGINDRAGA, ht.hItem, ht.pt); 3748 3916 infoPtr->dropItem = ht.hItem; 3749 3917 } … … 3784 3952 TREEVIEW_CreateDragImage (HWND hwnd, WPARAM wParam, LPARAM lParam) 3785 3953 { 3786 TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);3787 TREEVIEW_ITEM *dragItem;3788 INT cx,cy;3789 HDC hdc,htopdc;3790 HWND hwtop;3791 HBITMAP hbmp,hOldbmp;3792 SIZE size;3793 RECT rc;3794 HFONT hOldFont;3795 WCHAR*itemtxt;3796 3797 // TRACE (treeview,"\n"); 3798 if (!(infoPtr->himlNormal)) return 0;3799 dragItem=TREEVIEW_ValidItem (infoPtr, (HTREEITEM) lParam);3800 3801 if (!dragItem) return 0;3802 3803 if (dragItem->pszText==LPSTR_TEXTCALLBACKW) {3804 TREEVIEW_SendDispInfoNotify (hwnd, dragItem, TVN_GETDISPINFO, TVIF_TEXT);3805 }3806 itemtxt=dragItem->pszText;3807 3808 hwtop=GetDesktopWindow();3809 htopdc= GetDC(hwtop);3810 hdc=CreateCompatibleDC(htopdc);3811 3812 hOldFont=SelectObject (hdc, infoPtr->hFont);3813 GetTextExtentPoint32W (hdc, itemtxt, lstrlenW (itemtxt), &size);3814 3815 hbmp=CreateCompatibleBitmap (htopdc, size.cx, size.cy);3816 hOldbmp=SelectObject (hdc, hbmp);3817 3818 ImageList_GetIconSize (infoPtr->himlNormal, &cx, &cy);3819 size.cx+=cx;3820 if (cy>size.cy) size.cy=cy;3821 3822 infoPtr->dragList=ImageList_Create (size.cx, size.cy, ILC_COLOR, 10, 10);3823 ImageList_Draw (infoPtr->himlNormal, dragItem->iImage, hdc, 0, 0, ILD_NORMAL);3954 TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd); 3955 TREEVIEW_ITEM *dragItem; 3956 INT cx,cy; 3957 HDC hdc,htopdc; 3958 HWND hwtop; 3959 HBITMAP hbmp,hOldbmp; 3960 SIZE size; 3961 RECT rc; 3962 HFONT hOldFont; 3963 WCHAR *itemtxt; 3964 BOOL mustFree = FALSE; 3965 3966 if (!(infoPtr->himlNormal)) return 0; 3967 dragItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM) lParam); 3968 3969 if (!dragItem) return 0; 3970 3971 if (dragItem->pszText == LPSTR_TEXTCALLBACKW) 3972 itemtxt = TREEVIEW_CallbackText(hwnd,dragItem,&mustFree); 3973 else 3974 itemtxt = dragItem->pszText; 3975 3976 hwtop = GetDesktopWindow(); 3977 htopdc = GetDC(hwtop); 3978 hdc = CreateCompatibleDC(htopdc); 3979 3980 hOldFont = SelectObject (hdc, infoPtr->hFont); 3981 GetTextExtentPoint32W (hdc, itemtxt, lstrlenW (itemtxt), &size); 3982 3983 hbmp = CreateCompatibleBitmap (htopdc, size.cx, size.cy); 3984 hOldbmp = SelectObject (hdc, hbmp); 3985 3986 ImageList_GetIconSize (infoPtr->himlNormal, &cx, &cy); 3987 size.cx += cx; 3988 if (cy > size.cy) size.cy = cy; 3989 3990 infoPtr->dragList = ImageList_Create (size.cx, size.cy, ILC_COLOR, 10, 10); 3991 ImageList_Draw (infoPtr->himlNormal, dragItem->iImage, hdc, 0, 0, ILD_NORMAL); 3824 3992 3825 3993 /* … … 3828 3996 */ 3829 3997 3830 /* draw item text */ 3831 3832 SetRect (&rc, cx, 0, size.cx,size.cy); 3833 DrawTextW (hdc, itemtxt, lstrlenW (itemtxt), &rc, DT_LEFT); 3834 SelectObject (hdc, hOldFont); 3835 SelectObject (hdc, hOldbmp); 3836 3837 ImageList_Add (infoPtr->dragList, hbmp, 0); 3838 3839 DeleteDC (hdc); 3840 DeleteObject (hbmp); 3841 ReleaseDC (hwtop, htopdc); 3842 3843 return (LRESULT)infoPtr->dragList; 3998 /* draw item text */ 3999 4000 SetRect (&rc, cx, 0, size.cx,size.cy); 4001 DrawTextW (hdc, itemtxt, lstrlenW (itemtxt), &rc, DT_LEFT); 4002 SelectObject (hdc, hOldFont); 4003 SelectObject (hdc, hOldbmp); 4004 4005 ImageList_Add (infoPtr->dragList, hbmp, 0); 4006 4007 DeleteDC (hdc); 4008 DeleteObject (hbmp); 4009 ReleaseDC (hwtop, htopdc); 4010 if (mustFree) COMCTL32_Free(itemtxt); 4011 4012 return (LRESULT)infoPtr->dragList; 3844 4013 } 3845 4014 … … 3878 4047 return FALSE; 3879 4048 3880 prevItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)prevSelect);4049 prevItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)prevSelect); 3881 4050 3882 4051 if (newSelect) 3883 if (TREEVIEW_SendTreeviewNotify(hwnd, TVN_SELCHANGING,cause,(HTREEITEM)prevSelect,(HTREEITEM)newSelect))4052 if (TREEVIEW_SendTreeviewNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_SELCHANGINGW:TVN_SELCHANGINGA,cause,(HTREEITEM)prevSelect,(HTREEITEM)newSelect)) 3884 4053 return FALSE; /* FIXME: OK? */ 3885 4054 … … 3906 4075 TREEVIEW_RefreshItem(hwnd,wineItem,FALSE); 3907 4076 3908 TREEVIEW_SendTreeviewNotify(hwnd, TVN_SELCHANGED,cause,(HTREEITEM)prevSelect,(HTREEITEM)newSelect);4077 TREEVIEW_SendTreeviewNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? TVN_SELCHANGEDW:TVN_SELCHANGEDA,cause,(HTREEITEM)prevSelect,(HTREEITEM)newSelect); 3909 4078 3910 4079 break; 3911 4080 3912 4081 case TVGN_DROPHILITE: 3913 prevItem = TREEVIEW_ValidItem (infoPtr, infoPtr->dropItem);4082 prevItem = TREEVIEW_ValidItem (infoPtr, infoPtr->dropItem); 3914 4083 3915 4084 if (prevItem) … … 4007 4176 4008 4177 static LRESULT 4009 TREEVIEW_VScroll (HWND hwnd, WPARAM wParam,LPARAM lParam)4178 TREEVIEW_VScroll(HWND hwnd,WPARAM wParam,LPARAM lParam) 4010 4179 { 4011 4180 TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd); … … 4420 4589 static BOOL TREEVIEW_Compare(HWND hwnd,TREEVIEW_ITEM *item,LPWSTR text,INT textlen) 4421 4590 { 4591 WCHAR* itemtext; 4592 BOOL mustFree = FALSE,res; 4593 4422 4594 if (item->pszText == LPSTR_TEXTCALLBACKW) 4423 TREEVIEW_SendDispInfoNotify(hwnd,item,TVN_GETDISPINFO,TVIF_TEXT); 4424 if (item->pszText == LPSTR_TEXTCALLBACKW) return FALSE; 4595 itemtext = TREEVIEW_CallbackText(hwnd,item,&mustFree); 4596 else 4597 itemtext = item->pszText; 4425 4598 4426 4599 //simulate lstrcmpniW 4427 return CompareStringW(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,item->pszText,MIN(lstrlenW(item->pszText),textlen),text,textlen) == 2; 4600 res = (CompareStringW(LOCALE_SYSTEM_DEFAULT,NORM_IGNORECASE,itemtext,MIN(lstrlenW(itemtext),textlen),text,textlen) == 2); 4601 if (mustFree) COMCTL32_Free(itemtext); 4602 4603 return res; 4428 4604 } 4429 4605 … … 4573 4749 4574 4750 case TVM_DELETEITEM: 4575 return TREEVIEW_DeleteItem (hwnd, wParam, lParam);4751 return TREEVIEW_DeleteItem (hwnd, wParam, lParam); 4576 4752 4577 4753 case TVM_EXPAND: 4578 return TREEVIEW_Expand (hwnd, wParam, lParam);4754 return TREEVIEW_Expand (hwnd, wParam, lParam); 4579 4755 4580 4756 case TVM_GETITEMRECT: 4581 return TREEVIEW_GetItemRect (hwnd, wParam, lParam);4757 return TREEVIEW_GetItemRect (hwnd, wParam, lParam); 4582 4758 4583 4759 case TVM_GETCOUNT: 4584 return TREEVIEW_GetCount (hwnd, wParam, lParam);4760 return TREEVIEW_GetCount (hwnd, wParam, lParam); 4585 4761 4586 4762 case TVM_GETINDENT: 4587 return TREEVIEW_GetIndent (hwnd);4763 return TREEVIEW_GetIndent (hwnd); 4588 4764 4589 4765 case TVM_SETINDENT: 4590 return TREEVIEW_SetIndent (hwnd, wParam);4766 return TREEVIEW_SetIndent (hwnd, wParam); 4591 4767 4592 4768 case TVM_GETIMAGELIST: 4593 return TREEVIEW_GetImageList (hwnd, wParam, lParam);4769 return TREEVIEW_GetImageList (hwnd, wParam, lParam); 4594 4770 4595 4771 case TVM_SETIMAGELIST: 4596 return TREEVIEW_SetImageList (hwnd, wParam, lParam);4772 return TREEVIEW_SetImageList (hwnd, wParam, lParam); 4597 4773 4598 4774 case TVM_GETNEXTITEM: 4599 return TREEVIEW_GetNextItem (hwnd, wParam, lParam);4775 return TREEVIEW_GetNextItem (hwnd, wParam, lParam); 4600 4776 4601 4777 case TVM_SELECTITEM: 4602 return TREEVIEW_SelectItem (hwnd, wParam, lParam);4778 return TREEVIEW_SelectItem (hwnd, wParam, lParam); 4603 4779 4604 4780 case TVM_GETITEMA: 4605 return TREEVIEW_GetItem(hwnd,wParam,lParam,FALSE);4781 return TREEVIEW_GetItem(hwnd,wParam,lParam,FALSE); 4606 4782 4607 4783 case TVM_GETITEMW: 4608 return TREEVIEW_GetItem(hwnd,wParam,lParam,TRUE);4784 return TREEVIEW_GetItem(hwnd,wParam,lParam,TRUE); 4609 4785 4610 4786 case TVM_SETITEMA: 4611 return TREEVIEW_SetItem(hwnd,wParam,lParam,FALSE);4787 return TREEVIEW_SetItem(hwnd,wParam,lParam,FALSE); 4612 4788 4613 4789 case TVM_SETITEMW: 4614 return TREEVIEW_SetItem(hwnd,wParam,lParam,TRUE);4790 return TREEVIEW_SetItem(hwnd,wParam,lParam,TRUE); 4615 4791 4616 4792 case TVM_EDITLABELA: 4617 return TREEVIEW_EditLabel(hwnd,(HTREEITEM)lParam,FALSE);4793 return TREEVIEW_EditLabel(hwnd,(HTREEITEM)lParam,FALSE); 4618 4794 4619 4795 case TVM_EDITLABELW: 4620 return TREEVIEW_EditLabel(hwnd,(HTREEITEM)lParam,TRUE);4796 return TREEVIEW_EditLabel(hwnd,(HTREEITEM)lParam,TRUE); 4621 4797 4622 4798 case TVM_GETEDITCONTROL: 4623 return TREEVIEW_GetEditControl (hwnd);4799 return TREEVIEW_GetEditControl (hwnd); 4624 4800 4625 4801 case TVM_GETVISIBLECOUNT: 4626 return TREEVIEW_GetVisibleCount (hwnd, wParam, lParam);4802 return TREEVIEW_GetVisibleCount (hwnd, wParam, lParam); 4627 4803 4628 4804 case TVM_HITTEST: 4629 return TREEVIEW_HitTest(hwnd,(LPTVHITTESTINFO)lParam);4805 return TREEVIEW_HitTest(hwnd,(LPTVHITTESTINFO)lParam); 4630 4806 4631 4807 case TVM_CREATEDRAGIMAGE: 4632 return TREEVIEW_CreateDragImage (hwnd, wParam, lParam);4808 return TREEVIEW_CreateDragImage (hwnd, wParam, lParam); 4633 4809 4634 4810 case TVM_SORTCHILDREN: 4635 return TREEVIEW_SortChildren(hwnd, wParam, lParam);4811 return TREEVIEW_SortChildren(hwnd, wParam, lParam); 4636 4812 4637 4813 case TVM_ENSUREVISIBLE: 4638 return TREEVIEW_EnsureVisible(hwnd,(HTREEITEM)lParam);4814 return TREEVIEW_EnsureVisible(hwnd,(HTREEITEM)lParam); 4639 4815 4640 4816 case TVM_SORTCHILDRENCB: 4641 return TREEVIEW_SortChildrenCB(hwnd, wParam, lParam);4817 return TREEVIEW_SortChildrenCB(hwnd, wParam, lParam); 4642 4818 4643 4819 case TVM_ENDEDITLABELNOW: 4644 return TREEVIEW_EndEditLabelNow (hwnd,(BOOL)wParam);4820 return TREEVIEW_EndEditLabelNow (hwnd,(BOOL)wParam); 4645 4821 4646 4822 case TVM_GETISEARCHSTRINGA: 4647 return TREEVIEW_GetISearchString(hwnd,(LPWSTR)lParam,FALSE);4823 return TREEVIEW_GetISearchString(hwnd,(LPWSTR)lParam,FALSE); 4648 4824 4649 4825 case TVM_GETISEARCHSTRINGW: 4650 return TREEVIEW_GetISearchString(hwnd,(LPWSTR)lParam,TRUE);4826 return TREEVIEW_GetISearchString(hwnd,(LPWSTR)lParam,TRUE); 4651 4827 4652 4828 case TVM_GETTOOLTIPS: 4653 return TREEVIEW_GetToolTips (hwnd);4829 return TREEVIEW_GetToolTips (hwnd); 4654 4830 4655 4831 case TVM_SETTOOLTIPS: 4656 return TREEVIEW_SetToolTips (hwnd, wParam);4832 return TREEVIEW_SetToolTips (hwnd, wParam); 4657 4833 4658 4834 case TVM_SETINSERTMARK: 4659 return TREEVIEW_SetInsertMark (hwnd,wParam, lParam);4835 return TREEVIEW_SetInsertMark (hwnd,wParam, lParam); 4660 4836 4661 4837 case TVM_SETITEMHEIGHT: 4662 return TREEVIEW_SetItemHeight (hwnd, wParam);4838 return TREEVIEW_SetItemHeight (hwnd, wParam); 4663 4839 4664 4840 case TVM_GETITEMHEIGHT: 4665 return TREEVIEW_GetItemHeight (hwnd);4841 return TREEVIEW_GetItemHeight (hwnd); 4666 4842 4667 4843 case TVM_SETBKCOLOR: 4668 return TREEVIEW_SetBkColor (hwnd, wParam, lParam);4844 return TREEVIEW_SetBkColor (hwnd, wParam, lParam); 4669 4845 4670 4846 case TVM_SETTEXTCOLOR: 4671 return TREEVIEW_SetTextColor (hwnd, wParam, lParam);4847 return TREEVIEW_SetTextColor (hwnd, wParam, lParam); 4672 4848 4673 4849 case TVM_GETBKCOLOR: 4674 return TREEVIEW_GetBkColor (hwnd);4850 return TREEVIEW_GetBkColor (hwnd); 4675 4851 4676 4852 case TVM_GETTEXTCOLOR: 4677 return TREEVIEW_GetTextColor (hwnd);4853 return TREEVIEW_GetTextColor (hwnd); 4678 4854 4679 4855 case TVM_SETSCROLLTIME: 4680 return TREEVIEW_SetScrollTime (hwnd, (UINT)wParam);4856 return TREEVIEW_SetScrollTime (hwnd, (UINT)wParam); 4681 4857 4682 4858 case TVM_GETSCROLLTIME: 4683 return TREEVIEW_GetScrollTime (hwnd);4859 return TREEVIEW_GetScrollTime (hwnd); 4684 4860 4685 4861 case TVM_GETITEMSTATE: 4686 return TREEVIEW_GetItemState (hwnd,wParam, lParam);4862 return TREEVIEW_GetItemState (hwnd,wParam, lParam); 4687 4863 4688 4864 case TVM_GETLINECOLOR: 4689 return TREEVIEW_GetLineColor (hwnd,wParam, lParam);4865 return TREEVIEW_GetLineColor (hwnd,wParam, lParam); 4690 4866 4691 4867 case TVM_SETLINECOLOR: 4692 return TREEVIEW_SetLineColor (hwnd,wParam, lParam);4868 return TREEVIEW_SetLineColor (hwnd,wParam, lParam); 4693 4869 4694 4870 case TVM_SETINSERTMARKCOLOR: 4695 return TREEVIEW_SetInsertMarkColor (hwnd,wParam, lParam);4871 return TREEVIEW_SetInsertMarkColor (hwnd,wParam, lParam); 4696 4872 4697 4873 case TVM_GETINSERTMARKCOLOR: 4698 return TREEVIEW_GetInsertMarkColor (hwnd,wParam, lParam);4874 return TREEVIEW_GetInsertMarkColor (hwnd,wParam, lParam); 4699 4875 4700 4876 case WM_COMMAND: 4701 return TREEVIEW_Command (hwnd, wParam, lParam);4877 return TREEVIEW_Command (hwnd, wParam, lParam); 4702 4878 4703 4879 case WM_DESTROY: 4704 return TREEVIEW_Destroy (hwnd);4880 return TREEVIEW_Destroy (hwnd); 4705 4881 4706 4882 case WM_ENABLE: 4707 return TREEVIEW_Enable(hwnd,wParam,lParam);4883 return TREEVIEW_Enable(hwnd,wParam,lParam); 4708 4884 4709 4885 case WM_ERASEBKGND: 4710 return TREEVIEW_EraseBackground (hwnd, wParam, lParam);4886 return TREEVIEW_EraseBackground (hwnd, wParam, lParam); 4711 4887 4712 4888 case WM_GETDLGCODE: 4713 return TREEVIEW_GetDlgCode(hwnd,wParam,lParam);4889 return TREEVIEW_GetDlgCode(hwnd,wParam,lParam); 4714 4890 4715 4891 case WM_PAINT: 4716 return TREEVIEW_Paint (hwnd, wParam, lParam);4892 return TREEVIEW_Paint (hwnd, wParam, lParam); 4717 4893 4718 4894 case WM_GETFONT: 4719 return TREEVIEW_GetFont (hwnd, wParam, lParam);4895 return TREEVIEW_GetFont (hwnd, wParam, lParam); 4720 4896 4721 4897 case WM_SETFONT: 4722 return TREEVIEW_SetFont (hwnd, wParam, lParam);4898 return TREEVIEW_SetFont (hwnd, wParam, lParam); 4723 4899 4724 4900 case WM_KEYDOWN: 4725 return TREEVIEW_KeyDown (hwnd, wParam, lParam);4901 return TREEVIEW_KeyDown (hwnd, wParam, lParam); 4726 4902 4727 4903 case WM_CHAR: 4728 return TREEVIEW_Char(hwnd,wParam,lParam);4904 return TREEVIEW_Char(hwnd,wParam,lParam); 4729 4905 4730 4906 case WM_SETFOCUS: 4731 return TREEVIEW_SetFocus (hwnd, wParam, lParam);4907 return TREEVIEW_SetFocus (hwnd, wParam, lParam); 4732 4908 4733 4909 case WM_KILLFOCUS: 4734 return TREEVIEW_KillFocus (hwnd, wParam, lParam);4910 return TREEVIEW_KillFocus (hwnd, wParam, lParam); 4735 4911 4736 4912 case WM_MOUSEMOVE: 4737 return TREEVIEW_MouseMove(hwnd,wParam,lParam);4913 return TREEVIEW_MouseMove(hwnd,wParam,lParam); 4738 4914 4739 4915 case WM_LBUTTONDOWN: 4740 return TREEVIEW_LButtonDown (hwnd, wParam, lParam);4916 return TREEVIEW_LButtonDown (hwnd, wParam, lParam); 4741 4917 4742 4918 case WM_LBUTTONDBLCLK: 4743 return TREEVIEW_LButtonDoubleClick (hwnd, wParam, lParam);4919 return TREEVIEW_LButtonDoubleClick (hwnd, wParam, lParam); 4744 4920 4745 4921 case WM_RBUTTONDOWN: 4746 return TREEVIEW_RButtonDown (hwnd, wParam, lParam);4922 return TREEVIEW_RButtonDown (hwnd, wParam, lParam); 4747 4923 4748 4924 case WM_RBUTTONDBLCLK: 4749 return TREEVIEW_RButtonDoubleClick(hwnd,wParam,lParam);4925 return TREEVIEW_RButtonDoubleClick(hwnd,wParam,lParam); 4750 4926 4751 4927 case WM_STYLECHANGED: 4752 return TREEVIEW_StyleChanged (hwnd, wParam, lParam);4928 return TREEVIEW_StyleChanged (hwnd, wParam, lParam); 4753 4929 4754 4930 case WM_SYSCOLORCHANGE: 4755 return TREEVIEW_SysColorChange(hwnd,wParam,lParam);4931 return TREEVIEW_SysColorChange(hwnd,wParam,lParam); 4756 4932 4757 4933 case WM_SETCURSOR: 4758 return TREEVIEW_SetCursor(hwnd,wParam,lParam);4934 return TREEVIEW_SetCursor(hwnd,wParam,lParam); 4759 4935 4760 4936 case WM_SETREDRAW: 4761 return TREEVIEW_SetRedraw(hwnd,wParam,lParam);4937 return TREEVIEW_SetRedraw(hwnd,wParam,lParam); 4762 4938 4763 4939 case WM_TIMER: 4764 return TREEVIEW_HandleTimer (hwnd, wParam, lParam);4940 return TREEVIEW_HandleTimer (hwnd, wParam, lParam); 4765 4941 4766 4942 case WM_SIZE: 4767 return TREEVIEW_Size (hwnd, wParam,lParam);4943 return TREEVIEW_Size (hwnd, wParam,lParam); 4768 4944 4769 4945 case WM_HSCROLL: 4770 return TREEVIEW_HScroll (hwnd, wParam, lParam);4946 return TREEVIEW_HScroll (hwnd, wParam, lParam); 4771 4947 4772 4948 case WM_VSCROLL: 4773 return TREEVIEW_VScroll (hwnd, wParam, lParam);4949 return TREEVIEW_VScroll (hwnd, wParam, lParam); 4774 4950 4775 4951 case WM_MOUSEWHEEL: 4776 return TREEVIEW_MouseWheel (hwnd, wParam, lParam);4952 return TREEVIEW_MouseWheel (hwnd, wParam, lParam); 4777 4953 4778 4954 case WM_DRAWITEM: 4779 //printf ("drawItem\n");4780 return DefWindowProcA (hwnd, uMsg, wParam, lParam);4955 //printf ("drawItem\n"); 4956 return DefWindowProcA (hwnd, uMsg, wParam, lParam); 4781 4957 4782 4958 default: 4783 //if (uMsg >= WM_USER) 4784 // FIXME (treeview, "Unknown msg %04x wp=%08x lp=%08lx\n", 4785 // uMsg, wParam, lParam); 4786 return defComCtl32ProcA(hwnd,uMsg,wParam,lParam); 4959 return defComCtl32ProcA(hwnd,uMsg,wParam,lParam); 4787 4960 } 4788 4961 return 0;
Note:
See TracChangeset
for help on using the changeset viewer.
