[User32]
[reactos.git] / reactos / dll / win32 / user32 / controls / combo.c
index 4ebbb03..adeac61 100644 (file)
@@ -74,9 +74,6 @@ static UINT   CBitHeight, CBitWidth;
 #define COMBO_EDITBUTTONSPACE()  0
 #define EDIT_CONTROL_PADDING()   1
 
-//static LRESULT WINAPI ComboWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
-//static LRESULT WINAPI ComboWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
-
 /*********************************************************************
  * combo class descriptor
  */
@@ -1122,7 +1119,7 @@ static void CBDropDown( LPHEADCOMBO lphc )
    if( (rect.bottom + nDroppedHeight) >= mon_info.rcWork.bottom )
       rect.bottom = rect.top - nDroppedHeight;
 
-   SetWindowPos( lphc->hWndLBox, HWND_TOP, rect.left, rect.bottom,
+   SetWindowPos( lphc->hWndLBox, HWND_TOPMOST, rect.left, rect.bottom,
                 lphc->droppedRect.right - lphc->droppedRect.left,
                 nDroppedHeight,
                 SWP_NOACTIVATE | SWP_SHOWWINDOW);
@@ -1840,6 +1837,18 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                                   WPARAM wParam, LPARAM lParam, BOOL unicode )
 {
       LPHEADCOMBO lphc = (LPHEADCOMBO)GetWindowLongPtrW( hwnd, 0 );
+#ifdef __REACTOS__
+      PWND pWnd;
+
+      pWnd = ValidateHwnd(hwnd);
+      if (pWnd)
+      {
+         if (!pWnd->fnid)
+         {
+            NtUserSetWindowFNID(hwnd, FNID_COMBOBOX);
+         }
+      }    
+#endif    
 
       TRACE("[%p]: msg %s wp %08lx lp %08lx\n",
             hwnd, SPY_GetMsgName(message, hwnd), wParam, lParam );
@@ -1858,6 +1867,9 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
        }
        case WM_NCDESTROY:
                COMBO_NCDestroy(lphc);
+#ifdef __REACTOS__
+                NtUserSetWindowFNID(hwnd, FNID_DESTROY);
+#endif
                break;/* -> DefWindowProc */
 
        case WM_CREATE:
@@ -1921,10 +1933,16 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
        case WM_GETFONT:
                return  (LRESULT)lphc->hFont;
        case WM_SETFOCUS:
-               if( lphc->wState & CBF_EDIT )
-                   SetFocus( lphc->hWndEdit );
-               else
-                   COMBO_SetFocus( lphc );
+               if( lphc->wState & CBF_EDIT ) {
+                   SetFocus( lphc->hWndEdit );
+                   /* The first time focus is received, select all the text */
+                   if( !(lphc->wState & CBF_BEENFOCUSED) ) {
+                       SendMessageW(lphc->hWndEdit, EM_SETSEL, 0, -1);
+                       lphc->wState |= CBF_BEENFOCUSED;
+                   }
+               }
+                else
+                    COMBO_SetFocus( lphc );
                return  TRUE;
        case WM_KILLFOCUS:
             {
@@ -2047,11 +2065,6 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
 
        /* Combo messages */
 
-#ifndef __REACTOS__
-       case CB_ADDSTRING16:
-               if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)MapSL(lParam);
-               /* fall through */
-#endif
        case CB_ADDSTRING:
                if( unicode )
                 {
@@ -2082,12 +2095,6 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                     HeapFree(GetProcessHeap(), 0, string);
                     return ret;
                 }
-#ifndef __REACTOS__
-       case CB_INSERTSTRING16:
-               wParam = (INT)(INT16)wParam;
-               if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)MapSL(lParam);
-               /* fall through */
-#endif
        case CB_INSERTSTRING:
                if( unicode )
                 {
@@ -2106,57 +2113,23 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
 
                     return SendMessageA(lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam);
                 }
-#ifndef __REACTOS__
-       case CB_DELETESTRING16:
-#endif
        case CB_DELETESTRING:
                return unicode ? SendMessageW(lphc->hWndLBox, LB_DELETESTRING, wParam, 0) :
                                 SendMessageA(lphc->hWndLBox, LB_DELETESTRING, wParam, 0);
-#ifndef __REACTOS__
-       case CB_SELECTSTRING16:
-               wParam = (INT)(INT16)wParam;
-               if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)MapSL(lParam);
-               /* fall through */
-#endif
        case CB_SELECTSTRING:
                return COMBO_SelectString(lphc, (INT)wParam, lParam, unicode);
-#ifndef __REACTOS__
-       case CB_FINDSTRING16:
-               wParam = (INT)(INT16)wParam;
-               if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)MapSL(lParam);
-               /* fall through */
-#endif
        case CB_FINDSTRING:
                return unicode ? SendMessageW(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam) :
                                 SendMessageA(lphc->hWndLBox, LB_FINDSTRING, wParam, lParam);
-#ifndef __REACTOS__
-       case CB_FINDSTRINGEXACT16:
-               wParam = (INT)(INT16)wParam;
-               if( CB_HASSTRINGS(lphc) ) lParam = (LPARAM)MapSL(lParam);
-               /* fall through */
-#endif
        case CB_FINDSTRINGEXACT:
                return unicode ? SendMessageW(lphc->hWndLBox, LB_FINDSTRINGEXACT, wParam, lParam) :
                                 SendMessageA(lphc->hWndLBox, LB_FINDSTRINGEXACT, wParam, lParam);
-#ifndef __REACTOS__
-       case CB_SETITEMHEIGHT16:
-               wParam = (INT)(INT16)wParam;    /* signed integer */
-               /* fall through */
-#endif
        case CB_SETITEMHEIGHT:
                return  COMBO_SetItemHeight( lphc, (INT)wParam, (INT)lParam);
-#ifndef __REACTOS__
-       case CB_GETITEMHEIGHT16:
-               wParam = (INT)(INT16)wParam;
-               /* fall through */
-#endif
        case CB_GETITEMHEIGHT:
                if( (INT)wParam >= 0 )  /* listbox item */
                     return SendMessageW(lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0);
                 return  CBGetTextAreaHeight(hwnd, lphc);
-#ifndef __REACTOS__
-       case CB_RESETCONTENT16:
-#endif
        case CB_RESETCONTENT:
                SendMessageW(lphc->hWndLBox, LB_RESETCONTENT, 0, 0);
                 if( (lphc->wState & CBF_EDIT) && CB_HASSTRINGS(lphc) )
@@ -2187,40 +2160,15 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                if( (CB_GETTYPE(lphc) != CBS_SIMPLE) &&
                    (INT)wParam < 32768 ) lphc->droppedWidth = (INT)wParam;
                return  CB_ERR;
-#ifndef __REACTOS__
-       case CB_GETDROPPEDCONTROLRECT16:
-               lParam = (LPARAM)MapSL(lParam);
-               if( lParam )
-               {
-                    RECT r;
-                    RECT16 *r16 = (RECT16 *)lParam;
-                    CBGetDroppedControlRect( lphc, &r );
-                    r16->left   = r.left;
-                    r16->top    = r.top;
-                    r16->right  = r.right;
-                    r16->bottom = r.bottom;
-               }
-               return  CB_OKAY;
-#endif
        case CB_GETDROPPEDCONTROLRECT:
                if( lParam ) CBGetDroppedControlRect(lphc, (LPRECT)lParam );
                return  CB_OKAY;
-#ifndef __REACTOS__
-       case CB_GETDROPPEDSTATE16:
-#endif
        case CB_GETDROPPEDSTATE:
                return  (lphc->wState & CBF_DROPPED) ? TRUE : FALSE;
-#ifndef __REACTOS__
-       case CB_DIR16:
-               return SendMessageA(lphc->hWndLBox, LB_DIR16, wParam, lParam);
-#endif
        case CB_DIR:
                return unicode ? SendMessageW(lphc->hWndLBox, LB_DIR, wParam, lParam) :
                                 SendMessageA(lphc->hWndLBox, LB_DIR, wParam, lParam);
 
-#ifndef __REACTOS__
-       case CB_SHOWDROPDOWN16:
-#endif
        case CB_SHOWDROPDOWN:
                if( CB_GETTYPE(lphc) != CBS_SIMPLE )
                {
@@ -2234,21 +2182,10 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                            CBRollUp( lphc, FALSE, TRUE );
                }
                return  TRUE;
-#ifndef __REACTOS__
-       case CB_GETCOUNT16:
-#endif
        case CB_GETCOUNT:
                return SendMessageW(lphc->hWndLBox, LB_GETCOUNT, 0, 0);
-#ifndef __REACTOS__
-       case CB_GETCURSEL16:
-#endif
        case CB_GETCURSEL:
                return SendMessageW(lphc->hWndLBox, LB_GETCURSEL, 0, 0);
-#ifndef __REACTOS__
-       case CB_SETCURSEL16:
-               wParam = (INT)(INT16)wParam;
-               /* fall through */
-#endif
        case CB_SETCURSEL:
                lParam = SendMessageW(lphc->hWndLBox, LB_SETCURSEL, wParam, 0);
                if( lParam >= 0 )
@@ -2261,58 +2198,26 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                    InvalidateRect(lphc->self, &lphc->textRect, TRUE);
                lphc->wState &= ~CBF_SELCHANGE;
                return  lParam;
-#ifndef __REACTOS__
-       case CB_GETLBTEXT16:
-               wParam = (INT)(INT16)wParam;
-               lParam = (LPARAM)MapSL(lParam);
-               /* fall through */
-#endif
        case CB_GETLBTEXT:
                return unicode ? SendMessageW(lphc->hWndLBox, LB_GETTEXT, wParam, lParam) :
                                 SendMessageA(lphc->hWndLBox, LB_GETTEXT, wParam, lParam);
-#ifndef __REACTOS__
-       case CB_GETLBTEXTLEN16:
-               wParam = (INT)(INT16)wParam;
-               /* fall through */
-#endif
        case CB_GETLBTEXTLEN:
                 return unicode ? SendMessageW(lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0) :
                                  SendMessageA(lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0);
-#ifndef __REACTOS__
-       case CB_GETITEMDATA16:
-               wParam = (INT)(INT16)wParam;
-               /* fall through */
-#endif
        case CB_GETITEMDATA:
                return SendMessageW(lphc->hWndLBox, LB_GETITEMDATA, wParam, 0);
-#ifndef __REACTOS__
-       case CB_SETITEMDATA16:
-               wParam = (INT)(INT16)wParam;
-               /* fall through */
-#endif
        case CB_SETITEMDATA:
                return SendMessageW(lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam);
-#ifndef __REACTOS__
-       case CB_GETEDITSEL16:
-               wParam = lParam = 0;   /* just in case */
-               /* fall through */
-#endif
        case CB_GETEDITSEL:
                /* Edit checks passed parameters itself */
                if( lphc->wState & CBF_EDIT )
                    return SendMessageW(lphc->hWndEdit, EM_GETSEL, wParam, lParam);
                return  CB_ERR;
-#ifndef __REACTOS__
-       case CB_SETEDITSEL16:
-#endif
        case CB_SETEDITSEL:
                if( lphc->wState & CBF_EDIT )
                     return SendMessageW(lphc->hWndEdit, EM_SETSEL,
                          (INT)(INT16)LOWORD(lParam), (INT)(INT16)HIWORD(lParam) );
                return  CB_ERR;
-#ifndef __REACTOS__
-       case CB_SETEXTENDEDUI16:
-#endif
        case CB_SETEXTENDEDUI:
                 if( CB_GETTYPE(lphc) == CBS_SIMPLE )
                     return  CB_ERR;
@@ -2320,9 +2225,6 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
                    lphc->wState |= CBF_EUI;
                else lphc->wState &= ~CBF_EUI;
                return  CB_OKAY;
-#ifndef __REACTOS__
-       case CB_GETEXTENDEDUI16:
-#endif
        case CB_GETEXTENDEDUI:
                return  (lphc->wState & CBF_EUI) ? TRUE : FALSE;
        case CB_GETCOMBOBOXINFO:
@@ -2330,6 +2232,7 @@ LRESULT WINAPI ComboWndProc_common( HWND hwnd, UINT message,
        case CB_LIMITTEXT:
                if( lphc->wState & CBF_EDIT )
                        return SendMessageW(lphc->hWndEdit, EM_LIMITTEXT, wParam, lParam);
+                break; // ReactOS!!! removed at revision 38715
 
     case WM_UPDATEUISTATE:
         if (unicode)