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. Modified: trunk/reactos/lib/user32/controls/combo.c Modified: trunk/reactos/lib/user32/controls/listbox.c Modified: trunk/reactos/lib/user32/include/controls.h _____
Modified: trunk/reactos/lib/user32/controls/combo.c --- trunk/reactos/lib/user32/controls/combo.c 2005-12-12 19:23:52 UTC (rev 20106) +++ trunk/reactos/lib/user32/controls/combo.c 2005-12-12 19:49:08 UTC (rev 20107) @@ -1842,19 +1842,6 @@
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 @@ /* 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 @@ /* 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 _____
Modified: trunk/reactos/lib/user32/controls/listbox.c --- trunk/reactos/lib/user32/controls/listbox.c 2005-12-12 19:23:52 UTC (rev 20106) +++ trunk/reactos/lib/user32/controls/listbox.c 2005-12-12 19:49:08 UTC (rev 20107) @@ -2650,6 +2650,8 @@
/* fall through */ #endif case LB_ADDSTRING: + case LB_ADDSTRING_LOWER: + case LB_ADDSTRING_UPPER: { INT ret; LPWSTR textW; @@ -2662,6 +2664,12 @@ 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 @@ /* fall through */ #endif case LB_INSERTSTRING: + case LB_INSERTSTRING_UPPER: + case LB_INSERTSTRING_LOWER: { INT ret; LPWSTR textW; @@ -2688,6 +2698,12 @@ 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); _____
Modified: trunk/reactos/lib/user32/include/controls.h --- trunk/reactos/lib/user32/include/controls.h 2005-12-12 19:23:52 UTC (rev 20106) +++ trunk/reactos/lib/user32/include/controls.h 2005-12-12 19:49:08 UTC (rev 20107) @@ -110,4 +110,9 @@
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 */