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 */