Remove support for owner drawn listviews in non-REPORT mode. We need
to do this since Windows supports owner draw *only* in report mode, and hence apps are not prepared to handle drawing in other modes.
This commit is contained in:
parent
4150f31f58
commit
dda1e31ce7
|
@ -1220,6 +1220,7 @@ static void LISTVIEW_UpdateScroll(LISTVIEW_INFO *infoPtr)
|
||||||
*/
|
*/
|
||||||
static void LISTVIEW_ShowFocusRect(LISTVIEW_INFO *infoPtr, BOOL fShow)
|
static void LISTVIEW_ShowFocusRect(LISTVIEW_INFO *infoPtr, BOOL fShow)
|
||||||
{
|
{
|
||||||
|
UINT uView = infoPtr->dwStyle & LVS_TYPEMASK;
|
||||||
HDC hdc;
|
HDC hdc;
|
||||||
|
|
||||||
TRACE("fShow=%d, nItem=%d\n", fShow, infoPtr->nFocusedItem);
|
TRACE("fShow=%d, nItem=%d\n", fShow, infoPtr->nFocusedItem);
|
||||||
|
@ -1242,7 +1243,8 @@ static void LISTVIEW_ShowFocusRect(LISTVIEW_INFO *infoPtr, BOOL fShow)
|
||||||
|
|
||||||
if (!(hdc = GetDC(infoPtr->hwndSelf))) return;
|
if (!(hdc = GetDC(infoPtr->hwndSelf))) return;
|
||||||
|
|
||||||
if (infoPtr->dwStyle & LVS_OWNERDRAWFIXED)
|
/* for some reason, owner draw should work only in report mode */
|
||||||
|
if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (uView == LVS_REPORT))
|
||||||
{
|
{
|
||||||
DRAWITEMSTRUCT dis;
|
DRAWITEMSTRUCT dis;
|
||||||
LVITEMW item;
|
LVITEMW item;
|
||||||
|
@ -1415,8 +1417,7 @@ static BOOL LISTVIEW_GetItemMetrics(LISTVIEW_INFO *infoPtr, LVITEMW *lpLVItem,
|
||||||
if (!(lpLVItem->mask & LVIF_STATE) ||
|
if (!(lpLVItem->mask & LVIF_STATE) ||
|
||||||
!(lpLVItem->stateMask & LVIS_FOCUSED))
|
!(lpLVItem->stateMask & LVIS_FOCUSED))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if ((lpLVItem->state & LVIS_FOCUSED) &&
|
if (lpLVItem->state & LVIS_FOCUSED)
|
||||||
!(infoPtr->dwStyle & LVS_OWNERDRAWFIXED))
|
|
||||||
oversizedBox = doLabel = TRUE;
|
oversizedBox = doLabel = TRUE;
|
||||||
}
|
}
|
||||||
if (lprcLabel) doLabel = TRUE;
|
if (lprcLabel) doLabel = TRUE;
|
||||||
|
@ -1501,15 +1502,15 @@ static BOOL LISTVIEW_GetItemMetrics(LISTVIEW_INFO *infoPtr, LVITEMW *lpLVItem,
|
||||||
{
|
{
|
||||||
SIZE labelSize = { 0, 0 };
|
SIZE labelSize = { 0, 0 };
|
||||||
|
|
||||||
/* we need the text in non owner draw mode */
|
if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (uView == LVS_REPORT))
|
||||||
if (!(infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && !(lpLVItem->mask & LVIF_TEXT)) return FALSE;
|
|
||||||
|
|
||||||
if (infoPtr->dwStyle & LVS_OWNERDRAWFIXED)
|
|
||||||
{
|
{
|
||||||
labelSize.cx = infoPtr->nItemWidth;
|
labelSize.cx = infoPtr->nItemWidth;
|
||||||
labelSize.cy = infoPtr->nItemHeight;
|
labelSize.cy = infoPtr->nItemHeight;
|
||||||
|
goto calc_label;
|
||||||
}
|
}
|
||||||
else if (is_textT(lpLVItem->pszText, TRUE))
|
/* we need the text in non owner draw mode */
|
||||||
|
if (!(lpLVItem->mask & LVIF_TEXT)) return FALSE;
|
||||||
|
if (is_textT(lpLVItem->pszText, TRUE))
|
||||||
{
|
{
|
||||||
HFONT hFont = infoPtr->hFont ? infoPtr->hFont : infoPtr->hDefaultFont;
|
HFONT hFont = infoPtr->hFont ? infoPtr->hFont : infoPtr->hDefaultFont;
|
||||||
HDC hdc = GetDC(infoPtr->hwndSelf);
|
HDC hdc = GetDC(infoPtr->hwndSelf);
|
||||||
|
@ -1539,25 +1540,22 @@ static BOOL LISTVIEW_GetItemMetrics(LISTVIEW_INFO *infoPtr, LVITEMW *lpLVItem,
|
||||||
ReleaseDC(infoPtr->hwndSelf, hdc);
|
ReleaseDC(infoPtr->hwndSelf, hdc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
calc_label:
|
||||||
if (uView == LVS_ICON)
|
if (uView == LVS_ICON)
|
||||||
{
|
{
|
||||||
Label.left = Box.left + (infoPtr->iconSpacing.cx - labelSize.cx) / 2;
|
Label.left = Box.left + (infoPtr->iconSpacing.cx - labelSize.cx) / 2;
|
||||||
Label.top = Box.top + ICON_TOP_PADDING_HITABLE +
|
Label.top = Box.top + ICON_TOP_PADDING_HITABLE +
|
||||||
infoPtr->iconSize.cy + ICON_BOTTOM_PADDING;
|
infoPtr->iconSize.cy + ICON_BOTTOM_PADDING;
|
||||||
Label.right = Label.left + labelSize.cx;
|
Label.right = Label.left + labelSize.cx;
|
||||||
if (infoPtr->dwStyle & LVS_OWNERDRAWFIXED)
|
Label.bottom = Label.top + infoPtr->nItemHeight;
|
||||||
Label.bottom = Label.top + infoPtr->nItemHeight;
|
if (!oversizedBox && labelSize.cy > infoPtr->ntmHeight)
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (!oversizedBox && labelSize.cy > infoPtr->ntmHeight)
|
labelSize.cy = min(Box.bottom - Label.top, labelSize.cy);
|
||||||
{
|
labelSize.cy /= infoPtr->ntmHeight;
|
||||||
labelSize.cy = min(Box.bottom - Label.top, labelSize.cy);
|
labelSize.cy = max(labelSize.cy, 1);
|
||||||
labelSize.cy /= infoPtr->ntmHeight;
|
labelSize.cy *= infoPtr->ntmHeight;
|
||||||
labelSize.cy = max(labelSize.cy, 1);
|
}
|
||||||
labelSize.cy *= infoPtr->ntmHeight;
|
Label.bottom = Label.top + labelSize.cy + HEIGHT_PADDING;
|
||||||
}
|
|
||||||
Label.bottom = Label.top + labelSize.cy + HEIGHT_PADDING;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else /* LVS_SMALLICON, LVS_LIST or LVS_REPORT */
|
else /* LVS_SMALLICON, LVS_LIST or LVS_REPORT */
|
||||||
{
|
{
|
||||||
|
@ -1637,8 +1635,7 @@ static BOOL LISTVIEW_GetItemMeasures(LISTVIEW_INFO *infoPtr, INT nItem,
|
||||||
else doLabel = TRUE;
|
else doLabel = TRUE;
|
||||||
}
|
}
|
||||||
if (uView == LVS_ICON && (lprcBox || lprcBounds || lprcLabel) &&
|
if (uView == LVS_ICON && (lprcBox || lprcBounds || lprcLabel) &&
|
||||||
infoPtr->bFocus && !(infoPtr->dwStyle & LVS_OWNERDRAWFIXED) &&
|
infoPtr->bFocus && LISTVIEW_GetItemState(infoPtr, nItem, LVIS_FOCUSED))
|
||||||
LISTVIEW_GetItemState(infoPtr, nItem, LVIS_FOCUSED))
|
|
||||||
oversizedBox = doLabel = TRUE;
|
oversizedBox = doLabel = TRUE;
|
||||||
if (lprcLabel) doLabel = TRUE;
|
if (lprcLabel) doLabel = TRUE;
|
||||||
if (doLabel || lprcIcon) doIcon = TRUE;
|
if (doLabel || lprcIcon) doIcon = TRUE;
|
||||||
|
@ -3637,22 +3634,22 @@ static void LISTVIEW_Refresh(LISTVIEW_INFO *infoPtr, HDC hdc)
|
||||||
/* nothing to draw */
|
/* nothing to draw */
|
||||||
if(infoPtr->nItemCount == 0) goto enddraw;
|
if(infoPtr->nItemCount == 0) goto enddraw;
|
||||||
|
|
||||||
if (uView == LVS_ICON)
|
if ((infoPtr->dwStyle & LVS_OWNERDRAWFIXED) && (uView == LVS_REPORT))
|
||||||
LISTVIEW_RefreshIcon(infoPtr, hdc, cdmode);
|
LISTVIEW_RefreshOwnerDraw(infoPtr, hdc);
|
||||||
else if (uView == LVS_REPORT)
|
else
|
||||||
{
|
{
|
||||||
if (infoPtr->dwStyle & LVS_OWNERDRAWFIXED)
|
if (uView == LVS_ICON)
|
||||||
LISTVIEW_RefreshOwnerDraw(infoPtr, hdc);
|
LISTVIEW_RefreshIcon(infoPtr, hdc, cdmode);
|
||||||
else
|
else if (uView == LVS_REPORT)
|
||||||
LISTVIEW_RefreshReport(infoPtr, hdc, cdmode);
|
LISTVIEW_RefreshReport(infoPtr, hdc, cdmode);
|
||||||
|
else /* LVS_LIST or LVS_SMALLICON */
|
||||||
|
LISTVIEW_RefreshList(infoPtr, hdc, cdmode);
|
||||||
|
|
||||||
|
/* if we have a focus rect, draw it */
|
||||||
|
if (infoPtr->bFocus)
|
||||||
|
DrawFocusRect(hdc, &infoPtr->rcFocus);
|
||||||
}
|
}
|
||||||
else /* LVS_LIST or LVS_SMALLICON */
|
|
||||||
LISTVIEW_RefreshList(infoPtr, hdc, cdmode);
|
|
||||||
|
|
||||||
/* if we have a focus rect, draw it */
|
|
||||||
if (infoPtr->bFocus && !(infoPtr->dwStyle & LVS_OWNERDRAWFIXED))
|
|
||||||
DrawFocusRect(hdc, &infoPtr->rcFocus);
|
|
||||||
|
|
||||||
enddraw:
|
enddraw:
|
||||||
if (cdmode & CDRF_NOTIFYPOSTPAINT)
|
if (cdmode & CDRF_NOTIFYPOSTPAINT)
|
||||||
notify_customdraw(infoPtr, CDDS_POSTPAINT, &nmlvcd);
|
notify_customdraw(infoPtr, CDDS_POSTPAINT, &nmlvcd);
|
||||||
|
@ -5527,8 +5524,7 @@ static LRESULT LISTVIEW_HitTest(LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, BO
|
||||||
if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return -1;
|
if (!LISTVIEW_GetOrigin(infoPtr, &Origin)) return -1;
|
||||||
|
|
||||||
/* first deal with the large items */
|
/* first deal with the large items */
|
||||||
if (uView == LVS_ICON && !(infoPtr->dwStyle & LVS_OWNERDRAWFIXED) &&
|
if (uView == LVS_ICON && PtInRect (&infoPtr->rcFocus, lpht->pt))
|
||||||
PtInRect (&infoPtr->rcFocus, lpht->pt))
|
|
||||||
{
|
{
|
||||||
lpht->iItem = infoPtr->nFocusedItem;
|
lpht->iItem = infoPtr->nFocusedItem;
|
||||||
}
|
}
|
||||||
|
@ -5873,6 +5869,7 @@ static LRESULT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
|
||||||
nItem = DPA_InsertPtr(hdpaSubItems, 0, lpItem);
|
nItem = DPA_InsertPtr(hdpaSubItems, 0, lpItem);
|
||||||
if (nItem == -1) goto fail;
|
if (nItem == -1) goto fail;
|
||||||
|
|
||||||
|
/* FIXME: is the handling of this LVS_OWNERDRAWFIXED correct? */
|
||||||
is_sorted = (lStyle & (LVS_SORTASCENDING | LVS_SORTDESCENDING)) &&
|
is_sorted = (lStyle & (LVS_SORTASCENDING | LVS_SORTDESCENDING)) &&
|
||||||
!(lStyle & LVS_OWNERDRAWFIXED) && (LPSTR_TEXTCALLBACKW != lpLVItem->pszText);
|
!(lStyle & LVS_OWNERDRAWFIXED) && (LPSTR_TEXTCALLBACKW != lpLVItem->pszText);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue