Skip to content
Snippets Groups Projects
Commit 15d9a602 authored by Alexandre Julliard's avatar Alexandre Julliard
Browse files

Serge Ivanov

Andrew Lewycky
Improved drawing of item text, added SHOWSELALWAYS capability.
parent efd79674
No related branches found
No related tags found
No related merge requests found
......@@ -784,9 +784,24 @@ TREEVIEW_DrawItem (HWND hwnd, HDC hdc, TREEVIEW_ITEM *wineItem)
r.left=xpos;
if ((wineItem->mask & TVIF_TEXT) && (wineItem->pszText))
{
COLORREF oldBkColor = 0;
COLORREF oldTextColor = 0;
INT oldBkMode;
HBRUSH hbrBk = 0;
BOOL inFocus = GetFocus() == hwnd;
TREEVIEW_ITEM tmpItem;
char buf[128];
if (wineItem->pszText == LPSTR_TEXTCALLBACKA)
{
tmpItem.hItem = wineItem->hItem;
tmpItem.state = wineItem->state;
tmpItem.lParam = wineItem->lParam;
tmpItem.pszText = buf;
tmpItem.cchTextMax = sizeof(buf);
TREEVIEW_SendDispInfoNotify(hwnd, &tmpItem, TVN_GETDISPINFOA, TVIF_TEXT);
}
r.left += 3;
r.right -= 3;
......@@ -796,81 +811,103 @@ TREEVIEW_DrawItem (HWND hwnd, HDC hdc, TREEVIEW_ITEM *wineItem)
wineItem->text.top = r.top;
wineItem->text.bottom= r.bottom;
if (wineItem->pszText== LPSTR_TEXTCALLBACKA) {
TRACE("LPSTR_TEXTCALLBACK\n");
TREEVIEW_SendDispInfoNotify (hwnd, wineItem, TVN_GETDISPINFOA, TVIF_TEXT);
}
/* Yep, there are some things that need to be straightened out here.
Removing the comments around the setTextColor does not give the right
results. Dito FillRect.
*/
oldBkMode = SetBkMode(hdc, TRANSPARENT);
/* GetTextExtentPoint32A (hdc, wineItem->pszText,
strlen (wineItem->pszText), &size); */
/* FillRect ( hdc, &wineItem->text, GetSysColorBrush (infoPtr->clrBk));
*/
/* - If item is drop target or it is selected and window is in focus -
* use blue background (COLOR_HIGHLIGHT).
* - If item is selected, window is not in focus, but it has style
* TVS_SHOWSELALWAYS - use grey background (COLOR_BTNFACE)
* - Otherwise - don't fill background
*/
if ((wineItem->state & TVIS_DROPHILITED) ||
((wineItem->state & TVIS_SELECTED) &&
(inFocus || (GetWindowLongA( hwnd, GWL_STYLE) & TVS_SHOWSELALWAYS))))
{
if ((wineItem->state & TVIS_DROPHILITED) || inFocus)
{
hbrBk = CreateSolidBrush(GetSysColor( COLOR_HIGHLIGHT));
oldTextColor = SetTextColor(hdc, GetSysColor( COLOR_HIGHLIGHTTEXT));
}
else
{
hbrBk = CreateSolidBrush(GetSysColor( COLOR_BTNFACE));
if (infoPtr->clrText == -1)
oldTextColor = SetTextColor(hdc, GetSysColor( COLOR_WINDOWTEXT));
else
oldTextColor = SetTextColor(hdc, infoPtr->clrText);
}
}
else
{
if (infoPtr->clrText == -1)
oldTextColor = SetTextColor(hdc, GetSysColor( COLOR_WINDOWTEXT));
else
oldTextColor = SetTextColor(hdc, infoPtr->clrText);
}
if (!(cditem & CDRF_NOTIFYPOSTPAINT) &&
(wineItem->state & (TVIS_SELECTED | TVIS_DROPHILITED)) ) {
oldBkMode = SetBkMode (hdc, OPAQUE);
oldBkColor = SetBkColor (hdc, GetSysColor( COLOR_HIGHLIGHT));
oldTextColor = SetTextColor(hdc, GetSysColor( COLOR_HIGHLIGHTTEXT));
} else {
oldBkMode = SetBkMode (hdc, TRANSPARENT);
oldBkColor = SetBkColor (hdc, infoPtr->clrBk);
/* oldTextColor = SetTextColor(hdc, infoPtr->clrText); */
}
if (wineItem->pszText != LPSTR_TEXTCALLBACKA)
tmpItem.pszText = wineItem->pszText;
/* Obtain the text coordinate */
DrawTextA (
hdc,
tmpItem.pszText,
lstrlenA(tmpItem.pszText),
&wineItem->text,
uTextJustify | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT | DT_NOPREFIX);
/* We need to reset it to items height */
wineItem->text.top = r.top;
wineItem->text.bottom = r.bottom;
wineItem->text.right += 4; /* This is extra for focus rectangle */
if (hbrBk)
{
FillRect(hdc, &wineItem->text, hbrBk);
DeleteObject(hbrBk);
}
wineItem->text.left += 2;
/* Draw it */
DrawTextA ( hdc,
wineItem->pszText,
lstrlenA(wineItem->pszText),
tmpItem.pszText,
lstrlenA(tmpItem.pszText),
&wineItem->text,
uTextJustify | DT_VCENTER | DT_SINGLELINE );
uTextJustify | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
/* Obtain the text coordinate */
DrawTextA (
hdc,
wineItem->pszText,
lstrlenA(wineItem->pszText),
&wineItem->text,
uTextJustify | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT);
wineItem->text.left -=2;
/* Restore the hdc state */
SetTextColor( hdc, oldTextColor);
if (oldBkMode != TRANSPARENT)
SetBkMode(hdc, oldBkMode);
if (wineItem->state & (TVIS_SELECTED | TVIS_DROPHILITED))
SetBkColor (hdc, oldBkColor);
/* Draw the box arround the selected item */
if (wineItem->state & TVIS_SELECTED )
if (wineItem->state & TVIS_SELECTED && inFocus)
{
HPEN hNewPen = CreatePen(PS_DOT, 0, GetSysColor(COLOR_WINDOWTEXT) );
HPEN hOldPen = SelectObject( hdc, hNewPen );
POINT points[4];
points[0].x = wineItem->text.left-1;
points[0].y = wineItem->text.top+1;
points[1].x = wineItem->text.right;
points[1].y = wineItem->text.top+1;
points[2].x = wineItem->text.right;
points[2].y = wineItem->text.bottom;
points[3].x = wineItem->text.left-1;
points[3].y = wineItem->text.bottom;
INT rop = SetROP2(hdc, R2_XORPEN);
POINT points[5];
Polyline (hdc,points,4);
points[4].x = points[0].x = wineItem->text.left;
points[4].y = points[0].y = wineItem->text.top;
points[1].x = wineItem->text.right-1 ;
points[1].y = wineItem->text.top;
points[2].x = wineItem->text.right-1;
points[2].y = wineItem->text.bottom-1;
points[3].x = wineItem->text.left;
points[3].y = wineItem->text.bottom-1;
Polyline (hdc,points,5);
SetROP2(hdc, rop);
DeleteObject(hNewPen);
SelectObject(hdc, hOldPen);
}
if (oldBkMode != TRANSPARENT)
SetBkMode(hdc, oldBkMode);
}
/* Draw insertion mark if necessary */
......@@ -1021,20 +1058,29 @@ tvItem->stateMask);
wineItem->stateMask|= tvItem->stateMask;
}
if (tvItem->mask & TVIF_TEXT) {
if (tvItem->pszText!=LPSTR_TEXTCALLBACKA) {
len=lstrlenA (tvItem->pszText);
if (len>wineItem->cchTextMax)
wineItem->pszText= COMCTL32_ReAlloc (wineItem->pszText, len+1);
lstrcpynA (wineItem->pszText, tvItem->pszText,len+1);
} else {
if (wineItem->cchTextMax) {
COMCTL32_Free (wineItem->pszText);
wineItem->cchTextMax=0;
}
wineItem->pszText=LPSTR_TEXTCALLBACKA;
}
}
if (tvItem->mask & TVIF_TEXT)
{
if (tvItem->pszText!=LPSTR_TEXTCALLBACKA)
{
len=lstrlenA (tvItem->pszText) + 1;
if (len>wineItem->cchTextMax)
{
wineItem->pszText= COMCTL32_ReAlloc (wineItem->pszText, len);
wineItem->cchTextMax = len;
}
lstrcpynA (wineItem->pszText, tvItem->pszText,len);
}
else
{
if (wineItem->cchTextMax)
{
COMCTL32_Free (wineItem->pszText);
wineItem->cchTextMax=0;
}
wineItem->pszText=LPSTR_TEXTCALLBACKA;
}
}
wineItem->mask |= tvItem->mask;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment