Ignore:
Timestamp:
Mar 21, 2000, 6:30:46 PM (25 years ago)
Author:
cbratschi
Message:

bug fixes and improvements

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/comctl32/treeview.cpp

    r3154 r3182  
    1 /* $Id: treeview.cpp,v 1.3 2000-03-18 16:17:34 cbratschi Exp $ */
     1/* $Id: treeview.cpp,v 1.4 2000-03-21 17:30:46 cbratschi Exp $ */
    22/* Treeview control
    33 *
     
    6666static BOOL    TREEVIEW_SendTreeviewNotify (HWND hwnd, UINT code, UINT action, HTREEITEM oldItem, HTREEITEM newItem);
    6767static 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);
     68static INT     TREEVIEW_CallbackChildren(HWND hwnd,TREEVIEW_ITEM *wineItem);
     69static INT     TREEVIEW_CallbackImage(HWND hwnd,TREEVIEW_ITEM *wineItem);
     70static INT     TREEVIEW_CallbackSelectedImage(HWND hwnd,TREEVIEW_ITEM *wineItem);
     71static WCHAR*  TREEVIEW_CallbackText(HWND hwnd,TREEVIEW_ITEM *wineItem,BOOL *mustFree);
    6972static BOOL    TREEVIEW_SendCustomDrawNotify (HWND hwnd, DWORD dwDrawStage, HDC hdc, RECT rc);
    7073static BOOL    TREEVIEW_SendCustomDrawItemNotify (HWND hwnd, HDC hdc, TREEVIEW_ITEM *tvItem, UINT uItemDrawState);
     
    7376static LRESULT TREEVIEW_DoSelectItem(HWND hwnd,INT action,HTREEITEM newSelect,INT cause);
    7477static void    TREEVIEW_Refresh(HWND hwnd);
     78static void    TREEVIEW_RefreshItem(HWND hwnd,TREEVIEW_ITEM *item,BOOL wholeLine);
    7579static void    TREEVIEW_Draw(HWND hwnd,HDC hdc,RECT *updateRect);
    7680static BOOL    TREEVIEW_UnqueueRefresh(HWND hwnd,BOOL calc,BOOL refresh);
     
    127131   {
    128132      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);
    139134      else
    140          cChildren = wineItem->cChildren;
     135        cChildren = wineItem->cChildren;
    141136   }
    142137   else if ( wineItem->firstChild )
     
    328323      COMCTL32_Free (killItem->pszText);
    329324    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);
    331326    if (killItem->firstChild)
    332327      TREEVIEW_RemoveAllChildren (hwnd, killItem);
     
    356351 wineItem->pszText = NULL;
    357352
    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);
    359354
    360355 if (wineItem->firstChild)
     
    403398                killItem->pszText = NULL;
    404399
    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);
    407401                }
    408402
     
    474468  if (!(GetWindowLongA(hwnd, GWL_STYLE) & TVS_NONEVENHEIGHT))
    475469    if (infoPtr->uItemHeight & 0x1) infoPtr->uItemHeight++;
     470
     471  if (prevHeight != infoPtr->uItemHeight)
     472  {
     473    infoPtr->uInternalStatus |= TV_CALCALL;
     474    TREEVIEW_QueueRefresh(hwnd);
     475  }
    476476
    477477  return prevHeight;
     
    808808      /* The item is curently selected */
    809809      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;
    813813    } else
    814814    {
    815815      /* The item is not selected */
    816816      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;
    820820    }
    821821
     
    844844      HBRUSH   hbrBk = 0;
    845845      BOOL     inFocus = GetFocus() == hwnd;
     846      WCHAR* text;
     847      BOOL mustFree = FALSE;
    846848
    847849      oldBkMode = SetBkMode(hdc, TRANSPARENT);
     
    879881
    880882      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;
    882886
    883887      if (hbrBk)
     
    890894
    891895      /* 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);
    897898
    898899      item->text.left -= 2;
     
    10281029  TVITEMEXW *tvItem;
    10291030  INT iItem,len;
     1031  BOOL mustRefresh = FALSE;
     1032  BOOL mustRepaint = FALSE;
    10301033
    10311034  if (infoPtr->hwndEdit) SetFocus(hwnd);
     
    10341037  iItem = (INT)tvItem->hItem;
    10351038
    1036   wineItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)iItem);
     1039  wineItem = TREEVIEW_ValidItem(infoPtr,(HTREEITEM)iItem);
    10371040  if (!wineItem) return FALSE;
    10381041
    1039   if (tvItem->mask & TVIF_CHILDREN)
     1042  if ((tvItem->mask & TVIF_CHILDREN) && (wineItem->cChildren != tvItem->cChildren))
     1043  {
    10401044    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  {
    10431050    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  {
    10461056    wineItem->iIntegral = tvItem->iIntegral;
     1057    mustRefresh = TRUE;
     1058  }
    10471059
    10481060  if (tvItem->mask & TVIF_PARAM)
    10491061    wineItem->lParam = tvItem->lParam;
    10501062
    1051   if (tvItem->mask & TVIF_SELECTEDIMAGE)
     1063  if ((tvItem->mask & TVIF_SELECTEDIMAGE) && (wineItem->iSelectedImage != tvItem->iSelectedImage))
     1064  {
    10521065    wineItem->iSelectedImage = tvItem->iSelectedImage;
     1066    mustRepaint = TRUE;
     1067  }
    10531068
    10541069  if (tvItem->mask & TVIF_STATE)
    10551070  {
     1071    DWORD oldState = wineItem->state,oldMask = wineItem->stateMask;
     1072
    10561073    wineItem->state &= ~tvItem->stateMask;
    10571074    wineItem->state |= (tvItem->state & tvItem->stateMask);
    10581075    wineItem->stateMask |= tvItem->stateMask;
     1076    mustRepaint = (oldState != wineItem->state) || (oldMask != wineItem->stateMask);
    10591077  }
    10601078
     
    10661084      {
    10671085        len = lstrlenW(tvItem->pszText)+1;
     1086
    10681087        if (len > wineItem->cchTextMax)
    10691088        {
    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));
    10711091          wineItem->cchTextMax = len;
    10721092        }
    1073         lstrcpynW(wineItem->pszText,tvItem->pszText,len);
     1093        lstrcpyW(wineItem->pszText,tvItem->pszText);
    10741094      } else
    10751095      {
    10761096        if (wineItem->cchTextMax)
    10771097        {
    1078           COMCTL32_Free (wineItem->pszText);
     1098          if (wineItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free (wineItem->pszText);
    10791099          wineItem->cchTextMax = 0;
    10801100        }
     
    10831103    } else
    10841104    {
    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;
    10921108        if (len > wineItem->cchTextMax)
    10931109        {
    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));
    10951112          wineItem->cchTextMax = len;
    10961113        }
    1097         lstrcpynAtoW(wineItem->pszText,tvItem->pszText,len);
     1114        lstrcpyAtoW(wineItem->pszText,(LPSTR)tvItem->pszText);
    10981115      } else
    10991116      {
    11001117        if (wineItem->cchTextMax)
    11011118        {
    1102           COMCTL32_Free (wineItem->pszText);
     1119          if (wineItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(wineItem->pszText);
    11031120          wineItem->cchTextMax = 0;
    11041121        }
     
    11061123      }
    11071124    }
    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  }
    11131142
    11141143  return TRUE;
     
    11531182
    11541183      //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))
    11561185      {
    11571186        rect.left += TREEVIEW_LEFT_MARGIN;
     
    12651294    UINT  uTextJustify = DT_LEFT;
    12661295    HFONT hOldFont;
     1296    WCHAR* text;
     1297    BOOL mustFree = FALSE;
    12671298
    12681299    r.left += 3;
     
    12751306
    12761307    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;
    12781311
    12791312    if (!hdc)
     
    12891322
    12901323    /* 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);
    12971326
    12981327    SelectObject(hdc,hOldFont);
     
    15831612          TREEVIEW_DrawItem(hwnd,hdc,item,dwStyle,infoPtr);
    15841613          visFound = TRUE;
    1585         }
     1614        } else if (updateRect && (item->rect.top >= updateRect->bottom)) break;
    15861615      } else if (visFound) break;
    15871616      if (!visFound && (dwStyle & TVS_HASLINES) && (dwStyle & TVS_LINESATROOT))
     
    16911720    infoPtr->Timer &= ~TV_REFRESH_TIMER_SET;
    16921721    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    }
    16941727
    16951728    return TRUE;
     
    17201753
    17211754  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  }
    17231761
    17241762  if (tvItem->mask & TVIF_INTEGRAL)
     
    17301768
    17311769  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  }
    17331776
    17341777  if (tvItem->mask & TVIF_STATE)
     
    17371780  if (tvItem->mask & TVIF_TEXT)
    17381781  {
     1782    WCHAR* text;
     1783    BOOL mustFree = FALSE;
     1784
    17391785    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
    17411790    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);
    17561795  }
    17571796
     
    19742013  WCHAR *txt1,*txt2;
    19752014  TREEVIEW_ITEM *item;
    1976 
    1977   item = (TREEVIEW_ITEM *) first;
     2015  INT res;
     2016  BOOL mustFree1 = FALSE,mustFree2 = FALSE;
     2017
     2018  item = (TREEVIEW_ITEM*)first;
    19782019  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;
    19842025  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;
    19902035}
    19912036
     
    21492194static LRESULT
    21502195TREEVIEW_InsertItem(HWND hwnd,WPARAM wParam,LPARAM lParam,BOOL unicode)
    2151 
    21522196{
    21532197  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
     
    22182262   */
    22192263  tvItem = &ptdi->itemex;
    2220   wineItem=& infoPtr->items[iItem];
     2264  wineItem = &infoPtr->items[iItem];
    22212265
    22222266  if ((ptdi->hParent==TVI_ROOT) || (ptdi->hParent==0)) {
     
    22522296      if (tvItem->pszText != LPSTR_TEXTCALLBACKW)
    22532297      {
    2254         //TRACE (treeview,"(%p,%s)\n", &tvItem->pszText, tvItem->pszText);
    22552298        len = lstrlenW(tvItem->pszText)+1;
    22562299        wineItem->pszText = (WCHAR*)COMCTL32_Alloc(len*sizeof(WCHAR));
     
    22592302      } else
    22602303      {
    2261         //TRACE (treeview,"LPSTR_TEXTCALLBACK\n");
    22622304        wineItem->pszText = LPSTR_TEXTCALLBACKW;
    22632305        wineItem->cchTextMax = 0;
     
    22652307    } else
    22662308    {
    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);
    22752314        wineItem->cchTextMax = len;
    22762315      } else
    22772316      {
    2278         //TRACE (treeview,"LPSTR_TEXTCALLBACK\n");
    22792317        wineItem->pszText = LPSTR_TEXTCALLBACKW;
    22802318        wineItem->cchTextMax = 0;
     
    23092347    {
    23102348      TREEVIEW_ITEM *aChild;
    2311 
    23122349      TREEVIEW_ITEM *previousChild = NULL;
    23132350      BOOL bItemInserted           = FALSE;
     2351      WCHAR* text;
     2352      BOOL mustFree = FALSE;
    23142353
    23152354      if (parentItem)
     
    23192358
    23202359      /* 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;
    23242364
    23252365      /* Iterate the parent children to see where we fit in */
     
    23272367      {
    23282368        INT comp;
     2369        WCHAR* text2;
     2370        BOOL mustFree2 = FALSE;
    23292371
    23302372        /* 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);
    23362380        if ( comp < 0 )  /* we are smaller than the current one */
    23372381        {
     
    23612405        }
    23622406      }
     2407      if (mustFree) COMCTL32_Free(text);
    23632408
    23642409      /*
     
    24812526  if (newIndent != infoPtr->uIndent)
    24822527  {
    2483     infoPtr->uIndent=newIndent;
     2528    infoPtr->uIndent = newIndent;
    24842529    infoPtr->uInternalStatus |= TV_CALCALL;
    24852530    TREEVIEW_QueueRefresh(hwnd);
     
    27802825TREEVIEW_Paint (HWND hwnd, WPARAM wParam, LPARAM lParam)
    27812826{
    2782     HDC hdc;
     2827  HDC hdc = (HDC)wParam;
     2828
     2829  if (!hdc)
     2830  {
    27832831    PAINTSTRUCT ps;
    27842832
    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;
    27912840}
    27922841
     
    28532902
    28542903static BOOL
    2855 TREEVIEW_SendTreeviewNotify (HWND hwnd, UINT code, UINT action,
    2856                         HTREEITEM oldItem, HTREEITEM newItem)
     2904TREEVIEW_SendTreeviewNotify (HWND hwnd,UINT code,UINT action,HTREEITEM oldItem,HTREEITEM newItem)
    28572905{
    28582906  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
     
    28752923    if (!isUnicodeNotify(&infoPtr->header))
    28762924    {
    2877       if (!wineItem->pszText) nmhdr.itemOld.pszText = NULL; else
     2925      if (!wineItem->pszText || (wineItem->pszText == LPSTR_TEXTCALLBACKW)) nmhdr.itemOld.pszText = NULL; else
    28782926      {
    28792927        INT len = lstrlenW(wineItem->pszText)+1;
     
    29012949    if (!isUnicodeNotify(&infoPtr->header))
    29022950    {
    2903       if (!wineItem->pszText) nmhdr.itemNew.pszText = NULL; else
     2951      if (!wineItem->pszText || (wineItem->pszText == LPSTR_TEXTCALLBACKW)) nmhdr.itemNew.pszText = NULL; else
    29042952      {
    29052953        INT len = lstrlenW(wineItem->pszText)+1;
     
    29502998}
    29512999
    2952 static BOOL
    2953 TREEVIEW_SendDispInfoNotify (HWND hwnd, TREEVIEW_ITEM *wineItem, UINT code, UINT what)
     3000static 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
     3019static 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
     3038static WCHAR* TREEVIEW_CallbackText(HWND hwnd,TREEVIEW_ITEM *wineItem,BOOL *mustFree)
    29543039{
    29553040  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
     
    29583043  WCHAR *buf;
    29593044
    2960   tvdi.item.mask        = what;
     3045  tvdi.item.mask        = TVIF_TEXT;
    29613046  tvdi.item.hItem       = wineItem->hItem;
    29623047  tvdi.item.state       = wineItem->state;
    29633048  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;
    29663051  buf = tvdi.item.pszText;
    29673052
    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)
    29773064    {
    29783065      wineItem->pszText = tvdi.item.pszText;
     
    29823069      } else
    29833070      {
    2984         //TRACE (treeview,"user-supplied buffer\n");
     3071        //user-supplied buffer
    29853072        COMCTL32_Free(buf);
    29863073        wineItem->cchTextMax = 0;
    29873074      }
     3075      *mustFree = FALSE;
     3076      return wineItem->pszText;
    29883077    } else
    29893078    {
     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    {
    29903090      if (buf == tvdi.item.pszText)
    29913091      {
    2992         COMCTL32_Free(wineItem->pszText);
    29933092        wineItem->cchTextMax = 128;
    29943093        wineItem->pszText = (WCHAR*)COMCTL32_Alloc(128*sizeof(WCHAR));
     
    29973096      } else
    29983097      {
    2999         //TRACE (treeview,"user-supplied buffer\n");
     3098        //user-supplied buffer
    30003099        COMCTL32_Free(buf);
    30013100        wineItem->cchTextMax = 0;
    30023101      }
     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;
    30033113    }
    30043114  }
    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
     3117static 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;
    30143134}
    30153135
     
    31623282
    31633283        /* 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))
    31653285          return FALSE;
    31663286
     
    31863306        //TRACE(treeview, "  TVN_ITEMEXPANDING sent...\n");
    31873307
    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);
    31943309
    31953310        //TRACE(treeview, "  TVN_ITEMEXPANDED sent...\n");
     
    33213436  HFONT hOldFont = 0;
    33223437  TEXTMETRICA textMetric;
     3438  WCHAR* textW;
     3439  CHAR* textA = NULL;
     3440  BOOL mustFree = FALSE;
     3441  NMTVDISPINFOW tvdi;
    33233442
    33243443  if (!editItem)
     
    33333452
    33343453  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;
    33363457
    33373458  hdc = GetDC(hwnd);
     
    33433464
    33443465  /*Get String Lenght in pixels */
    3345   GetTextExtentPoint32W(hdc, editItem->pszText, lstrlenW(editItem->pszText), &sz);
     3466  GetTextExtentPoint32W(hdc,textW,lstrlenW(textW),&sz);
    33463467
    33473468  /*Add Extra spacing for the next character */
     
    33723493                  (DWORD) TREEVIEW_Edit_SubclassProc);
    33733494
    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))
    33763509  {
    33773510     DestroyWindow(infoPtr->hwndEdit);
    33783511     infoPtr->hwndEdit = 0;
     3512     if (mustFree) COMCTL32_Free(textW);
     3513     if (textA) COMCTL32_Free(textA);
    33793514
    33803515     return (HWND)0;
    33813516  }
     3517  if (textA) HeapFree(GetProcessHeap(),0,textA);
    33823518
    33833519  infoPtr->editItem = hItem;
    3384   SetWindowTextW(infoPtr->hwndEdit, editItem->pszText);
     3520  SetWindowTextW(infoPtr->hwndEdit,textW);
    33853521  SetFocus(infoPtr->hwndEdit);
    33863522  SendMessageA(infoPtr->hwndEdit, EM_SETSEL, 0, -1);
    33873523  ShowWindow(infoPtr->hwndEdit, SW_SHOW);
     3524  if (mustFree) COMCTL32_Free(textW);
    33883525
    33893526  return infoPtr->hwndEdit;
     
    33923529
    33933530LRESULT WINAPI
    3394 TREEVIEW_EndEditLabelNow (HWND hwnd, BOOL bCancel)
     3531TREEVIEW_EndEditLabelNow(HWND hwnd,BOOL bCancel)
    33953532{
    33963533  TREEVIEW_INFO *infoPtr    = TREEVIEW_GetInfoPtr(hwnd);
     
    34163553    iLength = GetWindowTextW(infoPtr->hwndEdit,textW,1023);
    34173554
    3418     //if (iLength >= 1023)
    3419     //{
    3420     //  ERR("Insuficient space to retrieve new item label.");
    3421     //}
    3422 
    34233555    if (isUnicodeNotify(&infoPtr->header)) tvdi.item.pszText = textW; else
    34243556    {
    34253557      INT len = iLength+1;
    34263558
    3427       textA = (CHAR*)COMCTL32_Alloc(len);
     3559      textA = (CHAR*)COMCTL32_Alloc(len*sizeof(CHAR));
    34283560      lstrcpynWtoA(textA,textW,len);
    34293561      tvdi.item.pszText = (WCHAR*)textA;
    34303562    }
    34313563    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);
    34403571
    34413572  if (!bCancel && bCommit) /* Apply the changes */
    34423573  {
     3574    WCHAR* text;
     3575    BOOL mustFree = FALSE;
     3576
    34433577    if (!isUnicodeNotify(&infoPtr->header))
    34443578      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        }
    34613624      }
    34623625    }
     3626    if (mustFree) COMCTL32_Free(text);
    34633627  }
    34643628
     
    35803744      DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
    35813745      LPWSTR text;
     3746      BOOL mustFree = FALSE;
    35823747      TTTOOLINFOW ti;
    35833748      POINT pt;
     
    35863751      {
    35873752        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;
    35903756        tvgit.cchTextMax = INFOTIPSIZE;
    35913757        tvgit.hItem      = item->hItem;
     
    35953761        if (isUnicodeNotify(&infoPtr->header))
    35963762        {
     3763          if (buf != tvgit.pszText) COMCTL32_Free(buf); else mustFree = TRUE;
    35973764          text = tvgit.pszText;
    35983765        } else
     
    36003767          text = (WCHAR*)COMCTL32_Alloc(tvgit.cchTextMax*sizeof(WCHAR));
    36013768          lstrcpyAtoW(text,(LPSTR)tvgit.pszText);
     3769          COMCTL32_Free(buf);
    36023770        }
    36033771      } else
    36043772      {
    36053773        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;
    36093777      }
    36103778#if 0 //CB: not yet
     
    36223790      SendMessageA(infoPtr->hwndToolTip,TTM_TRACKACTIVATE,(WPARAM)TRUE,(LPARAM)&ti);
    36233791#endif
    3624       if (text != item->pszText) COMCTL32_Free(text);
     3792      if (mustFree) COMCTL32_Free(text);
    36253793    }
    36263794
     
    36733841    if (TREEVIEW_TrackMouse(hwnd, ht.pt))
    36743842    {
    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);
    36763844      infoPtr->dropItem = ht.hItem;
    36773845      return 0;
     
    37453913      if (ht.hItem)
    37463914      {
    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);
    37483916         infoPtr->dropItem = ht.hItem;
    37493917      }
     
    37843952TREEVIEW_CreateDragImage (HWND hwnd, WPARAM wParam, LPARAM lParam)
    37853953{
    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);
    38243992
    38253993/*
     
    38283996*/
    38293997
    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;
    38444013}
    38454014
     
    38784047        return FALSE;
    38794048
    3880       prevItem= TREEVIEW_ValidItem (infoPtr, (HTREEITEM)prevSelect);
     4049      prevItem = TREEVIEW_ValidItem (infoPtr, (HTREEITEM)prevSelect);
    38814050
    38824051      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))
    38844053          return FALSE;       /* FIXME: OK? */
    38854054
     
    39064075      TREEVIEW_RefreshItem(hwnd,wineItem,FALSE);
    39074076
    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);
    39094078
    39104079      break;
    39114080
    39124081    case TVGN_DROPHILITE:
    3913       prevItem= TREEVIEW_ValidItem (infoPtr, infoPtr->dropItem);
     4082      prevItem = TREEVIEW_ValidItem (infoPtr, infoPtr->dropItem);
    39144083
    39154084      if (prevItem)
     
    40074176
    40084177static LRESULT
    4009 TREEVIEW_VScroll (HWND hwnd, WPARAM wParam, LPARAM lParam)
     4178TREEVIEW_VScroll(HWND hwnd,WPARAM wParam,LPARAM lParam)
    40104179{
    40114180  TREEVIEW_INFO *infoPtr = TREEVIEW_GetInfoPtr(hwnd);
     
    44204589static BOOL TREEVIEW_Compare(HWND hwnd,TREEVIEW_ITEM *item,LPWSTR text,INT textlen)
    44214590{
     4591  WCHAR* itemtext;
     4592  BOOL mustFree = FALSE,res;
     4593
    44224594  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;
    44254598
    44264599  //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;
    44284604}
    44294605
     
    45734749
    45744750        case TVM_DELETEITEM:
    4575                 return TREEVIEW_DeleteItem (hwnd, wParam, lParam);
     4751          return TREEVIEW_DeleteItem (hwnd, wParam, lParam);
    45764752
    45774753        case TVM_EXPAND:
    4578                 return TREEVIEW_Expand (hwnd, wParam, lParam);
     4754          return TREEVIEW_Expand (hwnd, wParam, lParam);
    45794755
    45804756        case TVM_GETITEMRECT:
    4581                 return TREEVIEW_GetItemRect (hwnd, wParam, lParam);
     4757          return TREEVIEW_GetItemRect (hwnd, wParam, lParam);
    45824758
    45834759        case TVM_GETCOUNT:
    4584                 return TREEVIEW_GetCount (hwnd, wParam, lParam);
     4760          return TREEVIEW_GetCount (hwnd, wParam, lParam);
    45854761
    45864762        case TVM_GETINDENT:
    4587                 return TREEVIEW_GetIndent (hwnd);
     4763          return TREEVIEW_GetIndent (hwnd);
    45884764
    45894765        case TVM_SETINDENT:
    4590                 return TREEVIEW_SetIndent (hwnd, wParam);
     4766          return TREEVIEW_SetIndent (hwnd, wParam);
    45914767
    45924768        case TVM_GETIMAGELIST:
    4593                 return TREEVIEW_GetImageList (hwnd, wParam, lParam);
     4769          return TREEVIEW_GetImageList (hwnd, wParam, lParam);
    45944770
    45954771        case TVM_SETIMAGELIST:
    4596                 return TREEVIEW_SetImageList (hwnd, wParam, lParam);
     4772          return TREEVIEW_SetImageList (hwnd, wParam, lParam);
    45974773
    45984774        case TVM_GETNEXTITEM:
    4599                 return TREEVIEW_GetNextItem (hwnd, wParam, lParam);
     4775          return TREEVIEW_GetNextItem (hwnd, wParam, lParam);
    46004776
    46014777        case TVM_SELECTITEM:
    4602                 return TREEVIEW_SelectItem (hwnd, wParam, lParam);
     4778          return TREEVIEW_SelectItem (hwnd, wParam, lParam);
    46034779
    46044780        case TVM_GETITEMA:
    4605                 return TREEVIEW_GetItem(hwnd,wParam,lParam,FALSE);
     4781          return TREEVIEW_GetItem(hwnd,wParam,lParam,FALSE);
    46064782
    46074783        case TVM_GETITEMW:
    4608                 return TREEVIEW_GetItem(hwnd,wParam,lParam,TRUE);
     4784          return TREEVIEW_GetItem(hwnd,wParam,lParam,TRUE);
    46094785
    46104786        case TVM_SETITEMA:
    4611                 return TREEVIEW_SetItem(hwnd,wParam,lParam,FALSE);
     4787          return TREEVIEW_SetItem(hwnd,wParam,lParam,FALSE);
    46124788
    46134789        case TVM_SETITEMW:
    4614                 return TREEVIEW_SetItem(hwnd,wParam,lParam,TRUE);
     4790          return TREEVIEW_SetItem(hwnd,wParam,lParam,TRUE);
    46154791
    46164792        case TVM_EDITLABELA:
    4617                 return TREEVIEW_EditLabel(hwnd,(HTREEITEM)lParam,FALSE);
     4793          return TREEVIEW_EditLabel(hwnd,(HTREEITEM)lParam,FALSE);
    46184794
    46194795        case TVM_EDITLABELW:
    4620                 return TREEVIEW_EditLabel(hwnd,(HTREEITEM)lParam,TRUE);
     4796          return TREEVIEW_EditLabel(hwnd,(HTREEITEM)lParam,TRUE);
    46214797
    46224798        case TVM_GETEDITCONTROL:
    4623                 return TREEVIEW_GetEditControl (hwnd);
     4799          return TREEVIEW_GetEditControl (hwnd);
    46244800
    46254801        case TVM_GETVISIBLECOUNT:
    4626                 return TREEVIEW_GetVisibleCount (hwnd, wParam, lParam);
     4802          return TREEVIEW_GetVisibleCount (hwnd, wParam, lParam);
    46274803
    46284804        case TVM_HITTEST:
    4629                 return TREEVIEW_HitTest(hwnd,(LPTVHITTESTINFO)lParam);
     4805          return TREEVIEW_HitTest(hwnd,(LPTVHITTESTINFO)lParam);
    46304806
    46314807        case TVM_CREATEDRAGIMAGE:
    4632                 return TREEVIEW_CreateDragImage (hwnd, wParam, lParam);
     4808          return TREEVIEW_CreateDragImage (hwnd, wParam, lParam);
    46334809
    46344810        case TVM_SORTCHILDREN:
    4635                 return TREEVIEW_SortChildren(hwnd, wParam, lParam);
     4811          return TREEVIEW_SortChildren(hwnd, wParam, lParam);
    46364812
    46374813        case TVM_ENSUREVISIBLE:
    4638                 return TREEVIEW_EnsureVisible(hwnd,(HTREEITEM)lParam);
     4814          return TREEVIEW_EnsureVisible(hwnd,(HTREEITEM)lParam);
    46394815
    46404816        case TVM_SORTCHILDRENCB:
    4641                 return TREEVIEW_SortChildrenCB(hwnd, wParam, lParam);
     4817          return TREEVIEW_SortChildrenCB(hwnd, wParam, lParam);
    46424818
    46434819        case TVM_ENDEDITLABELNOW:
    4644                 return TREEVIEW_EndEditLabelNow (hwnd,(BOOL)wParam);
     4820          return TREEVIEW_EndEditLabelNow (hwnd,(BOOL)wParam);
    46454821
    46464822        case TVM_GETISEARCHSTRINGA:
    4647                 return TREEVIEW_GetISearchString(hwnd,(LPWSTR)lParam,FALSE);
     4823          return TREEVIEW_GetISearchString(hwnd,(LPWSTR)lParam,FALSE);
    46484824
    46494825        case TVM_GETISEARCHSTRINGW:
    4650                 return TREEVIEW_GetISearchString(hwnd,(LPWSTR)lParam,TRUE);
     4826          return TREEVIEW_GetISearchString(hwnd,(LPWSTR)lParam,TRUE);
    46514827
    46524828        case TVM_GETTOOLTIPS:
    4653                 return TREEVIEW_GetToolTips (hwnd);
     4829          return TREEVIEW_GetToolTips (hwnd);
    46544830
    46554831        case TVM_SETTOOLTIPS:
    4656                 return TREEVIEW_SetToolTips (hwnd, wParam);
     4832          return TREEVIEW_SetToolTips (hwnd, wParam);
    46574833
    46584834        case TVM_SETINSERTMARK:
    4659                 return TREEVIEW_SetInsertMark (hwnd,wParam, lParam);
     4835          return TREEVIEW_SetInsertMark (hwnd,wParam, lParam);
    46604836
    46614837        case TVM_SETITEMHEIGHT:
    4662                 return TREEVIEW_SetItemHeight (hwnd, wParam);
     4838          return TREEVIEW_SetItemHeight (hwnd, wParam);
    46634839
    46644840        case TVM_GETITEMHEIGHT:
    4665                 return TREEVIEW_GetItemHeight (hwnd);
     4841          return TREEVIEW_GetItemHeight (hwnd);
    46664842
    46674843        case TVM_SETBKCOLOR:
    4668                 return TREEVIEW_SetBkColor (hwnd, wParam, lParam);
     4844          return TREEVIEW_SetBkColor (hwnd, wParam, lParam);
    46694845
    46704846        case TVM_SETTEXTCOLOR:
    4671                 return TREEVIEW_SetTextColor (hwnd, wParam, lParam);
     4847          return TREEVIEW_SetTextColor (hwnd, wParam, lParam);
    46724848
    46734849        case TVM_GETBKCOLOR:
    4674                 return TREEVIEW_GetBkColor (hwnd);
     4850          return TREEVIEW_GetBkColor (hwnd);
    46754851
    46764852        case TVM_GETTEXTCOLOR:
    4677                 return TREEVIEW_GetTextColor (hwnd);
     4853          return TREEVIEW_GetTextColor (hwnd);
    46784854
    46794855        case TVM_SETSCROLLTIME:
    4680                 return TREEVIEW_SetScrollTime (hwnd, (UINT)wParam);
     4856          return TREEVIEW_SetScrollTime (hwnd, (UINT)wParam);
    46814857
    46824858        case TVM_GETSCROLLTIME:
    4683                 return TREEVIEW_GetScrollTime (hwnd);
     4859          return TREEVIEW_GetScrollTime (hwnd);
    46844860
    46854861        case TVM_GETITEMSTATE:
    4686                 return TREEVIEW_GetItemState (hwnd,wParam, lParam);
     4862          return TREEVIEW_GetItemState (hwnd,wParam, lParam);
    46874863
    46884864        case TVM_GETLINECOLOR:
    4689                 return TREEVIEW_GetLineColor (hwnd,wParam, lParam);
     4865          return TREEVIEW_GetLineColor (hwnd,wParam, lParam);
    46904866
    46914867        case TVM_SETLINECOLOR:
    4692                 return TREEVIEW_SetLineColor (hwnd,wParam, lParam);
     4868          return TREEVIEW_SetLineColor (hwnd,wParam, lParam);
    46934869
    46944870        case TVM_SETINSERTMARKCOLOR:
    4695                 return TREEVIEW_SetInsertMarkColor (hwnd,wParam, lParam);
     4871          return TREEVIEW_SetInsertMarkColor (hwnd,wParam, lParam);
    46964872
    46974873        case TVM_GETINSERTMARKCOLOR:
    4698                 return TREEVIEW_GetInsertMarkColor (hwnd,wParam, lParam);
     4874          return TREEVIEW_GetInsertMarkColor (hwnd,wParam, lParam);
    46994875
    47004876        case WM_COMMAND:
    4701                 return TREEVIEW_Command (hwnd, wParam, lParam);
     4877          return TREEVIEW_Command (hwnd, wParam, lParam);
    47024878
    47034879        case WM_DESTROY:
    4704                 return TREEVIEW_Destroy (hwnd);
     4880          return TREEVIEW_Destroy (hwnd);
    47054881
    47064882        case WM_ENABLE:
    4707                 return TREEVIEW_Enable(hwnd,wParam,lParam);
     4883          return TREEVIEW_Enable(hwnd,wParam,lParam);
    47084884
    47094885        case WM_ERASEBKGND:
    4710                 return TREEVIEW_EraseBackground (hwnd, wParam, lParam);
     4886          return TREEVIEW_EraseBackground (hwnd, wParam, lParam);
    47114887
    47124888        case WM_GETDLGCODE:
    4713                 return TREEVIEW_GetDlgCode(hwnd,wParam,lParam);
     4889          return TREEVIEW_GetDlgCode(hwnd,wParam,lParam);
    47144890
    47154891        case WM_PAINT:
    4716                 return TREEVIEW_Paint (hwnd, wParam, lParam);
     4892          return TREEVIEW_Paint (hwnd, wParam, lParam);
    47174893
    47184894        case WM_GETFONT:
    4719                 return TREEVIEW_GetFont (hwnd, wParam, lParam);
     4895          return TREEVIEW_GetFont (hwnd, wParam, lParam);
    47204896
    47214897        case WM_SETFONT:
    4722                 return TREEVIEW_SetFont (hwnd, wParam, lParam);
     4898          return TREEVIEW_SetFont (hwnd, wParam, lParam);
    47234899
    47244900        case WM_KEYDOWN:
    4725                 return TREEVIEW_KeyDown (hwnd, wParam, lParam);
     4901          return TREEVIEW_KeyDown (hwnd, wParam, lParam);
    47264902
    47274903        case WM_CHAR:
    4728                 return TREEVIEW_Char(hwnd,wParam,lParam);
     4904          return TREEVIEW_Char(hwnd,wParam,lParam);
    47294905
    47304906        case WM_SETFOCUS:
    4731                 return TREEVIEW_SetFocus (hwnd, wParam, lParam);
     4907          return TREEVIEW_SetFocus (hwnd, wParam, lParam);
    47324908
    47334909        case WM_KILLFOCUS:
    4734                 return TREEVIEW_KillFocus (hwnd, wParam, lParam);
     4910          return TREEVIEW_KillFocus (hwnd, wParam, lParam);
    47354911
    47364912        case WM_MOUSEMOVE:
    4737                 return TREEVIEW_MouseMove(hwnd,wParam,lParam);
     4913          return TREEVIEW_MouseMove(hwnd,wParam,lParam);
    47384914
    47394915        case WM_LBUTTONDOWN:
    4740                 return TREEVIEW_LButtonDown (hwnd, wParam, lParam);
     4916          return TREEVIEW_LButtonDown (hwnd, wParam, lParam);
    47414917
    47424918        case WM_LBUTTONDBLCLK:
    4743                 return TREEVIEW_LButtonDoubleClick (hwnd, wParam, lParam);
     4919          return TREEVIEW_LButtonDoubleClick (hwnd, wParam, lParam);
    47444920
    47454921        case WM_RBUTTONDOWN:
    4746                 return TREEVIEW_RButtonDown (hwnd, wParam, lParam);
     4922          return TREEVIEW_RButtonDown (hwnd, wParam, lParam);
    47474923
    47484924        case WM_RBUTTONDBLCLK:
    4749                 return TREEVIEW_RButtonDoubleClick(hwnd,wParam,lParam);
     4925          return TREEVIEW_RButtonDoubleClick(hwnd,wParam,lParam);
    47504926
    47514927        case WM_STYLECHANGED:
    4752                 return TREEVIEW_StyleChanged (hwnd, wParam, lParam);
     4928          return TREEVIEW_StyleChanged (hwnd, wParam, lParam);
    47534929
    47544930        case WM_SYSCOLORCHANGE:
    4755                 return TREEVIEW_SysColorChange(hwnd,wParam,lParam);
     4931          return TREEVIEW_SysColorChange(hwnd,wParam,lParam);
    47564932
    47574933        case WM_SETCURSOR:
    4758                 return TREEVIEW_SetCursor(hwnd,wParam,lParam);
     4934          return TREEVIEW_SetCursor(hwnd,wParam,lParam);
    47594935
    47604936        case WM_SETREDRAW:
    4761                 return TREEVIEW_SetRedraw(hwnd,wParam,lParam);
     4937          return TREEVIEW_SetRedraw(hwnd,wParam,lParam);
    47624938
    47634939        case WM_TIMER:
    4764                 return TREEVIEW_HandleTimer (hwnd, wParam, lParam);
     4940          return TREEVIEW_HandleTimer (hwnd, wParam, lParam);
    47654941
    47664942        case WM_SIZE:
    4767                 return TREEVIEW_Size (hwnd, wParam,lParam);
     4943          return TREEVIEW_Size (hwnd, wParam,lParam);
    47684944
    47694945        case WM_HSCROLL:
    4770                 return TREEVIEW_HScroll (hwnd, wParam, lParam);
     4946          return TREEVIEW_HScroll (hwnd, wParam, lParam);
    47714947
    47724948        case WM_VSCROLL:
    4773                 return TREEVIEW_VScroll (hwnd, wParam, lParam);
     4949          return TREEVIEW_VScroll (hwnd, wParam, lParam);
    47744950
    47754951        case WM_MOUSEWHEEL:
    4776                 return TREEVIEW_MouseWheel (hwnd, wParam, lParam);
     4952          return TREEVIEW_MouseWheel (hwnd, wParam, lParam);
    47774953
    47784954        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);
    47814957
    47824958        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);
    47874960      }
    47884961    return 0;
Note: See TracChangeset for help on using the changeset viewer.