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/listview.cpp

    r3154 r3182  
    1 /*$Id: listview.cpp,v 1.3 2000-03-18 16:17:24 cbratschi Exp $*/
     1/*$Id: listview.cpp,v 1.4 2000-03-21 17:30:42 cbratschi Exp $*/
    22/*
    33 * Listview control
     
    66 * Copyright 1999 Luc Tourangeau
    77 * Copyright 1999 Achim Hasenmueller
    8  * Copyright 1999 Christoph Bratschi
     8 * Copyright 1999-2000 Christoph Bratschi (cbratschi@datacomm.ch)
    99 *
    1010 * NOTES
     
    3636 *   LISTVIEW_Update : not completed
    3737 * WM_SETREDRAW not implemented
     38 *
     39 * the sort algorithm isn't stable (order of same items isn't fixed)!!!
    3840 */
    3941
     
    107109 */
    108110
    109 static INT LISTVIEW_HitTestItem(HWND, LPLVHITTESTINFO);
    110 static INT LISTVIEW_GetCountPerRow(HWND);
    111 static INT LISTVIEW_GetCountPerColumn(HWND);
    112 static VOID LISTVIEW_AlignLeft(HWND);
    113 static VOID LISTVIEW_AlignTop(HWND);
    114 static VOID LISTVIEW_AddGroupSelection(HWND, INT);
    115 static VOID LISTVIEW_AddSelection(HWND, INT);
    116 static BOOL LISTVIEW_AddSubItem(HWND, LPLVITEMW,BOOL);
    117 static INT LISTVIEW_FindInsertPosition(HDPA, INT);
    118 static INT LISTVIEW_GetItemHeight(HWND);
    119 static BOOL LISTVIEW_GetItemPosition(HWND, INT, LPPOINT);
     111static INT     LISTVIEW_HitTestItem(HWND, LPLVHITTESTINFO);
     112static INT     LISTVIEW_GetCountPerRow(HWND);
     113static INT     LISTVIEW_GetCountPerColumn(HWND);
     114static VOID    LISTVIEW_AlignLeft(HWND);
     115static VOID    LISTVIEW_AlignTop(HWND);
     116static VOID    LISTVIEW_AddGroupSelection(HWND, INT);
     117static VOID    LISTVIEW_AddSelection(HWND, INT);
     118static BOOL    LISTVIEW_AddSubItem(HWND, LPLVITEMW,BOOL);
     119static INT     LISTVIEW_FindInsertPosition(HDPA, INT);
     120static INT     LISTVIEW_GetItemHeight(HWND);
     121static BOOL    LISTVIEW_GetItemPosition(HWND, INT, LPPOINT);
     122static LRESULT LISTVIEW_GetItemRect(HWND hwnd,INT nItem,LPRECT lprc,INT code);
    120123static LRESULT LISTVIEW_GetItemRect(HWND, INT, LPRECT);
    121 static INT LISTVIEW_GetItemWidth(HWND);
    122 static INT LISTVIEW_GetLabelWidth(HWND, INT);
     124static INT     LISTVIEW_GetItemWidth(HWND);
     125static INT     LISTVIEW_GetLabelWidth(HWND, INT);
    123126static LRESULT LISTVIEW_GetOrigin(HWND, LPPOINT);
    124 static INT LISTVIEW_CalculateWidth(HWND hwnd, INT nItem);
     127static INT     LISTVIEW_CalculateWidth(HWND hwnd, INT nItem);
    125128static LISTVIEW_SUBITEM* LISTVIEW_GetSubItem(HDPA, INT);
    126129static LRESULT LISTVIEW_GetViewRect(HWND, LPRECT);
    127 static BOOL LISTVIEW_InitItem(HWND, LISTVIEW_ITEM *, LPLVITEMW,BOOL);
    128 static BOOL LISTVIEW_InitSubItem(HWND,LISTVIEW_SUBITEM*,LPLVITEMW,BOOL);
     130static BOOL    LISTVIEW_InitItem(HWND, LISTVIEW_ITEM *, LPLVITEMW,BOOL);
     131static BOOL    LISTVIEW_InitSubItem(HWND,LISTVIEW_SUBITEM*,LPLVITEMW,BOOL);
    129132static LRESULT LISTVIEW_MouseSelection(HWND, POINT);
    130 static BOOL LISTVIEW_RemoveColumn(HDPA, INT);
    131 static VOID LISTVIEW_RemoveSelections(HWND, INT, INT);
    132 static BOOL LISTVIEW_RemoveSubItem(HDPA, INT);
    133 static VOID LISTVIEW_SetGroupSelection(HWND, INT);
    134 static BOOL LISTVIEW_SetItem(HWND, LPLVITEMW,BOOL);
    135 static BOOL LISTVIEW_SetItemFocus(HWND, INT);
    136 static BOOL LISTVIEW_SetItemPosition(HWND, INT, INT, INT);
    137 static VOID LISTVIEW_UpdateScroll(HWND);
    138 static VOID LISTVIEW_SetSelection(HWND, INT);
    139 static VOID LISTVIEW_UpdateSize(HWND);
    140 static BOOL LISTVIEW_SetSubItem(HWND, LPLVITEMW,BOOL);
     133static BOOL    LISTVIEW_RemoveColumn(HDPA, INT);
     134static VOID    LISTVIEW_RemoveSelections(HWND, INT, INT);
     135static BOOL    LISTVIEW_RemoveSubItem(HDPA, INT);
     136static VOID    LISTVIEW_SetGroupSelection(HWND, INT);
     137static LRESULT LISTVIEW_SetItem(HWND, LPLVITEMW,BOOL);
     138static BOOL    LISTVIEW_SetItemFocus(HWND, INT);
     139static BOOL    LISTVIEW_SetItemPosition(HWND, INT, INT, INT);
     140static VOID    LISTVIEW_UpdateScroll(HWND);
     141static VOID    LISTVIEW_SetSelection(HWND, INT);
     142static VOID    LISTVIEW_UpdateSize(HWND);
     143static BOOL    LISTVIEW_SetSubItem(HWND, LPLVITEMW,BOOL);
    141144static LRESULT LISTVIEW_SetViewRect(HWND, LPRECT);
    142 static BOOL LISTVIEW_ToggleSelection(HWND, INT);
    143 static VOID LISTVIEW_UnsupportedStyles(LONG lStyle);
    144 static HWND LISTVIEW_EditLabel(HWND hwnd,INT nItem,BOOL unicode);
    145 static BOOL LISTVIEW_EndEditLabel(HWND hwnd,LPSTR pszText,DWORD nItem);
     145static BOOL    LISTVIEW_ToggleSelection(HWND, INT);
     146static VOID    LISTVIEW_UnsupportedStyles(LONG lStyle);
     147static HWND    LISTVIEW_EditLabel(HWND hwnd,INT nItem,BOOL unicode);
     148static BOOL    LISTVIEW_EndEditLabel(HWND hwnd,LPSTR pszText,DWORD nItem);
    146149static LRESULT LISTVIEW_Command(HWND hwnd, WPARAM wParam, LPARAM lParam);
    147150static LRESULT LISTVIEW_SortItems(HWND hwnd, WPARAM wParam, LPARAM lParam);
     151static LRESULT LISTVIEW_GetItem(HWND hwnd,LPLVITEMW lpLVItem,BOOL unicode,BOOL internal);
     152static INT     LISTVIEW_GetTopIndex(HWND hwnd);
     153static LRESULT LISTVIEW_GetItemState(HWND hwnd, INT nItem, UINT uMask);
     154static LRESULT LISTVIEW_SetItemState(HWND hwnd,INT nItem,DWORD data,DWORD mask);
     155static BOOL    LISTVIEW_SetItemPosition(HWND hwnd, INT nItem, INT nPosX, INT nPosY);
     156static LRESULT LISTVIEW_GetStringWidth(HWND hwnd,LPWSTR lpszText,BOOL unicode);
     157static BOOL    LISTVIEW_EnsureVisible(HWND hwnd,INT nItem,BOOL bPartial);
     158
     159static VOID LISTVIEW_Refresh(HWND hwnd)
     160{
     161  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     162  DWORD dwStyle;
     163  UINT uView;
     164
     165  if (infoPtr->refreshFlags & RF_REFRESH) return;
     166
     167  dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     168  uView =  dwStyle & LVS_TYPEMASK;
     169
     170  if (uView == LVS_REPORT)
     171  {
     172    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     173    RECT rect,rect2;
     174
     175    GetClientRect(hwnd,&rect);
     176    GetClientRect(infoPtr->hwndHeader,&rect2);
     177    rect.top += rect2.bottom;
     178    InvalidateRect(hwnd,&rect,TRUE);
     179  } else InvalidateRect(hwnd,NULL,TRUE);
     180}
     181
     182static VOID LISTVIEW_QueueRefresh(HWND hwnd)
     183{
     184  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     185
     186  if (infoPtr->refreshFlags & RF_REFRESH)
     187    KillTimer (hwnd,LV_REFRESH_TIMER);
     188  infoPtr->refreshFlags |= RF_REFRESH;
     189  SetTimer(hwnd,LV_REFRESH_TIMER,LV_REFRESH_DELAY,0);
     190}
     191
     192static LRESULT LISTVIEW_Timer(HWND hwnd,WPARAM wParam,LPARAM lParam)
     193{
     194  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     195
     196  switch (wParam)
     197  {
     198    case LV_REFRESH_TIMER:
     199      KillTimer(hwnd,LV_REFRESH_TIMER);
     200      if (infoPtr->refreshFlags & RF_UPDATESCROLL)
     201      {
     202        LISTVIEW_UpdateScroll(hwnd);
     203        infoPtr->refreshFlags &= ~RF_UPDATESCROLL;
     204      }
     205      if (infoPtr->refreshFlags & RF_REFRESH)
     206      {
     207        infoPtr->refreshFlags &= ~RF_REFRESH;
     208        LISTVIEW_Refresh(hwnd);
     209      }
     210      return 0;
     211  }
     212
     213  return 1;
     214}
     215
     216static VOID LISTVIEW_RefreshItem(HWND hwnd,INT nItem)
     217{
     218  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     219  RECT rect;
     220
     221  if (infoPtr->refreshFlags & RF_REFRESH) return;
     222  LISTVIEW_GetItemRect(hwnd,nItem,&rect,LVIR_SELECTBOUNDS);
     223  InvalidateRect(hwnd,&rect,TRUE);
     224}
     225
     226static VOID LISTVIEW_RefreshSubItem(HWND hwnd,INT nItem,INT nSubItem)
     227{
     228  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     229  RECT rect;
     230
     231  //CB: todo
     232  if (infoPtr->refreshFlags & RF_REFRESH) return;
     233  LISTVIEW_GetItemRect(hwnd,nItem,&rect,LVIR_SELECTBOUNDS);
     234  InvalidateRect(hwnd,&rect,TRUE);
     235}
     236
     237static VOID LISTVIEW_ScrollWindow(HWND hwnd,INT xScroll,INT yScroll,UINT uView)
     238{
     239  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     240
     241  if (infoPtr->refreshFlags & RF_REFRESH) return;
     242
     243  if (uView == LVS_REPORT)
     244  {
     245    RECT rect,header;
     246
     247    //clip header
     248    GetClientRect(hwnd,&rect);
     249    GetClientRect(infoPtr->hwndHeader,&header);
     250    if (yScroll < 0)
     251    {
     252      //up
     253      rect.top += header.bottom-yScroll;
     254      ScrollWindowEx(hwnd,xScroll,yScroll,&rect,NULL,0,NULL,0);
     255      rect.top = rect.bottom+yScroll;
     256      if (rect.top < header.bottom) rect.top = header.bottom;
     257      InvalidateRect(hwnd,&rect,TRUE);//CB: still wrong pixels
     258    } else if (yScroll > 0)
     259    { //down
     260      rect.top += header.bottom;
     261      ScrollWindowEx(hwnd,xScroll,yScroll,&rect,NULL,0,NULL,SW_INVALIDATE);
     262    }
     263    if (yScroll == 0)
     264    {
     265      rect.top += header.bottom;
     266      ScrollWindowEx(hwnd,xScroll,yScroll,&rect,NULL,0,NULL,SW_INVALIDATE);
     267    }
     268  } else ScrollWindowEx(hwnd,xScroll,yScroll,NULL,NULL,0,NULL,SW_INVALIDATE);
     269}
    148270
    149271/*************************************************************************
     
    163285static VOID LISTVIEW_UpdateHeaderSize(HWND hwnd, INT nNewScrollPos)
    164286{
    165     LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
     287    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
    166288    RECT winRect;
    167289    POINT point[2];
     
    196318{
    197319  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    198   LONG lStyle = GetWindowLongA(hwnd, GWL_STYLE);
    199   UINT uView =  lStyle & LVS_TYPEMASK;
     320  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     321  UINT uView =  dwStyle & LVS_TYPEMASK;
    200322  INT nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
    201323  INT nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
    202324  SCROLLINFO scrollInfo;
    203325
     326  if (dwStyle & LVS_NOSCROLL)
     327  {
     328    ShowScrollBar(hwnd,SB_BOTH,FALSE);
     329    return;
     330  }
     331
    204332  ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
    205333  scrollInfo.cbSize = sizeof(SCROLLINFO);
     
    208336  {
    209337    /* update horizontal scrollbar */
    210 
    211338    INT nCountPerColumn = LISTVIEW_GetCountPerColumn(hwnd);
    212339    INT nCountPerRow = LISTVIEW_GetCountPerRow(hwnd);
    213340    INT nNumOfItems = GETITEMCOUNT(infoPtr);
    214341
    215     scrollInfo.nMax = nNumOfItems / nCountPerColumn;
    216     if((nNumOfItems % nCountPerColumn) == 0)
    217     {
    218         scrollInfo.nMax--;
    219     }
    220     scrollInfo.nPos = ListView_GetTopIndex(hwnd) / nCountPerColumn;
    221     scrollInfo.nPage = nCountPerRow;
     342    infoPtr->maxScroll.x = nNumOfItems / nCountPerColumn+1;
     343    if ((nNumOfItems % nCountPerColumn) == 0)
     344      infoPtr->maxScroll.x--;
     345
     346    infoPtr->lefttop.x = LISTVIEW_GetTopIndex(hwnd) / nCountPerColumn;
     347    infoPtr->scrollPage.x = nCountPerRow;
     348
     349    scrollInfo.nMin  = 0;
     350    scrollInfo.nMax  = infoPtr->maxScroll.x-1;
     351    scrollInfo.nPos  = infoPtr->lefttop.x;
     352    scrollInfo.nPage = infoPtr->scrollPage.x;
    222353    scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
    223     SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
    224   }
    225   else if (uView == LVS_REPORT)
     354    SetScrollInfo(hwnd,SB_HORZ,&scrollInfo,TRUE);
     355  } else if (uView == LVS_REPORT)
    226356  {
    227357    /* update vertical scrollbar */
    228     scrollInfo.nMin = 0;
    229     scrollInfo.nMax = GETITEMCOUNT(infoPtr) - 1;
    230     scrollInfo.nPos = ListView_GetTopIndex(hwnd);
    231     scrollInfo.nPage = LISTVIEW_GetCountPerColumn(hwnd);
     358    infoPtr->maxScroll.y = GETITEMCOUNT(infoPtr);
     359    infoPtr->lefttop.y = LISTVIEW_GetTopIndex(hwnd);
     360    infoPtr->scrollPage.y = LISTVIEW_GetCountPerColumn(hwnd);
     361
     362    scrollInfo.nMin  = 0;
     363    scrollInfo.nMax  = infoPtr->maxScroll.y-1;
     364    scrollInfo.nPos  = infoPtr->lefttop.y;
     365    scrollInfo.nPage = infoPtr->scrollPage.y;
    232366    scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
    233     SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE);
     367    SetScrollInfo(hwnd,SB_VERT,&scrollInfo,TRUE);
    234368
    235369    /* update horizontal scrollbar */
    236370    nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
    237     if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) == FALSE
    238        || GETITEMCOUNT(infoPtr) == 0)
    239     {
    240       scrollInfo.nPos = 0;
    241     }
    242     scrollInfo.nMin = 0;
    243     scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE  ;
    244     scrollInfo.nPage = nListWidth / LISTVIEW_SCROLL_DIV_SIZE;
    245     scrollInfo.nMax = max(infoPtr->nItemWidth / LISTVIEW_SCROLL_DIV_SIZE, 0)-1;
    246     SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
     371    if (!(dwStyle & WS_HSCROLL) || !GETITEMCOUNT(infoPtr))
     372      infoPtr->lefttop.x = 0;
     373
     374    infoPtr->scrollPage.x = nListWidth / LISTVIEW_SCROLL_DIV_SIZE;
     375    infoPtr->maxScroll.x = max(infoPtr->nItemWidth / LISTVIEW_SCROLL_DIV_SIZE, 0);
     376
     377    scrollInfo.nMin  = 0;
     378    scrollInfo.nMax  = infoPtr->maxScroll.x-1;
     379    scrollInfo.nPos  = infoPtr->lefttop.x;
     380    scrollInfo.nPage = infoPtr->scrollPage.x;
     381    scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
     382    SetScrollInfo(hwnd,SB_HORZ,&scrollInfo,TRUE);
    247383
    248384    /* Update the Header Control */
    249     scrollInfo.fMask = SIF_POS;
    250     GetScrollInfo(hwnd, SB_HORZ, &scrollInfo);
    251     LISTVIEW_UpdateHeaderSize(hwnd, scrollInfo.nPos);
    252 
    253   }
    254   else
     385    LISTVIEW_UpdateHeaderSize(hwnd,infoPtr->lefttop.x);
     386  } else
    255387  {
    256388    RECT rcView;
    257389
    258     if (LISTVIEW_GetViewRect(hwnd, &rcView) != FALSE)
     390    if (LISTVIEW_GetViewRect(hwnd,&rcView))
    259391    {
    260392      INT nViewWidth = rcView.right - rcView.left;
     
    262394
    263395      /* Update Horizontal Scrollbar */
    264       scrollInfo.fMask = SIF_POS;
    265       if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) == FALSE
    266         || GETITEMCOUNT(infoPtr) == 0)
    267       {
    268         scrollInfo.nPos = 0;
    269       }
    270       scrollInfo.nMax = max(nViewWidth / LISTVIEW_SCROLL_DIV_SIZE, 0)-1;
    271       scrollInfo.nMin = 0;
    272       scrollInfo.nPage = nListWidth / LISTVIEW_SCROLL_DIV_SIZE;
     396      if (!(dwStyle & WS_HSCROLL) || !GETITEMCOUNT(infoPtr))
     397        infoPtr->lefttop.x = 0;
     398      infoPtr->maxScroll.x = max(nViewWidth / LISTVIEW_SCROLL_DIV_SIZE, 0);
     399      infoPtr->scrollPage.x = nListWidth / LISTVIEW_SCROLL_DIV_SIZE;
     400
     401      scrollInfo.nMin  = 0;
     402      scrollInfo.nMax  = infoPtr->maxScroll.x-1;
     403      scrollInfo.nPos  = infoPtr->lefttop.x;
     404      scrollInfo.nPage = infoPtr->scrollPage.x;
    273405      scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
    274       SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
     406      SetScrollInfo(hwnd,SB_HORZ,&scrollInfo,TRUE);
    275407
    276408      /* Update Vertical Scrollbar */
    277409      nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
    278       scrollInfo.fMask = SIF_POS;
    279       if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) == FALSE
    280         || GETITEMCOUNT(infoPtr) == 0)
    281       {
    282         scrollInfo.nPos = 0;
    283       }
    284       scrollInfo.nMax = max(nViewHeight / LISTVIEW_SCROLL_DIV_SIZE,0)-1;
    285       scrollInfo.nMin = 0;
    286       scrollInfo.nPage = nListHeight / LISTVIEW_SCROLL_DIV_SIZE;
     410      if (!(dwStyle & WS_VSCROLL) || !GETITEMCOUNT(infoPtr))
     411        infoPtr->lefttop.x = 0;
     412      infoPtr->maxScroll.y = max(nViewHeight / LISTVIEW_SCROLL_DIV_SIZE,0);
     413      infoPtr->scrollPage.y = nListHeight / LISTVIEW_SCROLL_DIV_SIZE;
     414
     415      scrollInfo.nMin  = 0;
     416      scrollInfo.nMax  = infoPtr->maxScroll.y-1;
     417      scrollInfo.nPos  = infoPtr->lefttop.y;
     418      scrollInfo.nPage = infoPtr->scrollPage.y;
    287419      scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
    288       SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE);
     420      SetScrollInfo(hwnd,SB_VERT,&scrollInfo,TRUE);
    289421    }
    290422  }
     
    312444  {
    313445    //FIXME("  LVS_NOLABELWRAP\n");
    314   }
    315 
    316   if ((LVS_TYPEMASK & lStyle) == LVS_NOSCROLL)
    317   {
    318     //FIXME("  LVS_NOSCROLL\n");
    319446  }
    320447
     
    374501        }
    375502
    376         ListView_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
     503        LISTVIEW_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
    377504        ptItem.x += infoPtr->nItemWidth;
    378505        rcView.right = max(rcView.right, ptItem.x);
     
    385512      for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
    386513      {
    387         ListView_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
     514        LISTVIEW_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
    388515        ptItem.y += infoPtr->nItemHeight;
    389516      }
     
    431558        }
    432559
    433         ListView_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
     560        LISTVIEW_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
    434561        ptItem.y += infoPtr->nItemHeight;
    435562        rcView.bottom = max(rcView.bottom, ptItem.y);
     
    442569      for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
    443570      {
    444         ListView_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
     571        LISTVIEW_SetItemPosition(hwnd, i, ptItem.x, ptItem.y);
    445572        ptItem.x += infoPtr->nItemWidth;
    446573      }
     
    772899  for (i = nFirst; i <= nLast; i++)
    773900  {
    774     ListView_SetItemState(hwnd,i,LVIS_SELECTED,LVIS_SELECTED);
     901    LISTVIEW_SetItemState(hwnd,i,LVIS_SELECTED,LVIS_SELECTED);
    775902  }
    776903
     
    794921  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    795922
    796   ListView_SetItemState(hwnd,nItem,LVIS_SELECTED,LVIS_SELECTED);
     923  LISTVIEW_SetItemState(hwnd,nItem,LVIS_SELECTED,LVIS_SELECTED);
    797924
    798925  LISTVIEW_SetItemFocus(hwnd, nItem);
     
    817944  BOOL bResult;
    818945
    819   if (ListView_GetItemState(hwnd, nItem, LVIS_SELECTED) & LVIS_SELECTED)
    820   {
    821     ListView_SetItemState(hwnd,nItem,0,LVIS_SELECTED);
     946  if (LISTVIEW_GetItemState(hwnd, nItem, LVIS_SELECTED) & LVIS_SELECTED)
     947  {
     948    LISTVIEW_SetItemState(hwnd,nItem,0,LVIS_SELECTED);
    822949    bResult = FALSE;
    823950  }
    824951  else
    825952  {
    826     ListView_SetItemState(hwnd,nItem,LVIS_SELECTED,LVIS_SELECTED);
     953    LISTVIEW_SetItemState(hwnd,nItem,LVIS_SELECTED,LVIS_SELECTED);
    827954    bResult = TRUE;
    828955  }
     
    856983    if (PtInRect(&rcSelRect, ptItem) != FALSE)
    857984    {
    858       ListView_SetItemState(hwnd,i,LVIS_SELECTED,LVIS_SELECTED);
     985      LISTVIEW_SetItemState(hwnd,i,LVIS_SELECTED,LVIS_SELECTED);
    859986    }
    860987    else
    861988    {
    862       ListView_SetItemState(hwnd,i,0,LVIS_SELECTED);
     989      LISTVIEW_SetItemState(hwnd,i,0,LVIS_SELECTED);
    863990    }
    864991  }
     
    8911018      if ((i < nFirst) || (i > nLast))
    8921019      {
    893         ListView_SetItemState(hwnd,i,0,LVIS_SELECTED);
     1020        LISTVIEW_SetItemState(hwnd,i,0,LVIS_SELECTED);
    8941021      }
    8951022      else
    8961023      {
    897         ListView_SetItemState(hwnd,i,LVIS_SELECTED,LVIS_SELECTED);
     1024        LISTVIEW_SetItemState(hwnd,i,LVIS_SELECTED,LVIS_SELECTED);
    8981025      }
    8991026    }
     
    9371064    bResult = TRUE;
    9381065
    939     ListView_SetItemState(hwnd,infoPtr->nFocusedItem,0,LVIS_FOCUSED);
    940     ListView_SetItemState(hwnd,nItem,LVIS_FOCUSED,LVIS_FOCUSED);
     1066    LISTVIEW_SetItemState(hwnd,infoPtr->nFocusedItem,0,LVIS_FOCUSED);
     1067    LISTVIEW_SetItemState(hwnd,nItem,LVIS_FOCUSED,LVIS_FOCUSED);
    9411068
    9421069    infoPtr->nFocusedItem = nItem;
    943     ListView_EnsureVisible(hwnd, nItem, FALSE);
     1070    LISTVIEW_EnsureVisible(hwnd, nItem, FALSE);
    9441071  }
    9451072
     
    9721099  }
    9731100
    974   ListView_SetItemState(hwnd,infoPtr->nFocusedItem,0,LVIS_FOCUSED);
    975   ListView_SetItemState(hwnd,nItem,LVIS_SELECTED | LVIS_FOCUSED,LVIS_SELECTED | LVIS_FOCUSED);
     1101  LISTVIEW_SetItemState(hwnd,infoPtr->nFocusedItem,0,LVIS_FOCUSED);
     1102  LISTVIEW_SetItemState(hwnd,nItem,LVIS_SELECTED | LVIS_FOCUSED,LVIS_SELECTED | LVIS_FOCUSED);
    9761103
    9771104  infoPtr->nFocusedItem = nItem;
     
    9911118 *   FAILURE : FALSE (nothing has changed)
    9921119 */
    993 static BOOL LISTVIEW_KeySelection(HWND hwnd, INT nItem)
     1120static VOID LISTVIEW_KeySelection(HWND hwnd, INT nItem)
    9941121{
    9951122  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
     
    9971124  WORD wShift = HIWORD(GetKeyState(VK_SHIFT));
    9981125  WORD wCtrl = HIWORD(GetKeyState(VK_CONTROL));
    999   BOOL bResult = FALSE;
    10001126
    10011127  if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
     
    10031129    if (lStyle & LVS_SINGLESEL)
    10041130    {
    1005       bResult = TRUE;
    10061131      LISTVIEW_SetSelection(hwnd, nItem);
    1007       ListView_EnsureVisible(hwnd, nItem, FALSE);
     1132      LISTVIEW_EnsureVisible(hwnd, nItem, FALSE);
    10081133    }
    10091134    else
     
    10111136      if (wShift)
    10121137      {
    1013         bResult = TRUE;
    10141138        LISTVIEW_SetGroupSelection(hwnd, nItem);
    10151139      }
    10161140      else if (wCtrl)
    10171141      {
    1018         bResult = LISTVIEW_SetItemFocus(hwnd, nItem);
     1142        LISTVIEW_SetItemFocus(hwnd, nItem);
    10191143      }
    10201144      else
    10211145      {
    1022         bResult = TRUE;
    10231146        LISTVIEW_SetSelection(hwnd, nItem);
    1024         ListView_EnsureVisible(hwnd, nItem, FALSE);
    1025       }
    1026     }
    1027   }
    1028 
    1029   return bResult;
     1147        LISTVIEW_EnsureVisible(hwnd, nItem, FALSE);
     1148      }
     1149    }
     1150  }
    10301151}
    10311152
     
    10811202  for (i = nFirst; i <= nLast; i++)
    10821203  {
    1083     ListView_SetItemState(hwnd,i,0,LVIS_SELECTED);
     1204    LISTVIEW_SetItemState(hwnd,i,0,LVIS_SELECTED);
    10841205  }
    10851206}
     
    12911412                  uChanged |= LVIF_TEXT;
    12921413                }
    1293                 FreeAsciiString((LPSTR)textW);
     1414                HeapFree(GetProcessHeap(),0,textW);
    12941415              }
    12951416              else
     
    14501571    {
    14511572      bResult = TRUE;
    1452       ZeroMemory(lpSubItem, sizeof(LISTVIEW_SUBITEM));
     1573      ZeroMemory(lpSubItem,sizeof(LISTVIEW_SUBITEM));
    14531574
    14541575      lpSubItem->iSubItem = lpLVItem->iSubItem;
    14551576
    14561577      if (lpLVItem->mask & LVIF_IMAGE)
    1457       {
    14581578        lpSubItem->iImage = lpLVItem->iImage;
    1459       }
    14601579
    14611580      if (lpLVItem->mask & LVIF_TEXT)
     
    14661585          {
    14671586            if ((lStyle & LVS_SORTASCENDING) || (lStyle & LVS_SORTDESCENDING))
    1468             {
    14691587              return FALSE;
    1470             }
    1471 
    1472             if ((lpSubItem->pszText != NULL) &&
    1473                 (lpSubItem->pszText != LPSTR_TEXTCALLBACKW))
    1474             {
     1588
     1589            if ((lpSubItem->pszText != NULL) && (lpSubItem->pszText != LPSTR_TEXTCALLBACKW))
    14751590              COMCTL32_Free(lpSubItem->pszText);
    1476             }
    14771591
    14781592            lpSubItem->pszText = LPSTR_TEXTCALLBACKW;
    1479           }
    1480           else
     1593          } else
    14811594          {
    14821595            if (lpSubItem->pszText == LPSTR_TEXTCALLBACKW)
    1483             {
    14841596              lpSubItem->pszText = NULL;
    1485             }
    1486 
    1487             bResult = Str_SetPtrW(&lpSubItem->pszText, lpLVItem->pszText);
     1597
     1598            bResult = Str_SetPtrW(&lpSubItem->pszText,lpLVItem->pszText);
    14881599          }
    14891600        } else //!unicode
     
    14921603          {
    14931604            if ((lStyle & LVS_SORTASCENDING) || (lStyle & LVS_SORTDESCENDING))
    1494             {
    14951605              return FALSE;
    1496             }
    1497 
    1498             if ((lpSubItem->pszText != NULL) &&
    1499                 (lpSubItem->pszText != LPSTR_TEXTCALLBACKW))
    1500             {
     1606
     1607            if ((lpSubItem->pszText != NULL) && (lpSubItem->pszText != LPSTR_TEXTCALLBACKW))
    15011608              COMCTL32_Free(lpSubItem->pszText);
    1502             }
    15031609
    15041610            lpSubItem->pszText = LPSTR_TEXTCALLBACKW;
    1505           }
    1506           else
     1611          } else
    15071612          {
    15081613            INT len;
    15091614
    15101615            if (lpSubItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(lpSubItem->pszText);
    1511             len = (lpLVItem->pszText != NULL) ? lstrlenA((LPSTR)lpLVItem->pszText):0;
     1616            len = lpLVItem->pszText ? lstrlenA((LPSTR)lpLVItem->pszText):0;
    15121617
    15131618            if (len > 0)
     
    16491754/***
    16501755 * DESCRIPTION:
    1651  * Sets item attributes.
    1652  *
    1653  * PARAMETER(S):
    1654  * [I] HWND : window handle
    1655  * [I] LPLVITEM : new item atttributes
    1656  *
    1657  * RETURN:
    1658  *   SUCCESS : TRUE
    1659  *   FAILURE : FALSE
    1660  */
    1661 static BOOL LISTVIEW_SetItem(HWND hwnd, LPLVITEMW lpLVItem,BOOL unicode)
     1756 * Retrieves the index of the item at coordinate (0, 0) of the client area.
     1757 *
     1758 * PARAMETER(S):
     1759 * [I] HWND : window handle
     1760 *
     1761 * RETURN:
     1762 * item index
     1763 */
     1764static INT LISTVIEW_GetTopIndex(HWND hwnd)
    16621765{
    16631766  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    1664   BOOL bResult = FALSE;
    1665   HDPA hdpaSubItems;
    1666   LISTVIEW_ITEM *lpItem;
    1667   NMLISTVIEW nmlv;
    1668   UINT uChanged;
    1669   LONG lCtrlId = GetWindowLongA(hwnd, GWL_ID);
    1670 
    1671   if (lpLVItem != NULL)
    1672   {
    1673     if (lpLVItem->iSubItem == 0)
    1674     {
    1675       hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, lpLVItem->iItem);
    1676       if (hdpaSubItems != NULL)
    1677       {
    1678         lpItem = (LISTVIEW_ITEM *)DPA_GetPtr(hdpaSubItems, lpLVItem->iSubItem);
    1679         if (lpItem != NULL)
    1680         {
    1681           ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
    1682           nmlv.lParam = lpItem->lParam;
    1683           uChanged = LISTVIEW_GetItemChanges(lpItem, lpLVItem,unicode);
    1684           if (uChanged != 0)
    1685           {
    1686             if (uChanged & LVIF_STATE)
    1687             {
    1688               nmlv.uNewState = lpLVItem->state & lpLVItem->stateMask;
    1689               nmlv.uOldState = lpItem->state & lpLVItem->stateMask;
    1690             }
    1691 
    1692             nmlv.uChanged = uChanged;
    1693             nmlv.iItem = lpLVItem->iItem;
    1694             nmlv.lParam = lpItem->lParam;
    1695             /* send LVN_ITEMCHANGING notification */
    1696             sendNotify(hwnd,LVN_ITEMCHANGING,&nmlv.hdr);
    1697 
    1698             /* copy information */
    1699             bResult = LISTVIEW_InitItem(hwnd, lpItem, lpLVItem,unicode);
    1700 
    1701             /* send LVN_ITEMCHANGED notification */
    1702             sendNotify(hwnd,LVN_ITEMCHANGED,&nmlv.hdr);
    1703           }
    1704           else
    1705           {
    1706             bResult = TRUE;
    1707           }
    1708 
    1709           InvalidateRect(hwnd, NULL, TRUE);
    1710         }
    1711       }
    1712     }
    1713   }
    1714 
    1715   return bResult;
    1716 }
    1717 
    1718 /***
    1719  * DESCRIPTION:
    1720  * Sets subitem attributes.
    1721  *
    1722  * PARAMETER(S):
    1723  * [I] HWND : window handle
    1724  * [I] LPLVITEM : new subitem atttributes
    1725  *
    1726  * RETURN:
    1727  *   SUCCESS : TRUE
    1728  *   FAILURE : FALSE
    1729  */
    1730 static BOOL LISTVIEW_SetSubItem(HWND hwnd, LPLVITEMW lpLVItem,BOOL unicode)
    1731 {
    1732   LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    1733   BOOL bResult = FALSE;
    1734   HDPA hdpaSubItems;
    1735   LISTVIEW_SUBITEM *lpSubItem;
    1736 
    1737   if (lpLVItem != NULL)
    1738   {
    1739     if (lpLVItem->iSubItem > 0)
    1740     {
    1741       hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, lpLVItem->iItem);
    1742       if (hdpaSubItems != NULL)
    1743       {
    1744         /* set subitem only if column is present */
    1745         if (Header_GetItemCount(infoPtr->hwndHeader) > lpLVItem->iSubItem)
    1746         {
    1747           lpSubItem = LISTVIEW_GetSubItem(hdpaSubItems, lpLVItem->iSubItem);
    1748           if (lpSubItem != NULL)
    1749           {
    1750             bResult = LISTVIEW_InitSubItem(hwnd, lpSubItem, lpLVItem,unicode);
    1751           }
    1752           else
    1753           {
    1754             bResult = LISTVIEW_AddSubItem(hwnd, lpLVItem,unicode);
    1755           }
    1756 
    1757           InvalidateRect(hwnd, NULL, TRUE);
    1758         }
    1759       }
    1760     }
    1761   }
    1762 
    1763   return bResult;
    1764 }
    1765 
    1766 /***
    1767  * DESCRIPTION:
    1768  * Retrieves the index of the item at coordinate (0, 0) of the client area.
    1769  *
    1770  * PARAMETER(S):
    1771  * [I] HWND : window handle
    1772  *
    1773  * RETURN:
    1774  * item index
    1775  */
    1776 static INT LISTVIEW_GetTopIndex(HWND hwnd)
    1777 {
    1778   LONG lStyle = GetWindowLongA(hwnd, GWL_STYLE);
    1779   UINT uView = lStyle & LVS_TYPEMASK;
     1767  DWORD dwStyle = GetWindowLongA(hwnd, GWL_STYLE);
     1768  UINT uView = dwStyle & LVS_TYPEMASK;
    17801769  INT nItem = 0;
    1781   SCROLLINFO scrollInfo;
    1782 
    1783   ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
    1784   scrollInfo.cbSize = sizeof(SCROLLINFO);
    1785   scrollInfo.fMask = SIF_POS;
    17861770
    17871771  if (uView == LVS_LIST)
    17881772  {
    1789     if (lStyle & WS_HSCROLL)
    1790     {
    1791       if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
    1792       {
    1793         nItem = scrollInfo.nPos * LISTVIEW_GetCountPerColumn(hwnd);
    1794       }
    1795     }
    1796   }
    1797   else if (uView == LVS_REPORT)
    1798   {
    1799     if (lStyle & WS_VSCROLL)
    1800     {
    1801       if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
    1802       {
    1803         nItem = scrollInfo.nPos;
    1804       }
    1805     }
     1773    if (dwStyle & WS_HSCROLL)
     1774      nItem = infoPtr->lefttop.x*LISTVIEW_GetCountPerColumn(hwnd);
     1775  } else if (uView == LVS_REPORT)
     1776  {
     1777    if (dwStyle & WS_VSCROLL)
     1778      nItem = infoPtr->lefttop.y;
    18061779  }
    18071780
     
    18231796 * None
    18241797 */
    1825 static VOID LISTVIEW_DrawSubItem(HWND hwnd, HDC hdc, INT nItem, INT nSubItem,
    1826                                  RECT rcItem)
    1827 {
    1828   LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    1829   WCHAR szDispText[DISP_TEXT_SIZE];
    1830   LVITEMW lvItem;
    1831 
    1832 //  TRACE("(hwnd=%x, hdc=%x, nItem=%d, nSubItem=%d\n", hwnd, hdc,
    1833 //        nItem, nSubItem);
     1798static VOID LISTVIEW_DrawSubItem(HWND hwnd,HDC hdc,INT nItem,INT nSubItem,RECT rcItem)
     1799{
     1800  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     1801  LVINTERNALITEMW lvItem;
    18341802
    18351803  /* get information needed for drawing the item */
    18361804  ZeroMemory(&lvItem, sizeof(LVITEMW));
    1837   lvItem.mask = LVIF_TEXT;
    1838   lvItem.iItem = nItem;
    1839   lvItem.iSubItem = nSubItem;
    1840   lvItem.cchTextMax = DISP_TEXT_SIZE;
    1841   lvItem.pszText = szDispText;
    1842   ListView_GetItemW(hwnd,&lvItem);
     1805  lvItem.header.mask = LVIF_TEXT;
     1806  lvItem.header.iItem = nItem;
     1807  lvItem.header.iSubItem = nSubItem;
     1808  lvItem.header.cchTextMax = DISP_TEXT_SIZE;
     1809  lvItem.header.pszText = NULL;
     1810  lvItem.mustFree = FALSE;
     1811  LISTVIEW_GetItem(hwnd,(LPLVITEMW)&lvItem,TRUE,TRUE);
    18431812
    18441813  /* set item colors */
     
    18461815  SetTextColor(hdc, infoPtr->clrText);
    18471816
    1848   ExtTextOutW(hdc, rcItem.left, rcItem.top, ETO_OPAQUE | ETO_CLIPPED,
    1849               &rcItem, lvItem.pszText, lstrlenW(lvItem.pszText), NULL);
     1817  if (lvItem.unicode)
     1818    ExtTextOutW(hdc,rcItem.left,rcItem.top,ETO_OPAQUE | ETO_CLIPPED,&rcItem,lvItem.header.pszText,lstrlenW(lvItem.header.pszText),NULL);
     1819  else
     1820    ExtTextOutA(hdc,rcItem.left,rcItem.top,ETO_OPAQUE | ETO_CLIPPED,&rcItem,(LPSTR)lvItem.header.pszText,lstrlenA((LPSTR)lvItem.header.pszText),NULL);
     1821
     1822  if (lvItem.mustFree) COMCTL32_Free(lvItem.header.pszText);
    18501823}
    18511824
     
    18641837 * None
    18651838 */
    1866 static VOID LISTVIEW_DrawItem(HWND hwnd, HDC hdc, INT nItem, RECT rcItem)
     1839static VOID LISTVIEW_DrawItem(HWND hwnd,HDC hdc,INT nItem,RECT rcItem)
    18671840{
    18681841  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    1869   WCHAR szDispText[DISP_TEXT_SIZE];
    18701842  INT nLabelWidth;
    1871   LVITEMW lvItem;
     1843  LVINTERNALITEMW lvItem;
    18721844  INT nMixMode;
    18731845  DWORD dwBkColor;
    18741846  DWORD dwTextColor;
    18751847
    1876 //  TRACE("(hwnd=%x, hdc=%x, nItem=%d\n", hwnd, hdc, nItem);
    1877 
    18781848  /* get information needed for drawing the item */
    18791849  ZeroMemory(&lvItem, sizeof(LVITEMW));
    1880   lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_INDENT;
    1881   lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED | LVIS_STATEIMAGEMASK;
    1882   lvItem.iItem = nItem;
    1883   lvItem.iSubItem = 0;
    1884   lvItem.cchTextMax = DISP_TEXT_SIZE;
    1885   lvItem.pszText = szDispText;
    1886   ListView_GetItemW(hwnd,&lvItem);
     1850  lvItem.header.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_INDENT;
     1851  lvItem.header.stateMask = LVIS_SELECTED | LVIS_FOCUSED | LVIS_STATEIMAGEMASK;
     1852  lvItem.header.iItem = nItem;
     1853  lvItem.header.iSubItem = 0;
     1854  lvItem.header.cchTextMax = DISP_TEXT_SIZE;
     1855  lvItem.header.pszText = NULL;
     1856  lvItem.mustFree = FALSE;
     1857  LISTVIEW_GetItem(hwnd,(LPLVITEMW)&lvItem,TRUE,TRUE);
    18871858
    18881859  /* state icons */
    18891860  if (infoPtr->himlState != NULL)
    18901861  {
    1891      UINT uStateImage = (lvItem.state & LVIS_STATEIMAGEMASK) >> 12;
     1862     UINT uStateImage = (lvItem.header.state & LVIS_STATEIMAGEMASK) >> 12;
    18921863     if (uStateImage != 0)
    18931864     {
     
    19021873  if (infoPtr->himlSmall != NULL)
    19031874  {
    1904     if (lvItem.state & LVIS_SELECTED)
     1875    if (lvItem.header.state & LVIS_SELECTED)
    19051876    {
    19061877      ImageList_SetBkColor(infoPtr->himlSmall, CLR_NONE);
    1907       ImageList_Draw(infoPtr->himlSmall, lvItem.iImage, hdc, rcItem.left,
     1878      ImageList_Draw(infoPtr->himlSmall, lvItem.header.iImage, hdc, rcItem.left,
    19081879                     rcItem.top, ILD_SELECTED);
    19091880    }
     
    19111882    {
    19121883      ImageList_SetBkColor(infoPtr->himlSmall, CLR_NONE);
    1913       ImageList_Draw(infoPtr->himlSmall, lvItem.iImage, hdc, rcItem.left,
     1884      ImageList_Draw(infoPtr->himlSmall, lvItem.header.iImage, hdc, rcItem.left,
    19141885                     rcItem.top, ILD_NORMAL);
    19151886    }
     
    19191890
    19201891  /* Don't bother painting item being edited */
    1921   if (infoPtr->hwndEdit && lvItem.state & LVIS_FOCUSED)
    1922       return;
    1923 
    1924   if ((lvItem.state & LVIS_SELECTED) && (infoPtr->bFocus != FALSE))
     1892  if (infoPtr->hwndEdit && (lvItem.header.state & LVIS_FOCUSED))
     1893  {
     1894    if (lvItem.mustFree) COMCTL32_Free(lvItem.header.pszText);
     1895    return;
     1896  }
     1897
     1898  if ((lvItem.header.state & LVIS_SELECTED) && infoPtr->bFocus)
    19251899  {
    19261900    /* set item colors */
     
    19311905  }
    19321906  else if ((GetWindowLongA(hwnd, GWL_STYLE) & LVS_SHOWSELALWAYS) &&
    1933            (lvItem.state & LVIS_SELECTED) && (infoPtr->bFocus == FALSE))
     1907           (lvItem.header.state & LVIS_SELECTED) && !infoPtr->bFocus)
    19341908  {
    19351909    dwBkColor = SetBkColor(hdc, GetSysColor(COLOR_3DFACE));
     
    19471921  }
    19481922
    1949   nLabelWidth = ListView_GetStringWidthW(hwnd, lvItem.pszText);
     1923  nLabelWidth = LISTVIEW_GetStringWidth(hwnd,lvItem.header.pszText,lvItem.unicode);
    19501924  if (rcItem.left + nLabelWidth < rcItem.right)
    19511925    rcItem.right = rcItem.left + nLabelWidth;
    19521926
    19531927  /* draw label */
    1954   ExtTextOutW(hdc, rcItem.left, rcItem.top, ETO_OPAQUE | ETO_CLIPPED,
    1955               &rcItem, lvItem.pszText, lstrlenW(lvItem.pszText), NULL);
    1956 
    1957   if ((lvItem.state & LVIS_FOCUSED) && (infoPtr->bFocus == TRUE))
     1928  if (lvItem.unicode)
     1929    ExtTextOutW(hdc,rcItem.left,rcItem.top,ETO_OPAQUE | ETO_CLIPPED,&rcItem,lvItem.header.pszText,lstrlenW(lvItem.header.pszText),NULL);
     1930  else
     1931    ExtTextOutA(hdc,rcItem.left,rcItem.top,ETO_OPAQUE | ETO_CLIPPED,&rcItem,(LPSTR)lvItem.header.pszText,lstrlenA((LPSTR)lvItem.header.pszText),NULL);
     1932
     1933  if ((lvItem.header.state & LVIS_FOCUSED) && infoPtr->bFocus)
    19581934  {
    19591935    Rectangle(hdc, rcItem.left, rcItem.top, rcItem.right, rcItem.bottom);
     
    19661942    SetTextColor(hdc, infoPtr->clrText);
    19671943  }
     1944  if (lvItem.mustFree) COMCTL32_Free(lvItem.header.pszText);
    19681945}
    19691946
     
    20031980  lvItem.cchTextMax = DISP_TEXT_SIZE;
    20041981  lvItem.pszText = szDispText;
    2005   ListView_GetItemW(hwnd, &lvItem);
     1982  LISTVIEW_GetItem(hwnd,&lvItem,TRUE,FALSE);//CB:todo
    20061983
    20071984  if (lvItem.state & LVIS_SELECTED)
     
    20432020
    20442021  rcItem.top += infoPtr->iconSize.cy + ICON_BOTTOM_PADDING;
    2045   nLabelWidth = ListView_GetStringWidthW(hwnd, lvItem.pszText);
     2022  nLabelWidth = LISTVIEW_GetStringWidth(hwnd,lvItem.pszText,TRUE);
    20462023  nDrawPosX = infoPtr->iconSpacing.cx - nLabelWidth;
    20472024  if (nDrawPosX > 1)
     
    20792056 * None
    20802057 */
    2081 static VOID LISTVIEW_DrawReport(HWND hwnd, HDC hdc)
     2058static VOID LISTVIEW_DrawReport(HWND hwnd,HDC hdc,RECT *updateRect)
    20822059{
    20832060  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    2084   SCROLLINFO scrollInfo;
     2061  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
    20852062  INT nDrawPosY = infoPtr->rcList.top;
    20862063  INT nColumnCount;
    2087   RECT rcItem;
     2064  RECT rcItem,rcClient;
    20882065  INT  j;
    20892066  INT nItem;
    20902067  INT nLast;
    20912068
    2092   ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
    2093   scrollInfo.cbSize = sizeof(SCROLLINFO);
    2094   scrollInfo.fMask = SIF_POS;
    2095 
    2096   nItem = ListView_GetTopIndex(hwnd);
     2069  nItem = LISTVIEW_GetTopIndex(hwnd);
    20972070
    20982071  /* add 1 for displaying a partial item at the bottom */
     
    21012074
    21022075  /* send cache hint notification */
    2103   if (GetWindowLongA(hwnd,GWL_STYLE) & LVS_OWNERDATA)
     2076  if (dwStyle & LVS_OWNERDATA)
    21042077  {
    21052078    NMLVCACHEHINT nmlv;
     
    21102083    sendNotify(hwnd,LVN_ODCACHEHINT,&nmlv.hdr);
    21112084  }
     2085
     2086  GetClientRect(hwnd,&rcClient);
    21122087
    21132088  for (; nItem < nLast; nItem++)
     
    21222097      rcItem.bottom = rcItem.top + infoPtr->nItemHeight;
    21232098
     2099      if (rcItem.top >= rcClient.bottom) return;
     2100
    21242101      /* Offset the Scroll Bar Pos */
    2125       if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
    2126       {
    2127         rcItem.left -= (scrollInfo.nPos * LISTVIEW_SCROLL_DIV_SIZE);
    2128         rcItem.right -= (scrollInfo.nPos * LISTVIEW_SCROLL_DIV_SIZE);
    2129       }
    2130 
    2131       if (j == 0)
    2132       {
    2133         LISTVIEW_DrawItem(hwnd, hdc, nItem, rcItem);
    2134       }
    2135       else
    2136       {
    2137         LISTVIEW_DrawSubItem(hwnd, hdc, nItem, j, rcItem);
     2102      if (dwStyle & WS_HSCROLL)
     2103      {
     2104        rcItem.left -= (infoPtr->lefttop.x * LISTVIEW_SCROLL_DIV_SIZE);
     2105        rcItem.right -= (infoPtr->lefttop.x * LISTVIEW_SCROLL_DIV_SIZE);
     2106      }
     2107
     2108      if (!updateRect || IntersectRect(NULL,&rcItem,updateRect))
     2109      {
     2110        if (j == 0)
     2111          LISTVIEW_DrawItem(hwnd, hdc, nItem, rcItem);
     2112        else
     2113          LISTVIEW_DrawSubItem(hwnd, hdc, nItem, j, rcItem);
    21382114      }
    21392115    }
     
    22522228 * None
    22532229 */
    2254 static VOID LISTVIEW_DrawList(HWND hwnd, HDC hdc)
     2230static VOID LISTVIEW_DrawList(HWND hwnd,HDC hdc,RECT *updateRect)
    22552231{
    22562232  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
     
    22662242  nColumnCount = LISTVIEW_GetColumnCount(hwnd);
    22672243  nCountPerColumn = LISTVIEW_GetCountPerColumn(hwnd);
    2268   nItem = ListView_GetTopIndex(hwnd);
     2244  nItem = LISTVIEW_GetTopIndex(hwnd);
    22692245
    22702246  for (i = 0; i < nColumnCount; i++)
     
    22952271 * None
    22962272 */
    2297 static VOID LISTVIEW_DrawIcon(HWND hwnd, HDC hdc, BOOL bSmall)
     2273static VOID LISTVIEW_DrawIcon(HWND hwnd,HDC hdc,BOOL bSmall,RECT *updateRect)
    22982274{
    22992275  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
     
    23482324 * NoneX
    23492325 */
    2350 static VOID LISTVIEW_Draw(HWND hwnd, HDC hdc)
     2326static VOID LISTVIEW_Draw(HWND hwnd,HDC hdc,RECT *updateRect)
    23512327{
    23522328  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
     
    23672343  if (uView == LVS_LIST)
    23682344  {
    2369     LISTVIEW_DrawList(hwnd, hdc);
     2345    LISTVIEW_DrawList(hwnd,hdc,updateRect);
    23702346  }
    23712347  else if (uView == LVS_REPORT)
    23722348  {
    2373     LISTVIEW_DrawReport(hwnd, hdc);
     2349    LISTVIEW_DrawReport(hwnd,hdc,updateRect);
    23742350  }
    23752351  else if (uView == LVS_SMALLICON)
    23762352  {
    2377     LISTVIEW_DrawIcon(hwnd, hdc, TRUE);
     2353    LISTVIEW_DrawIcon(hwnd,hdc,TRUE,updateRect);
    23782354  }
    23792355  else if (uView == LVS_ICON)
    23802356  {
    2381     LISTVIEW_DrawIcon(hwnd, hdc, FALSE);
     2357    LISTVIEW_DrawIcon(hwnd,hdc,FALSE,updateRect);
    23822358  }
    23832359
     
    26222598
    26232599    /* invalidate client area (optimization needed) */
    2624     InvalidateRect(hwnd, NULL, TRUE);
     2600    LISTVIEW_Refresh(hwnd);
    26252601  }
    26262602
     
    26602636
    26612637      /* refresh client area */
    2662       InvalidateRect(hwnd, NULL, TRUE);
     2638      LISTVIEW_Refresh(hwnd);
    26632639    }
    26642640  }
     
    27632739          infoPtr->nFocusedItem = -1;
    27642740
    2765     LISTVIEW_UpdateScroll(hwnd);
    2766 
    27672741    /* refresh client area */
    2768     InvalidateRect(hwnd, NULL, TRUE);
     2742    infoPtr->refreshFlags |= RF_UPDATESCROLL;
     2743    LISTVIEW_QueueRefresh(hwnd);
    27692744  }
    27702745
     
    28582833  }
    28592834
    2860   if (textW) COMCTL32_Free(textW);
     2835  if (textW) HeapFree(GetProcessHeap(),0,textW);
    28612836
    28622837  return TRUE;
     
    28892864  WCHAR* textW = NULL;
    28902865
    2891 
    2892   if (~GetWindowLongA(hwnd, GWL_STYLE) & LVS_EDITLABELS)
    2893       return FALSE;
     2866  if (!(GetWindowLongA(hwnd, GWL_STYLE) & LVS_EDITLABELS))
     2867    return FALSE;
    28942868
    28952869  /* Is the EditBox still there, if so remove it */
    2896   if(infoPtr->hwndEdit != 0)
    2897   {
    2898       SetFocus(hwnd);
    2899   }
    2900 
    2901   LISTVIEW_SetSelection(hwnd, nItem);
    2902   LISTVIEW_SetItemFocus(hwnd, nItem);
     2870  if (infoPtr->hwndEdit)
     2871    SetFocus(hwnd);
     2872
     2873  LISTVIEW_SetSelection(hwnd,nItem);
     2874  LISTVIEW_SetItemFocus(hwnd,nItem);
    29032875
    29042876  ZeroMemory(&dispInfo, sizeof(NMLVDISPINFOA));
    29052877  if (NULL == (hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem)))
    2906           return 0;
     2878    return 0;
    29072879
    29082880  if (NULL == (lpItem = (LISTVIEW_ITEM *)DPA_GetPtr(hdpaSubItems, 0)))
    2909           return 0;
     2881    return 0;
    29102882
    29112883  /* get information needed for drawing the item */
     
    29192891    textW = (WCHAR*)COMCTL32_Alloc(DISP_TEXT_SIZE*sizeof(WCHAR));
    29202892    lvItem.pszText = textW;
    2921     ListView_GetItemW(hwnd,&lvItem);
     2893    LISTVIEW_GetItem(hwnd,&lvItem,TRUE,FALSE);
    29222894    dispInfo.item.cchTextMax = lstrlenW(lvItem.pszText);
    29232895  } else
     
    29252897    textA = (CHAR*)COMCTL32_Alloc(DISP_TEXT_SIZE*sizeof(CHAR));
    29262898    lvItem.pszText = (LPWSTR)textA;
    2927     ListView_GetItemA(hwnd, &lvItem);
     2899    LISTVIEW_GetItem(hwnd,&lvItem,FALSE,FALSE);
    29282900    dispInfo.item.cchTextMax = lstrlenA((LPSTR)lvItem.pszText);
    29292901  }
     
    29382910
    29392911  if (sendNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? LVN_BEGINLABELEDITW:LVN_BEGINLABELEDITA,&dispInfo.hdr))
    2940           return 0;
     2912    return 0;
    29412913
    29422914  rect.left = LVIR_LABEL;
    29432915  if (!LISTVIEW_GetItemRect(hwnd, nItem, &rect))
    2944           return 0;
     2916    return 0;
    29452917
    29462918  //Edit uses ANSI by default -> convert
    29472919  if (isUnicodeNotify(&infoPtr->header))
    2948   {
    29492920    textA = UnicodeToAsciiString(textW);
    2950   }
    29512921
    29522922  if (!(hedit = CreateEditLabel(textA , WS_VISIBLE,
     
    29792949 *   FAILURE : FALSE
    29802950 */
    2981 static BOOL LISTVIEW_EnsureVisible(HWND hwnd, INT nItem, BOOL bPartial)
     2951static BOOL LISTVIEW_EnsureVisible(HWND hwnd,INT nItem,BOOL bPartial)
    29822952{
    29832953  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    2984   UINT uView = GetWindowLongA(hwnd, GWL_STYLE) & LVS_TYPEMASK;
     2954  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     2955  UINT uView = dwStyle & LVS_TYPEMASK;
     2956  SCROLLINFO scrollInfo;
    29852957  INT nScrollPosHeight = 0;
    29862958  INT nScrollPosWidth = 0;
    2987   SCROLLINFO scrollInfo;
    29882959  RECT rcItem;
    2989 
    2990   ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
     2960  POINT oldlefttop = infoPtr->lefttop;
     2961
     2962  ZeroMemory(&scrollInfo,sizeof(SCROLLINFO));
    29912963  scrollInfo.cbSize = sizeof(SCROLLINFO);
    2992   scrollInfo.fMask = SIF_POS;
     2964  scrollInfo.fMask  = SIF_POS;
    29932965
    29942966  /* ALWAYS bPartial == FALSE, FOR NOW! */
     
    29992971    if (rcItem.left < infoPtr->rcList.left)
    30002972    {
    3001       if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
     2973      if (dwStyle & WS_HSCROLL)
    30022974      {
    30032975        /* scroll left */
     
    30062978          nScrollPosWidth = infoPtr->nItemWidth;
    30072979          rcItem.left += infoPtr->rcList.left;
    3008         }
    3009         else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
     2980        } else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
    30102981        {
    30112982          nScrollPosWidth = LISTVIEW_SCROLL_DIV_SIZE;
     
    30182989        {
    30192990          if (rcItem.left % nScrollPosWidth == 0)
     2991            infoPtr->lefttop.x += rcItem.left / nScrollPosWidth;
     2992          else
     2993            infoPtr->lefttop.x += rcItem.left / nScrollPosWidth - 1;
     2994
     2995          if (infoPtr->lefttop.x != oldlefttop.x)
    30202996          {
    3021             scrollInfo.nPos += rcItem.left / nScrollPosWidth;
     2997            scrollInfo.nPos = infoPtr->lefttop.x;
     2998            SetScrollInfo(hwnd,SB_HORZ,&scrollInfo,TRUE);
    30222999          }
    3023           else
    3024           {
    3025             scrollInfo.nPos += rcItem.left / nScrollPosWidth - 1;
    3026           }
    3027 
    3028           SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
    3029         }
    3030       }
    3031     }
    3032     else if (rcItem.right > infoPtr->rcList.right)
    3033     {
    3034       if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
     3000        }
     3001      }
     3002    } else if (rcItem.right > infoPtr->rcList.right)
     3003    {
     3004      if (dwStyle & WS_HSCROLL)
    30353005      {
    30363006        /* scroll right */
     
    30393009          rcItem.right -= infoPtr->rcList.right;
    30403010          nScrollPosWidth = infoPtr->nItemWidth;
    3041         }
    3042         else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
     3011        } else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
    30433012        {
    30443013          rcItem.right -= infoPtr->rcList.right;
     
    30503019        if (nScrollPosWidth != 0)
    30513020        {
     3021          SCROLLINFO scrollInfo;
     3022
    30523023          if (rcItem.right % nScrollPosWidth == 0)
     3024            infoPtr->lefttop.x += rcItem.right / nScrollPosWidth;
     3025          else
     3026            infoPtr->lefttop.x += rcItem.right / nScrollPosWidth + 1;
     3027
     3028          if (infoPtr->lefttop.x != oldlefttop.x)
    30533029          {
    3054             scrollInfo.nPos += rcItem.right / nScrollPosWidth;
     3030            scrollInfo.nPos   = infoPtr->lefttop.x;
     3031            SetScrollInfo(hwnd,SB_HORZ,&scrollInfo,TRUE);
    30553032          }
    3056           else
    3057           {
    3058             scrollInfo.nPos += rcItem.right / nScrollPosWidth + 1;
    3059           }
    3060 
    3061           SetScrollInfo(hwnd, SB_HORZ, &scrollInfo, TRUE);
    30623033        }
    30633034      }
     
    30673038    {
    30683039      /* scroll up */
    3069       if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
     3040      if (dwStyle & WS_VSCROLL)
    30703041      {
    30713042        if (uView == LVS_REPORT)
     
    30813052
    30823053        if (rcItem.top % nScrollPosHeight == 0)
    3083         {
    3084           scrollInfo.nPos += rcItem.top / nScrollPosHeight;
    3085         }
     3054          infoPtr->lefttop.y += rcItem.top / nScrollPosHeight;
    30863055        else
    3087         {
    3088           scrollInfo.nPos += rcItem.top / nScrollPosHeight - 1;
    3089         }
    3090 
    3091         SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE);
     3056          infoPtr->lefttop.y += rcItem.top / nScrollPosHeight - 1;
     3057
     3058        if (infoPtr->lefttop.y != oldlefttop.y)
     3059        {
     3060          scrollInfo.nPos = infoPtr->lefttop.y;
     3061          SetScrollInfo(hwnd,SB_VERT,&scrollInfo,TRUE);
     3062        }
    30923063      }
    30933064    }
     
    30953066    {
    30963067      /* scroll down */
    3097       if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
     3068      if (dwStyle & WS_VSCROLL)
    30983069      {
    30993070        if (uView == LVS_REPORT)
     
    31093080
    31103081        if (rcItem.bottom % nScrollPosHeight == 0)
    3111         {
    3112           scrollInfo.nPos += rcItem.bottom / nScrollPosHeight;
    3113         }
     3082          infoPtr->lefttop.y += rcItem.bottom / nScrollPosHeight;
    31143083        else
    3115         {
    3116           scrollInfo.nPos += rcItem.bottom / nScrollPosHeight + 1;
    3117         }
    3118 
    3119         SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE);
    3120       }
    3121     }
    3122   }
     3084          infoPtr->lefttop.y += rcItem.bottom / nScrollPosHeight + 1;
     3085        if (infoPtr->lefttop.y != oldlefttop.y)
     3086        {
     3087          scrollInfo.nPos = infoPtr->lefttop.y;
     3088          SetScrollInfo(hwnd,SB_VERT,&scrollInfo,TRUE);
     3089        }
     3090      }
     3091    }
     3092  }
     3093
     3094  if ((oldlefttop.x != infoPtr->lefttop.x) || (oldlefttop.y != infoPtr->lefttop.y))
     3095    LISTVIEW_ScrollWindow(hwnd,(oldlefttop.x-infoPtr->lefttop.x)*LISTVIEW_SCROLL_DIV_SIZE,(oldlefttop.y-infoPtr->lefttop.y)*infoPtr->nItemHeight,uView);
    31233096
    31243097  return TRUE;
     
    32773250          {
    32783251            /* get position of the new item index */
    3279             if (ListView_GetItemPosition(hwnd, nItem, &ptItem) == FALSE)
     3252            if (LISTVIEW_GetItemPosition(hwnd, nItem, &ptItem) == FALSE)
    32803253              return -1;
    32813254          }
     
    32913264        lvItem.iSubItem = 0;
    32923265        if (unicode)
    3293           ListView_GetItemW(hwnd, &lvItem);
     3266          LISTVIEW_GetItem(hwnd,&lvItem,TRUE,FALSE);//CB:todo
    32943267        else
    3295           ListView_GetItemA(hwnd,(LVITEMA*)&lvItem);
     3268          LISTVIEW_GetItem(hwnd,&lvItem,FALSE,FALSE);//CB:todo
    32963269        if (rc != FALSE)
    32973270        {
     
    36793652 * [IO] LPLVITEMW : item info
    36803653 * [I] internal : if true then we will use tricks that avoid copies
    3681  *               but are not compatible with the regular interface
     3654 *                but are not compatible with the regular interface
     3655 *                the unicode parameter is only used for NULL strings,
     3656 *                the caller is responsible for ASCII/UNICODE translations
    36823657 *
    36833658 * RETURN:
     
    36853660 *   FAILURE : FALSE
    36863661 */
    3687 static LRESULT LISTVIEW_GetItem(HWND hwnd, LPLVITEMW lpLVItem,BOOL unicode)
     3662static LRESULT LISTVIEW_GetItem(HWND hwnd,LPLVITEMW lpLVItem,BOOL unicode,BOOL internal)
    36883663{
    36893664  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    36903665  BOOL bResult = FALSE;
    36913666  NMLVDISPINFOW dispInfo;
    3692   LISTVIEW_SUBITEM *lpSubItem;
    3693   LISTVIEW_ITEM *lpItem;
    3694   HDPA hdpaSubItems;
    3695 
    3696   //TRACE("(hwnd=%x, lpLVItem=%p)\n", hwnd, lpLVItem);
    3697 
    3698   if (lpLVItem != NULL)
     3667
     3668  if (lpLVItem)
    36993669  {
    37003670    if ((lpLVItem->iItem >= 0) && (lpLVItem->iItem < GETITEMCOUNT(infoPtr)))
    37013671    {
    3702       ZeroMemory(&dispInfo, sizeof(NMLVDISPINFOW));
    3703       hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, lpLVItem->iItem);
    3704       if (hdpaSubItems != NULL)
    3705       {
    3706         lpItem = (LISTVIEW_ITEM *)DPA_GetPtr(hdpaSubItems, 0);
    3707         if (lpItem != NULL)
     3672      HDPA hdpaSubItems;
     3673
     3674      ZeroMemory(&dispInfo,sizeof(NMLVDISPINFOW));
     3675      hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems,lpLVItem->iItem);
     3676      if (hdpaSubItems)
     3677      {
     3678        LISTVIEW_ITEM *lpItem = (LISTVIEW_ITEM*)DPA_GetPtr(hdpaSubItems,0);
     3679
     3680        if (lpItem)
    37083681        {
    37093682          bResult = TRUE;
     
    37133686            LPWSTR textW = NULL;
    37143687
    3715             if ((lpItem->iImage == I_IMAGECALLBACK) &&
    3716                 (lpLVItem->mask & LVIF_IMAGE))
    3717             {
     3688            if ((lpItem->iImage == I_IMAGECALLBACK) && (lpLVItem->mask & LVIF_IMAGE))
    37183689              dispInfo.item.mask |= LVIF_IMAGE;
    3719             }
    3720 
    3721             if ((lpItem->pszText == LPSTR_TEXTCALLBACKW) &&
    3722                 (lpLVItem->mask & LVIF_TEXT))
     3690
     3691            if ((lpItem->pszText == LPSTR_TEXTCALLBACKW) && (lpLVItem->mask & LVIF_TEXT))
    37233692            {
    37243693              dispInfo.item.mask |= LVIF_TEXT;
     
    37543723            {
    37553724              lpLVItem->iImage = dispInfo.item.iImage;
    3756             }
    3757             else if (lpLVItem->mask & LVIF_IMAGE)
    3758             {
    3759               lpLVItem->iImage = lpItem->iImage;
    3760             }
     3725              if (dispInfo.item.mask & LVIF_DI_SETITEM)
     3726                lpItem->iImage = dispInfo.item.iImage;
     3727            } else if (lpLVItem->mask & LVIF_IMAGE)
     3728                lpLVItem->iImage = lpItem->iImage;
    37613729
    37623730            if (dispInfo.item.mask & LVIF_TEXT)
     
    37713739                  INT len = dispInfo.item.pszText ? lstrlenA((LPSTR)dispInfo.item.pszText):0;
    37723740
    3773                   COMCTL32_Free(lpItem->pszText);
     3741                  if (lpItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(lpItem->pszText);
    37743742                  if (len > 0)
    37753743                  {
     
    37833751              if (dispInfo.item.pszText == NULL)
    37843752              {
    3785                 if (unicode)
    3786                   lpLVItem->pszText[0] = L'\0';
    3787                 else
    3788                   ((LPSTR)lpLVItem->pszText)[0] = '\0';
     3753                if (!internal)
     3754                {
     3755                  if (unicode)
     3756                    lpLVItem->pszText[0] = L'\0';
     3757                  else
     3758                    ((LPSTR)lpLVItem->pszText)[0] = '\0';
     3759                } else
     3760                {
     3761                  lpLVItem->pszText = NULL;
     3762                  ((LPLVINTERNALITEMW)lpLVItem)->unicode = unicode;
     3763                }
    37893764              } else
    37903765              {
    3791                 if (unicode)
     3766                if (internal)
    37923767                {
     3768                  lpLVItem->pszText = dispInfo.item.pszText;
    37933769                  if (isUnicodeNotify(&infoPtr->header))
    3794                     lstrcpynW(lpLVItem->pszText, dispInfo.item.pszText, lpLVItem->cchTextMax);
    3795                   else
    3796                     lstrcpynAtoW(lpLVItem->pszText,(LPSTR)dispInfo.item.pszText,lpLVItem->cchTextMax);
    3797                   lpLVItem->pszText[lpLVItem->cchTextMax-1] = L'\0';
     3770                  {
     3771                    ((LPLVINTERNALITEMW)lpLVItem)->unicode = TRUE;
     3772                    if (textW == dispInfo.item.pszText)
     3773                    {
     3774                      ((LPLVINTERNALITEMW)lpLVItem)->mustFree = TRUE;
     3775                      textW = NULL;
     3776                    } else ((LPLVINTERNALITEMW)lpLVItem)->mustFree = FALSE;
     3777                  } else
     3778                  {
     3779                    ((LPLVINTERNALITEMW)lpLVItem)->unicode = FALSE;
     3780                    if (textA == (LPSTR)dispInfo.item.pszText)
     3781                    {
     3782                      ((LPLVINTERNALITEMW)lpLVItem)->mustFree = TRUE;
     3783                      textA = NULL;
     3784                    } else ((LPLVINTERNALITEMW)lpLVItem)->mustFree = FALSE;
     3785                  }
    37983786                } else
    37993787                {
    3800                   if (isUnicodeNotify(&infoPtr->header))
    3801                     lstrcpynWtoA((LPSTR)lpLVItem->pszText, dispInfo.item.pszText, lpLVItem->cchTextMax);
    3802                   else
    3803                     lstrcpynA((LPSTR)lpLVItem->pszText,(LPSTR)dispInfo.item.pszText,lpLVItem->cchTextMax);
    3804                   ((LPSTR)lpLVItem->pszText)[lpLVItem->cchTextMax-1] = '\0';
     3788                  if (unicode)
     3789                  {
     3790                    if (isUnicodeNotify(&infoPtr->header))
     3791                      lstrcpynW(lpLVItem->pszText,dispInfo.item.pszText,lpLVItem->cchTextMax);
     3792                    else
     3793                      lstrcpynAtoW(lpLVItem->pszText,(LPSTR)dispInfo.item.pszText,lpLVItem->cchTextMax);
     3794                    lpLVItem->pszText[lpLVItem->cchTextMax-1] = L'\0';
     3795                  } else
     3796                  {
     3797                    if (isUnicodeNotify(&infoPtr->header))
     3798                      lstrcpynWtoA((LPSTR)lpLVItem->pszText,dispInfo.item.pszText,lpLVItem->cchTextMax);
     3799                    else
     3800                      lstrcpynA((LPSTR)lpLVItem->pszText,(LPSTR)dispInfo.item.pszText,lpLVItem->cchTextMax);
     3801                    ((LPSTR)lpLVItem->pszText)[lpLVItem->cchTextMax-1] = '\0';
     3802                  }
    38053803                }
    38063804              }
    3807             }
    3808             else if (lpLVItem->mask & LVIF_TEXT)
     3805            } else if (lpLVItem->mask & LVIF_TEXT)
    38093806            {
    38103807              if (lpItem->pszText != NULL)
    38113808              {
    3812                 if (unicode)
     3809                if (internal)
    38133810                {
    3814                   lstrcpynW(lpLVItem->pszText,lpItem->pszText,lpLVItem->cchTextMax);
    3815                   lpLVItem->pszText[lpLVItem->cchTextMax-1] = L'\0';
     3811                  lpLVItem->pszText = lpItem->pszText;
     3812                  ((LPLVINTERNALITEMW)lpLVItem)->unicode = TRUE;
    38163813                } else
    38173814                {
    3818                   lstrcpynWtoA((LPSTR)lpLVItem->pszText,lpItem->pszText,lpLVItem->cchTextMax);
    3819                   ((LPSTR)lpLVItem->pszText)[lpLVItem->cchTextMax-1] = '\0';
     3815                  if (unicode)
     3816                  {
     3817                    lstrcpynW(lpLVItem->pszText,lpItem->pszText,lpLVItem->cchTextMax);
     3818                    lpLVItem->pszText[lpLVItem->cchTextMax-1] = L'\0';
     3819                  } else
     3820                  {
     3821                    lstrcpynWtoA((LPSTR)lpLVItem->pszText,lpItem->pszText,lpLVItem->cchTextMax);
     3822                    ((LPSTR)lpLVItem->pszText)[lpLVItem->cchTextMax-1] = '\0';
     3823                  }
    38203824                }
    3821               }
    3822               else
     3825              } else
    38233826              {
    3824                 if (unicode)
    3825                   ZeroMemory(lpLVItem->pszText,sizeof(WCHAR)*lpLVItem->cchTextMax);
    3826                 else
    3827                   ZeroMemory(lpLVItem->pszText,sizeof(CHAR)*lpLVItem->cchTextMax);
     3827                if (internal)
     3828                {
     3829                  lpLVItem->pszText = NULL;
     3830                  ((LPLVINTERNALITEMW)lpLVItem)->unicode = unicode;
     3831                } else
     3832                {
     3833                  if (unicode)
     3834                    lpLVItem->pszText[0] = 0;
     3835                  else
     3836                    ((CHAR*)lpLVItem->pszText)[0] = 0;
     3837                }
    38283838              }
    38293839            }
     
    38353845              lpLVItem->state |= (dispInfo.item.state &
    38363846                                  dispInfo.item.stateMask);
    3837             }
    3838             else if (lpLVItem->mask & LVIF_STATE)
    3839             {
    3840               lpLVItem->state = lpItem->state & lpLVItem->stateMask;
    3841             }
     3847            } else if (lpLVItem->mask & LVIF_STATE)
     3848                lpLVItem->state = lpItem->state & lpLVItem->stateMask;
    38423849
    38433850            if (lpLVItem->mask & LVIF_PARAM)
    3844             {
    38453851              lpLVItem->lParam = lpItem->lParam;
    3846             }
    38473852
    38483853            if (lpLVItem->mask & LVIF_INDENT)
    3849             {
    38503854              lpLVItem->iIndent = lpItem->iIndent;
    3851             }
     3855
    38523856            if (textA) COMCTL32_Free(textA);
    38533857            if (textW) COMCTL32_Free(textW);
    3854           }
    3855           else
     3858          } else //SubItem
    38563859          {
    38573860            CHAR* textA = NULL;
    38583861            WCHAR* textW = NULL;
    3859             lpSubItem = LISTVIEW_GetSubItemPtr(hdpaSubItems,
    3860                                                lpLVItem->iSubItem);
    3861             if (lpSubItem != NULL)
     3862            LISTVIEW_SUBITEM *lpSubItem = LISTVIEW_GetSubItemPtr(hdpaSubItems,lpLVItem->iSubItem);
     3863
     3864            if (lpSubItem)
    38623865            {
    3863               if ((lpSubItem->iImage == I_IMAGECALLBACK) &&
    3864                   (lpLVItem->mask & LVIF_IMAGE))
    3865               {
     3866              if ((lpSubItem->iImage == I_IMAGECALLBACK) && (lpLVItem->mask & LVIF_IMAGE))
    38663867                dispInfo.item.mask |= LVIF_IMAGE;
    3867               }
    3868 
    3869               if ((lpSubItem->pszText == LPSTR_TEXTCALLBACKW) &&
    3870                   (lpLVItem->mask & LVIF_TEXT))
     3868
     3869              if ((lpSubItem->pszText == LPSTR_TEXTCALLBACKW) && (lpLVItem->mask & LVIF_TEXT))
    38713870              {
    38723871                dispInfo.item.mask |= LVIF_TEXT;
     
    38843883                }
    38853884              }
    3886             }
    3887             else
     3885            } else //lpSubItem == NULL
    38883886            {
    38893887              if (lpLVItem->mask & LVIF_IMAGE)
    3890               {
    38913888                dispInfo.item.mask |= LVIF_IMAGE;
    3892               }
    38933889
    38943890              if (lpLVItem->mask & LVIF_TEXT)
     
    39153911              dispInfo.item.iSubItem = lpLVItem->iSubItem;
    39163912              dispInfo.item.lParam = lpItem->lParam;
    3917               sendNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? LVN_GETDISPINFOW:LVN_GETDISPINFOW,&dispInfo.hdr);
     3913              sendNotify(hwnd,isUnicodeNotify(&infoPtr->header) ? LVN_GETDISPINFOW:LVN_GETDISPINFOA,&dispInfo.hdr);
    39183914            }
    39193915
     
    39213917            {
    39223918              lpLVItem->iImage = dispInfo.item.iImage;
    3923             }
    3924             else if (lpLVItem->mask & LVIF_IMAGE)
    3925             {
    3926               lpLVItem->iImage = lpItem->iImage;
    3927             }
     3919              if (dispInfo.item.mask & LVIF_DI_SETITEM)
     3920                lpSubItem->iImage = dispInfo.item.iImage;
     3921            } else if (lpLVItem->mask & LVIF_IMAGE)
     3922                lpLVItem->iImage = lpSubItem->iImage;
    39283923
    39293924            if (dispInfo.item.mask & LVIF_PARAM)
    3930             {
    3931                 lpLVItem->lParam = dispInfo.item.lParam;
    3932             }
     3925              lpLVItem->lParam = dispInfo.item.lParam;
    39333926            else if (lpLVItem->mask & LVIF_PARAM)
    3934             {
    3935                 lpLVItem->lParam = lpItem->lParam;
    3936             }
     3927              lpLVItem->lParam = lpItem->lParam;
    39373928
    39383929            if (dispInfo.item.mask & LVIF_TEXT)
    39393930            {
    3940               if (dispInfo.item.mask & LVIF_DI_SETITEM)
     3931              if ((dispInfo.item.mask & LVIF_DI_SETITEM) && lpSubItem)
    39413932              {
    3942                 if (lpSubItem)
     3933                if (isUnicodeNotify(&infoPtr->header))
    39433934                {
     3935                  Str_SetPtrW(&lpSubItem->pszText,dispInfo.item.pszText);
     3936                } else
     3937                {
     3938                  INT len = dispInfo.item.pszText ? lstrlenA((LPSTR)dispInfo.item.pszText):0;
     3939
     3940                  if (lpSubItem->pszText != LPSTR_TEXTCALLBACKW) COMCTL32_Free(lpSubItem->pszText);
     3941                  if (len > 0)
     3942                  {
     3943                    len++;
     3944                    lpSubItem->pszText = (WCHAR*)COMCTL32_Alloc(len*sizeof(WCHAR));
     3945                    lstrcpyAtoW(lpSubItem->pszText,(LPSTR)dispInfo.item.pszText);
     3946                  } else lpSubItem->pszText = NULL;
     3947                }
     3948              }
     3949              /* Make sure the source string is valid */
     3950              if (dispInfo.item.pszText == NULL)
     3951              {
     3952                if (internal)
     3953                {
     3954                  lpLVItem->pszText = NULL;
     3955                  ((LPLVINTERNALITEMW)lpLVItem)->unicode = unicode;
     3956                } else
     3957                {
     3958                  if (unicode)
     3959                    lpLVItem->pszText[0] = L'\0';
     3960                  else
     3961                    ((LPSTR)lpLVItem->pszText)[0] = '\0';
     3962                }
     3963              } else
     3964              {
     3965                if (internal)
     3966                {
     3967                  lpLVItem->pszText = dispInfo.item.pszText;
    39443968                  if (isUnicodeNotify(&infoPtr->header))
    39453969                  {
    3946                     Str_SetPtrW(&lpSubItem->pszText,dispInfo.item.pszText);
     3970                    ((LPLVINTERNALITEMW)lpLVItem)->unicode = TRUE;
     3971                    if (textW == dispInfo.item.pszText)
     3972                    {
     3973                      ((LPLVINTERNALITEMW)lpLVItem)->mustFree = TRUE;
     3974                      textW = NULL;
     3975                    } else ((LPLVINTERNALITEMW)lpLVItem)->mustFree = FALSE;
    39473976                  } else
    39483977                  {
    3949                     INT len = dispInfo.item.pszText ? lstrlenA((LPSTR)dispInfo.item.pszText):0;
    3950 
    3951                     COMCTL32_Free(lpSubItem->pszText);
    3952                     if (len > 0)
     3978                    ((LPLVINTERNALITEMW)lpLVItem)->unicode = FALSE;
     3979                    if (textA == (LPSTR)dispInfo.item.pszText)
    39533980                    {
    3954                       len++;
    3955                       lpSubItem->pszText = (WCHAR*)COMCTL32_Alloc(len*sizeof(WCHAR));
    3956                       lstrcpyAtoW(lpSubItem->pszText,(LPSTR)dispInfo.item.pszText);
    3957                     } else lpSubItem->pszText = NULL;
     3981                      ((LPLVINTERNALITEMW)lpLVItem)->mustFree = TRUE;
     3982                      textA = NULL;
     3983                    } else ((LPLVINTERNALITEMW)lpLVItem)->mustFree = FALSE;
     3984                  }
     3985                } else
     3986                {
     3987                  if (unicode)
     3988                  {
     3989                    if (isUnicodeNotify(&infoPtr->header))
     3990                      lstrcpynW(lpLVItem->pszText,dispInfo.item.pszText,lpLVItem->cchTextMax);
     3991                    else
     3992                      lstrcpynAtoW(lpLVItem->pszText,(LPSTR)dispInfo.item.pszText,lpLVItem->cchTextMax);
     3993                    lpLVItem->pszText[lpLVItem->cchTextMax-1] = L'\0';
     3994                  } else
     3995                  {
     3996                    if (isUnicodeNotify(&infoPtr->header))
     3997                      lstrcpynWtoA((LPSTR)lpLVItem->pszText,dispInfo.item.pszText,lpLVItem->cchTextMax);
     3998                    else
     3999                      lstrcpynA((LPSTR)lpLVItem->pszText,(LPSTR)dispInfo.item.pszText,lpLVItem->cchTextMax);
     4000                    ((LPSTR)lpLVItem->pszText)[lpLVItem->cchTextMax-1] = '\0';
    39584001                  }
    39594002                }
    39604003              }
    3961               /* Make sure the source string is valid */
    3962 
    3963               if (dispInfo.item.pszText == NULL)
     4004            } else if (lpLVItem->mask & LVIF_TEXT)
     4005            {
     4006              if (lpSubItem->pszText)
    39644007              {
    3965                 if (unicode)
    3966                   lpLVItem->pszText[0] = L'\0';
    3967                 else
    3968                   ((LPSTR)lpLVItem->pszText)[0] = '\0';
     4008                if (internal)
     4009                {
     4010                  lpLVItem->pszText = lpSubItem->pszText;
     4011                  ((LPLVINTERNALITEMW)lpLVItem)->unicode = TRUE;
     4012                } else
     4013                {
     4014                  if (unicode)
     4015                  {
     4016                    lstrcpynW(lpLVItem->pszText,lpSubItem->pszText,lpLVItem->cchTextMax);
     4017                    lpLVItem->pszText[lpLVItem->cchTextMax-1] = L'\0';
     4018                  } else
     4019                  {
     4020                    lstrcpynWtoA((LPSTR)lpLVItem->pszText,lpSubItem->pszText,lpLVItem->cchTextMax);
     4021                    ((LPSTR)lpLVItem->pszText)[lpLVItem->cchTextMax-1] = '\0';
     4022                  }
     4023                }
    39694024              } else
    39704025              {
    3971                 if (unicode)
     4026                if (internal)
    39724027                {
    3973                   if (isUnicodeNotify(&infoPtr->header))
    3974                     lstrcpynW(lpLVItem->pszText, dispInfo.item.pszText, lpLVItem->cchTextMax);
    3975                   else
    3976                     lstrcpynAtoW(lpLVItem->pszText,(LPSTR)dispInfo.item.pszText,lpLVItem->cchTextMax);
    3977                   lpLVItem->pszText[lpLVItem->cchTextMax-1] = L'\0';
     4028                  lpLVItem->pszText = NULL;
     4029                  ((LPLVINTERNALITEMW)lpLVItem)->unicode = unicode;
    39784030                } else
    39794031                {
    3980                   if (isUnicodeNotify(&infoPtr->header))
    3981                     lstrcpynWtoA((LPSTR)lpLVItem->pszText, dispInfo.item.pszText, lpLVItem->cchTextMax);
     4032                  if (unicode)
     4033                    lpLVItem->pszText[0] = 0;
    39824034                  else
    3983                     lstrcpynA((LPSTR)lpLVItem->pszText,(LPSTR)dispInfo.item.pszText,lpLVItem->cchTextMax);
    3984                   ((LPSTR)lpLVItem->pszText)[lpLVItem->cchTextMax-1] = '\0';
     4035                    ((CHAR*)lpLVItem->pszText)[0] = 0;
    39854036                }
    39864037              }
    39874038            }
    3988             else if (lpLVItem->mask & LVIF_TEXT)
    3989             {
    3990               if (lpSubItem->pszText != NULL)
    3991               {
    3992                 if (unicode)
    3993                 {
    3994                   lstrcpynW(lpLVItem->pszText,lpSubItem->pszText,lpLVItem->cchTextMax);
    3995                   lpLVItem->pszText[lpLVItem->cchTextMax-1] = L'\0';
    3996                 } else
    3997                 {
    3998                   lstrcpynWtoA((LPSTR)lpLVItem->pszText,lpSubItem->pszText,lpLVItem->cchTextMax);
    3999                   ((LPSTR)lpLVItem->pszText)[lpLVItem->cchTextMax-1] = '\0';
    4000                 }
    4001               }
    4002               else
    4003               {
    4004                 if (unicode)
    4005                   ZeroMemory(lpLVItem->pszText,sizeof(WCHAR)*lpLVItem->cchTextMax);
    4006                 else
    4007                   ZeroMemory(lpLVItem->pszText,sizeof(CHAR)*lpLVItem->cchTextMax);
    4008               }
    4009             }
     4039            if (textA) COMCTL32_Free(textA);
     4040            if (textW) COMCTL32_Free(textW);
    40104041          }
    40114042        }
     
    40714102 *   FAILURE : FALSE
    40724103 */
    4073 static BOOL LISTVIEW_GetItemPosition(HWND hwnd, INT nItem,
    4074                                      LPPOINT lpptPosition)
     4104static BOOL LISTVIEW_GetItemPosition(HWND hwnd, INT nItem, LPPOINT lpptPosition)
    40754105{
    40764106  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
     
    40914121    {
    40924122      bResult = TRUE;
    4093       nItem = nItem - ListView_GetTopIndex(hwnd);
     4123      nItem = nItem - LISTVIEW_GetTopIndex(hwnd);
    40944124      nCountPerColumn = LISTVIEW_GetCountPerColumn(hwnd);
    40954125      if (nItem < 0)
     
    41174147      bResult = TRUE;
    41184148      lpptPosition->x = REPORT_MARGINX;
    4119       lpptPosition->y = ((nItem - ListView_GetTopIndex(hwnd)) *
     4149      lpptPosition->y = ((nItem - LISTVIEW_GetTopIndex(hwnd)) *
    41204150                         infoPtr->nItemHeight) + infoPtr->rcList.top;
    41214151    }
     
    41374167
    41384168  return bResult;
     4169}
     4170
     4171//same as ListView_GetItemRect, but direct call
     4172static LRESULT LISTVIEW_GetItemRect(HWND hwnd,INT nItem,LPRECT lprc,INT code)
     4173{
     4174  if (lprc) lprc->left = code;
     4175  return LISTVIEW_GetItemRect(hwnd,nItem,lprc);
    41394176}
    41404177
     
    41644201  INT nLabelWidth;
    41654202  TEXTMETRICA tm;
    4166 
    4167 //  TRACE("(hwnd=%x, nItem=%d, lprc=%p)\n", hwnd, nItem, lprc);
    4168 
     4203//CB: todo: LVS_REPORT view: clip text rect to header item width!
     4204//          large icon view: text rect is wrong!
    41694205  if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)) && (lprc != NULL))
    41704206  {
    4171     if (ListView_GetItemPosition(hwnd, nItem, &ptItem) != FALSE)
     4207    if (LISTVIEW_GetItemPosition(hwnd, nItem, &ptItem) != FALSE)
    41724208    {
    41734209      switch(lprc->left)
     
    44794515INT LISTVIEW_GetLabelWidth(HWND hwnd, INT nItem)
    44804516{
    4481   WCHAR szDispText[DISP_TEXT_SIZE];
    44824517  INT nLabelWidth = 0;
    4483   LVITEMW lvItem;
    4484 
    4485 //  TRACE("(hwnd=%x, nItem=%d)\n", hwnd, nItem);
     4518  LVINTERNALITEMW lvItem;
    44864519
    44874520  ZeroMemory(&lvItem, sizeof(LVITEMW));
    4488   lvItem.mask = LVIF_TEXT;
    4489   lvItem.iItem = nItem;
    4490   lvItem.cchTextMax = DISP_TEXT_SIZE;
    4491   lvItem.pszText = szDispText;
    4492   if (LISTVIEW_GetItem(hwnd,&lvItem,TRUE) != FALSE)
    4493   {
    4494     nLabelWidth = ListView_GetStringWidthW(hwnd,lvItem.pszText);
    4495   }
     4521  lvItem.header.mask = LVIF_TEXT;
     4522  lvItem.header.iItem = nItem;
     4523  lvItem.header.cchTextMax = DISP_TEXT_SIZE;
     4524  lvItem.header.pszText = NULL;
     4525  lvItem.mustFree = FALSE;
     4526  if (LISTVIEW_GetItem(hwnd,(LPLVITEMW)&lvItem,TRUE,TRUE))
     4527    nLabelWidth = LISTVIEW_GetStringWidth(hwnd,lvItem.header.pszText,lvItem.unicode);
     4528  if (lvItem.mustFree) COMCTL32_Free(lvItem.header.pszText);
    44964529
    44974530  return nLabelWidth;
     
    45514584    lvItem.stateMask = uMask;
    45524585    lvItem.mask = LVIF_STATE;
    4553     if (LISTVIEW_GetItem(hwnd,&lvItem,TRUE) != FALSE)
     4586    if (LISTVIEW_GetItem(hwnd,&lvItem,TRUE,FALSE) != FALSE)
    45544587    {
    45554588      uState = lvItem.state;
     
    45844617      lpLVItem->mask = LVIF_TEXT;
    45854618      lpLVItem->iItem = nItem;
    4586       if (LISTVIEW_GetItem(hwnd,lpLVItem,unicode) != FALSE)
     4619      if (LISTVIEW_GetItem(hwnd,lpLVItem,unicode,FALSE) != FALSE) //CB: todo
    45874620      {
    45884621        nLength = unicode ? lstrlenW(lpLVItem->pszText):lstrlenA((LPSTR)lpLVItem->pszText);
     
    46394672        {
    46404673          nItem--;
    4641           if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
     4674          if ((LISTVIEW_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
    46424675            return nItem;
    46434676        }
     
    46474680        lvFindInfo.flags = LVFI_NEARESTXY;
    46484681        lvFindInfo.vkDirection = VK_UP;
    4649         ListView_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
    4650         while ((nItem = ListView_FindItemW(hwnd, nItem, &lvFindInfo)) != -1)
    4651         {
    4652           if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
     4682        LISTVIEW_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
     4683        while ((nItem = LISTVIEW_FindItem(hwnd,nItem,&lvFindInfo,TRUE)) != -1)
     4684        {
     4685          if ((LISTVIEW_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
    46534686            return nItem;
    46544687        }
     
    46624695        {
    46634696          nItem++;
    4664           if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
     4697          if ((LISTVIEW_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
    46654698            return nItem;
    46664699        }
     
    46704703        lvFindInfo.flags = LVFI_NEARESTXY;
    46714704        lvFindInfo.vkDirection = VK_DOWN;
    4672         ListView_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
    4673         while ((nItem = ListView_FindItemW(hwnd, nItem, &lvFindInfo)) != -1)
    4674         {
    4675           if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
     4705        LISTVIEW_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
     4706        while ((nItem = LISTVIEW_FindItem(hwnd,nItem,&lvFindInfo,TRUE)) != -1)
     4707        {
     4708          if ((LISTVIEW_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
    46764709            return nItem;
    46774710        }
     
    46864719        {
    46874720          nItem -= nCountPerColumn;
    4688           if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
     4721          if ((LISTVIEW_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
    46894722            return nItem;
    46904723        }
     
    46944727        lvFindInfo.flags = LVFI_NEARESTXY;
    46954728        lvFindInfo.vkDirection = VK_LEFT;
    4696         ListView_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
    4697         while ((nItem = ListView_FindItemW(hwnd, nItem, &lvFindInfo)) != -1)
    4698         {
    4699           if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
     4729        LISTVIEW_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
     4730        while ((nItem = LISTVIEW_FindItem(hwnd,nItem,&lvFindInfo,TRUE)) != -1)
     4731        {
     4732          if ((LISTVIEW_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
    47004733            return nItem;
    47014734        }
     
    47104743        {
    47114744          nItem += nCountPerColumn;
    4712           if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
     4745          if ((LISTVIEW_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
    47134746            return nItem;
    47144747        }
     
    47184751        lvFindInfo.flags = LVFI_NEARESTXY;
    47194752        lvFindInfo.vkDirection = VK_RIGHT;
    4720         ListView_GetItemPosition(hwnd, nItem, &lvFindInfo.pt);
    4721         while ((nItem = ListView_FindItemW(hwnd, nItem, &lvFindInfo)) != -1)
    4722         {
    4723           if ((ListView_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
     4753        LISTVIEW_GetItemPosition(hwnd,nItem,&lvFindInfo.pt);
     4754        while ((nItem = LISTVIEW_FindItem(hwnd,nItem,&lvFindInfo,TRUE)) != -1)
     4755        {
     4756          if ((LISTVIEW_GetItemState(hwnd, nItem, uMask) & uMask) == uMask)
    47244757            return nItem;
    47254758        }
     
    47334766      for (i = nItem; i < GETITEMCOUNT(infoPtr); i++)
    47344767      {
    4735         if ((ListView_GetItemState(hwnd, i, uMask) & uMask) == uMask)
     4768        if ((LISTVIEW_GetItemState(hwnd, i, uMask) & uMask) == uMask)
    47364769          return i;
    47374770      }
     
    47584791static LRESULT LISTVIEW_GetOrigin(HWND hwnd, LPPOINT lpptOrigin)
    47594792{
    4760   LONG lStyle = GetWindowLongA(hwnd, GWL_STYLE);
    4761   UINT uView = lStyle & LVS_TYPEMASK;
     4793  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
     4794  DWORD dwStyle = GetWindowLongA(hwnd, GWL_STYLE);
     4795  UINT uView = dwStyle & LVS_TYPEMASK;
    47624796  BOOL bResult = FALSE;
    47634797
    4764 //  TRACE("(hwnd=%x, lpptOrigin=%p)\n", hwnd, lpptOrigin);
    4765 
    47664798  if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
    47674799  {
    4768     SCROLLINFO scrollInfo;
    47694800    ZeroMemory(lpptOrigin, sizeof(POINT));
    4770     ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
    4771     scrollInfo.cbSize = sizeof(SCROLLINFO);
    4772 
    4773     if (lStyle & WS_HSCROLL)
    4774     {
    4775       scrollInfo.fMask = SIF_POS;
    4776       if (GetScrollInfo(hwnd, SB_HORZ, &scrollInfo) != FALSE)
    4777       {
    4778         lpptOrigin->x = -scrollInfo.nPos * LISTVIEW_SCROLL_DIV_SIZE;
    4779       }
    4780     }
    4781 
    4782     if (lStyle & WS_VSCROLL)
    4783     {
    4784       scrollInfo.fMask = SIF_POS;
    4785       if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
    4786       {
    4787         lpptOrigin->y = -scrollInfo.nPos * LISTVIEW_SCROLL_DIV_SIZE;
    4788       }
    4789     }
     4801
     4802    if (dwStyle & WS_HSCROLL)
     4803      lpptOrigin->x = -infoPtr->lefttop.x*LISTVIEW_SCROLL_DIV_SIZE;
     4804
     4805    if (dwStyle & WS_VSCROLL)
     4806      lpptOrigin->y = -infoPtr->lefttop.y*LISTVIEW_SCROLL_DIV_SIZE;
    47904807
    47914808    bResult = TRUE;
     
    48134830  for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
    48144831  {
    4815     if (ListView_GetItemState(hwnd, i, LVIS_SELECTED) & LVIS_SELECTED)
     4832    if (LISTVIEW_GetItemState(hwnd, i, LVIS_SELECTED) & LVIS_SELECTED)
    48164833    {
    48174834      nSelectedCount++;
     
    50325049static LRESULT LISTVIEW_InsertColumn(HWND hwnd,INT nColumn,LPLVCOLUMNW lpColumn,BOOL unicode)
    50335050{
    5034   LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
     5051  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
    50355052  HDITEMW hdi;
    50365053  INT nNewColumn = -1;
    50375054
    5038 //  TRACE("(hwnd=%x, nColumn=%d, lpColumn=%p)\n",hwnd, nColumn,
    5039 //        lpColumn);
    5040 
    50415055  if (lpColumn != NULL)
    50425056  {
     
    50535067      {
    50545068        hdi.fmt |= HDF_LEFT;
    5055       }
    5056       else
     5069      } else
    50575070      {
    50585071        if (lpColumn->fmt & LVCFMT_LEFT)
    5059         {
    50605072          hdi.fmt |= HDF_LEFT;
    5061         }
    50625073        else if (lpColumn->fmt & LVCFMT_RIGHT)
    5063         {
    50645074          hdi.fmt |= HDF_RIGHT;
    5065         }
    50665075        else if (lpColumn->fmt & LVCFMT_CENTER)
    5067         {
    50685076          hdi.fmt |= HDF_CENTER;
    5069         }
    50705077      }
    50715078
     
    51235130    infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
    51245131
    5125     LISTVIEW_UpdateScroll(hwnd);
    5126     InvalidateRect(hwnd, NULL, TRUE);
     5132    infoPtr->refreshFlags |= RF_UPDATESCROLL;
     5133    LISTVIEW_QueueRefresh(hwnd);
    51275134  }
    51285135
     
    51725179static LRESULT LISTVIEW_InsertItem(HWND hwnd, LPLVITEMW lpLVItem,BOOL unicode)
    51735180{
    5174   LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    5175   LONG lStyle = GetWindowLongA(hwnd, GWL_STYLE);
    5176   UINT uView = lStyle & LVS_TYPEMASK;
    5177   LONG lCtrlId = GetWindowLongA(hwnd, GWL_ID);
     5181  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     5182  DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     5183  UINT uView = dwStyle & LVS_TYPEMASK;
     5184  LONG lCtrlId = GetWindowLongA(hwnd,GWL_ID);
    51785185  NMLISTVIEW nmlv;
    51795186  INT nItem = -1;
     
    51825189  LISTVIEW_ITEM *lpItem = NULL;
    51835190
    5184   if (lpLVItem != NULL)
     5191  if (lpLVItem)
    51855192  {
    51865193    /* make sure it's not a subitem; cannot insert a subitem */
     
    51885195    {
    51895196      lpItem = (LISTVIEW_ITEM *)COMCTL32_Alloc(sizeof(LISTVIEW_ITEM));
    5190       if (lpItem != NULL)
     5197      if (lpItem)
    51915198      {
    51925199        ZeroMemory(lpItem, sizeof(LISTVIEW_ITEM));
     
    52005207            if (nItem != -1)
    52015208            {
    5202               if ( ((lStyle & LVS_SORTASCENDING) || (lStyle & LVS_SORTDESCENDING))
    5203                       && !(lStyle & LVS_OWNERDRAWFIXED)
     5209              if ( ((dwStyle & LVS_SORTASCENDING) || (dwStyle & LVS_SORTDESCENDING))
     5210                      && !(dwStyle & LVS_OWNERDRAWFIXED)
    52045211                      && (LPSTR_TEXTCALLBACKW != lpLVItem->pszText) )
    52055212              {
     
    52515258                if ((uView == LVS_SMALLICON) || (uView == LVS_ICON))
    52525259                {
    5253                   if (lStyle & LVS_ALIGNLEFT)
     5260                  if (dwStyle & LVS_ALIGNLEFT)
    52545261                  {
    52555262                    LISTVIEW_AlignLeft(hwnd);
     
    52615268                }
    52625269
    5263                 LISTVIEW_UpdateScroll(hwnd);
    52645270                /* refresh client area */
    5265                 InvalidateRect(hwnd, NULL, TRUE);
     5271                infoPtr->refreshFlags |= RF_UPDATESCROLL;
     5272                LISTVIEW_QueueRefresh(hwnd);
    52665273              }
    52675274            }
     
    52745281  /* free memory if unsuccessful */
    52755282  if ((nItem == -1) && (lpItem != NULL))
    5276   {
    52775283    COMCTL32_Free(lpItem);
    5278   }
    52795284
    52805285  return nItem;
     
    52985303  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    52995304  BOOL bResult = FALSE;
    5300   RECT rc;
    53015305
    53025306  if (nFirst <= nLast)
     
    53075311      {
    53085312        /* bResult = */
    5309         InvalidateRect(hwnd, &rc, TRUE);
     5313        LISTVIEW_Refresh(hwnd);
    53105314      }
    53115315    }
     
    53335337  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    53345338
    5335   infoPtr->clrBk = clrBk;
    5336   InvalidateRect(hwnd, NULL, TRUE);
     5339  if (infoPtr->clrBk != clrBk)
     5340  {
     5341    infoPtr->clrBk = clrBk;
     5342    LISTVIEW_Refresh(hwnd);
     5343  }
    53375344
    53385345  return TRUE;
     
    55445551    infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
    55455552
    5546     InvalidateRect(hwnd, NULL, TRUE); // force redraw of the listview
     5553    LISTVIEW_QueueRefresh(hwnd); // force redraw of the listview
    55475554
    55485555    return lret;
     
    56465653}
    56475654
    5648 
    56495655/***
    56505656 * DESCRIPTION:
     
    56595665 *   FAILURE : FALSE
    56605666 */
    5661 static LRESULT LISTVIEW_SetItemHandler(HWND hwnd,LPLVITEMW lpLVItem,BOOL unicode)
     5667static LRESULT LISTVIEW_SetItem(HWND hwnd,LPLVITEMW lpLVItem,BOOL unicode)
    56625668{
    56635669  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    56645670  BOOL bResult = FALSE;
     5671  HDPA hdpaSubItems;
     5672  NMLISTVIEW nmlv;
    56655673
    56665674  if (lpLVItem != NULL)
     
    56705678      if (lpLVItem->iSubItem == 0)
    56715679      {
    5672         bResult = LISTVIEW_SetItem(hwnd,lpLVItem,unicode);
    5673       }
    5674       else
    5675       {
    5676         bResult = LISTVIEW_SetSubItem(hwnd,lpLVItem,unicode);
    5677       }
    5678     }
    5679   }
    5680 
     5680        hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, lpLVItem->iItem);
     5681        if (hdpaSubItems)
     5682        {
     5683          LISTVIEW_ITEM *lpItem;
     5684
     5685          lpItem = (LISTVIEW_ITEM *)DPA_GetPtr(hdpaSubItems, lpLVItem->iSubItem);
     5686          if (lpItem)
     5687          {
     5688            UINT uChanged;
     5689
     5690            ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
     5691            nmlv.lParam = lpItem->lParam;
     5692            uChanged = LISTVIEW_GetItemChanges(lpItem,lpLVItem,unicode);
     5693            if (uChanged != 0)
     5694            {
     5695              if (uChanged & LVIF_STATE)
     5696              {
     5697                nmlv.uNewState = lpLVItem->state & lpLVItem->stateMask;
     5698                nmlv.uOldState = lpItem->state & lpLVItem->stateMask;
     5699              }
     5700
     5701              nmlv.uChanged = uChanged;
     5702              nmlv.iItem = lpLVItem->iItem;
     5703              nmlv.lParam = lpItem->lParam;
     5704              /* send LVN_ITEMCHANGING notification */
     5705              sendNotify(hwnd,LVN_ITEMCHANGING,&nmlv.hdr);
     5706
     5707              /* copy information */
     5708              bResult = LISTVIEW_InitItem(hwnd, lpItem, lpLVItem,unicode);
     5709
     5710              /* send LVN_ITEMCHANGED notification */
     5711              sendNotify(hwnd,LVN_ITEMCHANGED,&nmlv.hdr);
     5712
     5713              LISTVIEW_RefreshItem(hwnd,lpLVItem->iItem);
     5714            } else
     5715                bResult = TRUE;
     5716          }
     5717        }
     5718      } else //sub-item
     5719      {
     5720        hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems,lpLVItem->iItem);
     5721        if (hdpaSubItems)
     5722        {
     5723          /* set subitem only if column is present */
     5724          if (Header_GetItemCount(infoPtr->hwndHeader) > lpLVItem->iSubItem)
     5725          {
     5726            LISTVIEW_SUBITEM *lpSubItem;
     5727
     5728            lpSubItem = LISTVIEW_GetSubItem(hdpaSubItems,lpLVItem->iSubItem);
     5729            if (lpSubItem)
     5730              bResult = LISTVIEW_InitSubItem(hwnd,lpSubItem,lpLVItem,unicode);
     5731            else
     5732              bResult = LISTVIEW_AddSubItem(hwnd,lpLVItem,unicode);
     5733
     5734            LISTVIEW_RefreshSubItem(hwnd,lpLVItem->iItem,lpLVItem->iSubItem);
     5735          }
     5736        }
     5737      }
     5738    }
     5739  }
    56815740
    56825741  return bResult;
     
    57425801 *   FAILURE : FALSE
    57435802 */
    5744 static BOOL LISTVIEW_SetItemPosition(HWND hwnd, INT nItem,
    5745                                      INT nPosX, INT nPosY)
     5803static BOOL LISTVIEW_SetItemPosition(HWND hwnd, INT nItem, INT nPosX, INT nPosY)
    57465804{
    57475805  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     
    57515809  BOOL bResult = FALSE;
    57525810
    5753 //  TRACE("(hwnd=%x,nItem=%d,X=%d,Y=%d)\n", hwnd, nItem, nPosX, nPosY);
    5754 
    57555811  if ((nItem >= 0) || (nItem < GETITEMCOUNT(infoPtr)))
    57565812  {
     
    57765832/* LISTVIEW_SetItemPosition32 */
    57775833
     5834//replaces ListView_SetItemState macro
     5835static LRESULT LISTVIEW_SetItemState(HWND hwnd,INT nItem,DWORD data,DWORD mask)
     5836{
     5837  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     5838  LVITEMW lvItem;
     5839  BOOL bResult;
     5840
     5841  ZeroMemory(&lvItem, sizeof(LVITEMW));
     5842  lvItem.mask = LVIF_STATE;
     5843  lvItem.stateMask = mask;
     5844  lvItem.state = data;
     5845
     5846  if (nItem == -1)
     5847  {
     5848    bResult = TRUE;
     5849
     5850    /* apply to all items */
     5851    for (INT i = 0; i< GETITEMCOUNT(infoPtr); i++)
     5852    {
     5853      lvItem.iItem = i;
     5854      if (!LISTVIEW_SetItem(hwnd,&lvItem,TRUE))
     5855        bResult = FALSE;
     5856    }
     5857  } else
     5858  {
     5859    lvItem.iItem = nItem;
     5860    bResult = LISTVIEW_SetItem(hwnd,&lvItem,TRUE);
     5861  }
     5862
     5863  return bResult;
     5864}
     5865
    57785866/***
    57795867 * DESCRIPTION:
     
    57895877 *   FAILURE : FALSE
    57905878 */
    5791 static LRESULT LISTVIEW_SetItemState(HWND hwnd, INT nItem, LPLVITEMW lpLVItem)
    5792 {
    5793   LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
     5879static LRESULT LISTVIEW_SetItemState(HWND hwnd,INT nItem,LPLVITEMW lpLVItem)
     5880{
     5881  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
    57945882  BOOL bResult = FALSE;
    57955883  LVITEMW lvItem;
    57965884  INT i;
    57975885
     5886  ZeroMemory(&lvItem, sizeof(LVITEMW));
     5887  lvItem.mask = LVIF_STATE;
     5888  lvItem.state = lpLVItem->state;
     5889  lvItem.stateMask = lpLVItem->stateMask;
     5890
    57985891  if (nItem == -1)
    57995892  {
    58005893    bResult = TRUE;
    5801     ZeroMemory(&lvItem, sizeof(LVITEMW));
    5802     lvItem.mask = LVIF_STATE;
    5803     lvItem.state = lpLVItem->state;
    5804     lvItem.stateMask = lpLVItem->stateMask ;
    58055894
    58065895    /* apply to all items */
     
    58085897    {
    58095898      lvItem.iItem = i;
    5810       if (ListView_SetItemW(hwnd,&lvItem) == FALSE)
    5811       {
     5899      if (!LISTVIEW_SetItem(hwnd,&lvItem,TRUE))
    58125900        bResult = FALSE;
    5813       }
    5814     }
    5815   }
    5816   else
    5817   {
    5818     ZeroMemory(&lvItem, sizeof(LVITEMW));
    5819     lvItem.mask = LVIF_STATE;
    5820     lvItem.state = lpLVItem->state;
    5821     lvItem.stateMask = lpLVItem->stateMask;
     5901    }
     5902  } else
     5903  {
    58225904    lvItem.iItem = nItem;
    5823     bResult = ListView_SetItemW(hwnd, &lvItem);
     5905    bResult = LISTVIEW_SetItem(hwnd,&lvItem,TRUE);
    58245906  }
    58255907
     
    58535935    lvItem.iItem = nItem;
    58545936    lvItem.iSubItem = lpLVItem->iSubItem;
    5855     if (unicode)
    5856       bResult = ListView_SetItemW(hwnd,&lvItem);
    5857     else
    5858       bResult = ListView_SetItemA(hwnd,&lvItem);
     5937    bResult = LISTVIEW_SetItem(hwnd,&lvItem,unicode);
    58595938  }
    58605939
     
    58975976  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    58985977
    5899   infoPtr->clrTextBk = clrTextBk;
    5900   InvalidateRect(hwnd, NULL, TRUE);
     5978  if (infoPtr->clrTextBk != clrTextBk)
     5979  {
     5980    infoPtr->clrTextBk = clrTextBk;
     5981    LISTVIEW_Refresh(hwnd);
     5982  }
    59015983
    59025984  return TRUE;
     
    59196001  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)LISTVIEW_GetInfoPtr(hwnd);
    59206002
    5921   infoPtr->clrText = clrText;
    5922   InvalidateRect(hwnd, NULL, TRUE);
     6003  if (infoPtr->clrText != clrText)
     6004  {
     6005    infoPtr->clrText = clrText;
     6006    LISTVIEW_Refresh(hwnd);
     6007  }
    59236008
    59246009  return TRUE;
     
    60576142        ((lStyle & LVS_TYPEMASK)  == LVS_SMALLICON)))
    60586143    {
    6059       ListView_Arrange(hwnd, 0);
     6144      LISTVIEW_Arrange(hwnd, 0);
    60606145    }
    60616146    else
    60626147    {
    60636148      /* get item bounding rectangle */
    6064       ListView_GetItemRect(hwnd,nItem,&rc,LVIR_BOUNDS);
    6065       InvalidateRect(hwnd, &rc, TRUE);
     6149
     6150      LISTVIEW_GetItemRect(hwnd,nItem,&rc,LVIR_BOUNDS);
     6151      InvalidateRect(hwnd,&rc,TRUE);
    60666152    }
    60676153  }
     
    62156301 * [I] HWND : window handle
    62166302 * [I] INT : scroll code
    6217  * [I] SHORT : current scroll position if scroll code is SB_THIMBPOSITION
     6303 * [I] SHORT : current scroll position if scroll code is SB_THUMBPOSITION
    62186304 *             or SB_THUMBTRACK.
    62196305 * [I] HWND : scrollbar control window handle
     
    62226308 * Zero
    62236309 */
    6224 static LRESULT LISTVIEW_VScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos,
    6225                                 HWND hScrollWnd)
    6226 {
    6227   SCROLLINFO scrollInfo;
    6228 
    6229   ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
    6230   scrollInfo.cbSize = sizeof(SCROLLINFO);
    6231   scrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
    6232 
    6233   if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
    6234   {
    6235     INT nOldScrollPos = scrollInfo.nPos;
    6236     switch (nScrollCode)
    6237     {
     6310static LRESULT LISTVIEW_VScroll(HWND hwnd,INT nScrollCode,SHORT nCurrentPos,HWND hScrollWnd)
     6311{
     6312  LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
     6313  INT maxY = infoPtr->maxScroll.y-infoPtr->scrollPage.y,oldY = infoPtr->lefttop.y;
     6314
     6315  switch (nScrollCode)
     6316  {
    62386317    case SB_LINEUP:
    6239       if (scrollInfo.nPos > scrollInfo.nMin)
    6240       {
    6241         scrollInfo.nPos--;
    6242       }
    6243     break;
     6318      if (infoPtr->lefttop.y > 0)
     6319        infoPtr->lefttop.y--;
     6320      break;
    62446321
    62456322    case SB_LINEDOWN:
    6246       if (scrollInfo.nPos < scrollInfo.nMax)
    6247       {
    6248         scrollInfo.nPos++;
    6249       }
     6323      if (infoPtr->lefttop.y < maxY)
     6324        infoPtr->lefttop.y++;
    62506325      break;
    62516326
    62526327    case SB_PAGEUP:
    6253       if (scrollInfo.nPos > scrollInfo.nMin)
    6254       {
    6255 
    6256         if (scrollInfo.nPos >= scrollInfo.nPage)
    6257         {
    6258           scrollInfo.nPos -= scrollInfo.nPage;
    6259         }
     6328      if (infoPtr->lefttop.y > 0)
     6329      {
     6330        if (infoPtr->lefttop.y >= infoPtr->scrollPage.y)
     6331          infoPtr->lefttop.y -= infoPtr->scrollPage.y;
    62606332        else
    6261         {
    6262           scrollInfo.nPos = scrollInfo.nMin;
    6263         }
     6333          infoPtr->lefttop.y = 0;
    62646334      }
    62656335      break;
    62666336
    62676337    case SB_PAGEDOWN:
    6268       if (scrollInfo.nPos < scrollInfo.nMax)
    6269       {
    6270         if (scrollInfo.nPos <= scrollInfo.nMax - scrollInfo.nPage)
    6271         {
    6272           scrollInfo.nPos += scrollInfo.nPage;
    6273         }
     6338      if (infoPtr->lefttop.y < maxY)
     6339      {
     6340        if (infoPtr->lefttop.y <= maxY-infoPtr->scrollPage.y)
     6341          infoPtr->lefttop.y += infoPtr->scrollPage.y;
    62746342        else
    6275         {
    6276           scrollInfo.nPos = scrollInfo.nMax;
    6277         }
     6343          infoPtr->lefttop.y = maxY;
    62786344      }
    62796345      break;
    62806346
    62816347    case SB_THUMBTRACK:
    6282         scrollInfo.nPos = nCurrentPos;
    6283         if (scrollInfo.nPos > scrollInfo.nMax)
    6284             scrollInfo.nPos=scrollInfo.nMax;
    6285 
    6286         if (scrollInfo.nPos < scrollInfo.nMin)
    6287             scrollInfo.nPos=scrollInfo.nMin;
    6288 
     6348      infoPtr->lefttop.y = nCurrentPos;
     6349      if (infoPtr->lefttop.y > maxY)
     6350        infoPtr->lefttop.y = maxY;
     6351
     6352      if (infoPtr->lefttop.y < 0)
     6353        infoPtr->lefttop.y = 0;
    62896354      break;
    6290     }
    6291 
    6292     if (nOldScrollPos != scrollInfo.nPos)
    6293     {
    6294       scrollInfo.fMask = SIF_POS;
    6295       SetScrollInfo(hwnd, SB_VERT, &scrollInfo, TRUE);
    6296       InvalidateRect(hwnd, NULL, TRUE);
    6297     }
    6298   }
    6299 
    6300   return 0;
     6355  }
     6356
     6357  if (oldY != infoPtr->lefttop.y)
     6358  {
     6359    SCROLLINFO scrollInfo;
     6360    RECT rect;
     6361    DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     6362    UINT uView =  dwStyle & LVS_TYPEMASK;
     6363    INT yScroll = (oldY-infoPtr->lefttop.y)*infoPtr->nItemHeight;
     6364
     6365    ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
     6366    scrollInfo.cbSize = sizeof(SCROLLINFO);
     6367    scrollInfo.nPos   = infoPtr->lefttop.y;
     6368    scrollInfo.fMask  = SIF_POS;
     6369    SetScrollInfo(hwnd,SB_VERT,&scrollInfo,TRUE);
     6370
     6371    LISTVIEW_ScrollWindow(hwnd,0,yScroll,uView);
     6372
     6373    return TRUE;
     6374  }
     6375
     6376  return FALSE;
    63016377}
    63026378
     
    63156391 * Zero
    63166392 */
    6317 static LRESULT LISTVIEW_HScroll(HWND hwnd, INT nScrollCode, SHORT nCurrentPos,
    6318                                 HWND hScrollWnd)
     6393static LRESULT LISTVIEW_HScroll(HWND hwnd,INT nScrollCode,SHORT nCurrentPos,HWND hScrollWnd)
    63196394{
    63206395  SCROLLINFO scrollInfo;
    6321 
     6396//CB: todo
    63226397  ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
    63236398  scrollInfo.cbSize = sizeof(SCROLLINFO);
     
    63956470          LISTVIEW_UpdateHeaderSize(hwnd, scrollInfo.nPos);
    63966471      }
    6397       InvalidateRect(hwnd, NULL, TRUE);
     6472      LISTVIEW_Refresh(hwnd);
    63986473    }
    63996474  }
     
    64046479static LRESULT LISTVIEW_MouseWheel(HWND hwnd, INT wheelDelta)
    64056480{
     6481    LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO*)LISTVIEW_GetInfoPtr(hwnd);
    64066482    INT gcWheelDelta = 0;
    64076483    UINT pulScrollLines = 3;
    6408     SCROLLINFO scrollInfo;
    6409 
    6410     UINT uView = GetWindowLongA(hwnd, GWL_STYLE) & LVS_TYPEMASK;
     6484    DWORD dwStyle = GetWindowLongA(hwnd,GWL_STYLE);
     6485    UINT uView = dwStyle & LVS_TYPEMASK;
    64116486
    64126487    SystemParametersInfoW(SPI_GETWHEELSCROLLLINES,0, &pulScrollLines, 0);
    64136488    gcWheelDelta -= wheelDelta;
    64146489
    6415     ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
    6416     scrollInfo.cbSize = sizeof(SCROLLINFO);
    6417     scrollInfo.fMask = SIF_POS | SIF_RANGE;
    6418 
    64196490    switch(uView)
    64206491    {
    6421     case LVS_ICON:
    6422     case LVS_SMALLICON:
     6492      case LVS_ICON:
     6493      case LVS_SMALLICON:
    64236494       /*
    64246495        *  listview should be scrolled by a multiple of 37 dependently on its dimension or its visible item number
    64256496        *  should be fixed in the future.
    64266497        */
    6427         if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
    6428             LISTVIEW_VScroll(hwnd, SB_THUMBPOSITION, scrollInfo.nPos + (gcWheelDelta < 0) ? 37 : -37, 0);
     6498        if (dwStyle & WS_VSCROLL)
     6499          LISTVIEW_VScroll(hwnd,SB_THUMBPOSITION,infoPtr->lefttop.y+(gcWheelDelta < 0) ? 37:-37,0);
    64296500        break;
    64306501
    6431     case LVS_REPORT:
     6502      case LVS_REPORT:
    64326503        if (abs(gcWheelDelta) >= WHEEL_DELTA && pulScrollLines)
    64336504        {
    6434             if (GetScrollInfo(hwnd, SB_VERT, &scrollInfo) != FALSE)
    6435             {
    6436                 int cLineScroll = min(LISTVIEW_GetCountPerColumn(hwnd), pulScrollLines);
    6437                 cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
    6438                 LISTVIEW_VScroll(hwnd, SB_THUMBPOSITION, scrollInfo.nPos + cLineScroll, 0);
    6439             }
     6505          if (dwStyle & WS_VSCROLL)
     6506          {
     6507            int cLineScroll = min(LISTVIEW_GetCountPerColumn(hwnd), pulScrollLines);
     6508
     6509            cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
     6510            LISTVIEW_VScroll(hwnd,SB_THUMBPOSITION,infoPtr->lefttop.y+cLineScroll,0);
     6511          }
    64406512        }
    64416513        break;
    64426514
    6443     case LVS_LIST:
    6444         LISTVIEW_HScroll(hwnd, (gcWheelDelta < 0) ? SB_LINELEFT : SB_LINERIGHT, 0, 0);
     6515      case LVS_LIST:
     6516        LISTVIEW_HScroll(hwnd,(gcWheelDelta < 0) ? SB_LINELEFT:SB_LINERIGHT,0,0);
    64456517        break;
    64466518    }
     
    65016573
    65026574  case VK_LEFT:
    6503     nItem = ListView_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_TOLEFT);
     6575    nItem = LISTVIEW_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_TOLEFT);
    65046576    break;
    65056577
    65066578  case VK_UP:
    6507     nItem = ListView_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_ABOVE);
     6579    nItem = LISTVIEW_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_ABOVE);
    65086580    break;
    65096581
    65106582  case VK_RIGHT:
    6511     nItem = ListView_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_TORIGHT);
     6583    nItem = LISTVIEW_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_TORIGHT);
    65126584    break;
    65136585
    65146586  case VK_DOWN:
    6515     nItem = ListView_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_BELOW);
     6587    nItem = LISTVIEW_GetNextItem(hwnd, infoPtr->nFocusedItem, LVNI_BELOW);
    65166588    break;
    65176589
     
    65266598
    65276599  if ((nItem != -1) && (nItem != infoPtr->nFocusedItem))
    6528   {
    6529     bRedraw = LISTVIEW_KeySelection(hwnd, nItem);
    6530     if (bRedraw != FALSE)
    6531     {
    6532       /* refresh client area */
    6533       InvalidateRect(hwnd, NULL, TRUE);
    6534       UpdateWindow(hwnd);
    6535     }
    6536   }
     6600    LISTVIEW_KeySelection(hwnd, nItem);
    65376601
    65386602  return 0;
     
    65746638    LISTVIEW_INFO *infoPtr = NULL;
    65756639    INT nItem = -1;
    6576     BOOL bRedraw;
    65776640    INT nSize = 0;
    65786641    INT idx = 0;
     
    66256688                {   /* get item */
    66266689                    LISTVIEW_InitLvItemStruct( item, idx, TEXT );
    6627                     ListView_GetItemA( hwnd, &item );
     6690                    LISTVIEW_GetItem(hwnd,(LVITEMW*)&item,FALSE,FALSE);//CB:todo
    66286691
    66296692                    /* compare items */
     
    66416704                {
    66426705                    LISTVIEW_InitLvItemStruct( item, idx, TEXT );
    6643                     ListView_GetItemA( hwnd, &item );
     6706                    LISTVIEW_GetItem(hwnd,(LVITEMW*)&item,FALSE,FALSE);//CB:todo
    66446707
    66456708                    if ( strncasecmp( &( item.pszText[ 0 ] ), szCharCode, 1 ) == 0 )
     
    66586721
    66596722                LISTVIEW_InitLvItemStruct( item, infoPtr->nFocusedItem + 1, TEXT );
    6660                 ListView_GetItemA( hwnd, &item );
     6723                LISTVIEW_GetItem(hwnd,(LVITEMW*)&item,FALSE,FALSE);//CB:todo
    66616724
    66626725                if ( strncasecmp( &( item.pszText[ 0 ] ), szCharCode, 1 ) == 0 )
     
    66706733                    {
    66716734                        LISTVIEW_InitLvItemStruct( item, idx, TEXT );
    6672                         ListView_GetItemA( hwnd, &item );
     6735                        LISTVIEW_GetItem(hwnd,(LVITEMW*)&item,FALSE,FALSE);//CB:todo
    66736736
    66746737                        if ( strncasecmp( &( item.pszText[ 0 ] ), szCharCode, 1 ) == 0 )
     
    66846747                        {
    66856748                            LISTVIEW_InitLvItemStruct( item,idx, TEXT );
    6686                             ListView_GetItemA( hwnd, &item );
     6749                            LISTVIEW_GetItem(hwnd,(LVITEMW*)&item,FALSE,FALSE);//CB:todo
    66876750
    66886751                            if ( strncasecmp( &( item.pszText[ 0 ] ), szCharCode, 1 ) == 0 )
     
    67086771                {
    67096772                    LISTVIEW_InitLvItemStruct( item,idx, TEXT );
    6710                     ListView_GetItemA( hwnd, &item );
     6773                    LISTVIEW_GetItem(hwnd,(LVITEMW*)&item,FALSE,FALSE);//CB:todo
    67116774
    67126775                    if ( strncasecmp( &( item.pszText[ 0 ] ), szCharCode, 1 ) == 0 )
     
    67246787                {
    67256788                    LISTVIEW_InitLvItemStruct( item,idx, TEXT );
    6726                     ListView_GetItemA( hwnd, &item );
     6789                    LISTVIEW_GetItem(hwnd,(LVITEMW*)&item,FALSE,FALSE);//CB:todo
    67276790
    67286791                    if ( strncasecmp( &( item.pszText[ 0 ] ), szCharCode, 1 ) == 0 )
     
    67456808                {   /* get item */
    67466809                    LISTVIEW_InitLvItemStruct( item, idx, TEXT );
    6747                     ListView_GetItemA( hwnd, &item );
     6810                    LISTVIEW_GetItem(hwnd,(LVITEMW*)&item,FALSE,FALSE);//CB:todo
    67486811
    67496812                    /* compare items */
     
    67616824        return 0;
    67626825
    6763     bRedraw = LISTVIEW_KeySelection(hwnd, nItem );
    6764     if (bRedraw != FALSE)
    6765     {
    6766         /* refresh client area */
    6767         InvalidateRect(hwnd, NULL, TRUE);
    6768         UpdateWindow(hwnd);
    6769     }
     6826    LISTVIEW_KeySelection(hwnd, nItem );
    67706827
    67716828    /* Store the WM_CHAR for next time */
     
    67996856  infoPtr->bFocus = FALSE;
    68006857
    6801   /* NEED drawing optimization ; redraw the selected items */
    6802   InvalidateRect(hwnd, NULL, TRUE);
     6858  /* redraw the selected items */
     6859  if (infoPtr->nFocusedItem != -1)
     6860    LISTVIEW_RefreshItem(hwnd,infoPtr->nFocusedItem);
    68036861
    68046862  return 0;
     
    68636921  INT nItem;
    68646922
    6865 //  TRACE("(hwnd=%x, key=%hu, X=%hu, Y=%hu)\n", hwnd, wKey, wPosX,
    6866 //        wPosY);
    6867 
    68686923  /* send NM_RELEASEDCAPTURE notification */
    68696924  sendNotify(hwnd,NM_RELEASEDCAPTURE);
     
    68846939    if (lStyle & LVS_SINGLESEL)
    68856940    {
    6886       if ((ListView_GetItemState(hwnd, nItem, LVIS_SELECTED) & LVIS_SELECTED)
    6887           && infoPtr->bDoEditLabel != TRUE)
     6941      if ((LISTVIEW_GetItemState(hwnd, nItem, LVIS_SELECTED) & LVIS_SELECTED) && infoPtr->bDoEditLabel != TRUE)
    68886942      {
    68896943          infoPtr->bDoEditLabel = TRUE;
     
    69176971      else
    69186972      {
    6919         if (ListView_GetItemState(hwnd, nItem, LVIS_SELECTED) & LVIS_SELECTED
    6920             && infoPtr->bDoEditLabel != TRUE)
     6973        if ((LISTVIEW_GetItemState(hwnd, nItem, LVIS_SELECTED) & LVIS_SELECTED) && (infoPtr->bDoEditLabel != TRUE))
    69216974        {
    69226975          infoPtr->bDoEditLabel = TRUE;
     
    69346987    LISTVIEW_RemoveSelections(hwnd, 0, GETITEMCOUNT(infoPtr));
    69356988  }
    6936 
    6937   //InvalidateRect(hwnd, NULL, TRUE);
    69386989
    69396990  return 0;
     
    70697120    {
    70707121      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
    7071       InvalidateRect(hwnd, NULL, TRUE);
     7122      LISTVIEW_Refresh(hwnd);
    70727123    }
    70737124    else if((lpnmh->code ==  HDN_ITEMCLICKA) || (lpnmh->code ==  HDN_ITEMCLICKW))
     
    70947145      infoPtr->nItemWidth = LISTVIEW_GetItemWidth(hwnd);
    70957146      LISTVIEW_UpdateScroll(hwnd);
    7096       InvalidateRect(hwnd, NULL, TRUE);
     7147      LISTVIEW_Refresh(hwnd);
    70977148    }
    70987149
     
    71157166static LRESULT LISTVIEW_Paint(HWND hwnd, HDC hdc)
    71167167{
    7117   PAINTSTRUCT ps;
    7118 
    7119 //   TRACE("(hwnd=%x,hdc=%x)\n", hwnd, hdc);
    7120 
    7121   if (hdc == 0)
    7122   {
    7123     hdc = BeginPaint(hwnd, &ps);
    7124     LISTVIEW_Draw(hwnd, hdc);
    7125     EndPaint(hwnd, &ps);
    7126   }
    7127   else
    7128   {
    7129     LISTVIEW_Draw(hwnd, hdc);
    7130   }
     7168  if (!hdc)
     7169  {
     7170    PAINTSTRUCT ps;
     7171
     7172    hdc = BeginPaint(hwnd,&ps);
     7173    LISTVIEW_Draw(hwnd, hdc,&ps.rcPaint);
     7174    EndPaint(hwnd,&ps);
     7175  } else
     7176      LISTVIEW_Draw(hwnd,hdc,NULL);
    71317177
    71327178  return 0;
     
    72747320  infoPtr->bFocus = TRUE;
    72757321
    7276   InvalidateRect(hwnd, NULL, TRUE);
    7277   UpdateWindow(hwnd);
     7322  if (infoPtr->nFocusedItem != -1)
     7323    LISTVIEW_RefreshItem(hwnd,infoPtr->nFocusedItem);
    72787324
    72797325  return 0;
     
    73167362
    73177363  /* invalidate listview control client area */
    7318   InvalidateRect(hwnd, NULL, TRUE);
    7319 
    7320   if (fRedraw != FALSE)
    7321   {
     7364  LISTVIEW_Refresh(hwnd);
     7365
     7366  if (fRedraw)
    73227367    UpdateWindow(hwnd);
    7323   }
    73247368
    73257369  return 0;
     
    73407384static LRESULT LISTVIEW_SetRedraw(HWND hwnd, BOOL bRedraw)
    73417385{
    7342     LRESULT lResult;
    7343     lResult = DefWindowProcA(hwnd, WM_SETREDRAW, bRedraw, 0);
    7344     if(bRedraw)
    7345     {
    7346         RedrawWindow(hwnd, NULL, 0,
    7347             RDW_INVALIDATE | RDW_FRAME | RDW_ERASE | RDW_ALLCHILDREN | RDW_ERASENOW);
    7348     }
    7349     return lResult;
     7386  LRESULT lResult;
     7387//CB:todo
     7388  lResult = DefWindowProcA(hwnd, WM_SETREDRAW, bRedraw, 0);
     7389  //if (bRedraw)
     7390  //  RedrawWindow(hwnd,NULL,0,RDW_INVALIDATE | RDW_FRAME | RDW_ERASE | RDW_ALLCHILDREN | RDW_ERASENOW);
     7391
     7392  return lResult;
    73507393}
    73517394
     
    73877430
    73887431  /* invalidate client area + erase background */
    7389   InvalidateRect(hwnd, NULL, TRUE);
     7432  LISTVIEW_Refresh(hwnd);//CB:tocheck
    73907433
    73917434  return 0;
     
    75577600
    75587601    /* invalidate client area + erase background */
    7559     InvalidateRect(hwnd, NULL, TRUE);
     7602    LISTVIEW_Refresh(hwnd);//CB:todo
    75607603
    75617604    /* print the list of unsupported window styles */
     
    75757618
    75767619  return 0;
    7577 }
    7578 
    7579 /***
    7580  * DESCRIPTION:
    7581  * Window procedure of the listview control.
    7582  *
    7583  */
    7584 static LRESULT WINAPI LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
    7585                                    LPARAM lParam)
    7586 {
    7587   switch (uMsg)
    7588   {
    7589   case LVM_APPROXIMATEVIEWRECT:
    7590     return LISTVIEW_ApproximateViewRect(hwnd, (INT)wParam,
    7591                                         LOWORD(lParam), HIWORD(lParam));
    7592   case LVM_ARRANGE:
    7593     return LISTVIEW_Arrange(hwnd, (INT)wParam);
    7594 
    7595 /* case LVM_CREATEDRAGIMAGE: */
    7596 
    7597   case LVM_DELETEALLITEMS:
    7598     return LISTVIEW_DeleteAllItems(hwnd);
    7599 
    7600   case LVM_DELETECOLUMN:
    7601     return LISTVIEW_DeleteColumn(hwnd, (INT)wParam);
    7602 
    7603   case LVM_DELETEITEM:
    7604     return LISTVIEW_DeleteItem(hwnd, (INT)wParam);
    7605 
    7606   case LVM_EDITLABELA:
    7607     return LISTVIEW_EditLabel(hwnd,(INT)wParam,FALSE);
    7608 
    7609   case LVM_EDITLABELW:
    7610     return LISTVIEW_EditLabel(hwnd,(INT)wParam,TRUE);
    7611 
    7612   case LVM_ENSUREVISIBLE:
    7613     return LISTVIEW_EnsureVisible(hwnd, (INT)wParam, (BOOL)lParam);
    7614 
    7615   case LVM_FINDITEMA:
    7616     return LISTVIEW_FindItem(hwnd,(INT)wParam,(LPLVFINDINFOW)lParam,FALSE);
    7617 
    7618   case LVM_FINDITEMW:
    7619     return LISTVIEW_FindItem(hwnd,(INT)wParam,(LPLVFINDINFOW)lParam,TRUE);
    7620 
    7621   case LVM_GETBKCOLOR:
    7622     return LISTVIEW_GetBkColor(hwnd);
    7623 
    7624 /*      case LVM_GETBKIMAGE: */
    7625 
    7626   case LVM_GETCALLBACKMASK:
    7627     return LISTVIEW_GetCallbackMask(hwnd);
    7628 
    7629   case LVM_GETCOLUMNA:
    7630     return LISTVIEW_GetColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,FALSE);
    7631 
    7632   case LVM_GETCOLUMNW:
    7633     return LISTVIEW_GetColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,TRUE);
    7634 
    7635 
    7636   case LVM_GETCOLUMNORDERARRAY:
    7637     return LISTVIEW_GetColumnOrderArray(hwnd, (INT)wParam, (LPINT)lParam);
    7638 
    7639   case LVM_GETCOLUMNWIDTH:
    7640     return LISTVIEW_GetColumnWidth(hwnd, (INT)wParam);
    7641 
    7642   case LVM_GETCOUNTPERPAGE:
    7643     return LISTVIEW_GetCountPerPage(hwnd);
    7644 
    7645   case LVM_GETEDITCONTROL:
    7646     return LISTVIEW_GetEditControl(hwnd);
    7647 
    7648   case LVM_GETEXTENDEDLISTVIEWSTYLE:
    7649     return LISTVIEW_GetExtendedListViewStyle(hwnd);
    7650 
    7651   case LVM_GETHEADER:
    7652     return LISTVIEW_GetHeader(hwnd);
    7653 
    7654 /*      case LVM_GETHOTCURSOR: */
    7655 
    7656   case LVM_GETHOTITEM:
    7657     return LISTVIEW_GetHotItem(hwnd);
    7658 
    7659 /*      case LVM_GETHOVERTIME: */
    7660 
    7661   case LVM_GETIMAGELIST:
    7662     return LISTVIEW_GetImageList(hwnd, (INT)wParam);
    7663 
    7664 /*      case LVM_GETISEARCHSTRING: */
    7665 
    7666   case LVM_GETITEMA:
    7667     return LISTVIEW_GetItem(hwnd,(LPLVITEMW)lParam,FALSE);
    7668 
    7669   case LVM_GETITEMW:
    7670     return LISTVIEW_GetItem(hwnd,(LPLVITEMW)lParam,TRUE);
    7671 
    7672 
    7673   case LVM_GETITEMCOUNT:
    7674     return LISTVIEW_GetItemCount(hwnd);
    7675 
    7676   case LVM_GETITEMPOSITION:
    7677     return LISTVIEW_GetItemPosition(hwnd, (INT)wParam, (LPPOINT)lParam);
    7678 
    7679   case LVM_GETITEMRECT:
    7680     return LISTVIEW_GetItemRect(hwnd, (INT)wParam, (LPRECT)lParam);
    7681 
    7682   case LVM_GETITEMSPACING:
    7683     return LISTVIEW_GetItemSpacing(hwnd, (BOOL)wParam);
    7684 
    7685   case LVM_GETITEMSTATE:
    7686     return LISTVIEW_GetItemState(hwnd, (INT)wParam, (UINT)lParam);
    7687 
    7688   case LVM_GETITEMTEXTA:
    7689     LISTVIEW_GetItemText(hwnd,(INT)wParam,(LPLVITEMW)lParam,FALSE);
    7690     break;
    7691 
    7692   case LVM_GETITEMTEXTW:
    7693     LISTVIEW_GetItemText(hwnd,(INT)wParam,(LPLVITEMW)lParam,TRUE);
    7694     break;
    7695 
    7696 
    7697   case LVM_GETNEXTITEM:
    7698     return LISTVIEW_GetNextItem(hwnd, (INT)wParam, LOWORD(lParam));
    7699 
    7700 /*      case LVM_GETNUMBEROFWORKAREAS: */
    7701 
    7702   case LVM_GETORIGIN:
    7703     return LISTVIEW_GetOrigin(hwnd, (LPPOINT)lParam);
    7704 
    7705   case LVM_GETSELECTEDCOUNT:
    7706     return LISTVIEW_GetSelectedCount(hwnd);
    7707 
    7708   case LVM_GETSELECTIONMARK:
    7709     return LISTVIEW_GetSelectionMark(hwnd);
    7710 
    7711   case LVM_GETSTRINGWIDTHA:
    7712     return LISTVIEW_GetStringWidth(hwnd,(LPWSTR)lParam,FALSE);
    7713 
    7714   case LVM_GETSTRINGWIDTHW:
    7715     return LISTVIEW_GetStringWidth(hwnd,(LPWSTR)lParam,TRUE);
    7716 
    7717 /*      case LVM_GETSUBITEMRECT: */
    7718 
    7719   case LVM_GETTEXTBKCOLOR:
    7720     return LISTVIEW_GetTextBkColor(hwnd);
    7721 
    7722   case LVM_GETTEXTCOLOR:
    7723     return LISTVIEW_GetTextColor(hwnd);
    7724 
    7725 /*      case LVM_GETTOOLTIPS: */
    7726 
    7727   case LVM_GETTOPINDEX:
    7728     return LISTVIEW_GetTopIndex(hwnd);
    7729 
    7730 /*      case LVM_GETUNICODEFORMAT: */
    7731 
    7732   case LVM_GETVIEWRECT:
    7733     return LISTVIEW_GetViewRect(hwnd, (LPRECT)lParam);
    7734 
    7735 /*      case LVM_GETWORKAREAS: */
    7736 
    7737   case LVM_HITTEST:
    7738     return LISTVIEW_HitTest(hwnd, (LPLVHITTESTINFO)lParam);
    7739 
    7740   case LVM_INSERTCOLUMNA:
    7741     return LISTVIEW_InsertColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,FALSE);
    7742 
    7743   case LVM_INSERTCOLUMNW:
    7744     return LISTVIEW_InsertColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,TRUE);
    7745 
    7746   case LVM_INSERTITEMA:
    7747     return LISTVIEW_InsertItem(hwnd,(LPLVITEMW)lParam,FALSE);
    7748 
    7749   case LVM_INSERTITEMW:
    7750     return LISTVIEW_InsertItem(hwnd,(LPLVITEMW)lParam,TRUE);
    7751 
    7752   case LVM_REDRAWITEMS:
    7753     return LISTVIEW_RedrawItems(hwnd, (INT)wParam, (INT)lParam);
    7754 
    7755 /*   case LVM_SCROLL:  */
    7756 /*     return LISTVIEW_Scroll(hwnd, (INT)wParam, (INT)lParam); */
    7757 
    7758   case LVM_SETBKCOLOR:
    7759     return LISTVIEW_SetBkColor(hwnd, (COLORREF)lParam);
    7760 
    7761 /*      case LVM_SETBKIMAGE: */
    7762 
    7763   case LVM_SETCALLBACKMASK:
    7764     return LISTVIEW_SetCallbackMask(hwnd, (UINT)wParam);
    7765 
    7766   case LVM_SETCOLUMNA:
    7767     return LISTVIEW_SetColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,FALSE);
    7768 
    7769   case LVM_SETCOLUMNW:
    7770     return LISTVIEW_SetColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,TRUE);
    7771 
    7772   case LVM_SETCOLUMNORDERARRAY:
    7773     return LISTVIEW_SetColumnOrderArray(hwnd, (INT)wParam, (LPINT)lParam);
    7774 
    7775   case LVM_SETCOLUMNWIDTH:
    7776     return LISTVIEW_SetColumnWidth(hwnd, (INT)wParam, (INT)lParam);
    7777 
    7778   case LVM_SETEXTENDEDLISTVIEWSTYLE:
    7779     return LISTVIEW_SetExtendedListViewStyle(hwnd, (DWORD)wParam, (DWORD)lParam);
    7780 
    7781 /*      case LVM_SETHOTCURSOR: */
    7782 
    7783   case LVM_SETHOTITEM:
    7784     return LISTVIEW_SetHotItem(hwnd, (INT)wParam);
    7785 
    7786 /*      case LVM_SETHOVERTIME: */
    7787 /*      case LVM_SETICONSPACING: */
    7788 
    7789   case LVM_SETIMAGELIST:
    7790     return LISTVIEW_SetImageList(hwnd, (INT)wParam, (HIMAGELIST)lParam);
    7791 
    7792   case LVM_SETITEMA:
    7793     return LISTVIEW_SetItemHandler(hwnd,(LPLVITEMW)lParam,FALSE);
    7794 
    7795   case LVM_SETITEMW:
    7796     return LISTVIEW_SetItemHandler(hwnd,(LPLVITEMW)lParam,TRUE);
    7797 
    7798   case LVM_SETITEMCOUNT:
    7799     return LISTVIEW_SetItemCount(hwnd, (INT)wParam, (DWORD)lParam);
    7800 
    7801   case LVM_SETITEMPOSITION:
    7802     return LISTVIEW_SetItemPosition(hwnd, (INT)wParam, (INT)LOWORD(lParam),
    7803                                     (INT)HIWORD(lParam));
    7804 
    7805 /*      case LVM_SETITEMPOSITION32: */
    7806 
    7807   case LVM_SETITEMSTATE:
    7808     return LISTVIEW_SetItemState(hwnd, (INT)wParam, (LPLVITEMW)lParam);
    7809 
    7810   case LVM_SETITEMTEXTA:
    7811     return LISTVIEW_SetItemText(hwnd,(INT)wParam,(LPLVITEMW)lParam,FALSE);
    7812 
    7813   case LVM_SETITEMTEXTW:
    7814     return LISTVIEW_SetItemText(hwnd,(INT)wParam,(LPLVITEMW)lParam,TRUE);
    7815 
    7816   case LVM_SETSELECTIONMARK:
    7817     return LISTVIEW_SetSelectionMark(hwnd, (INT)lParam);
    7818 
    7819   case LVM_SETTEXTBKCOLOR:
    7820     return LISTVIEW_SetTextBkColor(hwnd, (COLORREF)lParam);
    7821 
    7822   case LVM_SETTEXTCOLOR:
    7823     return LISTVIEW_SetTextColor(hwnd, (COLORREF)lParam);
    7824 
    7825 /*      case LVM_SETTOOLTIPS: */
    7826 /*      case LVM_SETUNICODEFORMAT: */
    7827 /*      case LVM_SETWORKAREAS: */
    7828 
    7829   case LVM_SORTITEMS:
    7830     return LISTVIEW_SortItems(hwnd, wParam, lParam);
    7831 
    7832 /*      case LVM_SUBITEMHITTEST: */
    7833 
    7834   case LVM_UPDATE:
    7835     return LISTVIEW_Update(hwnd, (INT)wParam);
    7836 
    7837   case WM_CHAR:
    7838     return LISTVIEW_ProcessLetterKeys( hwnd, wParam, lParam );
    7839 
    7840   case WM_COMMAND:
    7841     return LISTVIEW_Command(hwnd, wParam, lParam);
    7842 
    7843   case WM_CREATE:
    7844     return LISTVIEW_Create(hwnd, wParam, lParam);
    7845 
    7846   case WM_ERASEBKGND:
    7847     return LISTVIEW_EraseBackground(hwnd, wParam, lParam);
    7848 
    7849   case WM_GETDLGCODE:
    7850     return DLGC_WANTCHARS | DLGC_WANTARROWS;
    7851 
    7852   case WM_GETFONT:
    7853     return LISTVIEW_GetFont(hwnd);
    7854 
    7855   case WM_HSCROLL:
    7856     return LISTVIEW_HScroll(hwnd, (INT)LOWORD(wParam),
    7857                             (INT)HIWORD(wParam), (HWND)lParam);
    7858 
    7859   case WM_KEYDOWN:
    7860     return LISTVIEW_KeyDown(hwnd, (INT)wParam, (LONG)lParam);
    7861 
    7862   case WM_KILLFOCUS:
    7863     return LISTVIEW_KillFocus(hwnd);
    7864 
    7865   case WM_LBUTTONDBLCLK:
    7866     return LISTVIEW_LButtonDblClk(hwnd, (WORD)wParam, LOWORD(lParam),
    7867                                 HIWORD(lParam));
    7868 
    7869   case WM_LBUTTONDOWN:
    7870     return LISTVIEW_LButtonDown(hwnd, (WORD)wParam, LOWORD(lParam),
    7871                                 HIWORD(lParam));
    7872   case WM_LBUTTONUP:
    7873     return LISTVIEW_LButtonUp(hwnd, (WORD)wParam, LOWORD(lParam),
    7874                               HIWORD(lParam));
    7875 
    7876 /*      case WM_MOUSEMOVE: */
    7877 /*          return LISTVIEW_MouseMove (hwnd, wParam, lParam); */
    7878 
    7879   case WM_NCCREATE:
    7880     return LISTVIEW_NCCreate(hwnd, wParam, lParam);
    7881 
    7882   case WM_NCDESTROY:
    7883     return LISTVIEW_NCDestroy(hwnd);
    7884 
    7885   case WM_NOTIFY:
    7886     return LISTVIEW_Notify(hwnd, (INT)wParam, (LPNMHDR)lParam);
    7887 
    7888   case WM_PAINT:
    7889     return LISTVIEW_Paint(hwnd, (HDC)wParam);
    7890 
    7891   case WM_RBUTTONDBLCLK:
    7892     return LISTVIEW_RButtonDblClk(hwnd, (WORD)wParam, LOWORD(lParam),
    7893                                   HIWORD(lParam));
    7894 
    7895   case WM_RBUTTONDOWN:
    7896     return LISTVIEW_RButtonDown(hwnd, (WORD)wParam, LOWORD(lParam),
    7897                                 HIWORD(lParam));
    7898 
    7899   case WM_RBUTTONUP:
    7900     return LISTVIEW_RButtonUp(hwnd, (WORD)wParam, LOWORD(lParam),
    7901                               HIWORD(lParam));
    7902 
    7903   case WM_SETFOCUS:
    7904     return LISTVIEW_SetFocus(hwnd, (HWND)wParam);
    7905 
    7906   case WM_SETFONT:
    7907     return LISTVIEW_SetFont(hwnd, (HFONT)wParam, (WORD)lParam);
    7908 
    7909   case WM_SETREDRAW:
    7910     return LISTVIEW_SetRedraw(hwnd, (BOOL)wParam);
    7911 
    7912   case WM_SIZE:
    7913     return LISTVIEW_Size(hwnd, (int)SLOWORD(lParam), (int)SHIWORD(lParam));
    7914 
    7915   case WM_STYLECHANGED:
    7916     return LISTVIEW_StyleChanged(hwnd, wParam, (LPSTYLESTRUCT)lParam);
    7917 
    7918 /*      case WM_TIMER: */
    7919 
    7920   case WM_VSCROLL:
    7921     return LISTVIEW_VScroll(hwnd, (INT)LOWORD(wParam),
    7922                             (INT)HIWORD(wParam), (HWND)lParam);
    7923 
    7924   case WM_MOUSEWHEEL:
    7925       if (wParam & (MK_SHIFT | MK_CONTROL))
    7926           return DefWindowProcA( hwnd, uMsg, wParam, lParam );
    7927       return LISTVIEW_MouseWheel(hwnd, (short int)HIWORD(wParam));
    7928 
    7929 /*      case WM_WINDOWPOSCHANGED: */
    7930 /*      case WM_WININICHANGE: */
    7931 
    7932   default:
    7933     //if (uMsg >= WM_USER)
    7934     //{
    7935     //  ERR("unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam,
    7936     //      lParam);
    7937     //}
    7938 
    7939     /* call default window procedure */
    7940     return defComCtl32ProcA(hwnd, uMsg, wParam, lParam);
    7941   }
    7942 
    7943   return 0;
    7944 }
    7945 
    7946 /***
    7947  * DESCRIPTION:
    7948  * Registers the window class.
    7949  *
    7950  * PARAMETER(S):
    7951  * None
    7952  *
    7953  * RETURN:
    7954  * None
    7955  */
    7956 VOID LISTVIEW_Register(VOID)
    7957 {
    7958   WNDCLASSA wndClass;
    7959 
    7960   ZeroMemory(&wndClass, sizeof(WNDCLASSA));
    7961   wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;
    7962   wndClass.lpfnWndProc = (WNDPROC)LISTVIEW_WindowProc;
    7963   wndClass.cbClsExtra = 0;
    7964   wndClass.cbWndExtra = sizeof(LISTVIEW_INFO *);
    7965   wndClass.hCursor = LoadCursorA(0, IDC_ARROWA);
    7966   wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    7967   wndClass.lpszClassName = WC_LISTVIEWA;
    7968   RegisterClassA(&wndClass);
    7969 }
    7970 
    7971 /***
    7972  * DESCRIPTION:
    7973  * Unregisters the window class.
    7974  *
    7975  * PARAMETER(S):
    7976  * None
    7977  *
    7978  * RETURN:
    7979  * None
    7980  */
    7981 VOID LISTVIEW_Unregister(VOID)
    7982 {
    7983   UnregisterClassA(WC_LISTVIEWA, (HINSTANCE)NULL);
    79847620}
    79857621
     
    81967832    return hedit;
    81977833}
     7834
     7835/***
     7836 * DESCRIPTION:
     7837 * Window procedure of the listview control.
     7838 *
     7839 */
     7840static LRESULT WINAPI LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
     7841                                   LPARAM lParam)
     7842{
     7843  switch (uMsg)
     7844  {
     7845  case LVM_APPROXIMATEVIEWRECT:
     7846    return LISTVIEW_ApproximateViewRect(hwnd, (INT)wParam,
     7847                                        LOWORD(lParam), HIWORD(lParam));
     7848  case LVM_ARRANGE:
     7849    return LISTVIEW_Arrange(hwnd, (INT)wParam);
     7850
     7851/* case LVM_CREATEDRAGIMAGE: */
     7852
     7853  case LVM_DELETEALLITEMS:
     7854    return LISTVIEW_DeleteAllItems(hwnd);
     7855
     7856  case LVM_DELETECOLUMN:
     7857    return LISTVIEW_DeleteColumn(hwnd, (INT)wParam);
     7858
     7859  case LVM_DELETEITEM:
     7860    return LISTVIEW_DeleteItem(hwnd, (INT)wParam);
     7861
     7862  case LVM_EDITLABELA:
     7863    return LISTVIEW_EditLabel(hwnd,(INT)wParam,FALSE);
     7864
     7865  case LVM_EDITLABELW:
     7866    return LISTVIEW_EditLabel(hwnd,(INT)wParam,TRUE);
     7867
     7868  case LVM_ENSUREVISIBLE:
     7869    return LISTVIEW_EnsureVisible(hwnd,(INT)wParam,(BOOL)lParam);
     7870
     7871  case LVM_FINDITEMA:
     7872    return LISTVIEW_FindItem(hwnd,(INT)wParam,(LPLVFINDINFOW)lParam,FALSE);
     7873
     7874  case LVM_FINDITEMW:
     7875    return LISTVIEW_FindItem(hwnd,(INT)wParam,(LPLVFINDINFOW)lParam,TRUE);
     7876
     7877  case LVM_GETBKCOLOR:
     7878    return LISTVIEW_GetBkColor(hwnd);
     7879
     7880/*      case LVM_GETBKIMAGE: */
     7881
     7882  case LVM_GETCALLBACKMASK:
     7883    return LISTVIEW_GetCallbackMask(hwnd);
     7884
     7885  case LVM_GETCOLUMNA:
     7886    return LISTVIEW_GetColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,FALSE);
     7887
     7888  case LVM_GETCOLUMNW:
     7889    return LISTVIEW_GetColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,TRUE);
     7890
     7891
     7892  case LVM_GETCOLUMNORDERARRAY:
     7893    return LISTVIEW_GetColumnOrderArray(hwnd, (INT)wParam, (LPINT)lParam);
     7894
     7895  case LVM_GETCOLUMNWIDTH:
     7896    return LISTVIEW_GetColumnWidth(hwnd, (INT)wParam);
     7897
     7898  case LVM_GETCOUNTPERPAGE:
     7899    return LISTVIEW_GetCountPerPage(hwnd);
     7900
     7901  case LVM_GETEDITCONTROL:
     7902    return LISTVIEW_GetEditControl(hwnd);
     7903
     7904  case LVM_GETEXTENDEDLISTVIEWSTYLE:
     7905    return LISTVIEW_GetExtendedListViewStyle(hwnd);
     7906
     7907  case LVM_GETHEADER:
     7908    return LISTVIEW_GetHeader(hwnd);
     7909
     7910/*      case LVM_GETHOTCURSOR: */
     7911
     7912  case LVM_GETHOTITEM:
     7913    return LISTVIEW_GetHotItem(hwnd);
     7914
     7915/*      case LVM_GETHOVERTIME: */
     7916
     7917  case LVM_GETIMAGELIST:
     7918    return LISTVIEW_GetImageList(hwnd, (INT)wParam);
     7919
     7920/*      case LVM_GETISEARCHSTRING: */
     7921
     7922  case LVM_GETITEMA:
     7923    return LISTVIEW_GetItem(hwnd,(LPLVITEMW)lParam,FALSE,FALSE);
     7924
     7925  case LVM_GETITEMW:
     7926    return LISTVIEW_GetItem(hwnd,(LPLVITEMW)lParam,TRUE,FALSE);
     7927
     7928
     7929  case LVM_GETITEMCOUNT:
     7930    return LISTVIEW_GetItemCount(hwnd);
     7931
     7932  case LVM_GETITEMPOSITION:
     7933    return LISTVIEW_GetItemPosition(hwnd, (INT)wParam, (LPPOINT)lParam);
     7934
     7935  case LVM_GETITEMRECT:
     7936    return LISTVIEW_GetItemRect(hwnd, (INT)wParam, (LPRECT)lParam);
     7937
     7938  case LVM_GETITEMSPACING:
     7939    return LISTVIEW_GetItemSpacing(hwnd, (BOOL)wParam);
     7940
     7941  case LVM_GETITEMSTATE:
     7942    return LISTVIEW_GetItemState(hwnd, (INT)wParam, (UINT)lParam);
     7943
     7944  case LVM_GETITEMTEXTA:
     7945    LISTVIEW_GetItemText(hwnd,(INT)wParam,(LPLVITEMW)lParam,FALSE);
     7946    break;
     7947
     7948  case LVM_GETITEMTEXTW:
     7949    LISTVIEW_GetItemText(hwnd,(INT)wParam,(LPLVITEMW)lParam,TRUE);
     7950    break;
     7951
     7952
     7953  case LVM_GETNEXTITEM:
     7954    return LISTVIEW_GetNextItem(hwnd, (INT)wParam, LOWORD(lParam));
     7955
     7956/*      case LVM_GETNUMBEROFWORKAREAS: */
     7957
     7958  case LVM_GETORIGIN:
     7959    return LISTVIEW_GetOrigin(hwnd, (LPPOINT)lParam);
     7960
     7961  case LVM_GETSELECTEDCOUNT:
     7962    return LISTVIEW_GetSelectedCount(hwnd);
     7963
     7964  case LVM_GETSELECTIONMARK:
     7965    return LISTVIEW_GetSelectionMark(hwnd);
     7966
     7967  case LVM_GETSTRINGWIDTHA:
     7968    return LISTVIEW_GetStringWidth(hwnd,(LPWSTR)lParam,FALSE);
     7969
     7970  case LVM_GETSTRINGWIDTHW:
     7971    return LISTVIEW_GetStringWidth(hwnd,(LPWSTR)lParam,TRUE);
     7972
     7973/*      case LVM_GETSUBITEMRECT: */
     7974
     7975  case LVM_GETTEXTBKCOLOR:
     7976    return LISTVIEW_GetTextBkColor(hwnd);
     7977
     7978  case LVM_GETTEXTCOLOR:
     7979    return LISTVIEW_GetTextColor(hwnd);
     7980
     7981/*      case LVM_GETTOOLTIPS: */
     7982
     7983  case LVM_GETTOPINDEX:
     7984    return LISTVIEW_GetTopIndex(hwnd);
     7985
     7986  case LVM_GETVIEWRECT:
     7987    return LISTVIEW_GetViewRect(hwnd, (LPRECT)lParam);
     7988
     7989/*      case LVM_GETWORKAREAS: */
     7990
     7991  case LVM_HITTEST:
     7992    return LISTVIEW_HitTest(hwnd, (LPLVHITTESTINFO)lParam);
     7993
     7994  case LVM_INSERTCOLUMNA:
     7995    return LISTVIEW_InsertColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,FALSE);
     7996
     7997  case LVM_INSERTCOLUMNW:
     7998    return LISTVIEW_InsertColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,TRUE);
     7999
     8000  case LVM_INSERTITEMA:
     8001    return LISTVIEW_InsertItem(hwnd,(LPLVITEMW)lParam,FALSE);
     8002
     8003  case LVM_INSERTITEMW:
     8004    return LISTVIEW_InsertItem(hwnd,(LPLVITEMW)lParam,TRUE);
     8005
     8006  case LVM_REDRAWITEMS:
     8007    return LISTVIEW_RedrawItems(hwnd, (INT)wParam, (INT)lParam);
     8008
     8009/*   case LVM_SCROLL:  */
     8010/*     return LISTVIEW_Scroll(hwnd, (INT)wParam, (INT)lParam); */
     8011
     8012  case LVM_SETBKCOLOR:
     8013    return LISTVIEW_SetBkColor(hwnd, (COLORREF)lParam);
     8014
     8015/*      case LVM_SETBKIMAGE: */
     8016
     8017  case LVM_SETCALLBACKMASK:
     8018    return LISTVIEW_SetCallbackMask(hwnd, (UINT)wParam);
     8019
     8020  case LVM_SETCOLUMNA:
     8021    return LISTVIEW_SetColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,FALSE);
     8022
     8023  case LVM_SETCOLUMNW:
     8024    return LISTVIEW_SetColumn(hwnd,(INT)wParam,(LPLVCOLUMNW)lParam,TRUE);
     8025
     8026  case LVM_SETCOLUMNORDERARRAY:
     8027    return LISTVIEW_SetColumnOrderArray(hwnd, (INT)wParam, (LPINT)lParam);
     8028
     8029  case LVM_SETCOLUMNWIDTH:
     8030    return LISTVIEW_SetColumnWidth(hwnd, (INT)wParam, (INT)lParam);
     8031
     8032  case LVM_SETEXTENDEDLISTVIEWSTYLE:
     8033    return LISTVIEW_SetExtendedListViewStyle(hwnd, (DWORD)wParam, (DWORD)lParam);
     8034
     8035/*      case LVM_SETHOTCURSOR: */
     8036
     8037  case LVM_SETHOTITEM:
     8038    return LISTVIEW_SetHotItem(hwnd, (INT)wParam);
     8039
     8040/*      case LVM_SETHOVERTIME: */
     8041/*      case LVM_SETICONSPACING: */
     8042
     8043  case LVM_SETIMAGELIST:
     8044    return LISTVIEW_SetImageList(hwnd, (INT)wParam, (HIMAGELIST)lParam);
     8045
     8046  case LVM_SETITEMA:
     8047    return LISTVIEW_SetItem(hwnd,(LPLVITEMW)lParam,FALSE);
     8048
     8049  case LVM_SETITEMW:
     8050    return LISTVIEW_SetItem(hwnd,(LPLVITEMW)lParam,TRUE);
     8051
     8052  case LVM_SETITEMCOUNT:
     8053    return LISTVIEW_SetItemCount(hwnd, (INT)wParam, (DWORD)lParam);
     8054
     8055  case LVM_SETITEMPOSITION:
     8056    return LISTVIEW_SetItemPosition(hwnd, (INT)wParam, (INT)LOWORD(lParam),
     8057                                    (INT)HIWORD(lParam));
     8058
     8059/*      case LVM_SETITEMPOSITION32: */
     8060
     8061  case LVM_SETITEMSTATE:
     8062    return LISTVIEW_SetItemState(hwnd, (INT)wParam, (LPLVITEMW)lParam);
     8063
     8064  case LVM_SETITEMTEXTA:
     8065    return LISTVIEW_SetItemText(hwnd,(INT)wParam,(LPLVITEMW)lParam,FALSE);
     8066
     8067  case LVM_SETITEMTEXTW:
     8068    return LISTVIEW_SetItemText(hwnd,(INT)wParam,(LPLVITEMW)lParam,TRUE);
     8069
     8070  case LVM_SETSELECTIONMARK:
     8071    return LISTVIEW_SetSelectionMark(hwnd, (INT)lParam);
     8072
     8073  case LVM_SETTEXTBKCOLOR:
     8074    return LISTVIEW_SetTextBkColor(hwnd, (COLORREF)lParam);
     8075
     8076  case LVM_SETTEXTCOLOR:
     8077    return LISTVIEW_SetTextColor(hwnd, (COLORREF)lParam);
     8078
     8079/*      case LVM_SETTOOLTIPS: */
     8080/*      case LVM_SETWORKAREAS: */
     8081
     8082  case LVM_SORTITEMS:
     8083    return LISTVIEW_SortItems(hwnd, wParam, lParam);
     8084
     8085/*      case LVM_SUBITEMHITTEST: */
     8086
     8087  case LVM_UPDATE:
     8088    return LISTVIEW_Update(hwnd, (INT)wParam);
     8089
     8090  case WM_CHAR:
     8091    return LISTVIEW_ProcessLetterKeys( hwnd, wParam, lParam );
     8092
     8093  case WM_COMMAND:
     8094    return LISTVIEW_Command(hwnd, wParam, lParam);
     8095
     8096  case WM_CREATE:
     8097    return LISTVIEW_Create(hwnd, wParam, lParam);
     8098
     8099  case WM_ERASEBKGND:
     8100    return LISTVIEW_EraseBackground(hwnd, wParam, lParam);
     8101
     8102  case WM_GETDLGCODE:
     8103    return DLGC_WANTCHARS | DLGC_WANTARROWS;
     8104
     8105  case WM_GETFONT:
     8106    return LISTVIEW_GetFont(hwnd);
     8107
     8108  case WM_HSCROLL:
     8109    return LISTVIEW_HScroll(hwnd, (INT)LOWORD(wParam),
     8110                            (INT)HIWORD(wParam), (HWND)lParam);
     8111
     8112  case WM_KEYDOWN:
     8113    return LISTVIEW_KeyDown(hwnd, (INT)wParam, (LONG)lParam);
     8114
     8115  case WM_KILLFOCUS:
     8116    return LISTVIEW_KillFocus(hwnd);
     8117
     8118  case WM_LBUTTONDBLCLK:
     8119    return LISTVIEW_LButtonDblClk(hwnd, (WORD)wParam, LOWORD(lParam),
     8120                                HIWORD(lParam));
     8121
     8122  case WM_LBUTTONDOWN:
     8123    return LISTVIEW_LButtonDown(hwnd, (WORD)wParam, LOWORD(lParam),
     8124                                HIWORD(lParam));
     8125  case WM_LBUTTONUP:
     8126    return LISTVIEW_LButtonUp(hwnd, (WORD)wParam, LOWORD(lParam),
     8127                              HIWORD(lParam));
     8128
     8129/*      case WM_MOUSEMOVE: */
     8130/*          return LISTVIEW_MouseMove (hwnd, wParam, lParam); */
     8131
     8132  case WM_NCCREATE:
     8133    return LISTVIEW_NCCreate(hwnd, wParam, lParam);
     8134
     8135  case WM_NCDESTROY:
     8136    return LISTVIEW_NCDestroy(hwnd);
     8137
     8138  case WM_NOTIFY:
     8139    return LISTVIEW_Notify(hwnd, (INT)wParam, (LPNMHDR)lParam);
     8140
     8141  case WM_PAINT:
     8142    return LISTVIEW_Paint(hwnd, (HDC)wParam);
     8143
     8144  case WM_RBUTTONDBLCLK:
     8145    return LISTVIEW_RButtonDblClk(hwnd, (WORD)wParam, LOWORD(lParam),
     8146                                  HIWORD(lParam));
     8147
     8148  case WM_RBUTTONDOWN:
     8149    return LISTVIEW_RButtonDown(hwnd, (WORD)wParam, LOWORD(lParam),
     8150                                HIWORD(lParam));
     8151
     8152  case WM_RBUTTONUP:
     8153    return LISTVIEW_RButtonUp(hwnd, (WORD)wParam, LOWORD(lParam),
     8154                              HIWORD(lParam));
     8155
     8156  case WM_SETFOCUS:
     8157    return LISTVIEW_SetFocus(hwnd, (HWND)wParam);
     8158
     8159  case WM_SETFONT:
     8160    return LISTVIEW_SetFont(hwnd, (HFONT)wParam, (WORD)lParam);
     8161
     8162  case WM_SETREDRAW:
     8163    return LISTVIEW_SetRedraw(hwnd, (BOOL)wParam);
     8164
     8165  case WM_SIZE:
     8166    return LISTVIEW_Size(hwnd, (int)SLOWORD(lParam), (int)SHIWORD(lParam));
     8167
     8168  case WM_STYLECHANGED:
     8169    return LISTVIEW_StyleChanged(hwnd, wParam, (LPSTYLESTRUCT)lParam);
     8170
     8171  case WM_TIMER:
     8172    return LISTVIEW_Timer(hwnd,wParam,lParam);
     8173
     8174  case WM_VSCROLL:
     8175    return LISTVIEW_VScroll(hwnd,(INT)LOWORD(wParam),(INT)HIWORD(wParam),(HWND)lParam);
     8176
     8177  case WM_MOUSEWHEEL:
     8178      if (wParam & (MK_SHIFT | MK_CONTROL))
     8179          return DefWindowProcA( hwnd, uMsg, wParam, lParam );
     8180      return LISTVIEW_MouseWheel(hwnd, (short int)HIWORD(wParam));
     8181
     8182/*      case WM_WINDOWPOSCHANGED: */
     8183/*      case WM_WININICHANGE: */
     8184
     8185  default:
     8186    //if (uMsg >= WM_USER)
     8187    //{
     8188    //  ERR("unknown msg %04x wp=%08x lp=%08lx\n", uMsg, wParam,
     8189    //      lParam);
     8190    //}
     8191
     8192    /* call default window procedure */
     8193    return defComCtl32ProcA(hwnd, uMsg, wParam, lParam);
     8194  }
     8195
     8196  return 0;
     8197}
     8198
     8199/***
     8200 * DESCRIPTION:
     8201 * Registers the window class.
     8202 *
     8203 * PARAMETER(S):
     8204 * None
     8205 *
     8206 * RETURN:
     8207 * None
     8208 */
     8209VOID LISTVIEW_Register(VOID)
     8210{
     8211  WNDCLASSA wndClass;
     8212
     8213  ZeroMemory(&wndClass, sizeof(WNDCLASSA));
     8214  wndClass.style = CS_GLOBALCLASS | CS_DBLCLKS;
     8215  wndClass.lpfnWndProc = (WNDPROC)LISTVIEW_WindowProc;
     8216  wndClass.cbClsExtra = 0;
     8217  wndClass.cbWndExtra = sizeof(LISTVIEW_INFO *);
     8218  wndClass.hCursor = LoadCursorA(0, IDC_ARROWA);
     8219  wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
     8220  wndClass.lpszClassName = WC_LISTVIEWA;
     8221  RegisterClassA(&wndClass);
     8222}
     8223
     8224/***
     8225 * DESCRIPTION:
     8226 * Unregisters the window class.
     8227 *
     8228 * PARAMETER(S):
     8229 * None
     8230 *
     8231 * RETURN:
     8232 * None
     8233 */
     8234VOID LISTVIEW_Unregister(VOID)
     8235{
     8236  UnregisterClassA(WC_LISTVIEWA, (HINSTANCE)NULL);
     8237}
Note: See TracChangeset for help on using the changeset viewer.