Listview updates
Dimitrie O. Paun
dpaun at rogers.com
Thu Sep 12 11:17:41 CDT 2002
ChangeLog:
-- Complete rewrite of scrolling code: smaller, faster, cleaner.
We now properly scroll the window, rather than invalidating it
on every scroll action.
-- A bug or two got squashed.
-- Many code cleanups, simiplifications, etc.
-- Some documentation updates.
Index: dlls/comctl32/listview.c
===================================================================
RCS file: /var/cvs/wine/dlls/comctl32/listview.c,v
retrieving revision 1.140
diff -u -r1.140 listview.c
--- dlls/comctl32/listview.c 11 Sep 2002 00:47:09 -0000 1.140
+++ dlls/comctl32/listview.c 12 Sep 2002 15:51:29 -0000
@@ -94,9 +94,9 @@
typedef struct tagLISTVIEW_ITEM
{
- UINT state;
LPWSTR pszText;
INT iImage;
+ UINT state;
LPARAM lParam;
INT iIndent;
POINT ptPosition;
@@ -164,10 +164,7 @@
*/
/* Internal interface to LISTVIEW_HScroll and LISTVIEW_VScroll */
-#define SB_INTERNAL_UP -1
-#define SB_INTERNAL_DOWN -2
-#define SB_INTERNAL_RIGHT -3
-#define SB_INTERNAL_LEFT -4
+#define SB_INTERNAL -1
/* maximum size of a label */
#define DISP_TEXT_SIZE 512
@@ -217,7 +214,18 @@
*/
/* retrieve the number of items in the listview */
#define GETITEMCOUNT(infoPtr) ((infoPtr)->hdpaItems->nItemCount)
-#define HDM_INSERTITEMT(isW) ( (isW) ? HDM_INSERTITEMW : HDM_INSERTITEMA )
+
+#define LISTVIEW_DUMP(iP) do { \
+ TRACE("hwndSelf=%08x, clrBk=0x%06lx, clrText=0x%06lx, clrTextBk=0x%06lx, ItemHeight=%d, ItemWidth=%d, Style=0x%08lx\n", \
+ iP->hwndSelf, iP->clrBk, iP->clrText, iP->clrTextBk, \
+ iP->nItemHeight, iP->nItemWidth, GetWindowLongW (iP->hwndSelf, GWL_STYLE)); \
+ TRACE("hwndSelf=%08x, himlNor=%p, himlSml=%p, himlState=%p, Focused=%d, Hot=%d, exStyle=0x%08lx\n", \
+ iP->hwndSelf, iP->himlNormal, iP->himlSmall, iP->himlState, \
+ iP->nFocusedItem, iP->nHotItem, iP->dwExStyle); \
+ TRACE("hwndSelf=%08x, ntmH=%d, icSz.cx=%ld, icSz.cy=%ld, icSp.cx=%ld, icSp.cy=%ld\n", \
+ iP->hwndSelf, iP->ntmHeight, iP->iconSize.cx, iP->iconSize.cy, \
+ iP->iconSpacing.cx, iP->iconSpacing.cy); \
+} while(0)
/*
@@ -274,8 +282,8 @@
static void LISTVIEW_FillBackground(LISTVIEW_INFO *, HDC, LPRECT);
static void LISTVIEW_UpdateLargeItemLabelRect (LISTVIEW_INFO *, int, RECT*);
static LRESULT LISTVIEW_GetColumnT(LISTVIEW_INFO *, INT, LPLVCOLUMNW, BOOL);
-static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *, INT, SHORT, HWND);
-static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *, INT, SHORT, HWND);
+static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *, INT, INT, HWND);
+static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *, INT, INT, HWND);
static INT LISTVIEW_GetTopIndex(LISTVIEW_INFO *);
static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *, INT, BOOL);
static HWND CreateEditLabelT(LISTVIEW_INFO *, LPCWSTR, DWORD, INT, INT, INT, INT, BOOL);
@@ -312,26 +320,24 @@
else lstrcpynA((LPSTR)dest, (LPCSTR)src, max);
}
-static inline LPCSTR debugstr_t(LPCWSTR text, BOOL isW)
+static inline LPCSTR debugtext_t(LPCWSTR text, BOOL isW)
{
+ if (text == LPSTR_TEXTCALLBACKW) return "(callback)";
return isW ? debugstr_w(text) : debugstr_a((LPCSTR)text);
}
-static inline LPCSTR debugstr_tn(LPCWSTR text, BOOL isW, INT n)
+static inline LPCSTR debugtext_tn(LPCWSTR text, BOOL isW, INT n)
{
+ if (text == LPSTR_TEXTCALLBACKW) return "(callback)";
+ n = min(textlenT(text, isW), n);
return isW ? debugstr_wn(text, n) : debugstr_an((LPCSTR)text, n);
}
-static inline LPCSTR lv_dmp_str(LPCWSTR text, BOOL isW, INT n)
-{
- return debugstr_tn(text, isW, min(n, textlenT(text, isW)));
-}
-
static inline LPWSTR textdupTtoW(LPCWSTR text, BOOL isW)
{
LPWSTR wstr = (LPWSTR)text;
- TRACE("(text=%s, isW=%d)\n", debugstr_t(text, isW), isW);
+ TRACE("(text=%s, isW=%d)\n", debugtext_t(text, isW), isW);
if (!isW && text)
{
INT len = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)text, -1, NULL, 0);
@@ -462,7 +468,7 @@
else
WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR) pszTempBuf,
cchTempBufMax, NULL, NULL);
- TRACE(" text=%s\n", debugstr_t(pszTempBuf, convertToUnicode));
+ TRACE(" text=%s\n", debugtext_t(pszTempBuf, convertToUnicode));
savCchTextMax = pdi->item.cchTextMax;
savPszText = pdi->item.pszText;
pdi->item.pszText = pszTempBuf;
@@ -473,7 +479,7 @@
if (convertToUnicode || convertToAnsi)
{ /* convert back result */
- TRACE(" returned text=%s\n", debugstr_t(pdi->item.pszText, convertToUnicode));
+ TRACE(" returned text=%s\n", debugtext_t(pdi->item.pszText, convertToUnicode));
if (convertToUnicode) /* note : pointer can be changed by app ! */
WideCharToMultiByte(CP_ACP, 0, pdi->item.pszText, -1, (LPSTR) savPszText,
savCchTextMax, NULL, NULL);
@@ -498,7 +504,7 @@
n = min(min(n, strlenW(s1)), strlenW(s2));
res = CompareStringW(LOCALE_USER_DEFAULT, NORM_IGNORECASE, s1, n, s2, n);
- return res ? res - 2 : res;
+ return res ? res - sizeof(WCHAR) : res;
}
static char* debuglvitem_t(LPLVITEMW lpLVItem, BOOL isW)
@@ -511,8 +517,7 @@
" pszText=%s, cchTextMax=%d, iImage=%d, lParam=%lx, iIndent=%d}",
lpLVItem->mask, lpLVItem->iItem, lpLVItem->iSubItem,
lpLVItem->state, lpLVItem->stateMask,
- lpLVItem->pszText == LPSTR_TEXTCALLBACKW ? "(callback)" :
- lv_dmp_str(lpLVItem->pszText, isW, 80),
+ debugtext_tn(lpLVItem->pszText, isW, 80),
lpLVItem->cchTextMax, lpLVItem->iImage, lpLVItem->lParam,
lpLVItem->iIndent);
return buf;
@@ -527,26 +532,11 @@
snprintf(buf, 256, "{mask=%x, fmt=%x, cx=%d,"
" pszText=%s, cchTextMax=%d, iSubItem=%d}",
lpColumn->mask, lpColumn->fmt, lpColumn->cx,
- lpColumn->mask & LVCF_TEXT ? lpColumn->pszText == LPSTR_TEXTCALLBACKW ? "(callback)" :
- lv_dmp_str(lpColumn->pszText, isW, 80): "",
+ lpColumn->mask & LVCF_TEXT ? debugtext_tn(lpColumn->pszText, isW, 80): "",
lpColumn->mask & LVCF_TEXT ? lpColumn->cchTextMax: 0, lpColumn->iSubItem);
return buf;
}
-static void LISTVIEW_DumpListview(LISTVIEW_INFO *iP, INT line)
-{
- DWORD dwStyle = GetWindowLongW (iP->hwndSelf, GWL_STYLE);
- TRACE("listview %08x at line %d, clrBk=0x%06lx, clrText=0x%06lx, clrTextBk=0x%06lx, ItemHeight=%d, ItemWidth=%d, Style=0x%08lx\n",
- iP->hwndSelf, line, iP->clrBk, iP->clrText, iP->clrTextBk,
- iP->nItemHeight, iP->nItemWidth, dwStyle);
- TRACE("listview %08x at line %d, himlNor=%p, himlSml=%p, himlState=%p, Focused=%d, Hot=%d, exStyle=0x%08lx\n",
- iP->hwndSelf, line, iP->himlNormal, iP->himlSmall, iP->himlState,
- iP->nFocusedItem, iP->nHotItem, iP->dwExStyle);
- TRACE("listview %08x at line %d, ntmH=%d, icSz.cx=%ld, icSz.cy=%ld, icSp.cx=%ld, icSp.cy=%ld\n",
- iP->hwndSelf, line, iP->ntmHeight, iP->iconSize.cx, iP->iconSize.cy,
- iP->iconSpacing.cx, iP->iconSpacing.cy);
-}
-
static BOOL
LISTVIEW_SendCustomDrawNotify (LISTVIEW_INFO *infoPtr, DWORD dwDrawStage, HDC hdc,
RECT rc)
@@ -634,6 +624,10 @@
return (BOOL) retval;
}
+static inline int get_listview_type(LISTVIEW_INFO *infoPtr)
+{
+ return GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+}
/*************************************************************************
* LISTVIEW_ProcessLetterKeys
@@ -989,7 +983,7 @@
*/
static VOID LISTVIEW_AlignTop(LISTVIEW_INFO *infoPtr)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
POINT ptItem;
RECT rcView;
@@ -1057,7 +1051,7 @@
*/
static VOID LISTVIEW_AlignLeft(LISTVIEW_INFO *infoPtr)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
POINT ptItem;
RECT rcView;
@@ -1308,7 +1302,7 @@
*/
static INT LISTVIEW_CalculateWidth(LISTVIEW_INFO *infoPtr, INT nItem)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT nHeaderItemCount;
RECT rcHeaderItem;
INT nItemWidth = 0;
@@ -1411,7 +1405,7 @@
*/
static INT LISTVIEW_GetItemHeight(LISTVIEW_INFO *infoPtr)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT nItemHeight = 0;
if (uView == LVS_ICON)
@@ -2009,7 +2003,7 @@
*/
static VOID LISTVIEW_SetGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
LVITEMW item;
ZeroMemory(&item,sizeof(item));
@@ -2264,12 +2258,12 @@
*/
static INT LISTVIEW_MouseSelection(LISTVIEW_INFO *infoPtr, POINT pt)
{
- LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
+ LONG uView = get_listview_type(infoPtr);
INT i, topindex, bottomindex;
RECT rcItem;
topindex = LISTVIEW_GetTopIndex(infoPtr);
- if ((lStyle & LVS_TYPEMASK) == LVS_REPORT) {
+ if (uView == LVS_REPORT) {
bottomindex = topindex + LISTVIEW_GetCountPerColumn(infoPtr) + 1;
bottomindex = min(bottomindex, GETITEMCOUNT(infoPtr));
} else {
@@ -3492,15 +3486,11 @@
INT scrollOffset;
TRACE("\n");
- ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
- scrollInfo.cbSize = sizeof(SCROLLINFO);
- scrollInfo.fMask = SIF_POS;
nItem = ListView_GetTopIndex(infoPtr->hwndSelf);
/* add 1 for displaying a partial item at the bottom */
- nLast = nItem + LISTVIEW_GetCountPerColumn(infoPtr) + 1;
- nLast = min(nLast, GETITEMCOUNT(infoPtr));
+ nLast = min(nItem + LISTVIEW_GetCountPerColumn(infoPtr) + 1, GETITEMCOUNT(infoPtr));;
/* send cache hint notification */
if (lStyle & LVS_OWNERDATA)
@@ -3530,6 +3520,9 @@
return;
/* Get scroll bar info once before loop */
+ ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
+ scrollInfo.cbSize = sizeof(SCROLLINFO);
+ scrollInfo.fMask = SIF_POS;
GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo);
scrollOffset = scrollInfo.nPos;
@@ -3658,20 +3651,13 @@
*/
static INT LISTVIEW_GetCountPerRow(LISTVIEW_INFO *infoPtr)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
- INT nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
- INT nCountPerRow = 1;
+ UINT uView = get_listview_type(infoPtr);
+ INT nCountPerRow = 0;
- if (nListWidth > 0)
- {
- if (uView != LVS_REPORT)
- {
- nCountPerRow = nListWidth / infoPtr->nItemWidth;
- if (nCountPerRow == 0) nCountPerRow = 1;
- }
- }
+ if (uView != LVS_REPORT)
+ nCountPerRow = (infoPtr->rcList.right - infoPtr->rcList.left) / infoPtr->nItemWidth;
- return nCountPerRow;
+ return max(nCountPerRow, 1);
}
/***
@@ -3717,16 +3703,14 @@
*/
static INT LISTVIEW_GetColumnCount(LISTVIEW_INFO *infoPtr)
{
- LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
- INT nColumnCount = 0;
+ INT nColumnCount = 0;
- if ((lStyle & LVS_TYPEMASK) == LVS_LIST)
- {
- nColumnCount = infoPtr->rcList.right / infoPtr->nItemWidth;
- if (infoPtr->rcList.right % infoPtr->nItemWidth) nColumnCount++;
- }
+ if (get_listview_type(infoPtr) == LVS_LIST) {
+ nColumnCount = infoPtr->rcList.right / infoPtr->nItemWidth;
+ if (infoPtr->rcList.right % infoPtr->nItemWidth) nColumnCount++;
+ }
- return nColumnCount;
+ return nColumnCount;
}
@@ -3891,14 +3875,15 @@
*/
static VOID LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
HFONT hOldFont;
HPEN hPen, hOldPen;
DWORD cdmode;
RECT rect;
+ LISTVIEW_DUMP(infoPtr);
+
infoPtr->bIsDrawing = TRUE;
- LISTVIEW_DumpListview (infoPtr, __LINE__);
GetClientRect(infoPtr->hwndSelf, &rect);
cdmode = LISTVIEW_SendCustomDrawNotify(infoPtr,CDDS_PREPAINT,hdc,rect);
@@ -3955,7 +3940,7 @@
static LRESULT LISTVIEW_ApproximateViewRect(LISTVIEW_INFO *infoPtr, INT nItemCount,
WORD wWidth, WORD wHeight)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT nItemCountPerColumn = 1;
INT nColumnCount = 0;
DWORD dwViewRect = 0;
@@ -4019,7 +4004,7 @@
*/
static LRESULT LISTVIEW_Arrange(LISTVIEW_INFO *infoPtr, INT nAlignCode)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
BOOL bResult = FALSE;
if ((uView == LVS_ICON) || (uView == LVS_SMALLICON))
@@ -4175,7 +4160,7 @@
*/
static LRESULT LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
UINT uOwnerData = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_OWNERDATA;
BOOL bResult = FALSE;
@@ -4331,7 +4316,7 @@
BOOL bResult = TRUE;
INT nItem = infoPtr->nEditLabelItem;
- TRACE("(pszText=%s, nItem=%d, isW=%d)\n", debugstr_t(pszText, isW), nItem, isW);
+ TRACE("(pszText=%s, nItem=%d, isW=%d)\n", debugtext_t(pszText, isW), nItem, isW);
infoPtr->bEditing = FALSE;
if (!(lStyle & LVS_OWNERDATA))
@@ -4495,7 +4480,7 @@
*/
static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *infoPtr, INT nItem, BOOL bPartial)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT nScrollPosHeight = 0;
INT nScrollPosWidth = 0;
SCROLLINFO scrollInfo;
@@ -4841,21 +4826,6 @@
/***
* DESCRIPTION:
- * Retrieves the callback mask.
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- *
- * RETURN:
- * Value of mask
- */
-static UINT LISTVIEW_GetCallbackMask(LISTVIEW_INFO *infoPtr)
-{
- return infoPtr->uCallbackMask;
-}
-
-/***
- * DESCRIPTION:
* Retrieves column attributes.
*
* PARAMETER(S):
@@ -4971,7 +4941,7 @@
*/
static LRESULT LISTVIEW_GetColumnWidth(LISTVIEW_INFO *infoPtr, INT nColumn)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT nColumnWidth = 0;
HDITEMW hdi;
@@ -5005,7 +4975,7 @@
*/
static LRESULT LISTVIEW_GetCountPerPage(LISTVIEW_INFO *infoPtr)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT nItemCount = 0;
if (uView == LVS_LIST)
@@ -5368,7 +5338,7 @@
*/
static BOOL LISTVIEW_GetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, LPPOINT lpptPosition)
{
- UINT uView = GetWindowLongA(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
BOOL bResult = FALSE;
RECT rcBounding;
@@ -5484,7 +5454,7 @@
*/
static LRESULT LISTVIEW_GetItemRect(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprc)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
BOOL bResult = FALSE;
POINT ptOrigin;
POINT ptItem;
@@ -5865,7 +5835,7 @@
static LRESULT LISTVIEW_GetSubItemRect(LISTVIEW_INFO *infoPtr, INT nItem, INT nSubItem, INT
flags, LPRECT lprc)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT count;
TRACE("(nItem=%d, nSubItem=%d lprc=%p)\n", nItem, nSubItem,
@@ -5945,8 +5915,7 @@
}
else
{
- LONG style = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
- if ((style & LVS_TYPEMASK) == LVS_ICON)
+ if (get_listview_type(infoPtr) == LVS_ICON)
lResult = MAKELONG(DEFAULT_COLUMN_WIDTH, GetSystemMetrics(SM_CXSMICON)+HEIGHT_PADDING);
else
lResult = MAKELONG(infoPtr->nItemWidth, infoPtr->nItemHeight);
@@ -6031,7 +6000,7 @@
*/
static LRESULT LISTVIEW_GetNextItem(LISTVIEW_INFO *infoPtr, INT nItem, UINT uFlags)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
UINT uMask = 0;
LVFINDINFOW lvFindInfo;
INT nCountPerColumn;
@@ -6637,8 +6606,9 @@
}
/* insert item in header control */
- nNewColumn = SendMessageW(infoPtr->hwndHeader, HDM_INSERTITEMT(isW),
- (WPARAM)nColumn, (LPARAM)&hdi);
+ nNewColumn = SendMessageW(infoPtr->hwndHeader,
+ isW ? HDM_INSERTITEMW : HDM_INSERTITEMA,
+ (WPARAM)nColumn, (LPARAM)&hdi);
/* Need to reset the item width when inserting a new column */
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
@@ -6810,27 +6780,21 @@
*/
static LRESULT LISTVIEW_RedrawItems(LISTVIEW_INFO *infoPtr, INT nFirst, INT nLast)
{
- BOOL bResult = FALSE;
- RECT rcItem;
- INT i;
-
- if (nFirst <= nLast)
- {
- if ((nFirst >= 0) && (nFirst < GETITEMCOUNT(infoPtr)))
+ RECT rcItem;
+ INT i;
+
+ if (nLast < nFirst || min(nFirst, nLast) < 0 ||
+ max(nFirst, nLast) >= GETITEMCOUNT(infoPtr))
+ return FALSE;
+
+ for (i = nFirst; i <= nLast; i++)
{
- if ((nLast >= 0) && (nLast < GETITEMCOUNT(infoPtr)))
- {
- for (i = nFirst; i <= nLast; i++)
- {
- rcItem.left = LVIR_BOUNDS;
- LISTVIEW_GetItemRect(infoPtr, i, &rcItem);
- InvalidateRect(infoPtr->hwndSelf, &rcItem, TRUE);
- }
- }
+ rcItem.left = LVIR_BOUNDS;
+ LISTVIEW_GetItemRect(infoPtr, i, &rcItem);
+ InvalidateRect(infoPtr->hwndSelf, &rcItem, TRUE);
}
- }
- return bResult;
+ return TRUE;
}
/***
@@ -6868,55 +6832,23 @@
*/
static LRESULT LISTVIEW_Scroll(LISTVIEW_INFO *infoPtr, INT dx, INT dy)
{
- LONG lStyle = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE);
- UINT uView = lStyle & LVS_TYPEMASK;
- INT rows, mode, i;
-
- if (uView == LVS_REPORT)
- {
- rows = (abs(dy) + infoPtr->nItemHeight/2) / infoPtr->nItemHeight;
- if (rows != 0)
- {
- mode = (dy>0) ? SB_INTERNAL_DOWN : SB_INTERNAL_UP;
- for ( i=0; i<rows; i++)
- LISTVIEW_VScroll(infoPtr, mode, 0, 0);
- }
-
- if (dx != 0)
- {
- mode = (dx>0) ? SB_INTERNAL_RIGHT : SB_INTERNAL_LEFT;
- for ( i=0; i<abs(dx); i++)
- LISTVIEW_HScroll(infoPtr, mode, 0, 0);
- }
- return TRUE;
- }
- else if (uView == LVS_ICON)
- {
- INT mode, i;
-
- mode = (dy>0) ? SB_INTERNAL_DOWN : SB_INTERNAL_UP;
- for(i=0; i<abs(dy); i++)
- LISTVIEW_VScroll(infoPtr, mode, 0, 0);
- return TRUE;
- }
- else if (uView == LVS_SMALLICON)
- {
- INT mode, i;
-
- mode = (dy>0) ? SB_INTERNAL_DOWN : SB_INTERNAL_UP;
- for(i=0; i<abs(dy); i++)
- LISTVIEW_VScroll(infoPtr, mode, 0, 0);
- return TRUE;
- }
- else if (uView == LVS_LIST)
- {
- if (dy != 0) return FALSE;
- if (dx == 0) return TRUE;
- mode = (dx>0) ? SB_INTERNAL_RIGHT : SB_INTERNAL_LEFT;
- LISTVIEW_HScroll(infoPtr, mode, 0, 0);
- return TRUE;
- }
- return FALSE;
+ switch(get_listview_type(infoPtr)) {
+ case LVS_REPORT:
+ dy += (dy < 0 ? -1 : 1) * infoPtr->nItemHeight/2;
+ dy /= infoPtr->nItemHeight;
+ break;
+ case LVS_LIST:
+ if (dy != 0) return FALSE;
+ break;
+ default: /* icon */
+ dx = 0;
+ break;
+ }
+
+ if (dx != 0) LISTVIEW_HScroll(infoPtr, SB_INTERNAL, dx, 0);
+ if (dy != 0) LISTVIEW_VScroll(infoPtr, SB_INTERNAL, dy, 0);
+
+ return TRUE;
}
/***
@@ -6933,7 +6865,7 @@
*/
static LRESULT LISTVIEW_SetBkColor(LISTVIEW_INFO *infoPtr, COLORREF clrBk)
{
- if(infoPtr->clrBk!=clrBk){
+ if(infoPtr->clrBk != clrBk){
infoPtr->clrBk = clrBk;
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
}
@@ -6945,26 +6877,6 @@
/***
* DESCRIPTION:
- * Sets the callback mask. This mask will be used when the parent
- * window stores state information (some or all).
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- * [I] UINT : state mask
- *
- * RETURN:
- * SUCCESS : TRUE
- * FAILURE : FALSE
- */
-static BOOL LISTVIEW_SetCallbackMask(LISTVIEW_INFO *infoPtr, UINT uMask)
-{
- infoPtr->uCallbackMask = uMask;
-
- return TRUE;
-}
-
-/***
- * DESCRIPTION:
* Sets the attributes of a header item.
*
* PARAMETER(S):
@@ -7317,12 +7229,9 @@
*/
static LRESULT LISTVIEW_SetHotItem(LISTVIEW_INFO *infoPtr, INT iIndex)
{
- INT iOldIndex = infoPtr->nHotItem;
-
- /* set new style */
- infoPtr->nHotItem = iIndex;
-
- return iOldIndex;
+ INT iOldIndex = infoPtr->nHotItem;
+ infoPtr->nHotItem = iIndex;
+ return iOldIndex;
}
@@ -7339,11 +7248,9 @@
*/
static LRESULT LISTVIEW_SetHoverTime(LISTVIEW_INFO *infoPtr, DWORD dwHoverTime)
{
- DWORD oldHoverTime = infoPtr->dwHoverTime;
-
- infoPtr->dwHoverTime = dwHoverTime;
-
- return oldHoverTime;
+ DWORD oldHoverTime = infoPtr->dwHoverTime;
+ infoPtr->dwHoverTime = dwHoverTime;
+ return oldHoverTime;
}
/***
@@ -7426,7 +7333,7 @@
{
HIMAGELIST himlOld = 0;
INT oldHeight;
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
switch (nType)
{
@@ -7740,9 +7647,12 @@
{
TRACE("(clrTextBk=%lx)\n", clrTextBk);
- infoPtr->clrTextBk = clrTextBk;
- InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
-
+ if (infoPtr->clrTextBk != clrTextBk)
+ {
+ infoPtr->clrTextBk = clrTextBk;
+ InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
+ }
+
return TRUE;
}
@@ -7762,8 +7672,11 @@
{
TRACE("(clrText=%lx)\n", clrText);
- infoPtr->clrText = clrText;
- InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
+ if (infoPtr->clrText != clrText)
+ {
+ infoPtr->clrText = clrText;
+ InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
+ }
return TRUE;
}
@@ -7950,7 +7863,6 @@
infoPtr->nHotItem = -1;
infoPtr->iconSpacing.cx = GetSystemMetrics(SM_CXICONSPACING);
infoPtr->iconSpacing.cy = GetSystemMetrics(SM_CYICONSPACING);
- ZeroMemory(&infoPtr->rcList, sizeof(RECT));
infoPtr->hwndEdit = 0;
infoPtr->bEditing = FALSE;
infoPtr->nEditLabelItem = -1;
@@ -8078,10 +7990,9 @@
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
- * [I] INT : scroll code
- * [I] SHORT : current scroll position if scroll code is SB_THUMBPOSITION
- * or SB_THUMBTRACK.
- * [I] HWND : scrollbar control window handle
+ * [I] nScrollCode : scroll code
+ * [I] nScrollDiff : units to scroll in SB_INTERNAL mode, 0 otherwise
+ * [I] hScrollWnd : scrollbar control window handle
*
* RETURN:
* Zero
@@ -8089,117 +8000,93 @@
* NOTES:
* SB_LINEUP/SB_LINEDOWN:
* for LVS_ICON, LVS_SMALLICON is 37 by experiment
- * for LVS_REPORT is 1 line --> infoPtr->nItemHeight
- * for LVS_LIST cannot occur ??? (implemented as LVS_REPORT)
+ * for LVS_REPORT is 1 line
+ * for LVS_LIST cannot occur
*
*/
-static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode, SHORT nCurrentPos,
- HWND hScrollWnd)
+static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
+ INT nScrollDiff, HWND hScrollWnd)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
- SCROLLINFO scrollInfo;
- BOOL is_an_icon;
+ UINT uView = get_listview_type(infoPtr);
+ INT nOldScrollPos, nNewScrollPos;
+ SCROLLINFO scrollInfo;
+ BOOL is_an_icon;
- TRACE("(nScrollCode=%d, nCurrentPos=%d, hScrollWnd=%x)\n",
- nScrollCode, nCurrentPos, hScrollWnd);
+ TRACE("(nScrollCode=%d, nScrollDiff=%d)\n", nScrollCode, nScrollDiff);
- SendMessageW(infoPtr->hwndEdit, WM_KILLFOCUS, 0, 0);
+ SendMessageW(infoPtr->hwndEdit, WM_KILLFOCUS, 0, 0);
- ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
- scrollInfo.cbSize = sizeof(SCROLLINFO);
- scrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
+ ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
+ scrollInfo.cbSize = sizeof(SCROLLINFO);
+ scrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
- is_an_icon = ((uView == LVS_ICON) || (uView == LVS_SMALLICON));
+ is_an_icon = ((uView == LVS_ICON) || (uView == LVS_SMALLICON));
- if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo))
- {
- INT nOldScrollPos = scrollInfo.nPos;
+ if (!GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo)) return 1;
+
+ nOldScrollPos = scrollInfo.nPos;
switch (nScrollCode)
{
- case SB_INTERNAL_UP:
- if (scrollInfo.nPos > scrollInfo.nMin)
- scrollInfo.nPos--;
- break;
-
- case SB_INTERNAL_DOWN:
- if (scrollInfo.nPos < scrollInfo.nMax)
- scrollInfo.nPos++;
- break;
+ case SB_INTERNAL:
+ break;
case SB_LINEUP:
- if (scrollInfo.nPos > scrollInfo.nMin)
- scrollInfo.nPos -= (is_an_icon) ?
- LISTVIEW_SCROLL_ICON_LINE_SIZE : infoPtr->nItemHeight;
- break;
+ nScrollDiff = (is_an_icon) ? -LISTVIEW_SCROLL_ICON_LINE_SIZE : -1;
+ break;
case SB_LINEDOWN:
- if (scrollInfo.nPos < scrollInfo.nMax)
- scrollInfo.nPos += (is_an_icon) ?
- LISTVIEW_SCROLL_ICON_LINE_SIZE : infoPtr->nItemHeight;
- break;
+ nScrollDiff = (is_an_icon) ? LISTVIEW_SCROLL_ICON_LINE_SIZE : 1;
+ break;
case SB_PAGEUP:
- if (scrollInfo.nPos > scrollInfo.nMin)
- {
- if (scrollInfo.nPos >= scrollInfo.nPage)
- scrollInfo.nPos -= scrollInfo.nPage;
- else
- scrollInfo.nPos = scrollInfo.nMin;
- }
- break;
+ nScrollDiff = -scrollInfo.nPage;
+ break;
case SB_PAGEDOWN:
- if (scrollInfo.nPos < scrollInfo.nMax)
- {
- if (scrollInfo.nPos <= scrollInfo.nMax - scrollInfo.nPage)
- scrollInfo.nPos += scrollInfo.nPage;
- else
- scrollInfo.nPos = scrollInfo.nMax;
- }
- break;
+ nScrollDiff = scrollInfo.nPage;
+ break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
- scrollInfo.nPos = nCurrentPos;
- if (scrollInfo.nPos > scrollInfo.nMax)
- scrollInfo.nPos=scrollInfo.nMax;
-
- if (scrollInfo.nPos < scrollInfo.nMin)
- scrollInfo.nPos=scrollInfo.nMin;
+ nScrollDiff = scrollInfo.nTrackPos - scrollInfo.nPos;
+ break;
- break;
+ default:
+ nScrollDiff = 0;
}
- if (nOldScrollPos != scrollInfo.nPos)
- {
- scrollInfo.fMask = SIF_POS;
- SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo, TRUE);
-
- /* Get real position value, the value we set might have been changed
- * by SetScrollInfo (especially if we went too far.
- */
- scrollInfo.fMask = SIF_POS;
- GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo);
-
- /* only if the scroll position really changed, do we update screen */
- if (nOldScrollPos != scrollInfo.nPos)
- {
- if (IsWindowVisible(infoPtr->hwndHeader))
- {
- RECT rListview, rcHeader, rDest;
- GetClientRect(infoPtr->hwndSelf, &rListview);
- GetWindowRect(infoPtr->hwndHeader, &rcHeader);
- MapWindowPoints((HWND) NULL, infoPtr->hwndSelf, (LPPOINT) &rcHeader, 2);
- SubtractRect(&rDest, &rListview, &rcHeader);
- InvalidateRect(infoPtr->hwndSelf, &rDest, TRUE);
- }
- else
- InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
- }
+ /* quit right away if pos isn't changing */
+ if (nScrollDiff == 0) return 0;
+
+ /* calculate new position, and handle overflows */
+ nNewScrollPos = scrollInfo.nPos + nScrollDiff;
+ if (nScrollDiff > 0) {
+ if (nNewScrollPos < nOldScrollPos ||
+ nNewScrollPos > scrollInfo.nMax)
+ nNewScrollPos = scrollInfo.nMax;
+ } else {
+ if (nNewScrollPos > nOldScrollPos ||
+ nNewScrollPos < scrollInfo.nMin)
+ nNewScrollPos = scrollInfo.nMin;
}
- }
- return 0;
+ /* carry on only if it really changed */
+ if (nNewScrollPos == nOldScrollPos) return 0;
+
+ /* set the new position */
+ scrollInfo.fMask = SIF_POS;
+ scrollInfo.nPos = nNewScrollPos;
+ SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo, TRUE);
+
+ /* now adjust to client coordinates */
+ nScrollDiff = nOldScrollPos - nNewScrollPos;
+ if (uView == LVS_REPORT) nScrollDiff *= infoPtr->nItemHeight;
+
+ /* and scroll the window */
+ ScrollWindowEx( infoPtr->hwndSelf, 0, nScrollDiff, &infoPtr->rcList,
+ &infoPtr->rcList, 0, 0, SW_INVALIDATE);
+
+ return 0;
}
/***
@@ -8208,126 +8095,109 @@
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
- * [I] INT : scroll code
- * [I] SHORT : current scroll position if scroll code is SB_THUMBPOSITION
- * or SB_THUMBTRACK.
- * [I] HWND : scrollbar control window handle
+ * [I] nScrollCode : scroll code
+ * [I] nScrollDiff : units to scroll in SB_INTERNAL mode, 0 otherwise
+ * [I] hScrollWnd : scrollbar control window handle
*
* RETURN:
* Zero
*
* NOTES:
* SB_LINELEFT/SB_LINERIGHT:
- * for LVS_ICON, LVS_SMALLICON ??? (implemented as 1 pixel)
+ * for LVS_ICON, LVS_SMALLICON 1 pixel
* for LVS_REPORT is 1 pixel
* for LVS_LIST is 1 column --> which is a 1 because the
* scroll is based on columns not pixels
*
*/
-static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode, SHORT nCurrentPos,
- HWND hScrollWnd)
+static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
+ INT nScrollDiff, HWND hScrollWnd)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
- SCROLLINFO scrollInfo;
- BOOL is_a_list;
-
- TRACE("(nScrollCode=%d, nCurrentPos=%d, hScrollWnd=%x)\n",
- nScrollCode, nCurrentPos, hScrollWnd);
+ UINT uView = get_listview_type(infoPtr);
+ INT nOldScrollPos, nNewScrollPos;
+ SCROLLINFO scrollInfo;
- SendMessageW(infoPtr->hwndEdit, WM_KILLFOCUS, 0, 0);
+ TRACE("(nScrollCode=%d, nScrollDiff=%d)\n", nScrollCode, nScrollDiff);
- ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
- scrollInfo.cbSize = sizeof(SCROLLINFO);
- scrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE;
+ SendMessageW(infoPtr->hwndEdit, WM_KILLFOCUS, 0, 0);
- is_a_list = (uView == LVS_LIST);
+ ZeroMemory(&scrollInfo, sizeof(SCROLLINFO));
+ scrollInfo.cbSize = sizeof(SCROLLINFO);
+ scrollInfo.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
- if (GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo))
- {
- INT nOldScrollPos = scrollInfo.nPos;
+ if (!GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo)) return 1;
+ nOldScrollPos = scrollInfo.nPos;
+
switch (nScrollCode)
{
- case SB_INTERNAL_LEFT:
- if (scrollInfo.nPos > scrollInfo.nMin)
- scrollInfo.nPos--;
- break;
-
- case SB_INTERNAL_RIGHT:
- if (scrollInfo.nPos < scrollInfo.nMax)
- scrollInfo.nPos++;
- break;
+ case SB_INTERNAL:
+ break;
case SB_LINELEFT:
- if (scrollInfo.nPos > scrollInfo.nMin)
- scrollInfo.nPos--;
- break;
+ nScrollDiff = -1;
+ break;
case SB_LINERIGHT:
- if (scrollInfo.nPos < scrollInfo.nMax)
- scrollInfo.nPos++;
- break;
+ nScrollDiff = 1;
+ break;
case SB_PAGELEFT:
- if (scrollInfo.nPos > scrollInfo.nMin)
- {
- if (scrollInfo.nPos >= scrollInfo.nPage)
- scrollInfo.nPos -= scrollInfo.nPage;
- else
- scrollInfo.nPos = scrollInfo.nMin;
- }
- break;
+ nScrollDiff = -scrollInfo.nPage;
+ break;
case SB_PAGERIGHT:
- if (scrollInfo.nPos < scrollInfo.nMax)
- {
- if (scrollInfo.nPos <= scrollInfo.nMax - scrollInfo.nPage)
- scrollInfo.nPos += scrollInfo.nPage;
- else
- scrollInfo.nPos = scrollInfo.nMax;
- }
- break;
+ nScrollDiff = scrollInfo.nPage;
+ break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
- scrollInfo.nPos = nCurrentPos;
-
- if (scrollInfo.nPos > scrollInfo.nMax)
- scrollInfo.nPos=scrollInfo.nMax;
+ nScrollDiff = scrollInfo.nTrackPos - scrollInfo.nPos;
- if (scrollInfo.nPos < scrollInfo.nMin)
- scrollInfo.nPos=scrollInfo.nMin;
- break;
+ default:
+ nScrollDiff = 0;
}
- if (nOldScrollPos != scrollInfo.nPos)
- {
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
- scrollInfo.fMask = SIF_POS;
- SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
+ /* quit right away if pos isn't changing */
+ if (nScrollDiff == 0) return 0;
+
+ /* calculate new position, and handle overflows */
+ nNewScrollPos = scrollInfo.nPos + nScrollDiff;
+ if (nScrollDiff > 0) {
+ if (nNewScrollPos < nOldScrollPos ||
+ nNewScrollPos > scrollInfo.nMax)
+ nNewScrollPos = scrollInfo.nMax;
+ } else {
+ if (nNewScrollPos > nOldScrollPos ||
+ nNewScrollPos < scrollInfo.nMin)
+ nNewScrollPos = scrollInfo.nMin;
+ }
- /* Get real position value, the value we set might have been changed
- * by SetScrollInfo (especially if we went too far.
- */
- scrollInfo.fMask = SIF_POS;
- GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo);
+ /* carry on only if it really changed */
+ if (nNewScrollPos == nOldScrollPos) return 0;
+
+ /* set the new position */
+ scrollInfo.fMask = SIF_POS;
+ scrollInfo.nPos = nNewScrollPos;
+ SetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo, TRUE);
+
if(uView == LVS_REPORT)
- {
- LISTVIEW_UpdateHeaderSize(infoPtr, scrollInfo.nPos);
- }
-
- /* only if the scroll position really changed, do we update screen */
- if (nOldScrollPos != scrollInfo.nPos)
- InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
- }
- }
+ LISTVIEW_UpdateHeaderSize(infoPtr, nNewScrollPos);
+
+ /* now adjust to client coordinates */
+ nScrollDiff = nOldScrollPos - nNewScrollPos;
+ if (uView == LVS_REPORT) nScrollDiff *= infoPtr->nItemHeight;
+
+ /* and scroll the window */
+ ScrollWindowEx( infoPtr->hwndSelf, nScrollDiff, 0, &infoPtr->rcList,
+ &infoPtr->rcList, 0, 0, SW_INVALIDATE);
return 0;
}
static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO *infoPtr, INT wheelDelta)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT gcWheelDelta = 0;
UINT pulScrollLines = 3;
SCROLLINFO scrollInfo;
@@ -8389,7 +8259,7 @@
*/
static LRESULT LISTVIEW_KeyDown(LISTVIEW_INFO *infoPtr, INT nVirtualKey, LONG lKeyData)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT nItem = -1;
NMLVKEYDOWN nmKeyDown;
@@ -8476,7 +8346,7 @@
*/
static LRESULT LISTVIEW_KillFocus(LISTVIEW_INFO *infoPtr)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
INT i,nTop,nBottom;
TRACE("()\n");
@@ -9053,7 +8923,7 @@
*/
static LRESULT LISTVIEW_SetFont(LISTVIEW_INFO *infoPtr, HFONT hFont, WORD fRedraw)
{
- UINT uView = GetWindowLongW(infoPtr->hwndSelf, GWL_STYLE) & LVS_TYPEMASK;
+ UINT uView = get_listview_type(infoPtr);
TRACE("(hfont=%x,redraw=%hu)\n", hFont, fRedraw);
@@ -9393,7 +9263,7 @@
/* case LVM_GETBKIMAGE: */
case LVM_GETCALLBACKMASK:
- return LISTVIEW_GetCallbackMask(infoPtr);
+ return infoPtr->uCallbackMask;
case LVM_GETCOLUMNA:
return LISTVIEW_GetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
@@ -9576,7 +9446,8 @@
/* case LVM_SETBKIMAGE: */
case LVM_SETCALLBACKMASK:
- return LISTVIEW_SetCallbackMask(infoPtr, (UINT)wParam);
+ infoPtr->uCallbackMask = (UINT)wParam;
+ return TRUE;
case LVM_SETCOLUMNA:
return LISTVIEW_SetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
@@ -9701,9 +9572,7 @@
return infoPtr->hFont;
case WM_HSCROLL:
- if (SLOWORD(wParam) < 0) return 0; /* validate not internal codes */
- return LISTVIEW_HScroll(infoPtr, (INT)LOWORD(wParam),
- (INT)HIWORD(wParam), (HWND)lParam);
+ return LISTVIEW_HScroll(infoPtr, (INT)LOWORD(wParam), 0, (HWND)lParam);
case WM_KEYDOWN:
return LISTVIEW_KeyDown(infoPtr, (INT)wParam, (LONG)lParam);
@@ -9772,9 +9641,7 @@
/* case WM_TIMER: */
case WM_VSCROLL:
- if (SLOWORD(wParam) < 0) return 0; /* validate not internal codes */
- return LISTVIEW_VScroll(infoPtr, (INT)LOWORD(wParam),
- (INT)HIWORD(wParam), (HWND)lParam);
+ return LISTVIEW_VScroll(infoPtr, (INT)LOWORD(wParam), 0, (HWND)lParam);
case WM_MOUSEWHEEL:
if (wParam & (MK_SHIFT | MK_CONTROL))
@@ -10034,7 +9901,7 @@
TEXTMETRICW textMetric;
HINSTANCE hinst = GetWindowLongW(infoPtr->hwndSelf, GWL_HINSTANCE);
- TRACE("(text=%s, ..., isW=%d)\n", debugstr_t(text, isW), isW);
+ TRACE("(text=%s, ..., isW=%d)\n", debugtext_t(text, isW), isW);
style |= WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|WS_BORDER;
hdc = GetDC(infoPtr->hwndSelf);
More information about the wine-patches
mailing list