Listview K5
Dimitrie O. Paun
dpaun at rogers.com
Fri Oct 4 02:01:05 CDT 2002
ChangeLogs
-- Effective optimization in GetNextItem (speeds up Xnews)
-- Misc cleanups
--- dlls/comctl32/listview.c.K4 Fri Oct 4 01:51:18 2002
+++ dlls/comctl32/listview.c Fri Oct 4 02:55:49 2002
@@ -994,7 +994,7 @@
RECT winRect;
POINT point[2];
- TRACE("nNewScrollPos=%d", nNewScrollPos);
+ TRACE("nNewScrollPos=%d\n", nNewScrollPos);
GetWindowRect(infoPtr->hwndHeader, &winRect);
point[0].x = winRect.left;
@@ -3230,7 +3230,7 @@
TEXTATTR tmpTa, oldTa;
COLUMNCACHE *lpCols;
LVCOLUMNW lvColumn;
- LVITEMW lvItem;
+ LVITEMW item;
POINT ptOrig;
TRACE("()\n");
@@ -3307,7 +3307,6 @@
if (lStyle & LVS_OWNERDRAWFIXED)
{
DRAWITEMSTRUCT dis;
- LVITEMW item;
TRACE("Owner Drawn\n");
@@ -3333,6 +3332,7 @@
dis.rcItem.bottom = dis.rcItem.top + infoPtr->nItemHeight;
OffsetRect(&dis.rcItem, ptOrig.x, 0);
+ TRACE("item=%s, rcItem=%s\n", debuglvitem_t(&item, TRUE), debugrect(&dis.rcItem));
if (SendMessageW(GetParent(infoPtr->hwndSelf), WM_DRAWITEM, uID, (LPARAM)&dis))
continue;
}
@@ -3340,14 +3340,14 @@
/* compute the full select rectangle, if needed */
if (bFullSelected)
{
- lvItem.mask = LVIF_IMAGE | LVIF_STATE | LVIF_INDENT;
- lvItem.stateMask = LVIS_SELECTED;
- lvItem.iItem = nItem;
- lvItem.iSubItem = 0;
- if (!LISTVIEW_GetItemW(infoPtr, &lvItem, TRUE)) continue;
+ item.mask = LVIF_IMAGE | LVIF_STATE | LVIF_INDENT;
+ item.stateMask = LVIS_SELECTED;
+ item.iItem = nItem;
+ item.iSubItem = 0;
+ if (!LISTVIEW_GetItemW(infoPtr, &item, TRUE)) continue;
rcFullSelect.left = lpCols[0].rc.left + REPORT_MARGINX +
- infoPtr->iconSize.cx * lvItem.iIndent +
+ infoPtr->iconSize.cx * item.iIndent +
(infoPtr->himlSmall ? infoPtr->iconSize.cx : 0);
rcFullSelect.right = max(rcFullSelect.left, lpCols[nColumnCount - 1].rc.right - REPORT_MARGINX);
rcFullSelect.top = nDrawPosY;
@@ -3356,8 +3356,8 @@
}
/* draw the background of the selection rectangle, if need be */
- select_text_attr(infoPtr, hdc, bFullSelected && (lvItem.state & LVIS_SELECTED), &tmpTa);
- if (bFullSelected && (lvItem.state & LVIS_SELECTED))
+ select_text_attr(infoPtr, hdc, bFullSelected && (item.state & LVIS_SELECTED), &tmpTa);
+ if (bFullSelected && (item.state & LVIS_SELECTED))
ExtTextOutW(hdc, rcFullSelect.left, rcFullSelect.top, ETO_OPAQUE, &rcFullSelect, 0, 0, 0);
/* iterate through the invalidated columns */
@@ -5276,23 +5276,26 @@
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
- * [I] INT : item index
- * [I] INT : relationship flag
+ * [I] nItem : item index
+ * [I] uFlags : relationship flag
*
+ * FIXME:
+ * This function is ver, very inefficient! Needs work.
+ *
* RETURN:
* SUCCESS : item index
* FAILURE : -1
*/
static LRESULT LISTVIEW_GetNextItem(LISTVIEW_INFO *infoPtr, INT nItem, UINT uFlags)
{
- UINT uView = LISTVIEW_GetType(infoPtr);
- UINT uMask = 0;
- LVFINDINFOW lvFindInfo;
- INT nCountPerColumn;
- INT i;
+ UINT uView = LISTVIEW_GetType(infoPtr);
+ UINT uMask = 0;
+ LVFINDINFOW lvFindInfo;
+ INT nCountPerColumn;
+ INT i;
+
+ if ((nItem < -1) || (nItem >= GETITEMCOUNT(infoPtr))) return -1;
- if ((nItem >= -1) && (nItem < GETITEMCOUNT(infoPtr)))
- {
ZeroMemory(&lvFindInfo, sizeof(lvFindInfo));
if (uFlags & LVNI_CUT)
@@ -5307,6 +5310,14 @@
if (uFlags & LVNI_SELECTED)
uMask |= LVIS_SELECTED;
+ /* if we're asked for the focused item, that's only one,
+ * so it's worth optimizing */
+ if (uFlags & LVNI_FOCUSED)
+ {
+ if (!(LISTVIEW_GetItemState(infoPtr, infoPtr->nFocusedItem, uMask) & uMask) == uMask) return -1;
+ return (infoPtr->nFocusedItem == nItem) ? -1 : infoPtr->nFocusedItem;
+ }
+
if (uFlags & LVNI_ABOVE)
{
if ((uView == LVS_LIST) || (uView == LVS_REPORT))
@@ -5412,9 +5423,8 @@
return i;
}
}
- }
- return -1;
+ return -1;
}
/* LISTVIEW_GetNumberOfWorkAreas */
@@ -6822,15 +6832,16 @@
{
LVITEMW lvItem;
- TRACE("(nItem=%d, lpLVItem=%s, isW=%d)\n", nItem, debuglvitem_t(lpLVItem, isW), isW);
-
if ((nItem < 0) && (nItem >= GETITEMCOUNT(infoPtr))) return FALSE;
lvItem.iItem = nItem;
lvItem.iSubItem = lpLVItem->iSubItem;
lvItem.mask = LVIF_TEXT;
lvItem.pszText = lpLVItem->pszText;
+ lvItem.cchTextMax = lpLVItem->cchTextMax;
+ TRACE("(nItem=%d, lpLVItem=%s, isW=%d)\n", nItem, debuglvitem_t(&lvItem, isW), isW);
+
return LISTVIEW_SetItemT(infoPtr, &lvItem, isW);
}
More information about the wine-patches
mailing list