- Preliminary implementation of TVS_NOSCROLL and TVS_NOHSCROLL
- Implement A and W versions of WM_NOTIFY based on response to WM_NOTIFYFORMAT. Note that the EDITLABEL notifies are not done. - Implement WM_NOTIFYFORMAT.
This commit is contained in:
parent
94e9a6f901
commit
b4994d18e9
|
@ -127,6 +127,8 @@ typedef struct tagTREEVIEW_INFO
|
||||||
BOOL bIgnoreEditKillFocus;
|
BOOL bIgnoreEditKillFocus;
|
||||||
BOOL bLabelChanged;
|
BOOL bLabelChanged;
|
||||||
|
|
||||||
|
BOOL bNtfUnicode; /* TRUE if should send NOTIFY with W */
|
||||||
|
BOOL bUnicode; /* set by CCM_SETUNICODEFORMAT */
|
||||||
HIMAGELIST himlNormal;
|
HIMAGELIST himlNormal;
|
||||||
int normalImageHeight;
|
int normalImageHeight;
|
||||||
int normalImageWidth;
|
int normalImageWidth;
|
||||||
|
@ -192,6 +194,7 @@ static LRESULT TREEVIEW_RButtonUp(TREEVIEW_INFO *, LPPOINT);
|
||||||
static LRESULT TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel);
|
static LRESULT TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel);
|
||||||
static VOID TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr);
|
static VOID TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr);
|
||||||
static LRESULT TREEVIEW_HScroll(TREEVIEW_INFO *, WPARAM);
|
static LRESULT TREEVIEW_HScroll(TREEVIEW_INFO *, WPARAM);
|
||||||
|
static LRESULT TREEVIEW_NotifyFormat (TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam);
|
||||||
|
|
||||||
|
|
||||||
/* Random Utilities *****************************************************/
|
/* Random Utilities *****************************************************/
|
||||||
|
@ -409,6 +412,17 @@ TREEVIEW_GetListItem(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
||||||
|
|
||||||
/* Notifications ************************************************************/
|
/* Notifications ************************************************************/
|
||||||
|
|
||||||
|
static LRESULT
|
||||||
|
TREEVIEW_SendRealNotify(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
if (infoPtr->bNtfUnicode)
|
||||||
|
return (BOOL)SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
|
||||||
|
wParam, lParam);
|
||||||
|
else
|
||||||
|
return (BOOL)SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
|
||||||
|
wParam, lParam);
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
TREEVIEW_SendSimpleNotify(TREEVIEW_INFO *infoPtr, UINT code)
|
TREEVIEW_SendSimpleNotify(TREEVIEW_INFO *infoPtr, UINT code)
|
||||||
{
|
{
|
||||||
|
@ -420,24 +434,38 @@ TREEVIEW_SendSimpleNotify(TREEVIEW_INFO *infoPtr, UINT code)
|
||||||
nmhdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
|
nmhdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
|
||||||
nmhdr.code = code;
|
nmhdr.code = code;
|
||||||
|
|
||||||
return (BOOL)SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
|
return (BOOL)TREEVIEW_SendRealNotify(infoPtr,
|
||||||
(WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
|
(WPARAM)nmhdr.idFrom, (LPARAM)&nmhdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
TREEVIEW_TVItemFromItem(UINT mask, TVITEMA *tvItem, TREEVIEW_ITEM *item)
|
TREEVIEW_TVItemFromItem(TREEVIEW_INFO *infoPtr, UINT mask, TVITEMA *tvItem, TREEVIEW_ITEM *item)
|
||||||
{
|
{
|
||||||
tvItem->mask = mask;
|
tvItem->mask = mask;
|
||||||
tvItem->hItem = item;
|
tvItem->hItem = item;
|
||||||
tvItem->state = item->state;
|
tvItem->state = item->state;
|
||||||
tvItem->stateMask = 0;
|
tvItem->stateMask = 0;
|
||||||
tvItem->iImage = item->iImage;
|
tvItem->iImage = item->iImage;
|
||||||
tvItem->pszText = item->pszText;
|
|
||||||
tvItem->cchTextMax = item->cchTextMax;
|
tvItem->cchTextMax = item->cchTextMax;
|
||||||
tvItem->iImage = item->iImage;
|
tvItem->iImage = item->iImage;
|
||||||
tvItem->iSelectedImage = item->iSelectedImage;
|
tvItem->iSelectedImage = item->iSelectedImage;
|
||||||
tvItem->cChildren = item->cChildren;
|
tvItem->cChildren = item->cChildren;
|
||||||
tvItem->lParam = item->lParam;
|
tvItem->lParam = item->lParam;
|
||||||
|
|
||||||
|
/* **** **** **** **** WARNING **** **** **** **** */
|
||||||
|
/* This control stores all the data in A format */
|
||||||
|
/* we will convert it to W if the notify format */
|
||||||
|
/* is Unicode. */
|
||||||
|
/* **** **** **** **** WARNING **** **** **** **** */
|
||||||
|
if (infoPtr->bNtfUnicode) {
|
||||||
|
INT len = MultiByteToWideChar( CP_ACP, 0, item->pszText, -1, NULL, 0 );
|
||||||
|
if (len > 1) {
|
||||||
|
tvItem->pszText = (LPSTR)COMCTL32_Alloc (len*sizeof(WCHAR));
|
||||||
|
MultiByteToWideChar( CP_ACP, 0, item->pszText, -1, (LPWSTR)tvItem->pszText, len*sizeof(WCHAR) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
tvItem->pszText = item->pszText;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
|
@ -446,6 +474,7 @@ TREEVIEW_SendTreeviewNotify(TREEVIEW_INFO *infoPtr, UINT code, UINT action,
|
||||||
{
|
{
|
||||||
HWND hwnd = infoPtr->hwnd;
|
HWND hwnd = infoPtr->hwnd;
|
||||||
NMTREEVIEWA nmhdr;
|
NMTREEVIEWA nmhdr;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
TRACE("code:%x action:%x olditem:%p newitem:%p\n",
|
TRACE("code:%x action:%x olditem:%p newitem:%p\n",
|
||||||
code, action, oldItem, newItem);
|
code, action, oldItem, newItem);
|
||||||
|
@ -458,17 +487,22 @@ TREEVIEW_SendTreeviewNotify(TREEVIEW_INFO *infoPtr, UINT code, UINT action,
|
||||||
nmhdr.action = action;
|
nmhdr.action = action;
|
||||||
|
|
||||||
if (oldItem)
|
if (oldItem)
|
||||||
TREEVIEW_TVItemFromItem(mask, &nmhdr.itemOld, oldItem);
|
TREEVIEW_TVItemFromItem(infoPtr, mask, &nmhdr.itemOld, oldItem);
|
||||||
|
|
||||||
if (newItem)
|
if (newItem)
|
||||||
TREEVIEW_TVItemFromItem(mask, &nmhdr.itemNew, newItem);
|
TREEVIEW_TVItemFromItem(infoPtr, mask, &nmhdr.itemNew, newItem);
|
||||||
|
|
||||||
nmhdr.ptDrag.x = 0;
|
nmhdr.ptDrag.x = 0;
|
||||||
nmhdr.ptDrag.y = 0;
|
nmhdr.ptDrag.y = 0;
|
||||||
|
|
||||||
return (BOOL)SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
|
ret = (BOOL)TREEVIEW_SendRealNotify(infoPtr,
|
||||||
(WPARAM)GetWindowLongA(hwnd, GWL_ID),
|
(WPARAM)GetWindowLongA(hwnd, GWL_ID),
|
||||||
(LPARAM)&nmhdr);
|
(LPARAM)&nmhdr);
|
||||||
|
if (infoPtr->bNtfUnicode) {
|
||||||
|
COMCTL32_Free(nmhdr.itemOld.pszText);
|
||||||
|
COMCTL32_Free(nmhdr.itemNew.pszText);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL
|
static BOOL
|
||||||
|
@ -492,7 +526,7 @@ TREEVIEW_SendTreeviewDnDNotify(TREEVIEW_INFO *infoPtr, UINT code,
|
||||||
nmhdr.ptDrag.x = pt.x;
|
nmhdr.ptDrag.x = pt.x;
|
||||||
nmhdr.ptDrag.y = pt.y;
|
nmhdr.ptDrag.y = pt.y;
|
||||||
|
|
||||||
return (BOOL)SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
|
return (BOOL)TREEVIEW_SendRealNotify(infoPtr,
|
||||||
(WPARAM)GetWindowLongA(hwnd, GWL_ID),
|
(WPARAM)GetWindowLongA(hwnd, GWL_ID),
|
||||||
(LPARAM)&nmhdr);
|
(LPARAM)&nmhdr);
|
||||||
}
|
}
|
||||||
|
@ -522,7 +556,7 @@ TREEVIEW_SendCustomDrawNotify(TREEVIEW_INFO *infoPtr, DWORD dwDrawStage,
|
||||||
nmcdhdr.clrTextBk = infoPtr->clrBk;
|
nmcdhdr.clrTextBk = infoPtr->clrBk;
|
||||||
nmcdhdr.iLevel = 0;
|
nmcdhdr.iLevel = 0;
|
||||||
|
|
||||||
return (BOOL)SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
|
return (BOOL)TREEVIEW_SendRealNotify(infoPtr,
|
||||||
(WPARAM)GetWindowLongA(hwnd, GWL_ID),
|
(WPARAM)GetWindowLongA(hwnd, GWL_ID),
|
||||||
(LPARAM)&nmcdhdr);
|
(LPARAM)&nmcdhdr);
|
||||||
}
|
}
|
||||||
|
@ -570,7 +604,7 @@ TREEVIEW_SendCustomDrawItemNotify(TREEVIEW_INFO *infoPtr, HDC hdc,
|
||||||
nmcd->dwDrawStage, nmcd->hdc, nmcd->dwItemSpec,
|
nmcd->dwDrawStage, nmcd->hdc, nmcd->dwItemSpec,
|
||||||
nmcd->uItemState, nmcd->lItemlParam);
|
nmcd->uItemState, nmcd->lItemlParam);
|
||||||
|
|
||||||
retval = SendMessageA(infoPtr->hwndNotify, WM_NOTIFY,
|
retval = TREEVIEW_SendRealNotify(infoPtr,
|
||||||
(WPARAM)GetWindowLongA(hwnd, GWL_ID),
|
(WPARAM)GetWindowLongA(hwnd, GWL_ID),
|
||||||
(LPARAM)&nmcdhdr);
|
(LPARAM)&nmcdhdr);
|
||||||
|
|
||||||
|
@ -583,7 +617,9 @@ static BOOL
|
||||||
TREEVIEW_BeginLabelEditNotify(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *editItem)
|
TREEVIEW_BeginLabelEditNotify(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *editItem)
|
||||||
{
|
{
|
||||||
HWND hwnd = infoPtr->hwnd;
|
HWND hwnd = infoPtr->hwnd;
|
||||||
|
LPSTR allocated = NULL;
|
||||||
NMTVDISPINFOA tvdi;
|
NMTVDISPINFOA tvdi;
|
||||||
|
BOOL ret;
|
||||||
|
|
||||||
tvdi.hdr.hwndFrom = hwnd;
|
tvdi.hdr.hwndFrom = hwnd;
|
||||||
tvdi.hdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
|
tvdi.hdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
|
||||||
|
@ -593,11 +629,29 @@ TREEVIEW_BeginLabelEditNotify(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *editItem)
|
||||||
tvdi.item.hItem = editItem;
|
tvdi.item.hItem = editItem;
|
||||||
tvdi.item.state = editItem->state;
|
tvdi.item.state = editItem->state;
|
||||||
tvdi.item.lParam = editItem->lParam;
|
tvdi.item.lParam = editItem->lParam;
|
||||||
|
if (infoPtr->bNtfUnicode) {
|
||||||
|
INT len = MultiByteToWideChar( CP_ACP, 0, editItem->pszText, -1, NULL, 0 );
|
||||||
|
if (len > 1) {
|
||||||
|
tvdi.item.pszText = allocated = (LPSTR)COMCTL32_Alloc (len*sizeof(WCHAR));
|
||||||
|
MultiByteToWideChar( CP_ACP, 0, editItem->pszText, -1, (LPWSTR)tvdi.item.pszText, len*sizeof(WCHAR) );
|
||||||
|
tvdi.item.cchTextMax = len*sizeof(WCHAR);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tvdi.item.pszText = editItem->pszText; /* ??? */
|
||||||
|
tvdi.item.cchTextMax = editItem->cchTextMax; /* ??? */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
tvdi.item.pszText = editItem->pszText;
|
tvdi.item.pszText = editItem->pszText;
|
||||||
tvdi.item.cchTextMax = editItem->cchTextMax;
|
tvdi.item.cchTextMax = editItem->cchTextMax;
|
||||||
|
}
|
||||||
|
|
||||||
return SendMessageA(infoPtr->hwndNotify, WM_NOTIFY, tvdi.hdr.idFrom,
|
ret = (BOOL)TREEVIEW_SendRealNotify(infoPtr,
|
||||||
|
tvdi.hdr.idFrom,
|
||||||
(LPARAM)&tvdi);
|
(LPARAM)&tvdi);
|
||||||
|
if (allocated)
|
||||||
|
COMCTL32_Free(allocated);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -613,7 +667,8 @@ TREEVIEW_UpdateDispInfo(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
||||||
|
|
||||||
callback.hdr.hwndFrom = hwnd;
|
callback.hdr.hwndFrom = hwnd;
|
||||||
callback.hdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
|
callback.hdr.idFrom = GetWindowLongA(hwnd, GWL_ID);
|
||||||
callback.hdr.code = TVN_GETDISPINFOA;
|
callback.hdr.code = (infoPtr->bNtfUnicode) ? TVN_GETDISPINFOW :
|
||||||
|
TVN_GETDISPINFOA;
|
||||||
|
|
||||||
/* 'state' always contains valid value, as well as 'lParam'.
|
/* 'state' always contains valid value, as well as 'lParam'.
|
||||||
* All other parameters are uninitialized.
|
* All other parameters are uninitialized.
|
||||||
|
@ -629,7 +684,8 @@ TREEVIEW_UpdateDispInfo(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
||||||
if (mask & TVIF_TEXT)
|
if (mask & TVIF_TEXT)
|
||||||
wineItem->textWidth = 0;
|
wineItem->textWidth = 0;
|
||||||
|
|
||||||
SendMessageA(infoPtr->hwndNotify, WM_NOTIFY, callback.hdr.idFrom, (LPARAM)&callback);
|
TREEVIEW_SendRealNotify(infoPtr,
|
||||||
|
(WPARAM)callback.hdr.idFrom, (LPARAM)&callback);
|
||||||
|
|
||||||
/* It may have changed due to a call to SetItem. */
|
/* It may have changed due to a call to SetItem. */
|
||||||
mask &= wineItem->callbackMask;
|
mask &= wineItem->callbackMask;
|
||||||
|
@ -637,9 +693,37 @@ TREEVIEW_UpdateDispInfo(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
||||||
if ((mask & TVIF_TEXT) && callback.item.pszText != wineItem->pszText)
|
if ((mask & TVIF_TEXT) && callback.item.pszText != wineItem->pszText)
|
||||||
{
|
{
|
||||||
/* Instead of copying text into our buffer user specified its own */
|
/* Instead of copying text into our buffer user specified its own */
|
||||||
int len = max(lstrlenA(callback.item.pszText) + 1, TEXT_CALLBACK_SIZE);
|
if (infoPtr->bNtfUnicode) {
|
||||||
|
LPWSTR newText;
|
||||||
|
int buflen;
|
||||||
|
int len = WideCharToMultiByte( CP_ACP, 0,
|
||||||
|
(LPWSTR)callback.item.pszText, -1,
|
||||||
|
NULL, 0, NULL, NULL );
|
||||||
|
buflen = max((len+1)*sizeof(WCHAR), TEXT_CALLBACK_SIZE);
|
||||||
|
newText = (LPWSTR)COMCTL32_ReAlloc(wineItem->pszText, buflen);
|
||||||
|
|
||||||
|
TRACE("returned wstr %s, len=%d, buflen=%d\n",
|
||||||
|
debugstr_w((LPWSTR)callback.item.pszText), len, buflen);
|
||||||
|
|
||||||
|
if (newText)
|
||||||
|
{
|
||||||
|
wineItem->pszText = (LPSTR)newText;
|
||||||
|
WideCharToMultiByte( CP_ACP, 0,
|
||||||
|
(LPWSTR)callback.item.pszText, -1,
|
||||||
|
wineItem->pszText, buflen,
|
||||||
|
NULL, NULL );
|
||||||
|
wineItem->cchTextMax = buflen;
|
||||||
|
}
|
||||||
|
/* If ReAlloc fails we have nothing to do, but keep original text */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int len = max(lstrlenA(callback.item.pszText) + 1,
|
||||||
|
TEXT_CALLBACK_SIZE);
|
||||||
LPSTR newText = COMCTL32_ReAlloc(wineItem->pszText, len);
|
LPSTR newText = COMCTL32_ReAlloc(wineItem->pszText, len);
|
||||||
|
|
||||||
|
TRACE("returned str %s, len=%d\n",
|
||||||
|
debugstr_a(callback.item.pszText), len);
|
||||||
|
|
||||||
if (newText)
|
if (newText)
|
||||||
{
|
{
|
||||||
wineItem->pszText = newText;
|
wineItem->pszText = newText;
|
||||||
|
@ -648,6 +732,35 @@ TREEVIEW_UpdateDispInfo(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
||||||
}
|
}
|
||||||
/* If ReAlloc fails we have nothing to do, but keep original text */
|
/* If ReAlloc fails we have nothing to do, but keep original text */
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else if (mask & TVIF_TEXT) {
|
||||||
|
/* User put text into our buffer, that is ok unless W string */
|
||||||
|
if (infoPtr->bNtfUnicode) {
|
||||||
|
LPWSTR newText;
|
||||||
|
LPSTR oldText = NULL;
|
||||||
|
int buflen;
|
||||||
|
int len = WideCharToMultiByte( CP_ACP, 0,
|
||||||
|
(LPWSTR)callback.item.pszText, -1,
|
||||||
|
NULL, 0, NULL, NULL );
|
||||||
|
buflen = max((len+1)*sizeof(WCHAR), TEXT_CALLBACK_SIZE);
|
||||||
|
newText = (LPWSTR)COMCTL32_Alloc(buflen);
|
||||||
|
|
||||||
|
TRACE("same buffer wstr %s, len=%d, buflen=%d\n",
|
||||||
|
debugstr_w((LPWSTR)callback.item.pszText), len, buflen);
|
||||||
|
|
||||||
|
if (newText)
|
||||||
|
{
|
||||||
|
oldText = wineItem->pszText;
|
||||||
|
wineItem->pszText = (LPSTR)newText;
|
||||||
|
WideCharToMultiByte( CP_ACP, 0,
|
||||||
|
(LPWSTR)callback.item.pszText, -1,
|
||||||
|
wineItem->pszText, buflen, NULL, NULL );
|
||||||
|
wineItem->cchTextMax = buflen;
|
||||||
|
if (oldText)
|
||||||
|
COMCTL32_Free(oldText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (mask & TVIF_IMAGE)
|
if (mask & TVIF_IMAGE)
|
||||||
wineItem->iImage = callback.item.iImage;
|
wineItem->iImage = callback.item.iImage;
|
||||||
|
@ -948,6 +1061,8 @@ TREEVIEW_DoSetItem(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
||||||
wineItem->pszText = newText;
|
wineItem->pszText = newText;
|
||||||
wineItem->cchTextMax = len;
|
wineItem->cchTextMax = len;
|
||||||
lstrcpynA(wineItem->pszText, tvItem->pszText, len);
|
lstrcpynA(wineItem->pszText, tvItem->pszText, len);
|
||||||
|
TRACE("setting text %s, item %p\n",
|
||||||
|
debugstr_a(wineItem->pszText), wineItem);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -956,6 +1071,8 @@ TREEVIEW_DoSetItem(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
||||||
wineItem->pszText = COMCTL32_ReAlloc(wineItem->pszText,
|
wineItem->pszText = COMCTL32_ReAlloc(wineItem->pszText,
|
||||||
TEXT_CALLBACK_SIZE);
|
TEXT_CALLBACK_SIZE);
|
||||||
wineItem->cchTextMax = TEXT_CALLBACK_SIZE;
|
wineItem->cchTextMax = TEXT_CALLBACK_SIZE;
|
||||||
|
TRACE("setting callback, item %p\n",
|
||||||
|
wineItem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1318,7 +1435,9 @@ TREEVIEW_RemoveItem(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem)
|
||||||
{
|
{
|
||||||
TRACE("%p, (%s)\n", wineItem, TREEVIEW_ItemName(wineItem));
|
TRACE("%p, (%s)\n", wineItem, TREEVIEW_ItemName(wineItem));
|
||||||
|
|
||||||
TREEVIEW_SendTreeviewNotify(infoPtr, TVN_DELETEITEMA,
|
TREEVIEW_SendTreeviewNotify(infoPtr,
|
||||||
|
(infoPtr->bNtfUnicode) ? TVN_DELETEITEMW :
|
||||||
|
TVN_DELETEITEMA,
|
||||||
TVIF_HANDLE | TVIF_PARAM, 0, wineItem, 0);
|
TVIF_HANDLE | TVIF_PARAM, 0, wineItem, 0);
|
||||||
|
|
||||||
if (wineItem->firstChild)
|
if (wineItem->firstChild)
|
||||||
|
@ -1948,7 +2067,7 @@ TREEVIEW_SetItemA(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem)
|
||||||
}
|
}
|
||||||
|
|
||||||
static LRESULT
|
static LRESULT
|
||||||
TREEVIEW_GetItemW(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem)
|
TREEVIEW_GetItemW(TREEVIEW_INFO *infoPtr, LPTVITEMEXW tvItem)
|
||||||
{
|
{
|
||||||
TREEVIEW_ITEM *wineItem;
|
TREEVIEW_ITEM *wineItem;
|
||||||
INT iItem;
|
INT iItem;
|
||||||
|
@ -1987,17 +2106,20 @@ TREEVIEW_GetItemW(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem)
|
||||||
|
|
||||||
if (tvItem->mask & TVIF_TEXT) {
|
if (tvItem->mask & TVIF_TEXT) {
|
||||||
if (wineItem->pszText == LPSTR_TEXTCALLBACKA) {
|
if (wineItem->pszText == LPSTR_TEXTCALLBACKA) {
|
||||||
tvItem->pszText = LPSTR_TEXTCALLBACKA;
|
tvItem->pszText = LPSTR_TEXTCALLBACKW;
|
||||||
FIXME(" GetItem called with LPSTR_TEXTCALLBACK\n");
|
FIXME(" GetItem called with LPSTR_TEXTCALLBACK\n");
|
||||||
}
|
}
|
||||||
else if (wineItem->pszText) {
|
else if (wineItem->pszText) {
|
||||||
|
TRACE("orig str %s at %p\n",
|
||||||
|
debugstr_a(wineItem->pszText), wineItem->pszText);
|
||||||
MultiByteToWideChar(CP_ACP, 0, wineItem->pszText,
|
MultiByteToWideChar(CP_ACP, 0, wineItem->pszText,
|
||||||
-1 , (LPWSTR)tvItem->pszText, tvItem->cchTextMax);
|
-1 , tvItem->pszText, tvItem->cchTextMax);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE("item %d<%p>, txt %p, img %p, action %x\n",
|
TRACE("item %d<%p>, txt %p<%s>, img %p, action %x\n",
|
||||||
iItem, tvItem, tvItem->pszText, &tvItem->iImage, tvItem->mask);
|
iItem, tvItem, tvItem->pszText, debugstr_w(tvItem->pszText),
|
||||||
|
&tvItem->iImage, tvItem->mask);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2012,17 +2134,19 @@ TREEVIEW_SetItemW(TREEVIEW_INFO *infoPtr, LPTVITEMEXW tvItem)
|
||||||
tvItemA.hItem = tvItem->hItem;
|
tvItemA.hItem = tvItem->hItem;
|
||||||
tvItemA.state = tvItem->state;
|
tvItemA.state = tvItem->state;
|
||||||
tvItemA.stateMask = tvItem->stateMask;
|
tvItemA.stateMask = tvItem->stateMask;
|
||||||
|
if (tvItem->mask & TVIF_TEXT) {
|
||||||
len = WideCharToMultiByte(CP_ACP, 0, tvItem->pszText, -1,
|
len = WideCharToMultiByte(CP_ACP, 0, tvItem->pszText, -1,
|
||||||
NULL ,0 , NULL,NULL);
|
NULL ,0 , NULL,NULL);
|
||||||
if (len)
|
if (len) {
|
||||||
{
|
|
||||||
len ++;
|
len ++;
|
||||||
tvItemA.pszText = HeapAlloc(GetProcessHeap(),0,len);
|
tvItemA.pszText = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
|
||||||
len = WideCharToMultiByte(CP_ACP, 0, tvItem->pszText, -1,
|
len = WideCharToMultiByte(CP_ACP, 0, tvItem->pszText, -1,
|
||||||
tvItemA.pszText ,len , NULL,NULL);
|
tvItemA.pszText ,len*sizeof(WCHAR),
|
||||||
|
NULL,NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
tvItemA.pszText = NULL;
|
tvItemA.pszText = NULL;
|
||||||
|
}
|
||||||
tvItemA.cchTextMax = tvItem->cchTextMax;
|
tvItemA.cchTextMax = tvItem->cchTextMax;
|
||||||
tvItemA.iImage = tvItem->iImage;
|
tvItemA.iImage = tvItem->iImage;
|
||||||
tvItemA.iSelectedImage = tvItem->iSelectedImage;
|
tvItemA.iSelectedImage = tvItem->iSelectedImage;
|
||||||
|
@ -2413,6 +2537,10 @@ TREEVIEW_DrawItem(TREEVIEW_INFO *infoPtr, HDC hdc, TREEVIEW_ITEM *wineItem)
|
||||||
|
|
||||||
InflateRect(&rcText, -2, -1); /* allow for the focus rect */
|
InflateRect(&rcText, -2, -1); /* allow for the focus rect */
|
||||||
|
|
||||||
|
TRACE("drawing text %s at (%d,%d)-(%d,%d)\n",
|
||||||
|
debugstr_a(wineItem->pszText),
|
||||||
|
rcText.left, rcText.top, rcText.right, rcText.bottom);
|
||||||
|
|
||||||
/* Draw it */
|
/* Draw it */
|
||||||
DrawTextA(hdc,
|
DrawTextA(hdc,
|
||||||
wineItem->pszText,
|
wineItem->pszText,
|
||||||
|
@ -2515,6 +2643,8 @@ TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr)
|
||||||
|
|
||||||
infoPtr->treeWidth += infoPtr->scrollX;
|
infoPtr->treeWidth += infoPtr->scrollX;
|
||||||
|
|
||||||
|
if (infoPtr->dwStyle & TVS_NOSCROLL) return;
|
||||||
|
|
||||||
/* Adding one scroll bar may take up enough space that it forces us
|
/* Adding one scroll bar may take up enough space that it forces us
|
||||||
* to add the other as well. */
|
* to add the other as well. */
|
||||||
if (infoPtr->treeHeight > infoPtr->clientHeight)
|
if (infoPtr->treeHeight > infoPtr->clientHeight)
|
||||||
|
@ -2532,6 +2662,8 @@ TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr)
|
||||||
> infoPtr->clientHeight - GetSystemMetrics(SM_CYVSCROLL))
|
> infoPtr->clientHeight - GetSystemMetrics(SM_CYVSCROLL))
|
||||||
vert = TRUE;
|
vert = TRUE;
|
||||||
|
|
||||||
|
if (horz && (infoPtr->dwStyle & TVS_NOHSCROLL)) horz = FALSE;
|
||||||
|
|
||||||
si.cbSize = sizeof(SCROLLINFO);
|
si.cbSize = sizeof(SCROLLINFO);
|
||||||
si.fMask = SIF_POS|SIF_RANGE|SIF_PAGE;
|
si.fMask = SIF_POS|SIF_RANGE|SIF_PAGE;
|
||||||
si.nMin = 0;
|
si.nMin = 0;
|
||||||
|
@ -2917,7 +3049,10 @@ static BOOL
|
||||||
TREEVIEW_SendExpanding(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
TREEVIEW_SendExpanding(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
||||||
UINT action)
|
UINT action)
|
||||||
{
|
{
|
||||||
return !TREEVIEW_SendTreeviewNotify(infoPtr, TVN_ITEMEXPANDINGA, action,
|
return !TREEVIEW_SendTreeviewNotify(infoPtr,
|
||||||
|
(infoPtr->bNtfUnicode) ? TVN_ITEMEXPANDINGW :
|
||||||
|
TVN_ITEMEXPANDINGA,
|
||||||
|
action,
|
||||||
TVIF_HANDLE | TVIF_STATE | TVIF_PARAM
|
TVIF_HANDLE | TVIF_STATE | TVIF_PARAM
|
||||||
| TVIF_IMAGE | TVIF_SELECTEDIMAGE,
|
| TVIF_IMAGE | TVIF_SELECTEDIMAGE,
|
||||||
0, wineItem);
|
0, wineItem);
|
||||||
|
@ -2927,7 +3062,10 @@ static VOID
|
||||||
TREEVIEW_SendExpanded(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
TREEVIEW_SendExpanded(TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem,
|
||||||
UINT action)
|
UINT action)
|
||||||
{
|
{
|
||||||
TREEVIEW_SendTreeviewNotify(infoPtr, TVN_ITEMEXPANDEDA, action,
|
TREEVIEW_SendTreeviewNotify(infoPtr,
|
||||||
|
(infoPtr->bNtfUnicode) ? TVN_ITEMEXPANDEDW :
|
||||||
|
TVN_ITEMEXPANDEDA,
|
||||||
|
action,
|
||||||
TVIF_HANDLE | TVIF_STATE | TVIF_PARAM
|
TVIF_HANDLE | TVIF_STATE | TVIF_PARAM
|
||||||
| TVIF_IMAGE | TVIF_SELECTEDIMAGE,
|
| TVIF_IMAGE | TVIF_SELECTEDIMAGE,
|
||||||
0, wineItem);
|
0, wineItem);
|
||||||
|
@ -3514,8 +3652,7 @@ TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel)
|
||||||
tvdi.item.cchTextMax = 0;
|
tvdi.item.cchTextMax = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bCommit = (BOOL)SendMessageA(infoPtr->hwndNotify,
|
bCommit = (BOOL)TREEVIEW_SendRealNotify(infoPtr,
|
||||||
WM_NOTIFY,
|
|
||||||
(WPARAM)tvdi.hdr.idFrom, (LPARAM)&tvdi);
|
(WPARAM)tvdi.hdr.idFrom, (LPARAM)&tvdi);
|
||||||
|
|
||||||
if (!bCancel && bCommit) /* Apply the changes */
|
if (!bCancel && bCommit) /* Apply the changes */
|
||||||
|
@ -4626,6 +4763,13 @@ TREEVIEW_Create(HWND hwnd)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
infoPtr->hwndToolTip = 0;
|
infoPtr->hwndToolTip = 0;
|
||||||
|
|
||||||
|
infoPtr->bUnicode = IsWindowUnicode (hwnd);
|
||||||
|
|
||||||
|
/* Determine what type of notify should be issued */
|
||||||
|
/* sets infoPtr->bNtfUnicode */
|
||||||
|
TREEVIEW_NotifyFormat(infoPtr, 0, NF_REQUERY);
|
||||||
|
|
||||||
if (!(infoPtr->dwStyle & TVS_NOTOOLTIPS))
|
if (!(infoPtr->dwStyle & TVS_NOTOOLTIPS))
|
||||||
infoPtr->hwndToolTip = COMCTL32_CreateToolTip(hwnd);
|
infoPtr->hwndToolTip = COMCTL32_CreateToolTip(hwnd);
|
||||||
|
|
||||||
|
@ -4878,6 +5022,26 @@ TREEVIEW_Notify(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
|
||||||
return DefWindowProcA(infoPtr->hwnd, WM_NOTIFY, wParam, lParam);
|
return DefWindowProcA(infoPtr->hwnd, WM_NOTIFY, wParam, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static LRESULT
|
||||||
|
TREEVIEW_NotifyFormat (TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
INT i;
|
||||||
|
|
||||||
|
if (lParam == NF_REQUERY) {
|
||||||
|
i = SendMessageA(GetParent (infoPtr->hwnd),
|
||||||
|
WM_NOTIFYFORMAT, infoPtr->hwnd, NF_QUERY);
|
||||||
|
if ((i < NFR_ANSI) || (i > NFR_UNICODE)) {
|
||||||
|
ERR("wrong response to WM_NOTIFYFORMAT (%d), assuming ANSI\n",
|
||||||
|
i);
|
||||||
|
i = NFR_ANSI;
|
||||||
|
}
|
||||||
|
infoPtr->bNtfUnicode = (i == NFR_UNICODE) ? 1 : 0;
|
||||||
|
return (LRESULT)i;
|
||||||
|
}
|
||||||
|
return (LRESULT)((infoPtr->bNtfUnicode) ? NFR_UNICODE : NFR_ANSI);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static LRESULT
|
static LRESULT
|
||||||
TREEVIEW_Size(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
|
TREEVIEW_Size(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
|
@ -5027,7 +5191,7 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
return TREEVIEW_GetItemA(infoPtr, (LPTVITEMEXA)lParam);
|
return TREEVIEW_GetItemA(infoPtr, (LPTVITEMEXA)lParam);
|
||||||
|
|
||||||
case TVM_GETITEMW:
|
case TVM_GETITEMW:
|
||||||
return TREEVIEW_GetItemW(infoPtr, (LPTVITEMEXA)lParam);
|
return TREEVIEW_GetItemW(infoPtr, (LPTVITEMEXW)lParam);
|
||||||
|
|
||||||
case TVM_GETITEMHEIGHT:
|
case TVM_GETITEMHEIGHT:
|
||||||
return TREEVIEW_GetItemHeight(infoPtr);
|
return TREEVIEW_GetItemHeight(infoPtr);
|
||||||
|
@ -5161,7 +5325,8 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
case WM_NOTIFY:
|
case WM_NOTIFY:
|
||||||
return TREEVIEW_Notify(infoPtr, wParam, lParam);
|
return TREEVIEW_Notify(infoPtr, wParam, lParam);
|
||||||
|
|
||||||
/* WM_NOTIFYFORMAT */
|
case WM_NOTIFYFORMAT:
|
||||||
|
return TREEVIEW_NotifyFormat(infoPtr, wParam, lParam);
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
return TREEVIEW_Paint(infoPtr, wParam);
|
return TREEVIEW_Paint(infoPtr, wParam);
|
||||||
|
|
Loading…
Reference in New Issue