Set proper item focus on DeleteItem.

Clean up edit label implementation.
oldstable
Ulrich Czekalla 1999-11-04 01:42:36 +00:00 committed by Alexandre Julliard
parent 6deeedbf66
commit d11d6e2085
2 changed files with 49 additions and 29 deletions

View File

@ -92,20 +92,10 @@ DEFAULT_DEBUG_CHANNEL(listview)
/* retrieve the number of items in the listview */ /* retrieve the number of items in the listview */
#define GETITEMCOUNT(infoPtr) ((infoPtr)->hdpaItems->nItemCount) #define GETITEMCOUNT(infoPtr) ((infoPtr)->hdpaItems->nItemCount)
/* Some definitions for inline edit control */
typedef BOOL (*EditlblCallback)(HWND, LPSTR, DWORD);
HWND CreateEditLabel(LPCSTR text, DWORD style, INT x, INT y, HWND CreateEditLabel(LPCSTR text, DWORD style, INT x, INT y,
INT width, INT height, HWND parent, HINSTANCE hinst, INT width, INT height, HWND parent, HINSTANCE hinst,
EditlblCallback EditLblCb, DWORD param); EditlblCallback EditLblCb, DWORD param);
typedef struct tagEDITLABEL_ITEM
{
WNDPROC EditWndProc;
DWORD param;
EditlblCallback EditLblCb;
} EDITLABEL_ITEM;
/* /*
* forward declarations * forward declarations
*/ */
@ -1859,7 +1849,7 @@ static VOID LISTVIEW_DrawItem(HWND hwnd, HDC hdc, INT nItem, RECT rcItem)
} }
/* Don't bother painting item being edited */ /* Don't bother painting item being edited */
if (infoPtr->lpeditItem && lvItem.state & LVIS_FOCUSED) if (infoPtr->hwndEdit && lvItem.state & LVIS_FOCUSED)
return; return;
if ((lvItem.state & LVIS_SELECTED) && (infoPtr->bFocus != FALSE)) if ((lvItem.state & LVIS_SELECTED) && (infoPtr->bFocus != FALSE))
@ -2688,6 +2678,16 @@ static LRESULT LISTVIEW_DeleteItem(HWND hwnd, INT nItem)
} }
} }
/* If this item had focus change focus to next or previous item */
if (GETITEMCOUNT(infoPtr) > 0)
{
int sItem = nItem < GETITEMCOUNT(infoPtr) ? nItem : nItem - 1;
if (infoPtr->nFocusedItem == nItem)
LISTVIEW_SetItemFocus(hwnd, sItem);
}
else
infoPtr->nFocusedItem = -1;
LISTVIEW_UpdateScroll(hwnd); LISTVIEW_UpdateScroll(hwnd);
/* refresh client area */ /* refresh client area */
@ -2760,7 +2760,6 @@ static BOOL LISTVIEW_EndEditLabel(HWND hwnd, LPSTR pszText, DWORD nItem)
ListView_Notify(GetParent(hwnd), nCtrlId, &dispInfo); ListView_Notify(GetParent(hwnd), nCtrlId, &dispInfo);
infoPtr->hwndEdit = 0; infoPtr->hwndEdit = 0;
infoPtr->lpeditItem = NULL;
return TRUE; return TRUE;
} }
@ -2792,6 +2791,9 @@ static HWND LISTVIEW_EditLabelA(HWND hwnd, INT nItem)
if (~GetWindowLongA(hwnd, GWL_STYLE) & LVS_EDITLABELS) if (~GetWindowLongA(hwnd, GWL_STYLE) & LVS_EDITLABELS)
return FALSE; return FALSE;
LISTVIEW_SetSelection(hwnd, nItem);
LISTVIEW_SetItemFocus(hwnd, nItem);
ZeroMemory(&dispInfo, sizeof(NMLVDISPINFOA)); ZeroMemory(&dispInfo, sizeof(NMLVDISPINFOA));
if (NULL == (hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem))) if (NULL == (hdpaSubItems = (HDPA)DPA_GetPtr(infoPtr->hdpaItems, nItem)))
return 0; return 0;
@ -2825,7 +2827,6 @@ static HWND LISTVIEW_EditLabelA(HWND hwnd, INT nItem)
return 0; return 0;
infoPtr->hwndEdit = hedit; infoPtr->hwndEdit = hedit;
infoPtr->lpeditItem = lpItem;
SetFocus(hedit); SetFocus(hedit);
SendMessageA(hedit, EM_SETSEL, 0, -1); SendMessageA(hedit, EM_SETSEL, 0, -1);
@ -5737,7 +5738,7 @@ static LRESULT LISTVIEW_Create(HWND hwnd, WPARAM wParam, LPARAM lParam)
infoPtr->iconSpacing.cy = GetSystemMetrics(SM_CYICONSPACING); infoPtr->iconSpacing.cy = GetSystemMetrics(SM_CYICONSPACING);
ZeroMemory(&infoPtr->rcList, sizeof(RECT)); ZeroMemory(&infoPtr->rcList, sizeof(RECT));
infoPtr->hwndEdit = 0; infoPtr->hwndEdit = 0;
infoPtr->lpeditItem = NULL; infoPtr->pedititem = NULL;
/* get default font (icon title) */ /* get default font (icon title) */
SystemParametersInfoA(SPI_GETICONTITLELOGFONT, 0, &logFont, 0); SystemParametersInfoA(SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
@ -7378,14 +7379,26 @@ LRESULT CALLBACK EditLblWndProc(HWND hwnd, UINT uMsg,
WPARAM wParam, LPARAM lParam) WPARAM wParam, LPARAM lParam)
{ {
BOOL cancel = TRUE; BOOL cancel = TRUE;
EDITLABEL_ITEM *einfo = LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongA(GetParent(hwnd), 0);
(EDITLABEL_ITEM *) GetWindowLongA(hwnd, GWL_USERDATA); EDITLABEL_ITEM *einfo = infoPtr->pedititem;
switch (uMsg) switch (uMsg)
{ {
case WM_GETDLGCODE:
return DLGC_WANTARROWS | DLGC_WANTALLKEYS;
case WM_KILLFOCUS: case WM_KILLFOCUS:
break; break;
case WM_DESTROY:
{
WNDPROC editProc = einfo->EditWndProc;
SetWindowLongA(hwnd, GWL_WNDPROC, (LONG)editProc);
COMCTL32_Free(einfo);
infoPtr->pedititem = NULL;
return CallWindowProcA(editProc, hwnd, uMsg, wParam, lParam);
}
case WM_CHAR: case WM_CHAR:
if (VK_RETURN == (INT)wParam) if (VK_RETURN == (INT)wParam)
{ {
@ -7400,7 +7413,6 @@ LRESULT CALLBACK EditLblWndProc(HWND hwnd, UINT uMsg,
uMsg, wParam, lParam); uMsg, wParam, lParam);
} }
SetWindowLongA(hwnd, GWL_WNDPROC, (LONG)einfo->EditWndProc);
if (einfo->EditLblCb) if (einfo->EditLblCb)
{ {
char *buffer = NULL; char *buffer = NULL;
@ -7422,10 +7434,11 @@ LRESULT CALLBACK EditLblWndProc(HWND hwnd, UINT uMsg,
if (buffer) if (buffer)
COMCTL32_Free(buffer); COMCTL32_Free(buffer);
einfo->EditLblCb = NULL;
} }
COMCTL32_Free(einfo); SendMessageA(hwnd, WM_CLOSE, 0, 0);
PostMessageA(hwnd, WM_CLOSE, 0, 0);
return TRUE; return TRUE;
} }
@ -7443,25 +7456,22 @@ HWND CreateEditLabel(LPCSTR text, DWORD style, INT x, INT y,
EditlblCallback EditLblCb, DWORD param) EditlblCallback EditLblCb, DWORD param)
{ {
HWND hedit; HWND hedit;
EDITLABEL_ITEM *einfo; LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongA(parent, 0);
if (NULL == (infoPtr->pedititem = COMCTL32_Alloc(sizeof(EDITLABEL_ITEM))))
if (NULL == (einfo = COMCTL32_Alloc(sizeof(EDITLABEL_ITEM))))
return 0; return 0;
style |= WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|WS_BORDER; style |= WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|WS_BORDER;
if (!(hedit = CreateWindowA("Edit", text, style, x, y, width, height, if (!(hedit = CreateWindowA("Edit", text, style, x, y, width, height,
parent, 0, hinst, 0))) parent, 0, hinst, 0)))
{ {
COMCTL32_Free(einfo); COMCTL32_Free(infoPtr->pedititem);
return 0; return 0;
} }
einfo->param = param; infoPtr->pedititem->param = param;
einfo->EditLblCb = EditLblCb; infoPtr->pedititem->EditLblCb = EditLblCb;
einfo->EditWndProc = (WNDPROC)SetWindowLongA(hedit, infoPtr->pedititem->EditWndProc = (WNDPROC)SetWindowLongA(hedit,
GWL_WNDPROC, (LONG) EditLblWndProc); GWL_WNDPROC, (LONG) EditLblWndProc);
SetWindowLongA(hedit, GWL_USERDATA, (LONG)einfo);
return hedit; return hedit;
} }

View File

@ -11,6 +11,16 @@
#include "windef.h" #include "windef.h"
#include "wingdi.h" #include "wingdi.h"
/* Some definitions for inline edit control */
typedef BOOL (*EditlblCallback)(HWND, LPSTR, DWORD);
typedef struct tagEDITLABEL_ITEM
{
WNDPROC EditWndProc;
DWORD param;
EditlblCallback EditLblCb;
} EDITLABEL_ITEM;
typedef struct tagLISTVIEW_SUBITEM typedef struct tagLISTVIEW_SUBITEM
{ {
LPSTR pszText; LPSTR pszText;
@ -61,7 +71,7 @@ typedef struct tagLISTVIEW_INFO
PFNLVCOMPARE pfnCompare; PFNLVCOMPARE pfnCompare;
LPARAM lParamSort; LPARAM lParamSort;
HWND hwndEdit; HWND hwndEdit;
LISTVIEW_ITEM *lpeditItem; EDITLABEL_ITEM *pedititem;
} LISTVIEW_INFO; } LISTVIEW_INFO;