Commit 8a922131 authored by David Grant's avatar David Grant Committed by Alexandre Julliard

- Creating combobox with CBS_SIMPLE style shall set internal flag CBF_EDIT.

- Edit text must be selected only if CB is in focus. - If CB has edit control we have to call CBUpdateEdit to update its contents. Invalidating textRect will not force updating of child edit control, obviously. - We have to protect ourselves from changing selection in listbox when we receive listbox notification. So LBN_SELCHANGE -> CBUpdateEdit -> EN_CHANGE will not reselect item in the lisbox.
parent 0ce13a48
...@@ -472,7 +472,7 @@ static LRESULT COMBO_Create( LPHEADCOMBO lphc, WND* wnd, LPARAM lParam) ...@@ -472,7 +472,7 @@ static LRESULT COMBO_Create( LPHEADCOMBO lphc, WND* wnd, LPARAM lParam)
LPCREATESTRUCTA lpcs = (CREATESTRUCTA*)lParam; LPCREATESTRUCTA lpcs = (CREATESTRUCTA*)lParam;
if( !CB_GETTYPE(lphc) ) lphc->dwStyle |= CBS_SIMPLE; if( !CB_GETTYPE(lphc) ) lphc->dwStyle |= CBS_SIMPLE;
else if( CB_GETTYPE(lphc) != CBS_DROPDOWNLIST ) lphc->wState |= CBF_EDIT; if( CB_GETTYPE(lphc) != CBS_DROPDOWNLIST ) lphc->wState |= CBF_EDIT;
lphc->self = wnd; lphc->self = wnd;
lphc->owner = lpcs->hwndParent; lphc->owner = lpcs->hwndParent;
...@@ -1113,6 +1113,9 @@ static void CBUpdateEdit( LPHEADCOMBO lphc , INT index ) ...@@ -1113,6 +1113,9 @@ static void CBUpdateEdit( LPHEADCOMBO lphc , INT index )
SendMessageA( lphc->hWndEdit, WM_SETTEXT, 0, pText ? (LPARAM)pText : (LPARAM)"" ); SendMessageA( lphc->hWndEdit, WM_SETTEXT, 0, pText ? (LPARAM)pText : (LPARAM)"" );
lphc->wState &= ~CBF_NOEDITNOTIFY; lphc->wState &= ~CBF_NOEDITNOTIFY;
if( lphc->wState & CBF_FOCUSED )
SendMessageA( lphc->hWndEdit, EM_SETSEL, 0, (LPARAM)(-1) );
if( pText ) if( pText )
HeapFree( GetProcessHeap(), 0, pText ); HeapFree( GetProcessHeap(), 0, pText );
} }
...@@ -1384,7 +1387,14 @@ static LRESULT COMBO_Command( LPHEADCOMBO lphc, WPARAM wParam, HWND hWnd ) ...@@ -1384,7 +1387,14 @@ static LRESULT COMBO_Command( LPHEADCOMBO lphc, WPARAM wParam, HWND hWnd )
if (!(lphc->wState & CBF_NOEDITNOTIFY)) if (!(lphc->wState & CBF_NOEDITNOTIFY))
CB_NOTIFY( lphc, CBN_EDITCHANGE ); CB_NOTIFY( lphc, CBN_EDITCHANGE );
if (lphc->wState & CBF_NOLBSELECT)
{
lphc->wState &= ~CBF_NOLBSELECT;
}
else
{
CBUpdateLBox( lphc ); CBUpdateLBox( lphc );
}
break; break;
case (EN_UPDATE >> 8): case (EN_UPDATE >> 8):
...@@ -1417,13 +1427,17 @@ static LRESULT COMBO_Command( LPHEADCOMBO lphc, WPARAM wParam, HWND hWnd ) ...@@ -1417,13 +1427,17 @@ static LRESULT COMBO_Command( LPHEADCOMBO lphc, WPARAM wParam, HWND hWnd )
/* do not roll up if selection is being tracked /* do not roll up if selection is being tracked
* by arrowkeys in the dropdown listbox */ * by arrowkeys in the dropdown listbox */
if( (lphc->wState & CBF_DROPPED) && !(lphc->wState & CBF_NOROLLUP) ) if( (lphc->dwStyle & CBS_SIMPLE) ||
((lphc->wState & CBF_DROPPED) && !(lphc->wState & CBF_NOROLLUP)) )
{
CBRollUp( lphc, (HIWORD(wParam) == LBN_SELCHANGE), TRUE ); CBRollUp( lphc, (HIWORD(wParam) == LBN_SELCHANGE), TRUE );
}
else lphc->wState &= ~CBF_NOROLLUP; else lphc->wState &= ~CBF_NOROLLUP;
if( lphc->wState & CBF_EDIT ) if( lphc->wState & CBF_EDIT )
{ {
INT index = SendMessageA(lphc->hWndLBox, LB_GETCURSEL, 0, 0); INT index = SendMessageA(lphc->hWndLBox, LB_GETCURSEL, 0, 0);
lphc->wState |= CBF_NOLBSELECT;
CBUpdateEdit( lphc, index ); CBUpdateEdit( lphc, index );
/* select text in edit, as Windows does */ /* select text in edit, as Windows does */
SendMessageA( lphc->hWndEdit, EM_SETSEL, 0, (LPARAM)(-1) ); SendMessageA( lphc->hWndEdit, EM_SETSEL, 0, (LPARAM)(-1) );
...@@ -2055,6 +2069,8 @@ static inline LRESULT WINAPI ComboWndProc_locked( WND* pWnd, UINT message, ...@@ -2055,6 +2069,8 @@ static inline LRESULT WINAPI ComboWndProc_locked( WND* pWnd, UINT message,
wParam = (INT)(INT16)wParam; wParam = (INT)(INT16)wParam;
case CB_SETCURSEL: case CB_SETCURSEL:
lParam = SendMessageA( lphc->hWndLBox, LB_SETCURSEL, wParam, 0); lParam = SendMessageA( lphc->hWndLBox, LB_SETCURSEL, wParam, 0);
if( lParam >= 0 )
SendMessageA( lphc->hWndLBox, LB_SETTOPINDEX, wParam, 0);
if( lphc->wState & CBF_SELCHANGE ) if( lphc->wState & CBF_SELCHANGE )
{ {
/* no LBN_SELCHANGE in this case, update manually */ /* no LBN_SELCHANGE in this case, update manually */
......
...@@ -26,6 +26,7 @@ struct tagWND; ...@@ -26,6 +26,7 @@ struct tagWND;
#define CBF_NOREDRAW 0x0200 #define CBF_NOREDRAW 0x0200
#define CBF_SELCHANGE 0x0400 #define CBF_SELCHANGE 0x0400
#define CBF_NOEDITNOTIFY 0x1000 #define CBF_NOEDITNOTIFY 0x1000
#define CBF_NOLBSELECT 0x2000 /* do not change current selection */
#define CBF_EUI 0x8000 #define CBF_EUI 0x8000
/* Combo state struct */ /* Combo state struct */
......
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