From: Filip Navara Date: Mon, 12 Dec 2005 19:49:08 +0000 (+0000) Subject: Implement undocumented listbox messages LB_INSERTSTRING_UPPER, LB_INSERTSTRING_LOWER... X-Git-Tag: backups/expat-rbuild@40467~985 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=8f10c7915cfdedc5754c88355d8b058c38174710 Implement undocumented listbox messages LB_INSERTSTRING_UPPER, LB_INSERTSTRING_LOWER, LB_ADDSTRING_UPPER, LB_ADDSTRING_LOWER and use them in combobox CB_ADDSTRING and CB_INSERTSTRING implementation. svn path=/trunk/; revision=20107 --- diff --git a/reactos/lib/user32/controls/combo.c b/reactos/lib/user32/controls/combo.c index b7869080152..7e5f76482da 100644 --- a/reactos/lib/user32/controls/combo.c +++ b/reactos/lib/user32/controls/combo.c @@ -1842,19 +1842,6 @@ static LRESULT COMBO_GetComboBoxInfo(LPHEADCOMBO lphc, COMBOBOXINFO *pcbi) return TRUE; } -static char *strdupA(LPCSTR str) -{ - char *ret; - DWORD len; - - if(!str) return NULL; - - len = strlen(str); - ret = HeapAlloc(GetProcessHeap(), 0, len + 1); - memcpy(ret, str, len + 1); - return ret; -} - /*********************************************************************** * ComboWndProc_common * @@ -2082,33 +2069,14 @@ static LRESULT ComboWndProc_common( HWND hwnd, UINT message, /* fall through */ #endif case CB_ADDSTRING: - if( unicode ) - { - if( lphc->dwStyle & CBS_LOWERCASE ) - strlwrW((LPWSTR)lParam); - else if( lphc->dwStyle & CBS_UPPERCASE ) - struprW((LPWSTR)lParam); - return SendMessageW(lphc->hWndLBox, LB_ADDSTRING, 0, lParam); - } - else /* unlike the unicode version, the ansi version does not overwrite - the string if converting case */ - { - char *string = NULL; - LRESULT ret; - if( lphc->dwStyle & CBS_LOWERCASE ) - { - string = strdupA((LPSTR)lParam); - _strlwr(string); - } - else if( lphc->dwStyle & CBS_UPPERCASE ) - { - string = strdupA((LPSTR)lParam); - _strupr(string); - } - ret = SendMessageA(lphc->hWndLBox, LB_ADDSTRING, 0, string ? (LPARAM)string : lParam); - HeapFree(GetProcessHeap(), 0, string); - return ret; - } + { + UINT msg = LB_ADDSTRING; + if( lphc->dwStyle & CBS_LOWERCASE ) + msg = LB_ADDSTRING_LOWER; + else if( lphc->dwStyle & CBS_UPPERCASE ) + msg = LB_ADDSTRING_UPPER; + return SendMessageW(lphc->hWndLBox, msg, 0, lParam); + } #ifndef __REACTOS__ case CB_INSERTSTRING16: wParam = (INT)(INT16)wParam; @@ -2116,22 +2084,14 @@ static LRESULT ComboWndProc_common( HWND hwnd, UINT message, /* fall through */ #endif case CB_INSERTSTRING: - if( unicode ) - { - if( lphc->dwStyle & CBS_LOWERCASE ) - strlwrW((LPWSTR)lParam); - else if( lphc->dwStyle & CBS_UPPERCASE ) - struprW((LPWSTR)lParam); - return SendMessageW(lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam); - } - else - { - if( lphc->dwStyle & CBS_LOWERCASE ) - _strlwr((LPSTR)lParam); - else if( lphc->dwStyle & CBS_UPPERCASE ) - _strupr((LPSTR)lParam); - return SendMessageA(lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam); - } + { + UINT msg = LB_INSERTSTRING; + if( lphc->dwStyle & CBS_LOWERCASE ) + msg = LB_INSERTSTRING_LOWER; + else if( lphc->dwStyle & CBS_UPPERCASE ) + msg = LB_INSERTSTRING_UPPER; + return SendMessageW(lphc->hWndLBox, msg, 0, lParam); + } #ifndef __REACTOS__ case CB_DELETESTRING16: #endif diff --git a/reactos/lib/user32/controls/listbox.c b/reactos/lib/user32/controls/listbox.c index 9c998a5ae28..eeca21d9505 100644 --- a/reactos/lib/user32/controls/listbox.c +++ b/reactos/lib/user32/controls/listbox.c @@ -2650,6 +2650,8 @@ static LRESULT WINAPI ListBoxWndProc_common( HWND hwnd, UINT msg, /* fall through */ #endif case LB_ADDSTRING: + case LB_ADDSTRING_LOWER: + case LB_ADDSTRING_UPPER: { INT ret; LPWSTR textW; @@ -2662,6 +2664,12 @@ static LRESULT WINAPI ListBoxWndProc_common( HWND hwnd, UINT msg, if((textW = HeapAlloc(GetProcessHeap(), 0, countW * sizeof(WCHAR)))) MultiByteToWideChar(CP_ACP, 0, textA, -1, textW, countW); } + /* in the unicode the version, the string is really overwritten + during the converting case */ + if (msg == LB_ADDSTRING_LOWER) + strlwrW(textW); + else if (msg == LB_ADDSTRING_UPPER) + struprW(textW); wParam = LISTBOX_FindStringPos( descr, textW, FALSE ); ret = LISTBOX_InsertString( descr, wParam, textW ); if (!unicode && HAS_STRINGS(descr)) @@ -2676,6 +2684,8 @@ static LRESULT WINAPI ListBoxWndProc_common( HWND hwnd, UINT msg, /* fall through */ #endif case LB_INSERTSTRING: + case LB_INSERTSTRING_UPPER: + case LB_INSERTSTRING_LOWER: { INT ret; LPWSTR textW; @@ -2688,6 +2698,12 @@ static LRESULT WINAPI ListBoxWndProc_common( HWND hwnd, UINT msg, if((textW = HeapAlloc(GetProcessHeap(), 0, countW * sizeof(WCHAR)))) MultiByteToWideChar(CP_ACP, 0, textA, -1, textW, countW); } + /* in the unicode the version, the string is really overwritten + during the converting case */ + if (msg == LB_INSERTSTRING_LOWER) + strlwrW(textW); + else if (msg == LB_INSERTSTRING_UPPER) + struprW(textW); ret = LISTBOX_InsertString( descr, wParam, textW ); if(!unicode && HAS_STRINGS(descr)) HeapFree(GetProcessHeap(), 0, textW); diff --git a/reactos/lib/user32/include/controls.h b/reactos/lib/user32/include/controls.h index 69ddb55b9bc..772424a14d3 100644 --- a/reactos/lib/user32/include/controls.h +++ b/reactos/lib/user32/include/controls.h @@ -110,4 +110,9 @@ typedef struct extern BOOL COMBO_FlipListbox( LPHEADCOMBO, BOOL, BOOL ); +#define LB_INSERTSTRING_UPPER 0x1AA +#define LB_INSERTSTRING_LOWER 0x1AB +#define LB_ADDSTRING_UPPER 0x1AC +#define LB_ADDSTRING_LOWER 0x1AD + #endif /* _ROS_CONTROLS_H */