Brian Chang : riched20: EM_SETOPTIONS/EM_GETOPTIONS base implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Feb 22 15:30:18 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 8f6ba475e80592867be6927a3a5a83377add4630
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=8f6ba475e80592867be6927a3a5a83377add4630

Author: Brian Chang <brianch at seas.ucla.edu>
Date:   Tue Feb 21 13:49:19 2006 -0800

riched20: EM_SETOPTIONS/EM_GETOPTIONS base implementation.
ECO_READONLY implemented and tested.

---

 dlls/riched20/editor.c       |   59 +++++++++++++++++++++++++++++++++++++++---
 dlls/riched20/tests/editor.c |   50 ++++++++++++++++++++++++++++++++++++
 2 files changed, 105 insertions(+), 4 deletions(-)

diff --git a/dlls/riched20/editor.c b/dlls/riched20/editor.c
index 496210e..05e84cb 100644
--- a/dlls/riched20/editor.c
+++ b/dlls/riched20/editor.c
@@ -56,7 +56,7 @@
   + EM_GETLINECOUNT   returns number of rows, not of paragraphs
   + EM_GETMODIFY
   - EM_GETOLEINTERFACE
-  - EM_GETOPTIONS
+  + EM_GETOPTIONS
   + EM_GETPARAFORMAT
   - EM_GETPASSWORDCHAR 2.0
   - EM_GETPUNCTUATION 1.0asian
@@ -102,7 +102,7 @@
   - EM_SETLIMITTEXT
   + EM_SETMODIFY (not sure if implementation is correct)
   - EM_SETOLECALLBACK
-  - EM_SETOPTIONS
+  + EM_SETOPTIONS (partially implemented)
   - EM_SETPALETTE 2.0
   + EM_SETPARAFORMAT
   - EM_SETPASSWORDCHAR 2.0
@@ -1325,7 +1325,6 @@ LRESULT WINAPI RichEditANSIWndProc(HWND 
   UNSUPPORTED_MSG(EM_GETLIMITTEXT)
   UNSUPPORTED_MSG(EM_GETLINE)
   /* UNSUPPORTED_MSG(EM_GETOLEINTERFACE) separate stub */
-  UNSUPPORTED_MSG(EM_GETOPTIONS)
   UNSUPPORTED_MSG(EM_GETPASSWORDCHAR)
   UNSUPPORTED_MSG(EM_GETREDONAME)
   UNSUPPORTED_MSG(EM_GETTEXTMODE)
@@ -1341,7 +1340,6 @@ LRESULT WINAPI RichEditANSIWndProc(HWND 
   UNSUPPORTED_MSG(EM_SETEDITSTYLE)
   UNSUPPORTED_MSG(EM_SETFONTSIZE)
   UNSUPPORTED_MSG(EM_SETLANGOPTIONS)
-  UNSUPPORTED_MSG(EM_SETOPTIONS)
   UNSUPPORTED_MSG(EM_SETPALETTE)
   UNSUPPORTED_MSG(EM_SETPASSWORDCHAR)
   UNSUPPORTED_MSG(EM_SETSCROLLPOS)
@@ -1410,6 +1408,59 @@ LRESULT WINAPI RichEditANSIWndProc(HWND 
   case EM_REDO:
     ME_Redo(editor);
     return 0;
+  case EM_GETOPTIONS:
+  {
+    /* these flags are equivalent to the ES_* counterparts */
+    DWORD mask = ECO_VERTICAL | ECO_AUTOHSCROLL | ECO_AUTOVSCROLL |
+                 ECO_NOHIDESEL | ECO_READONLY | ECO_WANTRETURN;
+    DWORD settings = GetWindowLongW(hWnd, GWL_STYLE) & mask;
+
+    return settings;
+  }
+  case EM_SETOPTIONS:
+  {
+    /* these flags are equivalent to ES_* counterparts                      
+     * ECO_READONLY is already implemented in the code, only requires 
+     * setting the bit to work                                        
+     */
+    DWORD mask = ECO_VERTICAL | ECO_AUTOHSCROLL | ECO_AUTOVSCROLL |
+                 ECO_NOHIDESEL | ECO_READONLY | ECO_WANTRETURN;
+    DWORD raw = GetWindowLongW(hWnd, GWL_STYLE);
+    DWORD settings = mask & raw;
+
+    switch(wParam)
+    {
+      case ECOOP_SET:
+        settings = lParam;
+        break;
+      case ECOOP_OR:
+        settings |= lParam;
+        break;
+      case ECOOP_AND:
+        settings &= lParam;
+        break;
+      case ECOOP_XOR:
+        settings ^= lParam;
+    }
+    SetWindowLongW(hWnd, GWL_STYLE, (raw & ~mask) | (settings & mask));
+
+    if (lParam & ECO_AUTOWORDSELECTION)
+      FIXME("ECO_AUTOWORDSELECTION not implemented yet!\n");
+    if (lParam & ECO_SELECTIONBAR)
+      FIXME("ECO_SELECTIONBAR not implemented yet!\n");
+    if (lParam & ECO_VERTICAL)
+      FIXME("ECO_VERTICAL not implemented yet!\n");
+    if (lParam & ECO_AUTOHSCROLL)
+      FIXME("ECO_AUTOHSCROLL not implemented yet!\n");
+    if (lParam & ECO_AUTOVSCROLL)
+      FIXME("ECO_AUTOVSCROLL not implemented yet!\n");
+    if (lParam & ECO_NOHIDESEL)
+      FIXME("ECO_NOHIDESEL not implemented yet!\n");
+    if (lParam & ECO_WANTRETURN)
+      FIXME("ECO_WANTRETURN not implemented yet!\n");
+
+    return settings;
+  }
   case EM_SETSEL:
   {
     ME_InvalidateSelection(editor);
diff --git a/dlls/riched20/tests/editor.c b/dlls/riched20/tests/editor.c
index b650785..814fc1c 100644
--- a/dlls/riched20/tests/editor.c
+++ b/dlls/riched20/tests/editor.c
@@ -488,6 +488,54 @@ static void test_TM_PLAINTEXT()
   DestroyWindow(hwndRichEdit);
 }
 
+/* FIXME: Extra '\r' appended at end of gotten text*/
+static void test_WM_GETTEXT()
+{
+    HWND hwndRichEdit = new_richedit(NULL);
+    static const char text[] = "Hello. My name is RichEdit!";
+    char buffer[1024] = {0};
+    int result;
+
+    SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text);
+    SendMessage(hwndRichEdit, WM_GETTEXT, 1024, (LPARAM) buffer);
+    result = strcmp(buffer,text);
+    todo_wine{
+      ok(result == 0, 
+        "WM_GETTEXT: settext and gettext differ. strcmp: %d\n", result);
+    }
+}
+
+/* FIXME: need to test unimplemented options and robustly test wparam */
+static void test_EM_SETOPTIONS()
+{
+    HWND hwndRichEdit = new_richedit(NULL);
+    static const char text[] = "Hello. My name is RichEdit!";
+    char buffer[1024] = {0};
+
+    /* NEGATIVE TESTING - NO OPTIONS SET */
+    SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text);
+    SendMessage(hwndRichEdit, EM_SETOPTIONS, ECOOP_SET, 0);
+
+    /* testing no readonly by sending 'a' to the control*/
+    SetFocus(hwndRichEdit);
+    SendMessage(hwndRichEdit, WM_CHAR, 'a', 0x1E0001);
+    SendMessage(hwndRichEdit, WM_GETTEXT, 1024, (LPARAM) buffer);
+    ok(buffer[0]=='a', 
+       "EM_SETOPTIONS: Text not changed! s1:%s s2:%s\n", text, buffer);
+    SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text);
+
+    /* READONLY - sending 'a' to the control */
+    SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text);
+    SendMessage(hwndRichEdit, EM_SETOPTIONS, ECOOP_SET, ECO_READONLY);
+    SetFocus(hwndRichEdit);
+    SendMessage(hwndRichEdit, WM_CHAR, 'a', 0x1E0001);
+    SendMessage(hwndRichEdit, WM_GETTEXT, 1024, (LPARAM) buffer);
+    ok(buffer[0]==text[0], 
+       "EM_SETOPTIONS: Text changed! s1:%s s2:%s\n", text, buffer); 
+
+    DestroyWindow(hwndRichEdit);
+}
+
 START_TEST( editor )
 {
   MSG msg;
@@ -502,6 +550,8 @@ START_TEST( editor )
   test_EM_SCROLLCARET();
   test_EM_SETTEXTMODE();
   test_TM_PLAINTEXT();
+  test_EM_SETOPTIONS();
+  test_WM_GETTEXT();
 
   /* Set the environment variable WINETEST_RICHED20 to keep windows
    * responsive and open for 30 seconds. This is useful for debugging.




More information about the wine-cvs mailing list