Author: gbrunmar
Date: Mon Jun 9 14:07:54 2008
New Revision: 33909
URL:
http://svn.reactos.org/svn/reactos?rev=33909&view=rev
Log:
Fixed 11 winetests for edit boxes based on code from wine but tweaked for ReactOS
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/…
==============================================================================
--- trunk/reactos/dll/win32/user32/controls/edit.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/user32/controls/edit.c [iso-8859-1] Mon Jun 9 14:07:54 2008
@@ -4084,6 +4084,27 @@
return TRUE;
}
+/* Helper function for WM_CHAR
+ *
+ * According to an MSDN blog article titled "Just because you're a control
+ * doesn't mean that you're necessarily inside a dialog box," multiline
edit
+ * controls without ES_WANTRETURN would attempt to detect whether it is inside
+ * a dialog box or not.
+ */
+static BOOL EDIT_IsInsideDialog(EDITSTATE *es)
+{
+ if (es->hwndParent && es->hwndParent != GetDesktopWindow())
+ {
+ PWINDOW pParent = ValidateHwnd( es->hwndParent );
+
+ /* TODO: This should really check fnID instead of ExtraDataSize I guess */
+ if (pParent && pParent->ExtraDataSize >= DLGWINDOWEXTRA)
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
/*********************************************************************
*
@@ -4717,21 +4738,36 @@
} else if (control)
EDIT_WM_Copy(es);
break;
- case VK_RETURN:
- /* If the edit doesn't want the return send a message to the default object */
- if(!(es->style & ES_WANTRETURN))
+ case VK_RETURN:
+ /* If the edit doesn't want the return send a message to the default object
*/
+ if(!(es->style & ES_MULTILINE) || !(es->style & ES_WANTRETURN))
{
- HWND hwndParent = GetParent(es->hwndSelf);
- DWORD dw = SendMessageW( hwndParent, DM_GETDEFID, 0, 0 );
- if (HIWORD(dw) == DC_HASDEFID)
- {
- SendMessageW( hwndParent, WM_COMMAND,
- MAKEWPARAM( LOWORD(dw), BN_CLICKED ),
- (LPARAM)GetDlgItem( hwndParent, LOWORD(dw) ) );
- }
- }
- break;
- }
+ HWND hwndParent;
+ DWORD dw;
+
+ if (!EDIT_IsInsideDialog(es)) return 1;
+ if (control) break;
+
+ hwndParent = GetParent(es->hwndSelf);
+ dw = SendMessageW( hwndParent, DM_GETDEFID, 0, 0 );
+ if (HIWORD(dw) == DC_HASDEFID)
+ {
+ SendMessageW( hwndParent, WM_COMMAND,
+ MAKEWPARAM( LOWORD(dw), BN_CLICKED ),
+ (LPARAM)GetDlgItem( hwndParent, LOWORD(dw) ) );
+ }
+ else
+ SendMessageW( hwndParent, WM_COMMAND, IDOK, (LPARAM)GetDlgItem(
hwndParent, IDOK ) );
+ }
+ break;
+ case VK_ESCAPE:
+ if (!(es->style & ES_MULTILINE))
+ SendMessageW(GetParent(es->hwndSelf), WM_COMMAND, IDCANCEL,
(LPARAM)GetDlgItem( GetParent(es->hwndSelf), IDCANCEL ) );
+ break;
+ case VK_TAB:
+ SendMessageW(es->hwndParent, WM_NEXTDLGCTL, shift, 0);
+ break;
+ }
return 0;
}