Author: mjmartin
Date: Mon Nov  2 22:17:50 2009
New Revision: 43925

URL: http://svn.reactos.org/svn/reactos?rev=43925&view=rev
Log:
[user32]
- Reapply changes from 40677 as the edit control does not receive the 
WM_COMMAND message from its context menu when doing clipboard ops. 
- Fixes crashes in applications created with visual basic when using edit 
controls context menu.
- If we lose this in next sync, ill grovel and beg.

Modified:
    trunk/reactos/dll/win32/user32/controls/edit.c

Modified: trunk/reactos/dll/win32/user32/controls/edit.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/user32/controls/edit.c?rev=43925&r1=43924&r2=43925&view=diff
==============================================================================
--- trunk/reactos/dll/win32/user32/controls/edit.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/controls/edit.c [iso-8859-1] Mon Nov  2 
22:17:50 2009
@@ -3383,15 +3383,60 @@
 
 /*********************************************************************
  *
- *     WM_COMMAND
- *
- */
-static void EDIT_WM_Command(EDITSTATE *es, INT code, INT id, HWND control)
-{
-       if (code || control)
-               return;
-
-       switch (id) {
+ *     WM_CONTEXTMENU
+ *
+ *     Note: the resource files resource/sysres_??.rc cannot define a
+ *             single popup menu.  Hence we use a (dummy) menubar
+ *             containing the single popup menu as its first item.
+ *
+ *     FIXME: the message identifiers have been chosen arbitrarily,
+ *             hence we use MF_BYPOSITION.
+ *             We might as well use the "real" values (anybody knows ?)
+ *             The menu definition is in resources/sysres_??.rc.
+ *             Once these are OK, we better use MF_BYCOMMAND here
+ *             (as we do in EDIT_WM_Command()).
+ *
+ */
+static void EDIT_WM_ContextMenu(EDITSTATE *es, INT x, INT y)
+{
+#ifdef __REACTOS__
+       HMENU menu = LoadMenuA(User32Instance, "EDITMENU");
+#else
+       HMENU menu = LoadMenuA(user32_module, "EDITMENU");
+#endif
+       HMENU popup = GetSubMenu(menu, 0);
+       UINT start = es->selection_start;
+       UINT end = es->selection_end;
+
+    BOOL selectedItem;
+       ORDER_UINT(start, end);
+
+       /* undo */
+       EnableMenuItem(popup, 0, MF_BYPOSITION | (EDIT_EM_CanUndo(es) && 
!(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
+       /* cut */
+       EnableMenuItem(popup, 2, MF_BYPOSITION | ((end - start) && !(es->style 
& ES_PASSWORD) && !(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
+       /* copy */
+       EnableMenuItem(popup, 3, MF_BYPOSITION | ((end - start) && !(es->style 
& ES_PASSWORD) ? MF_ENABLED : MF_GRAYED));
+       /* paste */
+       EnableMenuItem(popup, 4, MF_BYPOSITION | 
(IsClipboardFormatAvailable(CF_UNICODETEXT) && !(es->style & ES_READONLY) ? 
MF_ENABLED : MF_GRAYED));
+       /* delete */
+       EnableMenuItem(popup, 5, MF_BYPOSITION | ((end - start) && !(es->style 
& ES_READONLY) ? MF_ENABLED : MF_GRAYED));
+       /* select all */
+       EnableMenuItem(popup, 7, MF_BYPOSITION | (start || (end != 
get_text_length(es)) ? MF_ENABLED : MF_GRAYED));
+
+        if (x == -1 && y == -1) /* passed via VK_APPS press/release */
+        {
+            RECT rc;
+            /* Windows places the menu at the edit's center in this case */
+            GetClientRect(es->hwndSelf, &rc);
+            MapWindowPoints(es->hwndSelf, 0, (POINT *)&rc, 2);
+            x = rc.left + (rc.right - rc.left) / 2;
+            y = rc.top + (rc.bottom - rc.top) / 2;
+        }
+
+       selectedItem = TrackPopupMenu(popup, TPM_LEFTALIGN | TPM_RIGHTBUTTON | 
TPM_RETURNCMD, x, y, 0, es->hwndSelf, NULL);
+
+       switch (selectedItem) {
                case EM_UNDO:
                         SendMessageW(es->hwndSelf, WM_UNDO, 0, 0);
                        break;
@@ -3415,62 +3460,7 @@
                        ERR("unknown menu item, please report\n");
                        break;
        }
-}
-
-
-/*********************************************************************
- *
- *     WM_CONTEXTMENU
- *
- *     Note: the resource files resource/sysres_??.rc cannot define a
- *             single popup menu.  Hence we use a (dummy) menubar
- *             containing the single popup menu as its first item.
- *
- *     FIXME: the message identifiers have been chosen arbitrarily,
- *             hence we use MF_BYPOSITION.
- *             We might as well use the "real" values (anybody knows ?)
- *             The menu definition is in resources/sysres_??.rc.
- *             Once these are OK, we better use MF_BYCOMMAND here
- *             (as we do in EDIT_WM_Command()).
- *
- */
-static void EDIT_WM_ContextMenu(EDITSTATE *es, INT x, INT y)
-{
-#ifdef __REACTOS__
-       HMENU menu = LoadMenuA(User32Instance, "EDITMENU");
-#else
-       HMENU menu = LoadMenuA(user32_module, "EDITMENU");
-#endif
-       HMENU popup = GetSubMenu(menu, 0);
-       UINT start = es->selection_start;
-       UINT end = es->selection_end;
-
-       ORDER_UINT(start, end);
-
-       /* undo */
-       EnableMenuItem(popup, 0, MF_BYPOSITION | (EDIT_EM_CanUndo(es) && 
!(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
-       /* cut */
-       EnableMenuItem(popup, 2, MF_BYPOSITION | ((end - start) && !(es->style 
& ES_PASSWORD) && !(es->style & ES_READONLY) ? MF_ENABLED : MF_GRAYED));
-       /* copy */
-       EnableMenuItem(popup, 3, MF_BYPOSITION | ((end - start) && !(es->style 
& ES_PASSWORD) ? MF_ENABLED : MF_GRAYED));
-       /* paste */
-       EnableMenuItem(popup, 4, MF_BYPOSITION | 
(IsClipboardFormatAvailable(CF_UNICODETEXT) && !(es->style & ES_READONLY) ? 
MF_ENABLED : MF_GRAYED));
-       /* delete */
-       EnableMenuItem(popup, 5, MF_BYPOSITION | ((end - start) && !(es->style 
& ES_READONLY) ? MF_ENABLED : MF_GRAYED));
-       /* select all */
-       EnableMenuItem(popup, 7, MF_BYPOSITION | (start || (end != 
get_text_length(es)) ? MF_ENABLED : MF_GRAYED));
-
-        if (x == -1 && y == -1) /* passed via VK_APPS press/release */
-        {
-            RECT rc;
-            /* Windows places the menu at the edit's center in this case */
-            GetClientRect(es->hwndSelf, &rc);
-            MapWindowPoints(es->hwndSelf, 0, (POINT *)&rc, 2);
-            x = rc.left + (rc.right - rc.left) / 2;
-            y = rc.top + (rc.bottom - rc.top) / 2;
-        }
-
-       TrackPopupMenu(popup, TPM_LEFTALIGN | TPM_RIGHTBUTTON, x, y, 0, 
es->hwndSelf, NULL);
+
        DestroyMenu(menu);
 }
 
@@ -5300,11 +5290,7 @@
                EDIT_WM_Clear(es);
                break;
 
-       case WM_COMMAND:
-               EDIT_WM_Command(es, HIWORD(wParam), LOWORD(wParam), 
(HWND)lParam);
-               break;
-
-        case WM_CONTEXTMENU:
+    case WM_CONTEXTMENU:
                EDIT_WM_ContextMenu(es, (short)LOWORD(lParam), 
(short)HIWORD(lParam));
                break;
 


Reply via email to