Listview U4
Dimitrie O. Paun
dpaun at rogers.com
Sat Oct 19 11:28:37 CDT 2002
ChangeLog
Store the entire format bitmap in the column info
Rewrite GetColumnT to take advantage of that
Related cleanups, and simplifications.
--- dlls/comctl32/listview.c.U3 Sat Oct 19 11:56:15 2002
+++ dlls/comctl32/listview.c Sat Oct 19 12:25:10 2002
@@ -79,8 +79,7 @@
typedef struct tagCOLUMN_INFO
{
RECT rcHeader; /* tracks the header's rectangle */
- UINT align; /* one of DT_{LEFT,CENTER,RIGHT} */
- BOOL hasImage; /* on/off switch for column images */
+ int fmt; /* same as LVCOLUMN.fmt */
} COLUMN_INFO;
typedef struct tagITEMHDR
@@ -303,7 +302,6 @@
static BOOL LISTVIEW_KeySelection(LISTVIEW_INFO *, INT);
static LRESULT LISTVIEW_GetItemState(LISTVIEW_INFO *, INT, UINT);
static LRESULT LISTVIEW_SetItemState(LISTVIEW_INFO *, INT, LPLVITEMW);
-static LRESULT LISTVIEW_GetColumnT(LISTVIEW_INFO *, INT, LPLVCOLUMNW, BOOL);
static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *, INT, INT, HWND);
static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *, INT, INT, HWND);
static INT LISTVIEW_GetTopIndex(LISTVIEW_INFO *);
@@ -1734,7 +1732,7 @@
if (!IsRectEmpty(&State)) Icon.left += IMAGE_PADDING;
Icon.top = Box.top;
Icon.right = Icon.left;
- if (infoPtr->himlSmall && (!lpColumnInfo || lpColumnInfo->hasImage))
+ if (infoPtr->himlSmall && (!lpColumnInfo || lpLVItem->iSubItem == 0 || (lpColumnInfo->fmt & LVCFMT_IMAGE)))
Icon.right += infoPtr->iconSize.cx;
Icon.bottom = Icon.top + infoPtr->nItemHeight;
}
@@ -3386,7 +3384,12 @@
else if (nSubItem)
{
COLUMN_INFO *lpColumnInfo = DPA_GetPtr(infoPtr->hdpaColumns, nSubItem);
- if (lpColumnInfo) uFormat |= lpColumnInfo->align;
+ if (lpColumnInfo)
+ {
+ if (lpColumnInfo->fmt & LVCFMT_LEFT) uFormat |= DT_LEFT;
+ else if (lpColumnInfo->fmt & LVCFMT_RIGHT) uFormat |= DT_RIGHT;
+ else if (lpColumnInfo->fmt & LVCFMT_CENTER) uFormat |= DT_CENTER;
+ }
}
if (!(uFormat & (DT_RIGHT | DT_CENTER))) rcLabel.left += 2;
DrawTextW(hdc, lvItem.pszText, -1, &rcLabel, uFormat);
@@ -4471,7 +4474,7 @@
*
* PARAMETER(S):
* [I] infoPtr : valid pointer to the listview structure
- * [I] nItem : column index
+ * [I] nColumn : column index
* [IO] lpColumn : column information
* [I] isW : if TRUE, then lpColumn is a LPLVCOLUMNW
* otherwise it is in fact a LPLVCOLUMNA
@@ -4480,77 +4483,45 @@
* SUCCESS : TRUE
* FAILURE : FALSE
*/
-static LRESULT LISTVIEW_GetColumnT(LISTVIEW_INFO *infoPtr, INT nItem, LPLVCOLUMNW lpColumn, BOOL isW)
+static LRESULT LISTVIEW_GetColumnT(LISTVIEW_INFO *infoPtr, INT nColumn, LPLVCOLUMNW lpColumn, BOOL isW)
{
- HDITEMW hdi;
- BOOL bResult = FALSE;
+ COLUMN_INFO *lpColumnInfo;
+ HDITEMW hdi;
- if (lpColumn != NULL)
- {
+ if (!lpColumn || nColumn < 0 || nColumn >= infoPtr->hdpaColumns->nItemCount) return FALSE;
+ if (!(lpColumnInfo = DPA_GetPtr(infoPtr->hdpaColumns, nColumn))) return FALSE;
/* initialize memory */
ZeroMemory(&hdi, sizeof(hdi));
- if (lpColumn->mask & LVCF_FMT)
- hdi.mask |= HDI_FORMAT;
-
- if (lpColumn->mask & LVCF_WIDTH)
- hdi.mask |= HDI_WIDTH;
-
if (lpColumn->mask & LVCF_TEXT)
{
- hdi.mask |= HDI_TEXT;
- hdi.cchTextMax = lpColumn->cchTextMax;
- hdi.pszText = lpColumn->pszText;
+ hdi.mask |= HDI_TEXT;
+ hdi.pszText = lpColumn->pszText;
+ hdi.cchTextMax = lpColumn->cchTextMax;
}
if (lpColumn->mask & LVCF_IMAGE)
- hdi.mask |= HDI_IMAGE;
+ hdi.mask |= HDI_IMAGE;
if (lpColumn->mask & LVCF_ORDER)
- hdi.mask |= HDI_ORDER;
-
- if (isW)
- bResult = Header_GetItemW(infoPtr->hwndHeader, nItem, &hdi);
- else
- bResult = Header_GetItemA(infoPtr->hwndHeader, nItem, &hdi);
-
- if (bResult)
- {
- if (lpColumn->mask & LVCF_FMT)
- {
- lpColumn->fmt = 0;
-
- if (hdi.fmt & HDF_LEFT)
- lpColumn->fmt |= LVCFMT_LEFT;
- else if (hdi.fmt & HDF_RIGHT)
- lpColumn->fmt |= LVCFMT_RIGHT;
- else if (hdi.fmt & HDF_CENTER)
- lpColumn->fmt |= LVCFMT_CENTER;
-
- if (hdi.fmt & HDF_IMAGE)
- lpColumn->fmt |= LVCFMT_COL_HAS_IMAGES;
+ hdi.mask |= HDI_ORDER;
- if (hdi.fmt & HDF_BITMAP_ON_RIGHT)
- lpColumn->fmt |= LVCFMT_BITMAP_ON_RIGHT;
- }
-
- if (lpColumn->mask & LVCF_WIDTH)
- lpColumn->cx = hdi.cxy;
+ if (!SendMessageW(infoPtr->hwndHeader, isW ? HDM_GETITEMW : HDM_GETITEMA, nColumn, (LPARAM)&hdi)) return FALSE;
- if (lpColumn->mask & LVCF_IMAGE)
- lpColumn->iImage = hdi.iImage;
+ if (lpColumn->mask & LVCF_FMT)
+ lpColumn->fmt = lpColumnInfo->fmt;
- if (lpColumn->mask & LVCF_ORDER)
- lpColumn->iOrder = hdi.iOrder;
+ if (lpColumn->mask & LVCF_WIDTH)
+ lpColumn->cx = lpColumnInfo->rcHeader.right - lpColumnInfo->rcHeader.left;
- TRACE("(col=%d, lpColumn=%s, isW=%d)\n",
- nItem, debuglvcolumn_t(lpColumn, isW), isW);
+ if (lpColumn->mask & LVCF_IMAGE)
+ lpColumn->iImage = hdi.iImage;
- }
- }
+ if (lpColumn->mask & LVCF_ORDER)
+ lpColumn->iOrder = hdi.iOrder;
- return bResult;
+ return TRUE;
}
@@ -5961,18 +5932,7 @@
if (!Header_GetItemRect(infoPtr->hwndHeader, nColumn, &rcCol)) return FALSE;
lpColumnInfo->rcHeader = rcCol;
if (lpColumn->mask & LVCF_FMT)
- {
- if (nColumn == 0 || lpColumn->fmt & LVCFMT_LEFT) lpColumnInfo->align = DT_LEFT;
- else if (lpColumn->fmt & LVCFMT_RIGHT) lpColumnInfo->align = DT_RIGHT;
- else if (lpColumn->fmt & LVCFMT_CENTER) lpColumnInfo->align = DT_CENTER;
-
- if (nColumn == 0 || (lpColumn->fmt & LVCFMT_IMAGE)) lpColumnInfo->hasImage = TRUE;
- }
- else
- {
- lpColumnInfo->align = DT_LEFT;
- lpColumnInfo->hasImage = (nColumn == 0);
- }
+ lpColumnInfo->fmt = lpColumn->fmt;
return TRUE;
}
More information about the wine-patches
mailing list