Commit 15d9a602 authored by Alexandre Julliard's avatar Alexandre Julliard

Serge Ivanov

Andrew Lewycky Improved drawing of item text, added SHOWSELALWAYS capability.
parent efd79674
...@@ -784,9 +784,24 @@ TREEVIEW_DrawItem (HWND hwnd, HDC hdc, TREEVIEW_ITEM *wineItem) ...@@ -784,9 +784,24 @@ TREEVIEW_DrawItem (HWND hwnd, HDC hdc, TREEVIEW_ITEM *wineItem)
r.left=xpos; r.left=xpos;
if ((wineItem->mask & TVIF_TEXT) && (wineItem->pszText)) if ((wineItem->mask & TVIF_TEXT) && (wineItem->pszText))
{ {
COLORREF oldBkColor = 0;
COLORREF oldTextColor = 0; COLORREF oldTextColor = 0;
INT oldBkMode; 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.left += 3;
r.right -= 3; r.right -= 3;
...@@ -796,81 +811,103 @@ TREEVIEW_DrawItem (HWND hwnd, HDC hdc, TREEVIEW_ITEM *wineItem) ...@@ -796,81 +811,103 @@ TREEVIEW_DrawItem (HWND hwnd, HDC hdc, TREEVIEW_ITEM *wineItem)
wineItem->text.top = r.top; wineItem->text.top = r.top;
wineItem->text.bottom= r.bottom; wineItem->text.bottom= r.bottom;
if (wineItem->pszText== LPSTR_TEXTCALLBACKA) { oldBkMode = SetBkMode(hdc, TRANSPARENT);
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.
*/
/* - If item is drop target or it is selected and window is in focus -
/* GetTextExtentPoint32A (hdc, wineItem->pszText, * use blue background (COLOR_HIGHLIGHT).
strlen (wineItem->pszText), &size); */ * - If item is selected, window is not in focus, but it has style
* TVS_SHOWSELALWAYS - use grey background (COLOR_BTNFACE)
/* FillRect ( hdc, &wineItem->text, GetSysColorBrush (infoPtr->clrBk)); * - 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) && if (wineItem->pszText != LPSTR_TEXTCALLBACKA)
(wineItem->state & (TVIS_SELECTED | TVIS_DROPHILITED)) ) { tmpItem.pszText = wineItem->pszText;
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); */
}
/* 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 */ /* Draw it */
DrawTextA ( hdc, DrawTextA ( hdc,
wineItem->pszText, tmpItem.pszText,
lstrlenA(wineItem->pszText), lstrlenA(tmpItem.pszText),
&wineItem->text, &wineItem->text,
uTextJustify | DT_VCENTER | DT_SINGLELINE ); uTextJustify | DT_VCENTER | DT_SINGLELINE | DT_NOPREFIX);
/* Obtain the text coordinate */ wineItem->text.left -=2;
DrawTextA (
hdc,
wineItem->pszText,
lstrlenA(wineItem->pszText),
&wineItem->text,
uTextJustify | DT_VCENTER | DT_SINGLELINE | DT_CALCRECT);
/* Restore the hdc state */ /* Restore the hdc state */
SetTextColor( hdc, oldTextColor); 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 */ /* 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 hNewPen = CreatePen(PS_DOT, 0, GetSysColor(COLOR_WINDOWTEXT) );
HPEN hOldPen = SelectObject( hdc, hNewPen ); HPEN hOldPen = SelectObject( hdc, hNewPen );
POINT points[4]; INT rop = SetROP2(hdc, R2_XORPEN);
POINT points[5];
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;
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); DeleteObject(hNewPen);
SelectObject(hdc, hOldPen); SelectObject(hdc, hOldPen);
} }
if (oldBkMode != TRANSPARENT)
SetBkMode(hdc, oldBkMode);
} }
/* Draw insertion mark if necessary */ /* Draw insertion mark if necessary */
...@@ -1021,20 +1058,29 @@ tvItem->stateMask); ...@@ -1021,20 +1058,29 @@ tvItem->stateMask);
wineItem->stateMask|= tvItem->stateMask; wineItem->stateMask|= tvItem->stateMask;
} }
if (tvItem->mask & TVIF_TEXT) { if (tvItem->mask & TVIF_TEXT)
if (tvItem->pszText!=LPSTR_TEXTCALLBACKA) { {
len=lstrlenA (tvItem->pszText); if (tvItem->pszText!=LPSTR_TEXTCALLBACKA)
if (len>wineItem->cchTextMax) {
wineItem->pszText= COMCTL32_ReAlloc (wineItem->pszText, len+1); len=lstrlenA (tvItem->pszText) + 1;
lstrcpynA (wineItem->pszText, tvItem->pszText,len+1); if (len>wineItem->cchTextMax)
} else { {
if (wineItem->cchTextMax) { wineItem->pszText= COMCTL32_ReAlloc (wineItem->pszText, len);
COMCTL32_Free (wineItem->pszText); wineItem->cchTextMax = len;
wineItem->cchTextMax=0; }
}
wineItem->pszText=LPSTR_TEXTCALLBACKA; 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; wineItem->mask |= tvItem->mask;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment