Cleanup of the way we maintain/lookup the item count.

Rename GetItemWidth to CalculateMaxWidth.
Misc trivial changes.
This commit is contained in:
Dimitrie O. Paun 2002-10-07 18:41:00 +00:00 committed by Alexandre Julliard
parent 1c7bf6229f
commit 914aac36b5
1 changed files with 108 additions and 125 deletions

View File

@ -154,6 +154,7 @@ typedef struct tagLISTVIEW_INFO
DWORD dwStyle; /* the cached window GWL_STYLE */
DWORD dwLvExStyle; /* extended listview style */
HDPA hdpaItems;
UINT nItemCount;
PFNLVCOMPARE pfnCompare;
LPARAM lParamSort;
HWND hwndEdit;
@ -234,12 +235,7 @@ DEFINE_COMMON_NOTIFICATIONS(LISTVIEW_INFO, hwndSelf);
/* Standard DrawText flags for LISTVIEW_UpdateLargeItemLabelRect and LISTVIEW_DrawLargeItem */
#define LISTVIEW_DTFLAGS DT_TOP | DT_CENTER | DT_WORDBREAK | DT_NOPREFIX | DT_EDITCONTROL
/*
* macros
*/
/* retrieve the number of items in the listview */
#define GETITEMCOUNT(infoPtr) ((infoPtr)->hdpaItems->nItemCount)
/* Dump the LISTVIEW_INFO structure to the debug channel */
#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, \
@ -269,7 +265,7 @@ static void LISTVIEW_AddGroupSelection(LISTVIEW_INFO *, INT);
static INT LISTVIEW_GetItemHeight(LISTVIEW_INFO *);
static BOOL LISTVIEW_GetItemPosition(LISTVIEW_INFO *, INT, LPPOINT);
static BOOL LISTVIEW_GetItemRect(LISTVIEW_INFO *, INT, LPRECT);
static INT LISTVIEW_GetItemWidth(LISTVIEW_INFO *);
static INT LISTVIEW_CalculateMaxWidth(LISTVIEW_INFO *);
static BOOL LISTVIEW_GetSubItemRect(LISTVIEW_INFO *, INT, LPRECT);
static INT LISTVIEW_GetLabelWidth(LISTVIEW_INFO *, INT);
static LRESULT LISTVIEW_GetColumnWidth(LISTVIEW_INFO *, INT);
@ -821,8 +817,8 @@ static RANGE LISTVIEW_GetVisibleRange(LISTVIEW_INFO *infoPtr)
}
visrange.upper = visrange.lower + nPerCol * nPerRow;
if (visrange.upper > GETITEMCOUNT(infoPtr))
visrange.upper = GETITEMCOUNT(infoPtr);
if (visrange.upper > infoPtr->nItemCount)
visrange.upper = infoPtr->nItemCount;
TRACE("range=(%d, %d)\n", visrange.lower, visrange.upper);
@ -874,18 +870,13 @@ static RANGE LISTVIEW_GetVisibleRange(LISTVIEW_INFO *infoPtr)
static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, LPARAM keyData)
{
INT nItem;
INT nSize;
INT endidx,idx;
LVITEMW item;
WCHAR buffer[MAX_PATH];
DWORD timestamp,elapsed;
/* simple parameter checking */
if (!charCode || !keyData)
return 0;
if (!infoPtr)
return 0;
if (!charCode || !keyData) return 0;
/* only allow the valid WM_CHARs through */
if (!isalnum(charCode) &&
@ -900,10 +891,8 @@ static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, L
charCode != '<' && charCode != ',' && charCode != '~')
return 0;
nSize=GETITEMCOUNT(infoPtr);
/* if there's one item or less, there is no where to go */
if (nSize <= 1)
return 0;
if (infoPtr->nItemCount <= 1) return 0;
/* compute how much time elapsed since last keypress */
timestamp=GetTickCount();
@ -941,12 +930,12 @@ static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, L
if (infoPtr->nSearchParamLength == 1)
idx++;
} else {
endidx=nSize;
endidx=infoPtr->nItemCount;
idx=0;
}
do {
if (idx == nSize) {
if (endidx == nSize || endidx == 0)
if (idx == infoPtr->nItemCount) {
if (endidx == infoPtr->nItemCount || endidx == 0)
break;
idx=0;
}
@ -1041,14 +1030,13 @@ static void LISTVIEW_UpdateScroll(LISTVIEW_INFO *infoPtr)
/* update horizontal scrollbar */
INT nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
INT nCountPerRow = LISTVIEW_GetCountPerRow(infoPtr);
INT nNumOfItems = GETITEMCOUNT(infoPtr);
TRACE("items=%d, perColumn=%d, perRow=%d\n",
nNumOfItems, nCountPerColumn, nCountPerRow);
infoPtr->nItemCount, nCountPerColumn, nCountPerRow);
scrollInfo.nMin = 0;
scrollInfo.nMax = nNumOfItems / nCountPerColumn;
if((nNumOfItems % nCountPerColumn) == 0)
scrollInfo.nMax = infoPtr->nItemCount / nCountPerColumn;
if((infoPtr->nItemCount % nCountPerColumn) == 0)
scrollInfo.nMax--;
if (scrollInfo.nMax < 0) scrollInfo.nMax = 0;
scrollInfo.nPos = ListView_GetTopIndex(infoPtr->hwndSelf) / nCountPerColumn;
@ -1063,7 +1051,7 @@ static void LISTVIEW_UpdateScroll(LISTVIEW_INFO *infoPtr)
/* update vertical scrollbar */
scrollInfo.nMin = 0;
scrollInfo.nMax = GETITEMCOUNT(infoPtr) - 1;
scrollInfo.nMax = infoPtr->nItemCount - 1;
scrollInfo.nPos = ListView_GetTopIndex(infoPtr->hwndSelf);
scrollInfo.nPage = LISTVIEW_GetCountPerColumn(infoPtr);
scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE;
@ -1077,7 +1065,7 @@ static void LISTVIEW_UpdateScroll(LISTVIEW_INFO *infoPtr)
nListWidth = infoPtr->rcList.right - infoPtr->rcList.left;
scrollInfo.fMask = SIF_POS;
if (!GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo)
|| GETITEMCOUNT(infoPtr) == 0)
|| infoPtr->nItemCount == 0)
{
scrollInfo.nPos = 0;
}
@ -1109,7 +1097,7 @@ static void LISTVIEW_UpdateScroll(LISTVIEW_INFO *infoPtr)
/* Update Horizontal Scrollbar */
scrollInfo.fMask = SIF_POS;
if (!GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo)
|| GETITEMCOUNT(infoPtr) == 0)
|| infoPtr->nItemCount == 0)
{
scrollInfo.nPos = 0;
}
@ -1124,7 +1112,7 @@ static void LISTVIEW_UpdateScroll(LISTVIEW_INFO *infoPtr)
nListHeight = infoPtr->rcList.bottom - infoPtr->rcList.top;
scrollInfo.fMask = SIF_POS;
if (!GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo)
|| GETITEMCOUNT(infoPtr) == 0)
|| infoPtr->nItemCount == 0)
{
scrollInfo.nPos = 0;
}
@ -1530,7 +1518,7 @@ static void LISTVIEW_AlignTop(LISTVIEW_INFO *infoPtr)
if (nListWidth > infoPtr->nItemWidth)
{
for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
for (i = 0; i < infoPtr->nItemCount; i++)
{
if ((ptItem.x-off_x) + infoPtr->nItemWidth > nListWidth)
{
@ -1548,7 +1536,7 @@ static void LISTVIEW_AlignTop(LISTVIEW_INFO *infoPtr)
}
else
{
for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
for (i = 0; i < infoPtr->nItemCount; i++)
{
LISTVIEW_SetItemPosition(infoPtr, i, ptItem.x, ptItem.y);
ptItem.y += infoPtr->nItemHeight;
@ -1596,7 +1584,7 @@ static void LISTVIEW_AlignLeft(LISTVIEW_INFO *infoPtr)
if (nListHeight > infoPtr->nItemHeight)
{
for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
for (i = 0; i < infoPtr->nItemCount; i++)
{
if (ptItem.y + infoPtr->nItemHeight > nListHeight)
{
@ -1613,7 +1601,7 @@ static void LISTVIEW_AlignLeft(LISTVIEW_INFO *infoPtr)
}
else
{
for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
for (i = 0; i < infoPtr->nItemCount; i++)
{
LISTVIEW_SetItemPosition(infoPtr, i, ptItem.x, ptItem.y);
ptItem.x += infoPtr->nItemWidth;
@ -1699,7 +1687,7 @@ static LISTVIEW_SUBITEM* LISTVIEW_GetSubItemPtr(HDPA hdpaSubItems,
* RETURN:
* Returns the width of an item width an item.
*/
static INT LISTVIEW_CalculateWidth(LISTVIEW_INFO *infoPtr, INT nItem)
static INT LISTVIEW_CalculateItemWidth(LISTVIEW_INFO *infoPtr, INT nItem)
{
UINT uView = LISTVIEW_GetType(infoPtr);
INT nItemWidth = 0, i;
@ -1721,12 +1709,12 @@ static INT LISTVIEW_CalculateWidth(LISTVIEW_INFO *infoPtr, INT nItem)
{
INT nLabelWidth;
if (GETITEMCOUNT(infoPtr) == 0) return DEFAULT_COLUMN_WIDTH;
if (infoPtr->nItemCount == 0) return DEFAULT_COLUMN_WIDTH;
/* get width of string */
if (nItem == -1)
{
for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
for (i = 0; i < infoPtr->nItemCount; i++)
{
nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, i);
nItemWidth = max(nItemWidth, nLabelWidth);
@ -1755,9 +1743,9 @@ static INT LISTVIEW_CalculateWidth(LISTVIEW_INFO *infoPtr, INT nItem)
* RETURN:
* Returns item width.
*/
static inline INT LISTVIEW_GetItemWidth(LISTVIEW_INFO *infoPtr)
static inline INT LISTVIEW_CalculateMaxWidth(LISTVIEW_INFO *infoPtr)
{
return LISTVIEW_CalculateWidth(infoPtr, -1);
return LISTVIEW_CalculateItemWidth(infoPtr, -1);
}
/***
@ -2116,7 +2104,7 @@ static INT LISTVIEW_GetSelectedCount(LISTVIEW_INFO *infoPtr)
if (infoPtr->uCallbackMask & LVIS_SELECTED)
{
INT i;
for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
for (i = 0; i < infoPtr->nItemCount; i++)
{
if (LISTVIEW_GetItemState(infoPtr, i, LVIS_SELECTED))
nSelectedCount++;
@ -2204,8 +2192,8 @@ static void LISTVIEW_ShiftIndices(LISTVIEW_INFO *infoPtr, INT nItem, INT directi
{
if (direction > 0)
infoPtr->nSelectionMark += direction;
else if (infoPtr->nSelectionMark >= GETITEMCOUNT(infoPtr))
infoPtr->nSelectionMark = GETITEMCOUNT(infoPtr) - 1;
else if (infoPtr->nSelectionMark >= infoPtr->nItemCount)
infoPtr->nSelectionMark = infoPtr->nItemCount - 1;
}
if (infoPtr->nFocusedItem > nItem)
@ -2216,8 +2204,8 @@ static void LISTVIEW_ShiftIndices(LISTVIEW_INFO *infoPtr, INT nItem, INT directi
infoPtr->nFocusedItem += direction;
else
{
if (infoPtr->nFocusedItem >= GETITEMCOUNT(infoPtr))
infoPtr->nFocusedItem = GETITEMCOUNT(infoPtr) - 1;
if (infoPtr->nFocusedItem >= infoPtr->nItemCount)
infoPtr->nFocusedItem = infoPtr->nItemCount - 1;
if (infoPtr->nFocusedItem >= 0)
LISTVIEW_SetItemFocus(infoPtr, infoPtr->nFocusedItem);
}
@ -2309,7 +2297,7 @@ static void LISTVIEW_SetGroupSelection(LISTVIEW_INFO *infoPtr, INT nItem)
rcSelMark.left = LVIR_BOUNDS;
if (!LISTVIEW_GetItemRect(infoPtr, infoPtr->nSelectionMark, &rcSelMark)) return;
UnionRect(&rcSel, &rcItem, &rcSelMark);
for (i = 0; i <= GETITEMCOUNT(infoPtr); i++)
for (i = 0; i <= infoPtr->nItemCount; i++)
{
LISTVIEW_GetItemPosition(infoPtr, i, &ptItem);
if (PtInRect(&rcSel, ptItem))
@ -2366,7 +2354,7 @@ static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *infoPtr, INT nItem)
WORD wCtrl = HIWORD(GetKeyState(VK_CONTROL));
BOOL bResult = FALSE;
if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
{
if (lStyle & LVS_SINGLESEL)
{
@ -2673,7 +2661,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL isW)
/* if LVS_LIST or LVS_SMALLICON, update the width of the items */
if((uChanged & LVIF_TEXT) && ((uView == LVS_LIST) || (uView == LVS_SMALLICON)))
{
int item_width = LISTVIEW_CalculateWidth(infoPtr, lpLVItem->iItem);
int item_width = LISTVIEW_CalculateItemWidth(infoPtr, lpLVItem->iItem);
if(item_width > infoPtr->nItemWidth) infoPtr->nItemWidth = item_width;
}
@ -2791,8 +2779,7 @@ static BOOL LISTVIEW_SetItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL i
TRACE("(lpLVItem=%s, isW=%d)\n", debuglvitem_t(lpLVItem, isW), isW);
if (!lpLVItem || lpLVItem->iItem < 0 ||
lpLVItem->iItem>=GETITEMCOUNT(infoPtr))
if (!lpLVItem || lpLVItem->iItem < 0 || lpLVItem->iItem >= infoPtr->nItemCount)
return FALSE;
/* For efficiency, we transform the lpLVItem->pszText to Unicode here */
@ -3288,9 +3275,6 @@ static void LISTVIEW_RefreshReport(LISTVIEW_INFO *infoPtr, HDC hdc, DWORD cdmode
TRACE("()\n");
/* nothing to draw */
if(GETITEMCOUNT(infoPtr) == 0) return;
/* figure out what to draw */
rgntype = GetClipBox(hdc, &rcClip);
if (rgntype == NULLREGION) return;
@ -3302,8 +3286,8 @@ static void LISTVIEW_RefreshReport(LISTVIEW_INFO *infoPtr, HDC hdc, DWORD cdmode
nItem = nTop;
nLast = nItem + nUpdateHeight / infoPtr->nItemHeight;
if (nUpdateHeight % infoPtr->nItemHeight) nLast++;
if (nLast > GETITEMCOUNT(infoPtr))
nLast = GETITEMCOUNT(infoPtr);
if (nLast > infoPtr->nItemCount)
nLast = infoPtr->nItemCount;
/* send cache hint notification */
if (lStyle & LVS_OWNERDATA)
@ -3484,15 +3468,11 @@ static void LISTVIEW_RefreshList(LISTVIEW_INFO *infoPtr, HDC hdc, DWORD cdmode)
TRACE("nColumnCount=%d, nCountPerColumn=%d, start item=%d\n",
nColumnCount, nCountPerColumn, nItem);
/* nothing to draw, return here */
if(GETITEMCOUNT(infoPtr) == 0)
return;
for (i = 0; i < nColumnCount; i++)
{
for (j = 0; j < nCountPerColumn; j++, nItem++)
{
if (nItem >= GETITEMCOUNT(infoPtr))
if (nItem >= infoPtr->nItemCount)
return;
if (cdmode & CDRF_NOTIFYITEMDRAW)
@ -3535,16 +3515,12 @@ static void LISTVIEW_RefreshIcon(LISTVIEW_INFO *infoPtr, HDC hdc, BOOL bSmall, D
TRACE("\n");
/* nothing to draw, return here */
if(GETITEMCOUNT(infoPtr) == 0)
return;
if (!LISTVIEW_GetOrigin(infoPtr, &ptOrigin)) return;
GetClipBox(hdc, &rcClip);
/* Draw the visible non-selected items */
for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
for (i = 0; i < infoPtr->nItemCount; i++)
{
if (LISTVIEW_GetItemState(infoPtr,i,LVIS_SELECTED))
continue;
@ -3589,7 +3565,7 @@ static void LISTVIEW_RefreshIcon(LISTVIEW_INFO *infoPtr, HDC hdc, BOOL bSmall, D
}
/* Draw the visible selected items */
for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
for (i = 0; i < infoPtr->nItemCount; i++)
{
if (!LISTVIEW_GetItemState(infoPtr,i,LVIS_SELECTED))
continue;
@ -3661,6 +3637,9 @@ static void LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc)
infoPtr->bIsDrawing = TRUE;
/* nothing to draw */
if(infoPtr->nItemCount == 0) goto enddraw;
/* select font */
hOldFont = SelectObject(hdc, infoPtr->hFont);
@ -3678,6 +3657,7 @@ static void LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc)
/* unselect objects */
SelectObject(hdc, hOldFont);
enddraw:
if (cdmode & CDRF_NOTIFYPOSTPAINT)
notify_customdraw(infoPtr, CDDS_POSTPAINT, hdc, rcClient);
@ -3707,7 +3687,7 @@ static LRESULT LISTVIEW_ApproximateViewRect(LISTVIEW_INFO *infoPtr, INT nItemCou
DWORD dwViewRect = 0;
if (nItemCount == -1)
nItemCount = GETITEMCOUNT(infoPtr);
nItemCount = infoPtr->nItemCount;
if (uView == LVS_LIST)
{
@ -3824,12 +3804,12 @@ static LRESULT LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr)
if (lStyle & LVS_OWNERDATA)
{
infoPtr->hdpaItems->nItemCount = 0;
infoPtr->nItemCount = 0;
LISTVIEW_InvalidateList(infoPtr);
return TRUE;
}
if (GETITEMCOUNT(infoPtr) > 0)
if (infoPtr->nItemCount > 0)
{
INT i, j;
@ -3840,7 +3820,7 @@ static LRESULT LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr)
nmlv.iItem = -1;
bSuppress = notify_listview(infoPtr, LVN_DELETEALLITEMS, &nmlv);
for (i = 0; i < GETITEMCOUNT(infoPtr); i++)
for (i = 0; i < infoPtr->nItemCount; i++)
{
hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, i);
if (hdpaSubItems != NULL)
@ -3884,6 +3864,7 @@ static LRESULT LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr)
/* reinitialize listview memory */
bResult = DPA_DeleteAllPtrs(infoPtr->hdpaItems);
infoPtr->nItemCount = 0;
/* align items (set position of each item) */
if ((uView == LVS_ICON) || (uView == LVS_SMALLICON))
@ -3942,7 +3923,7 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn)
HDPA hdpaSubItems;
INT nItem, nSubItem, i;
for (nItem = 0; nItem < infoPtr->hdpaItems->nItemCount; nItem++)
for (nItem = 0; nItem < infoPtr->nItemCount; nItem++)
{
hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem);
if (!hdpaSubItems) continue;
@ -3983,7 +3964,7 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn)
if (uView != LVS_REPORT) return TRUE;
/* Need to reset the item width when deleting a column */
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
infoPtr->nItemWidth -= rcCol.right - rcCol.left;
/* update scrollbar(s) */
LISTVIEW_UpdateScroll(infoPtr);
@ -4042,12 +4023,12 @@ static LRESULT LISTVIEW_DeleteItem(LISTVIEW_INFO *infoPtr, INT nItem)
if (lStyle & LVS_OWNERDATA)
{
infoPtr->hdpaItems->nItemCount --;
infoPtr->nItemCount--;
LISTVIEW_InvalidateList(infoPtr); /*FIXME: optimize */
return TRUE;
}
if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
{
/* initialize memory */
ZeroMemory(&nmlv, sizeof(NMLISTVIEW));
@ -4055,6 +4036,7 @@ static LRESULT LISTVIEW_DeleteItem(LISTVIEW_INFO *infoPtr, INT nItem)
hdpaSubItems = (HDPA)DPA_DeletePtr(infoPtr->hdpaItems, nItem);
if (hdpaSubItems != NULL)
{
infoPtr->nItemCount--;
for (i = 1; i < hdpaSubItems->nItemCount; i++)
{
lpSubItem = (LISTVIEW_SUBITEM *)DPA_GetPtr(hdpaSubItems, i);
@ -4359,7 +4341,7 @@ static LRESULT LISTVIEW_FindItemW(LISTVIEW_INFO *infoPtr, INT nStart,
LVITEMW lvItem;
BOOL bWrap = FALSE;
INT nItem = nStart;
INT nLast = GETITEMCOUNT(infoPtr);
INT nLast = infoPtr->nItemCount;
if ((nItem >= -1) && (lpFindInfo != NULL))
{
@ -4667,7 +4649,7 @@ static LRESULT LISTVIEW_GetCountPerPage(LISTVIEW_INFO *infoPtr)
}
else
{
nItemCount = GETITEMCOUNT(infoPtr);
nItemCount = infoPtr->nItemCount;
}
return nItemCount;
@ -4764,7 +4746,7 @@ static BOOL LISTVIEW_GetItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOOL i
TRACE("(lpLVItem=%s, isW=%d)\n", debuglvitem_t(lpLVItem, isW), isW);
if (!lpLVItem || (lpLVItem->iItem < 0) ||
(lpLVItem->iItem >= GETITEMCOUNT(infoPtr)))
(lpLVItem->iItem >= infoPtr->nItemCount))
return FALSE;
/* a quick optimization if all we're asked is the focus state
@ -4966,8 +4948,7 @@ static BOOL LISTVIEW_GetItemExtT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, BOO
LPWSTR pszText;
BOOL bResult;
if (!lpLVItem || (lpLVItem->iItem < 0) ||
(lpLVItem->iItem >= GETITEMCOUNT(infoPtr)))
if (!lpLVItem || lpLVItem->iItem < 0 || lpLVItem->iItem >= infoPtr->nItemCount)
return FALSE;
pszText = lpLVItem->pszText;
@ -4999,7 +4980,7 @@ static BOOL LISTVIEW_GetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, LPPOINT
{
TRACE("(nItem=%d, lpptPosition=%p)\n", nItem, lpptPosition);
if ((nItem < 0) || (nItem >= GETITEMCOUNT(infoPtr)) || !lpptPosition) return FALSE;
if (!lpptPosition || nItem < 0 || nItem >= infoPtr->nItemCount) return FALSE;
return LISTVIEW_GetItemMeasures(infoPtr, nItem, lpptPosition, NULL, NULL, NULL, NULL);
}
@ -5189,7 +5170,7 @@ static BOOL LISTVIEW_GetItemRect(LISTVIEW_INFO *infoPtr, INT nItem, LPRECT lprc)
TRACE("(hwnd=%x, nItem=%d, lprc=%p)\n", infoPtr->hwndSelf, nItem, lprc);
if ((nItem < 0) || (nItem >= GETITEMCOUNT(infoPtr)) || !lprc) return FALSE;
if (!lprc || nItem < 0 || nItem >= infoPtr->nItemCount) return FALSE;
switch(lprc->left)
{
@ -5343,7 +5324,7 @@ static LRESULT LISTVIEW_GetItemState(LISTVIEW_INFO *infoPtr, INT nItem, UINT uMa
{
LVITEMW lvItem;
if ((nItem < 0) || (nItem >= GETITEMCOUNT(infoPtr))) return 0;
if (nItem < 0 || nItem >= infoPtr->nItemCount) return 0;
lvItem.iItem = nItem;
lvItem.iSubItem = 0;
@ -5370,7 +5351,7 @@ static LRESULT LISTVIEW_GetItemState(LISTVIEW_INFO *infoPtr, INT nItem, UINT uMa
*/
static LRESULT LISTVIEW_GetItemTextT(LISTVIEW_INFO *infoPtr, INT nItem, LPLVITEMW lpLVItem, BOOL isW)
{
if (!lpLVItem || (nItem < 0) || (nItem >= GETITEMCOUNT(infoPtr))) return 0;
if (!lpLVItem || nItem < 0 || nItem >= infoPtr->nItemCount) return 0;
lpLVItem->mask = LVIF_TEXT;
lpLVItem->iItem = nItem;
@ -5405,7 +5386,7 @@ static LRESULT LISTVIEW_GetNextItem(LISTVIEW_INFO *infoPtr, INT nItem, UINT uFla
TRACE("nItem=%d, uFlags=%x\n", nItem, uFlags);
if ((nItem < -1) || (nItem >= GETITEMCOUNT(infoPtr))) return -1;
if (nItem < -1 || nItem >= infoPtr->nItemCount) return -1;
ZeroMemory(&lvFindInfo, sizeof(lvFindInfo));
@ -5456,7 +5437,7 @@ static LRESULT LISTVIEW_GetNextItem(LISTVIEW_INFO *infoPtr, INT nItem, UINT uFla
{
if ((uView == LVS_LIST) || (uView == LVS_REPORT))
{
while (nItem < GETITEMCOUNT(infoPtr))
while (nItem < infoPtr->nItemCount)
{
nItem++;
if ((LISTVIEW_GetItemState(infoPtr, nItem, uMask) & uMask) == uMask)
@ -5504,7 +5485,7 @@ static LRESULT LISTVIEW_GetNextItem(LISTVIEW_INFO *infoPtr, INT nItem, UINT uFla
if (uView == LVS_LIST)
{
nCountPerColumn = LISTVIEW_GetCountPerColumn(infoPtr);
while (nItem + nCountPerColumn < GETITEMCOUNT(infoPtr))
while (nItem + nCountPerColumn < infoPtr->nItemCount)
{
nItem += nCountPerColumn;
if ((ListView_GetItemState(infoPtr->hwndSelf, nItem, uMask) & uMask) == uMask)
@ -5528,7 +5509,7 @@ static LRESULT LISTVIEW_GetNextItem(LISTVIEW_INFO *infoPtr, INT nItem, UINT uFla
nItem++;
/* search by index */
for (i = nItem; i < GETITEMCOUNT(infoPtr); i++)
for (i = nItem; i < infoPtr->nItemCount; i++)
{
if ((LISTVIEW_GetItemState(infoPtr, i, uMask) & uMask) == uMask)
return i;
@ -5658,11 +5639,11 @@ static INT LISTVIEW_SuperHitTestItem(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lph
if (uView == LVS_REPORT)
{
bottomindex = topindex + LISTVIEW_GetCountPerColumn(infoPtr) + 1;
bottomindex = min(bottomindex,GETITEMCOUNT(infoPtr));
bottomindex = min(bottomindex,infoPtr->nItemCount);
}
else
{
bottomindex = GETITEMCOUNT(infoPtr);
bottomindex = infoPtr->nItemCount;
}
for (i = topindex; i < bottomindex; i++)
@ -5888,7 +5869,7 @@ static LRESULT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
if (!Header_GetItemRect(infoPtr->hwndHeader, nNewColumn, &rcCol)) return -1;
/* now we have to actually adjust the data */
if (!(infoPtr->dwStyle & LVS_OWNERDATA) && infoPtr->hdpaItems->nItemCount > 0)
if (!(infoPtr->dwStyle & LVS_OWNERDATA) && infoPtr->nItemCount > 0)
{
LISTVIEW_SUBITEM *lpSubItem, *lpMainItem, **lpNewItems = 0;
HDPA hdpaSubItems;
@ -5897,11 +5878,11 @@ static LRESULT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
/* preallocate memory, so we can fail gracefully */
if (nNewColumn == 0)
{
lpNewItems = COMCTL32_Alloc(sizeof(LISTVIEW_SUBITEM *) * infoPtr->hdpaItems->nItemCount);
lpNewItems = COMCTL32_Alloc(sizeof(LISTVIEW_SUBITEM *) * infoPtr->nItemCount);
if (!lpNewItems) return -1;
for (i = 0; i < infoPtr->hdpaItems->nItemCount; i++)
for (i = 0; i < infoPtr->nItemCount; i++)
if (!(lpNewItems[i] = COMCTL32_Alloc(sizeof(LISTVIEW_SUBITEM)))) break;
if (i != infoPtr->hdpaItems->nItemCount)
if (i != infoPtr->nItemCount)
{
for(; i >=0; i--) COMCTL32_Free(lpNewItems[i]);
COMCTL32_Free(lpNewItems);
@ -5909,7 +5890,7 @@ static LRESULT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
}
}
for (nItem = 0; nItem < infoPtr->hdpaItems->nItemCount; nItem++)
for (nItem = 0; nItem < infoPtr->nItemCount; nItem++)
{
hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem);
if (!hdpaSubItems) continue;
@ -5941,7 +5922,7 @@ static LRESULT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
if ((infoPtr->dwStyle & LVS_TYPEMASK) != LVS_REPORT) return nNewColumn;
/* Need to reset the item width when inserting a new column */
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
infoPtr->nItemWidth += rcCol.right - rcCol.left;
LISTVIEW_UpdateScroll(infoPtr);
@ -6007,8 +5988,8 @@ static LRESULT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
if (lStyle & LVS_OWNERDATA)
{
nItem = infoPtr->hdpaItems->nItemCount;
infoPtr->hdpaItems->nItemCount++;
nItem = infoPtr->nItemCount;
infoPtr->nItemCount++;
return nItem;
}
@ -6029,13 +6010,15 @@ static LRESULT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
!(lStyle & LVS_OWNERDRAWFIXED) && (LPSTR_TEXTCALLBACKW != lpLVItem->pszText);
nItem = DPA_InsertPtr( infoPtr->hdpaItems,
is_sorted ? GETITEMCOUNT( infoPtr ) + 1 : lpLVItem->iItem,
is_sorted ? infoPtr->nItemCount + 1 : lpLVItem->iItem,
hdpaSubItems );
if (nItem == -1) goto fail;
infoPtr->nItemCount++;
if (!LISTVIEW_SetItemT(infoPtr, lpLVItem, isW))
{
DPA_DeletePtr(infoPtr->hdpaItems, nItem);
infoPtr->nItemCount--;
goto fail;
}
@ -6105,7 +6088,7 @@ static LRESULT LISTVIEW_RedrawItems(LISTVIEW_INFO *infoPtr, INT nFirst, INT nLas
INT i;
if (nLast < nFirst || min(nFirst, nLast) < 0 ||
max(nFirst, nLast) >= GETITEMCOUNT(infoPtr))
max(nFirst, nLast) >= infoPtr->nItemCount)
return FALSE;
for (i = nFirst; i <= nLast; i++)
@ -6385,7 +6368,7 @@ static LRESULT LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT iCol, INT cx)
if (iCol == 0 || uView == LVS_LIST)
{
cx = 0;
for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
for(item_index = 0; item_index < infoPtr->nItemCount; item_index++)
{
nLabelWidth = LISTVIEW_GetLabelWidth(infoPtr, item_index);
cx = (nLabelWidth>cx)?nLabelWidth:cx;
@ -6400,7 +6383,7 @@ static LRESULT LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT iCol, INT cx)
lvItem.pszText = szDispText;
lvItem.cchTextMax = DISP_TEXT_SIZE;
cx = 0;
for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
for(item_index = 0; item_index < infoPtr->nItemCount; item_index++)
{
lvItem.iItem = item_index;
if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) continue;
@ -6463,7 +6446,7 @@ static LRESULT LISTVIEW_SetColumnWidth(LISTVIEW_INFO *infoPtr, INT iCol, INT cx)
lvItem.pszText = szDispText;
lvItem.cchTextMax = DISP_TEXT_SIZE;
cx = size.cx;
for(item_index = 0; item_index < GETITEMCOUNT(infoPtr); item_index++)
for(item_index = 0; item_index < infoPtr->nItemCount; item_index++)
{
lvItem.iItem = item_index;
if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) continue;
@ -6621,7 +6604,7 @@ static LRESULT LISTVIEW_SetIconSpacing(LISTVIEW_INFO *infoPtr, DWORD spacing)
infoPtr->ntmHeight);
/* these depend on the iconSpacing */
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
return oldspacing;
@ -6723,7 +6706,7 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
LISTVIEW_RemoveAllSelections(infoPtr);
precount = infoPtr->hdpaItems->nItemCount;
precount = infoPtr->nItemCount;
topvisible = LISTVIEW_GetTopIndex(infoPtr) +
LISTVIEW_GetCountPerColumn(infoPtr) + 1;
@ -6732,13 +6715,13 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
if (!DPA_SetPtr(infoPtr->hdpaItems, nItems - 1, NULL))
return FALSE;
infoPtr->nItemWidth = max(LISTVIEW_GetItemWidth(infoPtr),
infoPtr->nItemWidth = max(LISTVIEW_CalculateMaxWidth(infoPtr),
DEFAULT_COLUMN_WIDTH);
LISTVIEW_UpdateSize(infoPtr);
LISTVIEW_UpdateScroll(infoPtr);
if (min(precount,infoPtr->hdpaItems->nItemCount)<topvisible)
if (min(precount,infoPtr->nItemCount)<topvisible)
LISTVIEW_InvalidateList(infoPtr); /* FIXME: optimize */
}
else
@ -6783,7 +6766,7 @@ static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem,
if (lStyle & LVS_OWNERDATA)
return FALSE;
if ((nItem >= 0) || (nItem < GETITEMCOUNT(infoPtr)))
if ((nItem >= 0) || (nItem < infoPtr->nItemCount))
{
if ((uView == LVS_ICON) || (uView == LVS_SMALLICON))
{
@ -6875,7 +6858,7 @@ static LRESULT LISTVIEW_SetItemState(LISTVIEW_INFO *infoPtr, INT nItem, LPLVITEM
if (nItem == -1)
{
/* apply to all items */
for (lvItem.iItem = 0; lvItem.iItem < GETITEMCOUNT(infoPtr); lvItem.iItem++)
for (lvItem.iItem = 0; lvItem.iItem < infoPtr->nItemCount; lvItem.iItem++)
if (!LISTVIEW_SetItemT(infoPtr, &lvItem, TRUE)) bResult = FALSE;
}
else
@ -6902,7 +6885,7 @@ static BOOL LISTVIEW_SetItemTextT(LISTVIEW_INFO *infoPtr, INT nItem, LPLVITEMW l
{
LVITEMW lvItem;
if ((nItem < 0) && (nItem >= GETITEMCOUNT(infoPtr))) return FALSE;
if (nItem < 0 && nItem >= infoPtr->nItemCount) return FALSE;
lvItem.iItem = nItem;
lvItem.iSubItem = lpLVItem->iSubItem;
@ -7043,7 +7026,7 @@ static LRESULT LISTVIEW_SortItems(LISTVIEW_INFO *infoPtr, PFNLVCOMPARE pfnCompar
if (!infoPtr->hdpaItems) return FALSE;
/* if there are 0 or 1 items, there is no need to sort */
if (GETITEMCOUNT(infoPtr) < 2) return TRUE;
if (infoPtr->nItemCount < 2) return TRUE;
if (infoPtr->nFocusedItem >= 0)
{
@ -7062,7 +7045,7 @@ static LRESULT LISTVIEW_SortItems(LISTVIEW_INFO *infoPtr, PFNLVCOMPARE pfnCompar
* selected instead)
*/
selectionMarkItem=(infoPtr->nSelectionMark>=0)?DPA_GetPtr(infoPtr->hdpaItems, infoPtr->nSelectionMark):NULL;
for (i=0; i < GETITEMCOUNT(infoPtr); i++)
for (i=0; i < infoPtr->nItemCount; i++)
{
hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, i);
lpItem = (LISTVIEW_ITEM *)DPA_GetPtr(hdpaSubItems, 0);
@ -7109,7 +7092,7 @@ static BOOL LISTVIEW_Update(LISTVIEW_INFO *infoPtr, INT nItem)
TRACE("(nItem=%d)\n", nItem);
if ((nItem < 0) && (nItem >= GETITEMCOUNT(infoPtr))) return FALSE;
if (nItem < 0 && nItem >= infoPtr->nItemCount) return FALSE;
/* rearrange with default alignment style */
if ((lStyle & LVS_AUTOARRANGE) && ((uView == LVS_ICON) ||(uView == LVS_SMALLICON)))
@ -7227,7 +7210,7 @@ static LRESULT LISTVIEW_Create(HWND hwnd, LPCREATESTRUCTW lpcs)
infoPtr->hdpaSelectionRanges = DPA_Create(10);
/* initialize size of items */
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
/* initialize the hover time to -1(indicating the default system hover time) */
@ -7565,7 +7548,7 @@ static LRESULT LISTVIEW_KeyDown(LISTVIEW_INFO *infoPtr, INT nVirtualKey, LONG lK
switch (nVirtualKey)
{
case VK_RETURN:
if ((GETITEMCOUNT(infoPtr) > 0) && (infoPtr->nFocusedItem != -1))
if ((infoPtr->nItemCount > 0) && (infoPtr->nFocusedItem != -1))
{
notify_return(infoPtr);
notify_itemactivate(infoPtr);
@ -7573,13 +7556,13 @@ static LRESULT LISTVIEW_KeyDown(LISTVIEW_INFO *infoPtr, INT nVirtualKey, LONG lK
break;
case VK_HOME:
if (GETITEMCOUNT(infoPtr) > 0)
if (infoPtr->nItemCount > 0)
nItem = 0;
break;
case VK_END:
if (GETITEMCOUNT(infoPtr) > 0)
nItem = GETITEMCOUNT(infoPtr) - 1;
if (infoPtr->nItemCount > 0)
nItem = infoPtr->nItemCount - 1;
break;
case VK_LEFT:
@ -7613,7 +7596,7 @@ static LRESULT LISTVIEW_KeyDown(LISTVIEW_INFO *infoPtr, INT nVirtualKey, LONG lK
else
nItem = infoPtr->nFocusedItem + LISTVIEW_GetCountPerColumn(infoPtr)
* LISTVIEW_GetCountPerRow(infoPtr);
if(nItem >= GETITEMCOUNT(infoPtr)) nItem = GETITEMCOUNT(infoPtr) - 1;
if(nItem >= infoPtr->nItemCount) nItem = infoPtr->nItemCount - 1;
break;
}
@ -7725,7 +7708,7 @@ static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pt
nItem = LISTVIEW_GetItemAtPt(infoPtr, pt);
TRACE("nItem=%d\n", nItem);
if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
{
if (lStyle & LVS_SINGLESEL)
{
@ -7918,7 +7901,7 @@ static LRESULT LISTVIEW_Notify(LISTVIEW_INFO *infoPtr, INT nCtrlId, LPNMHDR lpnm
/* handle notification from header control */
if (lpnmh->code == HDN_ENDTRACKW)
{
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
LISTVIEW_InvalidateList(infoPtr); /* FIXME: optimize */
}
else if(lpnmh->code == HDN_ITEMCLICKW || lpnmh->code == HDN_ITEMCLICKA)
@ -7939,7 +7922,7 @@ static LRESULT LISTVIEW_Notify(LISTVIEW_INFO *infoPtr, INT nCtrlId, LPNMHDR lpnm
* update of the scroll bar here (Header.c works fine as it is,
* no need to disturb it)
*/
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
LISTVIEW_UpdateScroll(infoPtr);
LISTVIEW_InvalidateList(infoPtr); /* FIXME: optimize */
}
@ -8063,7 +8046,7 @@ static LRESULT LISTVIEW_RButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, POINTS pt
lvHitTestInfo.pt.y = pts.y;
nItem = LISTVIEW_GetItemAtPt(infoPtr, lvHitTestInfo.pt);
if ((nItem >= 0) && (nItem < GETITEMCOUNT(infoPtr)))
if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
{
LISTVIEW_SetItemFocus(infoPtr,nItem);
if (!((wKey & MK_SHIFT) || (wKey & MK_CONTROL)) &&
@ -8407,7 +8390,7 @@ static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
}
/* Now update the full item width and height */
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
if (lpss->styleNew & LVS_ALIGNLEFT)
LISTVIEW_AlignLeft(infoPtr);
@ -8429,21 +8412,21 @@ static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
infoPtr->iconSize.cx = GetSystemMetrics(SM_CXSMICON);
infoPtr->iconSize.cy = GetSystemMetrics(SM_CYSMICON);
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
}
else if (uNewView == LVS_LIST)
{
infoPtr->iconSize.cx = GetSystemMetrics(SM_CXSMICON);
infoPtr->iconSize.cy = GetSystemMetrics(SM_CYSMICON);
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
}
else
{
infoPtr->iconSize.cx = GetSystemMetrics(SM_CXSMICON);
infoPtr->iconSize.cy = GetSystemMetrics(SM_CYSMICON);
infoPtr->nItemWidth = LISTVIEW_GetItemWidth(infoPtr);
infoPtr->nItemWidth = LISTVIEW_CalculateMaxWidth(infoPtr);
infoPtr->nItemHeight = LISTVIEW_GetItemHeight(infoPtr);
if (lpss->styleNew & LVS_ALIGNLEFT)
LISTVIEW_AlignLeft(infoPtr);
@ -8598,7 +8581,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_GetItemExtT(infoPtr, (LPLVITEMW)lParam, TRUE);
case LVM_GETITEMCOUNT:
return GETITEMCOUNT(infoPtr);
return infoPtr->nItemCount;
case LVM_GETITEMPOSITION:
return LISTVIEW_GetItemPosition(infoPtr, (INT)wParam, (LPPOINT)lParam);